packages feed

sbv 14.7 → 14.8

raw patch · 104 files changed

+54262/−22462 lines, 104 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Data.SBV: KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
- Data.SBV.Dynamic: KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
- Data.SBV.Internals: CgHeader :: [Doc] -> CgPgmKind
- Data.SBV.Internals: KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
- Data.SBV.Trans: KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
+ Data.SBV: pattern KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
+ Data.SBV.Dynamic: cgArrayEqualityLimit :: Integer -> SBVCodeGen ()
+ Data.SBV.Dynamic: cgRegexLimits :: Integer -> Integer -> Integer -> SBVCodeGen ()
+ Data.SBV.Dynamic: pattern KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
+ Data.SBV.Internals: ($dmregisterKindInContext) :: (SolverContext m, MonadIO m) => Kind -> m ()
+ Data.SBV.Internals: CgCHeaderInfo :: Bool -> Doc -> [Doc] -> Doc -> CgCHeader
+ Data.SBV.Internals: CgRegexLimits :: Integer -> Integer -> Integer -> CgRegexLimits
+ Data.SBV.Internals: EApp :: [SExpr] -> SExpr
+ Data.SBV.Internals: ECon :: String -> SExpr
+ Data.SBV.Internals: EDouble :: Double -> SExpr
+ Data.SBV.Internals: EFloat :: Float -> SExpr
+ Data.SBV.Internals: EFloatingPoint :: FP -> SExpr
+ Data.SBV.Internals: ENum :: (Integer, Maybe Int, Bool) -> SExpr
+ Data.SBV.Internals: EReal :: AlgReal -> SExpr
+ Data.SBV.Internals: [cgArrayEqualityMaxKeys] :: CgConfig -> Integer
+ Data.SBV.Internals: [cgHeaderFloating] :: CgCHeader -> Bool
+ Data.SBV.Internals: [cgHeaderPrototypes] :: CgCHeader -> Doc
+ Data.SBV.Internals: [cgHeaderSignatures] :: CgCHeader -> [Doc]
+ Data.SBV.Internals: [cgHeaderTypes] :: CgCHeader -> Doc
+ Data.SBV.Internals: [cgRegexMaxNodes] :: CgConfig -> Integer
+ Data.SBV.Internals: [cgRegexMaxStates] :: CgConfig -> Integer
+ Data.SBV.Internals: [cgRegexMaxWork] :: CgConfig -> Integer
+ Data.SBV.Internals: [regexMaxNodes] :: CgRegexLimits -> Integer
+ Data.SBV.Internals: [regexMaxStates] :: CgRegexLimits -> Integer
+ Data.SBV.Internals: [regexMaxWork] :: CgRegexLimits -> Integer
+ Data.SBV.Internals: adtKindDependencies :: Kind -> [Kind]
+ Data.SBV.Internals: cgArrayEqualityLimit :: Integer -> SBVCodeGen ()
+ Data.SBV.Internals: cgRegexLimits :: Integer -> Integer -> Integer -> SBVCodeGen ()
+ Data.SBV.Internals: cgSetRegexLimits :: CgRegexLimits -> SBVCodeGen ()
+ Data.SBV.Internals: data CgCHeader
+ Data.SBV.Internals: data CgRegexLimits
+ Data.SBV.Internals: data SExpr
+ Data.SBV.Internals: defaultCgRegexLimits :: CgRegexLimits
+ Data.SBV.Internals: expandKinds :: Kind -> [Kind]
+ Data.SBV.Internals: formatFunctionResponse :: SExpr -> String -> String -> Bool -> Maybe [String] -> String
+ Data.SBV.Internals: parseSExpr :: String -> Either String SExpr
+ Data.SBV.Internals: pattern CgCHeader :: CgCHeader -> CgPgmKind
+ Data.SBV.Internals: pattern CgHeader :: [Doc] -> CgPgmKind
+ Data.SBV.Internals: pattern KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
+ Data.SBV.Internals: registerKindInContext :: SolverContext m => Kind -> m ()
+ Data.SBV.Internals: substituteADTVars :: String -> [(String, Kind)] -> Kind -> Kind
+ Data.SBV.Internals: withADTDependencies :: [Kind] -> Kind -> Kind
+ Data.SBV.Tools.CodeGen: CgRegexLimits :: Integer -> Integer -> Integer -> CgRegexLimits
+ Data.SBV.Tools.CodeGen: [regexMaxNodes] :: CgRegexLimits -> Integer
+ Data.SBV.Tools.CodeGen: [regexMaxStates] :: CgRegexLimits -> Integer
+ Data.SBV.Tools.CodeGen: [regexMaxWork] :: CgRegexLimits -> Integer
+ Data.SBV.Tools.CodeGen: cgArrayEqualityLimit :: Integer -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen: cgRegexLimits :: Integer -> Integer -> Integer -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen: cgSetRegexLimits :: CgRegexLimits -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen: data CgRegexLimits
+ Data.SBV.Tools.CodeGen: defaultCgRegexLimits :: CgRegexLimits
+ Data.SBV.Tools.CodeGen.Legacy: CgDouble :: CgSRealType
+ Data.SBV.Tools.CodeGen.Legacy: CgFloat :: CgSRealType
+ Data.SBV.Tools.CodeGen.Legacy: CgLongDouble :: CgSRealType
+ Data.SBV.Tools.CodeGen.Legacy: cgAddDecl :: [String] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgAddLDFlags :: [String] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgAddPrototype :: [String] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgGenerateDriver :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgGenerateMakefile :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgIgnoreSAssert :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgInput :: SymVal a => String -> SBVCodeGen (SBV a)
+ Data.SBV.Tools.CodeGen.Legacy: cgInputArr :: SymVal a => Int -> String -> SBVCodeGen [SBV a]
+ Data.SBV.Tools.CodeGen.Legacy: cgIntegerSize :: Int -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgOutput :: String -> SBV a -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgOutputArr :: SymVal a => String -> [SBV a] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgOverwriteFiles :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgPerformRTCs :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgReturn :: SBV a -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgReturnArr :: SymVal a => [SBV a] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgSRealType :: CgSRealType -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgSetDriverValues :: [Integer] -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgShowU8UsingHex :: Bool -> SBVCodeGen ()
+ Data.SBV.Tools.CodeGen.Legacy: cgSym :: Symbolic a -> SBVCodeGen a
+ Data.SBV.Tools.CodeGen.Legacy: compileToC :: Maybe FilePath -> String -> SBVCodeGen a -> IO a
+ Data.SBV.Tools.CodeGen.Legacy: compileToC' :: String -> SBVCodeGen a -> IO (a, CgConfig, CgPgmBundle)
+ Data.SBV.Tools.CodeGen.Legacy: compileToCLib :: Maybe FilePath -> String -> [(String, SBVCodeGen a)] -> IO [a]
+ Data.SBV.Tools.CodeGen.Legacy: compileToCLib' :: String -> [(String, SBVCodeGen a)] -> IO ([a], CgConfig, CgPgmBundle)
+ Data.SBV.Tools.CodeGen.Legacy: data CgSRealType
+ Data.SBV.Tools.CodeGen.Legacy: data SBVCodeGen a
+ Data.SBV.Trans: pattern KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind
+ Documentation.SBV.Examples.ADT.Shapes: Dot :: Shape
+ Documentation.SBV.Examples.ADT.Shapes: Rectangle :: Int32 -> Int32 -> Shape
+ Documentation.SBV.Examples.ADT.Shapes: Square :: Int32 -> Shape
+ Documentation.SBV.Examples.ADT.Shapes: [sideA] :: Shape -> Int32
+ Documentation.SBV.Examples.ADT.Shapes: [sideB] :: Shape -> Int32
+ Documentation.SBV.Examples.ADT.Shapes: [side] :: Shape -> Int32
+ Documentation.SBV.Examples.ADT.Shapes: _undefiner_Shape :: a
+ Documentation.SBV.Examples.ADT.Shapes: area :: SShape -> SInt32
+ Documentation.SBV.Examples.ADT.Shapes: cv2Shape :: String -> [CV] -> Shape
+ Documentation.SBV.Examples.ADT.Shapes: data Shape
+ Documentation.SBV.Examples.ADT.Shapes: examples :: IO AllSatResult
+ Documentation.SBV.Examples.ADT.Shapes: extracted :: IO [Shape]
+ Documentation.SBV.Examples.ADT.Shapes: getRectangle_1 :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: getRectangle_2 :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: getSquare_1 :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: goodShape :: SShape -> SBool
+ Documentation.SBV.Examples.ADT.Shapes: instance (Data.SBV.Core.Data.SymVal extraT1, Data.SBV.Core.Data.SymVal extraT2) => Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.Forall extraS1 extraT1 -> Data.SBV.Core.Data.Forall extraS2 extraT2 -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance (Data.SBV.Core.Data.SymVal extraT1, Data.SBV.Core.Data.SymVal extraT2, Data.SBV.Core.Data.SymVal extraT3) => Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.Forall extraS1 extraT1 -> Data.SBV.Core.Data.Forall extraS2 extraT2 -> Data.SBV.Core.Data.Forall extraS3 extraT3 -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance (Data.SBV.Core.Data.SymVal extraT1, Data.SBV.Core.Data.SymVal extraT2, Data.SBV.Core.Data.SymVal extraT3, Data.SBV.Core.Data.SymVal extraT4) => Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.Forall extraS1 extraT1 -> Data.SBV.Core.Data.Forall extraS2 extraT2 -> Data.SBV.Core.Data.Forall extraS3 extraT3 -> Data.SBV.Core.Data.Forall extraS4 extraT4 -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance (Data.SBV.Core.Data.SymVal extraT1, Data.SBV.Core.Data.SymVal extraT2, Data.SBV.Core.Data.SymVal extraT3, Data.SBV.Core.Data.SymVal extraT4, Data.SBV.Core.Data.SymVal extraT5) => Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.Forall extraS1 extraT1 -> Data.SBV.Core.Data.Forall extraS2 extraT2 -> Data.SBV.Core.Data.Forall extraS3 extraT3 -> Data.SBV.Core.Data.Forall extraS4 extraT4 -> Data.SBV.Core.Data.Forall extraS5 extraT5 -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance Data.SBV.Core.Data.SymVal Documentation.SBV.Examples.ADT.Shapes.Shape
+ Documentation.SBV.Examples.ADT.Shapes: instance Data.SBV.Core.Data.SymVal extraT => Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.Forall extraS extraT -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance Data.SBV.Core.Kind.HasKind Documentation.SBV.Examples.ADT.Shapes.Shape
+ Documentation.SBV.Examples.ADT.Shapes: instance Data.SBV.TP.Kernel.HasInductionSchema (Data.SBV.Core.Data.Forall ta Documentation.SBV.Examples.ADT.Shapes.Shape -> Data.SBV.Core.Data.SBool)
+ Documentation.SBV.Examples.ADT.Shapes: instance GHC.Show.Show Documentation.SBV.Examples.ADT.Shapes.Shape
+ Documentation.SBV.Examples.ADT.Shapes: instance Test.QuickCheck.Arbitrary.Arbitrary Documentation.SBV.Examples.ADT.Shapes.Shape
+ Documentation.SBV.Examples.ADT.Shapes: interesting :: SShape -> SBool
+ Documentation.SBV.Examples.ADT.Shapes: isDot :: SBV Shape -> SBool
+ Documentation.SBV.Examples.ADT.Shapes: isRectangle :: SBV Shape -> SBool
+ Documentation.SBV.Examples.ADT.Shapes: isSquare :: SBV Shape -> SBool
+ Documentation.SBV.Examples.ADT.Shapes: newShape :: Symbolic SShape
+ Documentation.SBV.Examples.ADT.Shapes: sCaseShape :: Mergeable result => result -> (SBV Int32 -> result) -> (SBV Int32 -> SBV Int32 -> result) -> SBV Shape -> result
+ Documentation.SBV.Examples.ADT.Shapes: sDot :: SBV Shape
+ Documentation.SBV.Examples.ADT.Shapes: sRectangle :: SBV Int32 -> SBV Int32 -> SBV Shape
+ Documentation.SBV.Examples.ADT.Shapes: sSquare :: SBV Int32 -> SBV Shape
+ Documentation.SBV.Examples.ADT.Shapes: sside :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: ssideA :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: ssideB :: SBV Shape -> SBV Int32
+ Documentation.SBV.Examples.ADT.Shapes: type SShape = SBV Shape
+ Documentation.SBV.Examples.Crypto.AES: aes128BlockEncrypt :: SBVCodeGen ()
- Data.SBV.Internals: CgConfig :: Bool -> Maybe Int -> Maybe CgSRealType -> [Integer] -> Bool -> Bool -> Bool -> Bool -> Bool -> CgConfig
+ Data.SBV.Internals: CgConfig :: Bool -> Maybe Int -> Maybe CgSRealType -> [Integer] -> Bool -> Bool -> Bool -> Bool -> Bool -> Integer -> Integer -> Integer -> Integer -> CgConfig

Files

CHANGES.md view
@@ -1,6 +1,96 @@ * Hackage: <http://hackage.haskell.org/package/sbv> * GitHub:  <http://github.com/LeventErkok/sbv> +### Version 14.8, 2026-09-25++  * The main change in this release is a new C backend, with much broader+    support for SBV programs, including arbitrary-width bit-vectors, recursive+    functions, ADTs, and higher-order specializations. This was largely developed+    with LLM assistance. The original backend remains available through+    `Data.SBV.Tools.CodeGen.Legacy`, but we recommend the new backend and welcome+    reports of any issues. See below for specific changes.++  * [BACKWARDS COMPATIBILITY] `Data.SBV.Tools.CodeGen` now selects a new C compiler.+    Import `Data.SBV.Tools.CodeGen.Legacy` to keep using the original one, including+    its low-level compilation functions.++    The new compiler supports standalone programs and static libraries using+    arbitrary-width bit-vectors, native and arbitrary-format floating point, exact+    integers and rational-valued reals, strings, lists, sets, tuples, ADTs, arrays,+    recursive function definitions, closed array lambdas, and SBV's firstified+    higher-order functions. Unsupported constructs, including solver-only features+    and captured array lambdas, produce explicit errors.++    Unmapped `SInteger` and rational-valued `SReal` now use GMP instead of being+    rejected. Keep `cgIntegerSize` or `cgSRealType` if native, precision-losing+    representations are intentional. Arbitrary-format floats and rounding-sensitive+    floating operations require LibBF; native bit-vector programs need neither.++    Regenerate C sources and headers together; generated type and helper names+    have changed.+    Detected runtime failures terminate the process; there is no error-return API.+    See `Data.SBV.Tools.CodeGen` for supported features, dependencies, and the+    ownership rules for composite values.++  * Generated floating-point code supports all five SBV rounding modes, including+    conversions and fused operations. Ordinary `SFloat` and `SDouble` arithmetic+    retains native C types. Callers and callbacks must preserve `FE_TONEAREST`;+    builds must disable implicit contraction and fast-math. Generated Makefiles+    supply the contraction flag. These restrictions do not apply to integer-only+    programs. `CgLongDouble` conversions support binary64, x87 extended, and+    binary128 target formats.++  * The new C compiler supports regex matching without an additional dependency.+    `cgSetRegexLimits` (named settings) and `cgRegexLimits` control generation+    budgets without limiting runtime string length. Direct array equality is+    supported for finite key domains, with a configurable `cgArrayEqualityLimit`.+    Exceeding these limits produces a generation error, not an approximation.++  * Generated C libraries rebuild correctly after component or header changes.+    Required libraries and `cgAddLDFlags` settings are kept in `SBV_LIBS`, so+    caller-supplied `LDFLAGS` no longer discard them. Use `SBV_LIBS` to override+    dependency discovery when integrating a custom installation.++  * Fix incorrect C results for pseudo-Boolean comparisons with large totals and+    native-mapped real-to-integer flooring. Generated diagnostic labels and+    assertion messages safely handle special characters.++  * ADTs containing other ADTs inside tuples, lists, sets, or arrays no longer+    need unrelated uses or explicit type registration to work reliably.+    This also applies to literal-only computations and to named and unnamed+    query-mode fresh variables.++  * Functions defined with `smtFunction` and its variants can now be first used+    in query mode without calling `registerFunction` beforehand.+    Thanks to David Van Balen for reporting [issue #815](https://github.com/LeventErkok/sbv/issues/815).++  * Fix constant folding of integral literals converted with `toSFloatingPoint`+    under non-default rounding modes, including overflow. Integral conversions+    with `toSFloat` and `toSDouble` now also fold in all five rounding modes.++  * Fix literal regex matching involving universal, complement, difference, and+    intersection expressions inside concatenations and repetitions. Empty+    concatenations (`Conc []`) now serialize correctly; invalid `Loop` and+    `Power` bounds are rejected consistently.++  * Fix first use of rational types in query mode, including rational fields+    nested in other types. `registerType` now works inside queries and can+    be safely repeated.++  * `registerFunction` no longer rules out NaN results for floating-point+    functions.++  * `getFunction` now preserves the current model and handles+    uninterpreted argument sorts and quoted function names correctly.++  * [BACKWARDS COMPATIBILITY] `getFunction` now rejects unregistered functions.+    Use the function in a constraint or call `registerFunction` before checking+    satisfiability. Custom `SMTFunction` instances overriding `sexprToFun` must+    accept an additional function-name argument.++  * New example: `Documentation.SBV.Examples.ADT.Shapes` demonstrates symbolic+    pattern matching and enumerating datatype values with `allSat` and query mode.+ ### Version 14.7, 2026-08-31    * Fix https://github.com/LeventErkok/sbv/issues/813. Thanks to David van Balen for reporting.
Data/SBV.hs view
@@ -1175,6 +1175,9 @@  These types can also be parameterized, per usual Haskell usage. +For a complete example of constraining and enumerating datatype values, see+"Documentation.SBV.Examples.ADT.Shapes".+ We also support a symbolic case-expression quasi-quoter, allowing us to write:  @
Data/SBV/Client.hs view
@@ -56,9 +56,9 @@  import Data.SBV.Core.Concrete (cvRank) import Data.SBV.Core.Data+import Data.SBV.Core.Kind (withADTDependencies) import Data.SBV.Core.Model import Data.SBV.Core.SizedFloats-import Data.SBV.Core.Symbolic (registerKind)  import Data.SBV.Provers.Prover import qualified Data.SBV.List as SL@@ -109,9 +109,6 @@ deriving instance TH.Lift TH.TyLit #endif --- A few other things we need to TH lift-deriving instance TH.Lift Kind- data ADTKind = ADTUninterpreted -- Completely uninterpreted              | ADTEnum          -- Enumeration              | ADTFull          -- A full datatype@@ -274,28 +271,15 @@                        in [| Just ($minb, $maxb) |]                   else [| Nothing |] -    -- make the initializer to get the subtypes registered-    st <- TH.newName "_st"  -- Get an underscored name here, since st might go unused if there're no subtypes-    register <- do let concretize b@TH.ConT{}     = b-                       concretize TH.VarT{}       = TH.ConT ''Integer-                       concretize (TH.AppT l arg) = TH.AppT (concretize l) (concretize arg)-                       concretize r               = r--                   end <- TH.noBindS [| pure () |]-                   pure $ TH.DoE Nothing $ [TH.NoBindS (TH.AppE (TH.AppE (TH.VarE 'registerKind) (TH.VarE st))-                                                                (TH.AppE (TH.VarE 'kindOf)-                                                                         (TH.AppTypeE (TH.ConE 'Proxy) (concretize t))))-                                           | (_, fts) <- cstrs, (_, t, KApp n _) <- fts, n /= TH.nameBase typeName-                                           ] ++ [end]--    let regFun = TH.FunD 'mkSymValInit [TH.Clause [TH.VarP st, TH.WildP] (TH.NormalB register) []]+    -- Retain declarations on the kind so literals and symbolic variables take+    -- the same registration path, including beneath containers.+    dependencies <- adtRegistrationTypes typeName      let symVal = TH.InstanceD                       Nothing                       symCtx                       (TH.AppT (TH.ConT ''SymVal) typeCon)                       [ litFun-                      , regFun                       , TH.FunD 'minMaxBound [TH.Clause [] (TH.NormalB mmBound)   []]                       , TH.FunD 'fromCV      [TH.Clause [] (TH.NormalB getFromCV) []]                        ]@@ -318,8 +302,12 @@                         Nothing                         kindCtx                         (TH.AppT (TH.ConT ''HasKind) typeCon)-                        [TH.FunD 'kindOf [TH.Clause [TH.WildP] (TH.NormalB kindDef) []]]+                        [TH.FunD 'kindOf [TH.Clause [TH.WildP] (TH.NormalB completeKindDef) []]] +        completeKindDef = TH.AppE (TH.AppE (TH.VarE 'withADTDependencies)+                                          (TH.ListE [TH.AppE (TH.VarE 'kindOf) (TH.AppTypeE (TH.ConE 'Proxy) t) | t <- dependencies]))+                                 kindDef+     hasArbitrary <- TH.isInstance ''Arbitrary [typeCon]     arbDecl <- case () of                 () | hasArbitrary -> pure []@@ -590,6 +578,46 @@               | True                = ADTFull          pure (k, args, cs)++-- | Find all ADT definitions needed by a generated kind, including+-- references nested in containers and dependencies of those references. Visit each+-- type constructor once so recursive and mutually recursive declarations terminate.+-- Registration needs only the datatype schema: replace free type variables with+-- Integer, retaining concrete arguments and the declaration's own type variables.+adtRegistrationTypes :: TH.Name -> TH.Q [TH.Type]+adtRegistrationTypes root = dependencies root >>= collect [root]+ where collect _    [] = pure []+       collect seen ((nm, ty) : pending)+         | nm `elem` seen = collect seen pending+         | True = do nested <- dependencies nm+                     rest   <- collect (nm : seen) (pending ++ nested)+                     pure (concretize ty : rest)++       -- Integer is only a registration placeholder used to obtain a schema,+       -- not the program's instantiation; actual type arguments are substituted+       -- separately when the schema is used.+       concretize TH.VarT{}       = TH.ConT ''Integer+       concretize (TH.AppT l arg) = TH.AppT (concretize l) (concretize arg)+       concretize ty              = ty++       dependencies nm = do (_, _, constructors) <- dissect nm+                            concat <$> sequence [field nm constructor ty | (constructor, fields) <- constructors, (_, ty, _) <- fields]++       field owner constructor original = do+         ty   <- expandSyns original+         kind <- toSBV owner constructor ty+         let (headType, arguments) = applications ty []+             nested = concat <$> mapM (field owner constructor) arguments+         case kind of+           KApp{} | TH.ConT nm <- headType -> ((nm, ty) :) <$> nested+           KTuple{} -> nested+           KList{}  -> nested+           KSet{}   -> nested+           KArray{} -> nested+           _        -> pure []++       applications (TH.AppT fun arg) arguments = applications fun (arg : arguments)+       applications fun               arguments = (fun, arguments)  -- | Find the SBV kind for this type toSBV :: TH.Name -> TH.Name -> TH.Type -> TH.Q Kind
Data/SBV/Compilers/C.hs view
@@ -6,1079 +6,64 @@ -- Maintainer: erkokl@gmail.com -- Stability : experimental ----- Compilation of symbolic programs to C--------------------------------------------------------------------------------{-# LANGUAGE TupleSections #-}--{-# OPTIONS_GHC -Wall -Werror -Wno-incomplete-uni-patterns #-}--module Data.SBV.Compilers.C(compileToC, compileToCLib, compileToC', compileToCLib') where--import Control.DeepSeq                (rnf)-import Data.Char                      (isSpace)-import Data.List                      (nub, intercalate, intersperse)-import Data.Maybe                     (isJust, isNothing, fromJust)-import qualified Data.Foldable as F   (toList)-import qualified Data.Set      as Set (member, union, unions, empty, toList, singleton, fromList)-import qualified Data.Text     as T-import System.FilePath                (takeBaseName, replaceExtension)-import System.Random--import Data.SBV.Core.Symbolic (ResultInp(..), ProgInfo(..))---- Work around the fact that GHC 8.4.1 started exporting <>.. Hmm..-import Text.PrettyPrint.HughesPJ-import qualified Text.PrettyPrint.HughesPJ as P ((<>))--import Data.SBV.Core.Data-import Data.SBV.Core.Kind (kRoundingMode)-import Data.SBV.Compilers.CodeGen--import Data.SBV.Utils.PrettyNum   (chex, showCFloat, showCDouble)--import GHC.Stack-------------------------------------------------------------------------------- * API-------------------------------------------------------------------------------- | Given a symbolic computation, render it as an equivalent collection of files--- that make up a C program:------   * The first argument is the directory name under which the files will be saved. To save---     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.------   * The second argument is the name of the C function to generate.------   * The final argument is the function to be compiled.------ Compilation will also generate a @Makefile@,  a header file, and a driver (test) program, etc. As a--- result, we return whatever the code-gen function returns. Most uses should simply have @()@ as--- the return type here, but the value can be useful if you want to chain the result of--- one compilation act to the next.-compileToC :: Maybe FilePath -> String -> SBVCodeGen a -> IO a-compileToC mbDirName nm f = do (retVal, cfg, bundle) <- compileToC' nm f-                               renderCgPgmBundle mbDirName (cfg, bundle)-                               pure retVal---- | Lower level version of 'compileToC', producing a t'CgPgmBundle'-compileToC' :: String -> SBVCodeGen a -> IO (a, CgConfig, CgPgmBundle)-compileToC' nm f = do rands <- randoms <$> newStdGen-                      codeGen SBVToC (defaultCgConfig { cgDriverVals = rands }) nm f---- | Create code to generate a library archive (.a) from given symbolic functions. Useful when generating code--- from multiple functions that work together as a library.------   * The first argument is the directory name under which the files will be saved. To save---     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.------   * The second argument is the name of the archive to generate.------   * The third argument is the list of functions to include, in the form of function-name/code pairs, similar---     to the second and third arguments of 'compileToC', except in a list.-compileToCLib :: Maybe FilePath -> String -> [(String, SBVCodeGen a)] -> IO [a]-compileToCLib mbDirName libName comps = do (retVal, cfg, pgm) <- compileToCLib' libName comps-                                           renderCgPgmBundle mbDirName (cfg, pgm)-                                           pure retVal---- | Lower level version of 'compileToCLib', producing a t'CgPgmBundle'-compileToCLib' :: String -> [(String, SBVCodeGen a)] -> IO ([a], CgConfig, CgPgmBundle)-compileToCLib' libName comps = do resCfgBundles <- mapM (uncurry compileToC') comps-                                  let (finalCfg, finalPgm) = mergeToLib libName [(c, b) | (_, c, b) <- resCfgBundles]-                                  pure ([r | (r, _, _) <- resCfgBundles], finalCfg, finalPgm)-------------------------------------------------------------------------------- * Implementation-------------------------------------------------------------------------------- token for the target language-data SBVToC = SBVToC--instance CgTarget SBVToC where-  targetName _ = "C"-  translate  _ = cgen---- Unexpected input, or things we will probably never support-die :: String -> a-die msg = error $ "SBV->C: Unexpected: " ++ msg---- Unsupported features, or features TBD-tbd :: String -> a-tbd msg = error $ "SBV->C: Not yet supported: " ++ msg--cgen :: CgConfig -> String -> CgState -> Result -> CgPgmBundle-cgen cfg nm st sbvProg-   -- we rnf the main pg and the sig to make sure any exceptions in type conversion pop-out early enough-   -- this is purely cosmetic, of course..-   = rnf (render sig) `seq` rnf (render (vcat body)) `seq` result-  where result = CgPgmBundle bundleKind-                        $ filt [ ("Makefile",  (CgMakefile flags, [genMake (cgGenDriver cfg) nm nmd flags]))-                               , (nm  ++ ".h", (CgHeader [sig],   [genHeader bundleKind nm [sig] extProtos]))-                               , (nmd ++ ".c", (CgDriver,         genDriver cfg randVals nm ins outs mbRet))-                               , (nm  ++ ".c", (CgSource,         body))-                               ]--        (body, flagsNeeded) = genCProg cfg nm sig sbvProg ins outs mbRet extDecls--        bundleKind = (cgInteger cfg, cgReal cfg)--        randVals = cgDriverVals cfg--        filt xs  = [c | c@(_, (k, _)) <- xs, need k]-          where need k | isCgDriver   k = cgGenDriver cfg-                       | isCgMakefile k = cgGenMakefile cfg-                       | True           = True--        nmd      = nm ++ "_driver"-        sig      = pprCFunHeader nm ins outs mbRet-        ins      = cgInputs st-        outs     = cgOutputs st-        mbRet    = case cgReturns st of-                     []           -> Nothing-                     [CgAtomic o] -> Just o-                     [CgArray _]  -> tbd "Non-atomic return values"-                     _            -> tbd "Multiple return values"-        extProtos = case cgPrototypes st of-                     [] -> empty-                     xs -> vcat $ text "/* User given prototypes: */" : map text xs-        extDecls  = case cgDecls st of-                     [] -> empty-                     xs -> vcat $ text "/* User given declarations: */" : map text xs-        flags    = flagsNeeded ++ cgLDFlags st---- | Pretty print a functions type. If there is only one output, we compile it--- as a function that returns that value. Otherwise, we compile it as a void function--- that takes return values as pointers to be updated.-pprCFunHeader :: String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> Doc-pprCFunHeader fn ins outs mbRet = retType <+> text fn P.<> parens (fsep (punctuate comma (map mkParam ins ++ map mkPParam outs)))-  where retType = case mbRet of-                   Nothing -> text "void"-                   Just sv -> pprCWord False sv--mkParam, mkPParam :: (String, CgVal) -> Doc-mkParam  (n, CgAtomic sv)     = pprCWord True  sv <+> text n-mkParam  (_, CgArray  [])     = die "mkParam: CgArray with no elements!"-mkParam  (n, CgArray  (sv:_)) = pprCWord True  sv <+> text "*" P.<> text n-mkPParam (n, CgAtomic sv)     = pprCWord False sv <+> text "*" P.<> text n-mkPParam (_, CgArray  [])     = die "mPkParam: CgArray with no elements!"-mkPParam (n, CgArray  (sv:_)) = pprCWord False sv <+> text "*" P.<> text n---- | Renders as "const SWord8 s0", etc. the first parameter is the width of the typefield-declSV :: Int -> SV -> Doc-declSV w sv = text "const" <+> pad (showCType sv) <+> text (show sv)-  where pad s = text $ s ++ replicate (w - length s) ' '---- | Return the proper declaration and the result as a pair. No consts-declSVNoConst :: Int -> SV -> (Doc, Doc)-declSVNoConst w sv = (text "     " <+> pad (showCType sv), text (show sv))-  where pad s = text $ s ++ replicate (w - length s) ' '---- | Renders as "s0", etc, or the corresponding constant-showSV :: CgConfig -> [(SV, CV)] -> SV -> Doc-showSV cfg consts sv-  | sv == falseSV                 = text "false"-  | sv == trueSV                  = text "true"-  | Just cv <- sv `lookup` consts = mkConst cfg cv-  | True                          = text $ show sv---- | Words as it would map to a C word-pprCWord :: HasKind a => Bool -> a -> Doc-pprCWord cnst v = (if cnst then text "const" else empty) <+> text (showCType v)---- | Almost a "show", but map "SWord1" to "SBool"--- which is used for extracting one-bit words. This is OK since C's bool type--- handles arithmetic fine, and maps nicely to our `SWord 1`. (Same isn't true for `SInt 1`, which--- doesn't have an easy counter-part on the C side.-showCType :: HasKind a => a -> String-showCType i = case kindOf i of-                KBounded False 1 -> "SBool"-                k                -> show k---- | The printf specifier for the type-specifier :: CgConfig -> SV -> Doc-specifier cfg sv = case kindOf sv of-                     KVar{}        -> die $ "variable sort: " ++ show (kindOf sv)-                     KBool         -> spec (False, 1)-                     KBounded b i  -> spec (b, i)-                     KUnbounded    -> spec (True, fromJust (cgInteger cfg))-                     KReal         -> specF (fromJust (cgReal cfg))-                     KFloat        -> specF CgFloat-                     KDouble       -> specF CgDouble-                     KString       -> text "%s"-                     KChar         -> text "%c"-                     KRational     -> die   "rational sort"-                     KFP{}         -> die   "arbitrary float sort"-                     KList k       -> die $ "list sort: "   ++ show k-                     KSet  k       -> die $ "set sort: "    ++ show k-                     KApp s _      -> die $ "ADT app: "     ++ s-                     KADT s _ _    -> die $ "ADT: "         ++ s-                     KTuple k      -> die $ "tuple sort: "  ++ show k-                     KArray  k1 k2 -> die $ "array sort: "  ++ show (k1, k2)-  where u8InHex = cgShowU8InHex cfg--        spec :: (Bool, Int) -> Doc-        spec (False,  1) = text "%d"-        spec (False,  8)-          | u8InHex      = text "0x%02\"PRIx8\""-          | True         = text "%\"PRIu8\""-        spec (True,   8) = text "%\"PRId8\""-        spec (False, 16) = text "0x%04\"PRIx16\"U"-        spec (True,  16) = text "%\"PRId16\""-        spec (False, 32) = text "0x%08\"PRIx32\"UL"-        spec (True,  32) = text "%\"PRId32\"L"-        spec (False, 64) = text "0x%016\"PRIx64\"ULL"-        spec (True,  64) = text "%\"PRId64\"LL"-        spec (s, sz)     = die $ "Format specifier at type " ++ (if s then "SInt" else "SWord") ++ show sz--        specF :: CgSRealType -> Doc-        specF CgFloat      = text "%a"-        specF CgDouble     = text "%a"-        specF CgLongDouble = text "%Lf"---- | Make a constant value of the given type. We don't check for out of bounds here, as it should not be needed.---   There are many options here, using binary, decimal, etc. We simply use decimal for values 8-bits or less,---   and hex otherwise.-mkConst :: CgConfig -> CV -> Doc-mkConst cfg  (CV KReal (CAlgReal (AlgRational _ r))) = double (fromRational r :: Double) P.<> sRealSuffix (fromJust (cgReal cfg))-  where sRealSuffix CgFloat      = text "F"-        sRealSuffix CgDouble     = empty-        sRealSuffix CgLongDouble = text "L"-mkConst cfg (CV KUnbounded       (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (True, fromJust (cgInteger cfg))-mkConst cfg (CV (KBounded sg sz) (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (sg,   sz)-mkConst cfg (CV KBool            (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (False, 1)-mkConst _   (CV KFloat           (CFloat f))   = text $ showCFloat f-mkConst _   (CV KDouble          (CDouble d))  = text $ showCDouble d-mkConst _   (CV KString          (CString s))  = text $ show s-mkConst _   (CV KChar            (CChar c))    = text $ show c-mkConst _   cv                                 = die $ "mkConst: " ++ show cv--showSizedConst :: Bool -> Integer -> (Bool, Int) -> Doc-showSizedConst _   i   (False,  1) = text (if i == 0 then "false" else "true")-showSizedConst u8h i t@(False,  8)-  | u8h                            = text $ T.unpack (chex False True t i)-  | True                           = integer i-showSizedConst _   i   (True,   8) = integer i-showSizedConst _   i t@(False, 16) = text $ T.unpack $ chex False True t i-showSizedConst _   i t@(True,  16) = text $ T.unpack $ chex False True t i-showSizedConst _   i t@(False, 32) = text $ T.unpack $ chex False True t i-showSizedConst _   i t@(True,  32) = text $ T.unpack $ chex False True t i-showSizedConst _   i t@(False, 64) = text $ T.unpack $ chex False True t i-showSizedConst _   i t@(True,  64) = text $ T.unpack $ chex False True t i-showSizedConst _   i   (s, sz)     = die $ "Constant " ++ show i ++ " at type " ++ (if s then "SInt" else "SWord") ++ show sz---- | Generate a makefile. The first argument is True if we have a driver.-genMake :: Bool -> String -> String -> [String] -> Doc-genMake ifdr fn dn ldFlags = foldr1 ($$) [l | (True, l) <- lns]- where ifld = not (null ldFlags)-       ld | ifld = text "${LDFLAGS}"-          | True = empty-       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")-             , (True, text "")-             , (True, text "# include any user-defined .mk file in the current directory.")-             , (True, text "-include *.mk")-             , (True, text "")-             , (True, text "CC?=gcc")-             , (True, text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")-             , (ifld, text "LDFLAGS?=" P.<> text (unwords ldFlags))-             , (True, text "")-             , (ifdr, text "all:" <+> nmd)-             , (ifdr, text "")-             , (True, nmo P.<> text (": " ++ ppSameLine (hsep [nmc, nmh])))-             , (True, text "\t${CC} ${CCFLAGS}" <+> text "-c $< -o $@")-             , (True, text "")-             , (ifdr, nmdo P.<> text ":" <+> nmdc)-             , (ifdr, text "\t${CC} ${CCFLAGS}" <+> text "-c $< -o $@")-             , (ifdr, text "")-             , (ifdr, nmd P.<> text (": " ++ ppSameLine (hsep [nmo, nmdo])))-             , (ifdr, text "\t${CC} ${CCFLAGS}" <+> text "$^ -o $@" <+> ld)-             , (ifdr, text "")-             , (True, text "clean:")-             , (True, text "\trm -f *.o")-             , (True, text "")-             , (ifdr, text "veryclean: clean")-             , (ifdr, text "\trm -f" <+> nmd)-             , (ifdr, text "")-             ]-       nm   = text fn-       nmd  = text dn-       nmh  = nm P.<> text ".h"-       nmc  = nm P.<> text ".c"-       nmo  = nm P.<> text ".o"-       nmdc = nmd P.<> text ".c"-       nmdo = nmd P.<> text ".o"---- | Generate the header-genHeader :: (Maybe Int, Maybe CgSRealType) -> String -> [Doc] -> Doc -> Doc-genHeader (ik, rk) fn sigs protos =-     text "/* Header file for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit! */"-  $$ text ""-  $$ text "#ifndef" <+> tag-  $$ text "#define" <+> tag-  $$ text ""-  $$ text "#include <stdio.h>"-  $$ text "#include <stdlib.h>"-  $$ text "#include <inttypes.h>"-  $$ text "#include <stdint.h>"-  $$ text "#include <stdbool.h>"-  $$ text "#include <string.h>"-  $$ text "#include <math.h>"-  $$ text ""-  $$ text "/* The boolean type */"-  $$ text "typedef bool SBool;"-  $$ text ""-  $$ text "/* The float type */"-  $$ text "typedef float SFloat;"-  $$ text ""-  $$ text "/* The double type */"-  $$ text "typedef double SDouble;"-  $$ text ""-  $$ text "/* Unsigned bit-vectors */"-  $$ text "typedef uint8_t  SWord8;"-  $$ text "typedef uint16_t SWord16;"-  $$ text "typedef uint32_t SWord32;"-  $$ text "typedef uint64_t SWord64;"-  $$ text ""-  $$ text "/* Signed bit-vectors */"-  $$ text "typedef int8_t  SInt8;"-  $$ text "typedef int16_t SInt16;"-  $$ text "typedef int32_t SInt32;"-  $$ text "typedef int64_t SInt64;"-  $$ text ""-  $$ imapping-  $$ rmapping-  $$ text ("/* Entry point prototype" ++ plu ++ ": */")-  $$ vcat (map (P.<> semi) sigs)-  $$ text ""-  $$ protos-  $$ text "#endif /*" <+> tag <+> text "*/"-  $$ text ""- where nm  = text fn-       tag = text "__" P.<> nm P.<> text "__HEADER_INCLUDED__"-       plu = if length sigs /= 1 then "s" else ""-       imapping = case ik of-                    Nothing -> empty-                    Just i  ->    text "/* User requested mapping for SInteger.                                 */"-                               $$ text "/* NB. Loss of precision: Target type is subject to modular arithmetic. */"-                               $$ text ("typedef SInt" ++ show i ++ " SInteger;")-                               $$ text ""-       rmapping = case rk of-                    Nothing -> empty-                    Just t  ->    text "/* User requested mapping for SReal.                          */"-                               $$ text "/* NB. Loss of precision: Target type is subject to rounding. */"-                               $$ text ("typedef " ++ show t ++ " SReal;")-                               $$ text ""--sepIf :: Bool -> Doc-sepIf b = if b then text "" else empty---- | Generate an example driver program-genDriver :: CgConfig -> [Integer] -> String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> [Doc]-genDriver cfg randVals fn inps outs mbRet = [pre, header, body, post]- where pre    =  text "/* Example driver program for" <+> nm P.<> text ". */"-              $$ text "/* Automatically generated by SBV. Edit as you see fit! */"-              $$ text ""-              $$ text "#include <stdio.h>"-       header =  text "#include" <+> doubleQuotes (nm P.<> text ".h")-              $$ text ""-              $$ text "int main(void)"-              $$ text "{"-       body   =  text ""-              $$ nest 2 (   vcat (map mkInp pairedInputs)-                      $$ vcat (map mkOut outs)-                      $$ sepIf (not (null [() | (_, _, CgArray{}) <- pairedInputs]) || not (null outs))-                      $$ call-                      $$ text ""-                      $$ (case mbRet of-                              Just sv -> text "printf" P.<> parens (printQuotes (fcall <+> text "=" <+> specifier cfg sv P.<> text "\\n")-                                                                              P.<> comma <+> resultVar) P.<> semi-                              Nothing -> text "printf" P.<> parens (printQuotes (fcall <+> text "->\\n")) P.<> semi)-                      $$ vcat (map display outs)-                      )-       post   =   text ""-              $+$ nest 2 (text "return 0" P.<> semi)-              $$  text "}"-              $$  text ""-       nm = text fn-       pairedInputs = matchRands randVals inps-       matchRands _      []                                 = []-       matchRands []     _                                  = die "Run out of driver values!"-       matchRands (r:rs) ((n, CgAtomic sv)            : cs) = ([mkRVal sv r], n, CgAtomic sv) : matchRands rs cs-       matchRands _      ((n, CgArray [])             : _ ) = die $ "Unsupported empty array input " ++ show n-       matchRands rs     ((n, a@(CgArray sws@(sv:_))) : cs)-          | length frs /= l                                 = die "Run out of driver values!"-          | True                                            = (map (mkRVal sv) frs, n, a) : matchRands srs cs-          where l          = length sws-                (frs, srs) = splitAt l rs-       mkRVal sv r = mkConst cfg $ mkConstCV (kindOf sv) r-       mkInp (_,  _, CgAtomic{})         = empty  -- constant, no need to declare-       mkInp (_,  n, CgArray [])         = die $ "Unsupported empty array value for " ++ show n-       mkInp (vs, n, CgArray sws@(sv:_)) =  pprCWord True sv <+> text n P.<> brackets (int (length sws)) <+> text "= {"-                                                      $$ nest 4 (fsep (punctuate comma (align vs)))-                                                      $$ text "};"-                                         $$ text ""-                                         $$ text "printf" P.<> parens (printQuotes (text "Contents of input array" <+> text n P.<> text ":\\n")) P.<> semi-                                         $$ display (n, CgArray sws)-                                         $$ text ""-       mkOut (v, CgAtomic sv)            = pprCWord False sv <+> text v P.<> semi-       mkOut (v, CgArray [])             = die $ "Unsupported empty array value for " ++ show v-       mkOut (v, CgArray sws@(sv:_))     = pprCWord False sv <+> text v P.<> brackets (int (length sws)) P.<> semi-       resultVar = text "__result"-       call = case mbRet of-                Nothing -> fcall P.<> semi-                Just sv -> pprCWord True sv <+> resultVar <+> text "=" <+> fcall P.<> semi-       fcall = nm P.<> parens (fsep (punctuate comma (map mkCVal pairedInputs ++ map mkOVal outs)))-       mkCVal ([v], _, CgAtomic{}) = v-       mkCVal (vs,  n, CgAtomic{}) = die $ "Unexpected driver value computed for " ++ show n ++ render (hcat vs)-       mkCVal (_,   n, CgArray{})  = text n-       mkOVal (n, CgAtomic{})      = text "&" P.<> text n-       mkOVal (n, CgArray{})       = text n-       display (n, CgAtomic sv)         = text "printf" P.<> parens (printQuotes (text " " <+> text n <+> text "=" <+> specifier cfg sv-                                                                                P.<> text "\\n") P.<> comma <+> text n) P.<> semi-       display (n, CgArray [])         =  die $ "Unsupported empty array value for " ++ show n-       display (n, CgArray sws@(sv:_)) =   text "int" <+> nctr P.<> semi-                                        $$ text "for(" P.<> nctr <+> text "= 0;" <+> nctr <+> text "<" <+> int len <+> text "; ++" P.<> nctr P.<> text ")"-                                        $$ nest 2 (text "printf" P.<> parens (printQuotes (text " " <+> entrySpec <+> text "=" <+> spec P.<> text "\\n")-                                                                 P.<> comma <+> nctr <+> comma P.<> entry) P.<> semi)-                  where nctr      = text n P.<> text "_ctr"-                        entry     = text n P.<> text "[" P.<> nctr P.<> text "]"-                        entrySpec = text n P.<> text "[%" P.<> int tab P.<> text "d]"-                        spec      = specifier cfg sv-                        len       = length sws-                        tab       = length $ show (len - 1)---- | Generate the C program-genCProg :: CgConfig -> String -> Doc -> Result -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> Doc -> ([Doc], [String])-genCProg cfg fn proto (Result pinfo kindInfo _tvals _ovals cgs topInps (_, preConsts) tbls _uis axioms (SBVPgm asgns) cstrs origAsserts _) inVars outVars mbRet extDecls-  | isNothing (cgInteger cfg) && KUnbounded `Set.member` kindInfo-  = error $ "SBV->C: Unbounded integers are not supported by the C compiler."-          ++ "\nUse 'cgIntegerSize' to specify a fixed size for SInteger representation."-  | KString `Set.member` kindInfo-  = notyet "Strings"-  | KChar `Set.member` kindInfo-  = notyet "Characters"-  | any isSet kindInfo-  = notyet "Sets (SSet)"-  | any isList kindInfo-  = notyet "Lists (SList)"-  | any isTuple kindInfo-  = notyet "Tuples (STupleN)"-  | isNothing (cgReal cfg) && KReal `Set.member` kindInfo-  = error $ "SBV->C: SReal values are not supported by the C compiler."-          ++ "\nUse 'cgSRealType' to specify a custom type for SReal representation."-  | not (null unsupportedBVs)-  = error $ "SBV->C: Unsupported bit-vector type(s): " ++ intercalate ", " (map show unsupportedBVs)-  | not (null usorts)-  = error $ "SBV->C: Cannot compile functions with uninterpreted sorts: " ++ intercalate ", " usorts-  | hasQuants pinfo-  = error "SBV->C: Cannot compile in the presence of quantified variables."-  | not $ null (progSpecialRels pinfo)-  = error "SBV->C: Cannot compile in the presence of special relations."-  | not (null axioms)-  = error "SBV->C: Cannot compile in the presence of 'smtFunction' definitions, use 'compileToCLib' instead."-  | not (null cstrs)-  = tbd "Explicit constraints"-  | True-  = ([pre, header, post], flagsNeeded)- where notyet m = error $ "SBV->C: " ++ m ++ " are currently not supported by the C compiler. Please get in touch if you'd like support for this feature!"--       asserts | cgIgnoreAsserts cfg = []-               | True                = origAsserts--       usorts = [s | k@(KADT s _ _) <- Set.toList kindInfo, isADT k && not (isRoundingMode k)] -- No support for any sorts other than RoundingMode!--       pre    =  text "/* File:" <+> doubleQuotes (nm P.<> text ".c") P.<> text ". Automatically generated by SBV. Do not edit! */"-              $$ text ""--       header = text "#include" <+> doubleQuotes (nm P.<> text ".h")--       unsupportedBVs = [k | k@(KBounded sg sz) <- Set.toList kindInfo, (not . supported) (sg, sz)]-         where supported (False, sz) = sz `elem` [1, 8, 16, 32, 64]-               supported (True,  sz) = sz `elem` [   8, 16, 32, 64]--       post   = text ""-             $$ vcat (map codeSeg cgs)-             $$ extDecls-             $$ proto-             $$ text "{"-             $$ text ""-             $$ nest 2 (   vcat (concatMap (genIO True . (\v -> (isAlive v, v))) inVars)-                        $$ vcat (merge (map genTbl tbls) (map genAsgn assignments) (map genAssert asserts))-                        $$ sepIf (not (null assignments) || not (null tbls))-                        $$ vcat (concatMap (genIO False . (True,)) outVars)-                        $$ maybe empty mkRet mbRet-                       )-             $$ text "}"-             $$ text ""--       nm = text fn--       assignments = F.toList asgns--       -- Do we need any linker flags for C?-       flagsNeeded = nub $ concatMap (getLDFlag . opRes) assignments-          where opRes (sv, SBVApp o _) = (o, kindOf sv)--       codeSeg (fnm, ls) =  text "/* User specified custom code for" <+> doubleQuotes (text fnm) <+> text "*/"-                         $$ vcat (map text ls)-                         $$ text ""--       ins = case topInps of-               ResultTopInps (is, []) -> is-               ResultTopInps is       -> die $ "Unexpected trackers: " ++ show is-               ResultLamInps is       -> die $ "Unexpected inputs  : " ++ show is--       typeWidth = getMax 0 $ [len (kindOf s) | (s, _) <- assignments] ++ [len (kindOf s) | NamedSymVar s _ <- ins]-                where len (KVar s)           = die $ "Variable: " ++ s-                      len KReal{}            = 5-                      len KFloat{}           = 6 -- SFloat-                      len KDouble{}          = 7 -- SDouble-                      len KString{}          = 7 -- SString-                      len KChar{}            = 5 -- SChar-                      len KUnbounded{}       = 8-                      len KBool              = 5 -- SBool-                      len (KBounded False n) = 5 + length (show n) -- SWordN-                      len (KBounded True  n) = 4 + length (show n) -- SIntN-                      len KRational{}        = die   "Rational."-                      len KFP{}              = die   "Arbitrary float."-                      len (KList s)          = die $ "List sort: "   ++ show s-                      len (KSet  s)          = die $ "Set sort: "    ++ show s-                      len (KTuple s)         = die $ "Tuple sort: "  ++ show s-                      len (KArray  k1 k2)    = die $ "Array sort:  " ++ show (k1, k2)-                      len (KApp s _)         = die $ "Uninterpreted ADT app: " ++ s-                      len (KADT s _ _)       = die $ "Uninterpreted ADT: "     ++ s--                      getMax 8 _      = 8  -- 8 is the max we can get with SInteger, so don't bother looking any further-                      getMax m []     = m-                      getMax m (x:xs) = getMax (m `max` x) xs--       consts = (falseSV, falseCV) : (trueSV, trueCV) : preConsts--       isConst s = isJust (lookup s consts)--       -- TODO: The following is brittle. We should really have a function elsewhere-       -- that walks the SBVExprs and collects the SWs together.-       usedVariables = Set.unions (retSWs : map usedCgVal outVars ++ map usedAsgn assignments)-         where retSWs = maybe Set.empty Set.singleton mbRet--               usedCgVal (_, CgAtomic s)  = Set.singleton s-               usedCgVal (_, CgArray ss)  = Set.fromList ss-               usedAsgn  (_, SBVApp o ss) = Set.union (opSWs o) (Set.fromList ss)--               opSWs (LkUp _ a b)             = Set.fromList [a, b]-               opSWs (IEEEFP (FP_Cast _ _ s)) = Set.singleton s-               opSWs _                        = Set.empty--       isAlive :: (String, CgVal) -> Bool-       isAlive (_, CgAtomic sv) = sv `Set.member` usedVariables-       isAlive (_, _)           = True--       genIO :: Bool -> (Bool, (String, CgVal)) -> [Doc]-       genIO True  (alive, (cNm, CgAtomic sv)) = [declSV typeWidth sv  <+> text "=" <+> text cNm P.<> semi               | alive]-       genIO False (alive, (cNm, CgAtomic sv)) = [text "*" P.<> text cNm <+> text "=" <+> showSV cfg consts sv P.<> semi | alive]-       genIO isInp (_,     (cNm, CgArray sws)) = zipWith genElt sws [(0::Int)..]-         where genElt sv i-                 | isInp = declSV typeWidth sv <+> text "=" <+> text entry       P.<> semi-                 | True  = text entry          <+> text "=" <+> showSV cfg consts sv P.<> semi-                 where entry = cNm ++ "[" ++ show i ++ "]"--       mkRet sv = text "return" <+> showSV cfg consts sv P.<> semi--       genTbl :: ((Int, Kind, Kind), [SV]) -> (Int, Doc)-       genTbl ((i, _, k), elts) =  (location, static <+> text "const" <+> text (show k) <+> text ("table" ++ show i) P.<> text "[] = {"-                                              $$ nest 4 (fsep (punctuate comma (align (map (showSV cfg consts) elts))))-                                              $$ text "};")-         where static   = if location == -1 then text "static" else empty-               location = maximum (-1 : map getNodeId elts)--       getNodeId s@(SV _ (NodeId (_, _, n))) | isConst s = -1-                                             | True      = n--       genAsgn :: (SV, SBVExpr) -> (Int, Doc)-       genAsgn (sv, n) = (getNodeId sv, ppExpr cfg consts n (declSV typeWidth sv) (declSVNoConst typeWidth sv) P.<> semi)--       -- merge tables intermixed with assignments and assertions, paying attention to putting tables as-       -- early as possible and tables right after.. Note that the assignment list (second argument) is sorted on its order-       merge :: [(Int, Doc)] -> [(Int, Doc)] -> [(Int, Doc)] -> [Doc]-       merge tables asgnments asrts = map snd $ merge2 asrts (merge2 tables asgnments)-         where merge2 []               as                  = as-               merge2 ts               []                  = ts-               merge2 ts@((i, t):trest) as@((i', a):arest)-                 | i < i'                                 = (i,  t)  : merge2 trest as-                 | True                                   = (i', a) : merge2 ts arest--       genAssert (msg, cs, sv) = (getNodeId sv, doc)-         where doc =     text "/* ASSERTION:" <+> text msg-                     $$  maybe empty (vcat . map text) (locInfo (getCallStack <$> cs))-                     $$  text " */"-                     $$  text "if" P.<> parens (showSV cfg consts sv)-                     $$  text "{"-                     $+$ nest 2 (vcat [errOut, text "exit(-1);"])-                     $$  text "}"-                     $$  text ""-               errOut = text $ "fprintf(stderr, \"%s:%d:ASSERTION FAILED: " ++ msg ++ "\\n\", __FILE__, __LINE__);"-               locInfo (Just ps) = let loc (f, sl) = concat [srcLocFile sl, ":", show (srcLocStartLine sl), ":", show (srcLocStartCol sl), ":", f ]-                                   in case map loc ps of-                                         []     -> Nothing-                                         (f:rs) -> Just $ (" * SOURCE   : " ++ f) : map (" *            " ++)  rs-               locInfo _         = Nothing--handlePB :: PBOp -> [Doc] -> Doc-handlePB o args = case o of-                    PB_AtMost  k -> addIf (repeat 1) <+> text "<=" <+> int k-                    PB_AtLeast k -> addIf (repeat 1) <+> text ">=" <+> int k-                    PB_Exactly k -> addIf (repeat 1) <+> text "==" <+> int k-                    PB_Le cs   k -> addIf cs         <+> text "<=" <+> int k-                    PB_Ge cs   k -> addIf cs         <+> text ">=" <+> int k-                    PB_Eq cs   k -> addIf cs         <+> text "==" <+> int k--  where addIf :: [Int] -> Doc-        addIf cs = parens $ fsep $ intersperse (text "+") [parens (a <+> text "?" <+> int c <+> text ":" <+> int 0) | (a, c) <- zip args cs]--handleIEEE :: FPOp -> [(SV, CV)] -> [(SV, Doc)] -> Doc -> Doc-handleIEEE w consts as var = cvt w-  where same f                   = (f, f)-        named fnm dnm f          = (f fnm, f dnm)--        cvt (FP_Cast from to m)     = case checkRM (m `lookup` consts) of-                                        Nothing          -> cast $ \[a] -> parens (text (show to)) <+> rnd a-                                        Just (Left  msg) -> die msg-                                        Just (Right msg) -> tbd msg-                                      where -- if we're converting from float to some integral like; first use rint/rintf to do the internal conversion and then cast.-                                            rnd a-                                             | (isFloat from || isDouble from) && (isBounded to || isUnbounded to)-                                             = let f = if isFloat from then "rintf" else "rint"-                                               in text f P.<> parens a-                                             | True-                                             = a--        cvt (FP_Reinterpret f t) = case (f, t) of-                                     (KBounded False 32, KFloat)  -> cast $ cpy "sizeof(SFloat)"-                                     (KBounded False 64, KDouble) -> cast $ cpy "sizeof(SDouble)"-                                     (KFloat,  KBounded False 32) -> cast $ cpy "sizeof(SWord32)"-                                     (KDouble, KBounded False 64) -> cast $ cpy "sizeof(SWord64)"-                                     _                            -> die $ "Reinterpretation from : " ++ show f ++ " to " ++ show t-                                    where cpy sz = \[a] -> let alhs = text "&" P.<> var-                                                               arhs = text "&" P.<> a-                                                           in text "memcpy" P.<> parens (fsep (punctuate comma [alhs, arhs, text sz]))-        cvt FP_Abs               = dispatch $ named "fabsf" "fabs" $ \nm _ [a] -> text nm P.<> parens a-        cvt FP_Neg               = dispatch $ same $ \_ [a] -> text "-" P.<> a-        cvt FP_Add               = dispatch $ same $ \_ [a, b] -> a <+> text "+" <+> b-        cvt FP_Sub               = dispatch $ same $ \_ [a, b] -> a <+> text "-" <+> b-        cvt FP_Mul               = dispatch $ same $ \_ [a, b] -> a <+> text "*" <+> b-        cvt FP_Div               = dispatch $ same $ \_ [a, b] -> a <+> text "/" <+> b-        cvt FP_FMA               = dispatch $ named "fmaf"  "fma"  $ \nm _ [a, b, c] -> text nm P.<> parens (fsep (punctuate comma [a, b, c]))-        cvt FP_Sqrt              = dispatch $ named "sqrtf" "sqrt" $ \nm _ [a]       -> text nm P.<> parens a-        cvt FP_Rem               = dispatch $ named "fmodf" "fmod" $ \nm _ [a, b]    -> text nm P.<> parens (fsep (punctuate comma [a, b]))-        cvt FP_RoundToIntegral   = dispatch $ named "rintf" "rint" $ \nm _ [a]       -> text nm P.<> parens a-        cvt FP_Min               = dispatch $ named "fminf" "fmin" $ \nm k [a, b]    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))-        cvt FP_Max               = dispatch $ named "fmaxf" "fmax" $ \nm k [a, b]    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))-        cvt FP_ObjEqual          = let mkIte   x y z = x <+> text "?" <+> y <+> text ":" <+> z-                                       chkNaN  x     = text "isnan"   P.<> parens x-                                       signbit x     = text "signbit" P.<> parens x-                                       eq      x y   = parens (x <+> text "==" <+> y)-                                       eqZero  x     = eq x (text "0")-                                       negZero x     = parens (signbit x <+> text "&&" <+> eqZero x)-                                   in dispatch $ same $ \_ [a, b] -> mkIte (chkNaN a) (chkNaN b) (mkIte (negZero a) (negZero b) (mkIte (negZero b) (negZero a) (eq a b)))-        cvt FP_IsNormal          = dispatch $ same $ \_ [a] -> text "isnormal" P.<> parens a-        cvt FP_IsSubnormal       = dispatch $ same $ \_ [a] -> text "FP_SUBNORMAL == fpclassify" P.<> parens a-        cvt FP_IsZero            = dispatch $ same $ \_ [a] -> text "FP_ZERO == fpclassify" P.<> parens a-        cvt FP_IsInfinite        = dispatch $ same $ \_ [a] -> text "isinf" P.<> parens a-        cvt FP_IsNaN             = dispatch $ same $ \_ [a] -> text "isnan" P.<> parens a-        cvt FP_IsNegative        = dispatch $ same $ \_ [a] -> text "!isnan" P.<> parens a <+> text "&&" <+> text "signbit"  P.<> parens a-        cvt FP_IsPositive        = dispatch $ same $ \_ [a] -> text "!isnan" P.<> parens a <+> text "&&" <+> text "!signbit" P.<> parens a--        -- grab the rounding-mode, if present, and make sure it's RoundNearestTiesToEven. Otherwise skip.-        fpArgs = case as of-                   []            -> []-                   ((m, _):args)-                     | isRoundingMode m -> case checkRM (m `lookup` consts) of-                                             Nothing          -> args-                                             Just (Left  msg) -> die msg-                                             Just (Right msg) -> tbd msg-                     | True              -> as--        -- Check that the RM is RoundNearestTiesToEven.-        -- If we start supporting other rounding-modes, this would be the point where we'd insert the rounding-mode set/reset code-        -- instead of merely returning OK or not-        checkRM (Just cv@(CV k v))-          | k == kRoundingMode = case v of-                                   CADT ("RoundNearestTiesToEven", []) -> Nothing-                                   CADT (s,                        []) -> Just (Right $ "handleIEEE: Unsupported rounding-mode: " ++ show s ++ " for: " ++ show w)-                                   _                                   -> Just (Left  $ "handleIEEE: Unexpected value for rounding-mode: " ++ show cv ++ " for: " ++ show w)-        checkRM (Just cv) = Just (Left  $ "handleIEEE: Expected rounding-mode, but got: " ++ show cv ++ " for: " ++ show w)-        checkRM Nothing   = Just (Right $ "handleIEEE: Non-constant rounding-mode for: " ++ show w)--        pickOp _          []             = die $ "Cannot determine float/double kind for op: " ++ show w-        pickOp (fOp, dOp) args@((a,_):_) = case kindOf a of-                                             KFloat  -> fOp KFloat  (map snd args)-                                             KDouble -> dOp KDouble (map snd args)-                                             k       -> die $ "handleIEEE: Expected double/float args, but got: " ++ show k ++ " for: " ++ show w--        dispatch (fOp, dOp) = pickOp (fOp, dOp) fpArgs-        cast f              = f (map snd fpArgs)--        -- In SMT-Lib, fpMin/fpMax is underspecified when given +0/-0 as the two arguments. (In any order.)-        -- In C, the second argument is returned. (I think, might depend on the architecture, optimizations etc.).-        -- We'll translate it so that we deterministically return +0.-        -- There's really no good choice here.-        wrapMinMax k a b s = parens cond <+> text "?" <+> fzero <+> text ":" <+> s-          where fzero = text $ if k == KFloat then showCFloat 0 else showCDouble 0-                cond  =                   parens (text "FP_ZERO == fpclassify" P.<> parens a)                                  -- a is zero-                        <+> text "&&" <+> parens (text "FP_ZERO == fpclassify" P.<> parens b)                                  -- b is zero-                        <+> text "&&" <+> parens (text "signbit" P.<> parens a <+> text "!=" <+> text "signbit" P.<> parens b) -- a and b differ in sign--ppExpr :: CgConfig -> [(SV, CV)] -> SBVExpr -> Doc -> (Doc, Doc) -> Doc-ppExpr cfg consts (SBVApp op opArgs) lhs (typ, var)-  | doNotAssign op-  = typ <+> var P.<> semi <+> rhs-  | True-  = lhs <+> text "=" <+> rhs-  where doNotAssign (IEEEFP FP_Reinterpret{}) = True   -- generates a memcpy instead; no simple assignment-        doNotAssign _                         = False  -- generates simple assignment--        rhs = p op (map (showSV cfg consts) opArgs)--        rtc = cgRTC cfg--        cBinOps = [ (Plus, "+"),  (Times, "*"), (Minus, "-")-                  , (Equal False, "==")  -- no strong equality!-                  , (NotEqual, "!="), (LessThan, "<"), (GreaterThan, ">"), (LessEq, "<="), (GreaterEq, ">=")-                  , (And, "&"), (Or, "|"), (XOr, "^")-                  ]--        -- see if we can find a constant shift; makes the output way more readable-        getShiftAmnt def [_, sv] = case sv `lookup` consts of-                                    Just (CV _  (CInteger i)) -> integer i-                                    _                         -> def-        getShiftAmnt def _       = def--        hd _ (h:_) = h-        hd w []    = error $ "Data.SBV.C.ppExpr: Impossible happened: " ++ w ++ ", received empty list!"--        p :: Op -> [Doc] -> Doc-        p ReadArray{}       _  = tbd "User specified arrays (ReadArray)"-        p WriteArray{}      _  = tbd "User specified arrays (WriteArray)"-        p (Label s)        [a] = a <+> text "/*" <+> text s <+> text "*/"-        p (IEEEFP w)         as = handleIEEE w  consts (zip opArgs as) var-        p (PseudoBoolean pb) as = handlePB pb as-        p (OverflowOp o) _      = tbd $ "Overflow operations" ++ show o-        p (KindCast _ to)   [a] = parens (text (show to)) <+> a-        p (Uninterpreted s) [] = text "/* Uninterpreted constant */" <+> text (T.unpack s)-        p (Uninterpreted s) as = text "/* Uninterpreted function */" <+> text (T.unpack s) P.<> parens (fsep (punctuate comma as))-        p (Extract i j) [a]    = extract i j (hd "Extract" opArgs) a-        p Join [a, b]          = join (let (s1 : s2 : _) = opArgs in (s1, s2, a, b))-        p (Rol i) [a]          = rotate True  i a (hd "Rol" opArgs)-        p (Ror i) [a]          = rotate False i a (hd "Ror" opArgs)-        p Shl     [a, i]       = shift  True  (getShiftAmnt i opArgs) a -- The order of i/a being reversed here is-        p Shr     [a, i]       = shift  False (getShiftAmnt i opArgs) a -- intentional and historical (from the days when Shl/Shr had a constant parameter.)-        p Not [a]              = case kindOf (hd "Not" opArgs) of-                                   -- be careful about booleans, bitwise complement is not correct for them!-                                   KBool -> text "!" P.<> a-                                   _     -> text "~" P.<> a-        p Ite [a, b, c] = a <+> text "?" <+> b <+> text ":" <+> c-        p (LkUp (t, k, _, len) ind def) []-          | not rtc                    = lkUp -- ignore run-time-checks per user request-          | needsCheckL && needsCheckR = cndLkUp checkBoth-          | needsCheckL                = cndLkUp checkLeft-          | needsCheckR                = cndLkUp checkRight-          | True                       = lkUp-          where [index, defVal] = map (showSV cfg consts) [ind, def]--                lkUp = text "table" P.<> int t P.<> brackets (showSV cfg consts ind)-                cndLkUp cnd = cnd <+> text "?" <+> defVal <+> text ":" <+> lkUp--                checkLeft  = index <+> text "< 0"-                checkRight = index <+> text ">=" <+> int len-                checkBoth  = parens (checkLeft <+> text "||" <+> checkRight)--                canOverflow True  sz = (2::Integer)^(sz-1)-1 >= fromIntegral len-                canOverflow False sz = (2::Integer)^sz    -1 >= fromIntegral len--                (needsCheckL, needsCheckR) = case k of-                                               KVar{}          -> die $ "array index with variable: " ++ show k-                                               KBool           -> (False, canOverflow False (1::Int))-                                               KBounded sg sz  -> (sg, canOverflow sg sz)-                                               KReal           -> die "array index with real value"-                                               KFloat          -> die "array index with float value"-                                               KDouble         -> die "array index with double value"-                                               KFP{}           -> die "array index with arbitrary float value"-                                               KRational       -> die "array index with rational value"-                                               KString         -> die "array index with string value"-                                               KChar           -> die "array index with character value"-                                               KUnbounded      -> case cgInteger cfg of-                                                                    Nothing -> (True, True) -- won't matter, it'll be rejected later-                                                                    Just i  -> (True, canOverflow True i)-                                               KList     s     -> die $ "List sort "   ++ show s-                                               KSet      s     -> die $ "Set sort "    ++ show s-                                               KTuple    s     -> die $ "Tuple sort "  ++ show s-                                               KArray    k1 k2 -> die $ "Array  sort " ++ show (k1, k2)-                                               KApp      s _   -> die $ "ADT app: " ++ s-                                               KADT      s _ _ -> die $ "ADT: "     ++ s--        -- Div/Rem should be careful on 0, in the SBV world x `div` 0 is 0, x `rem` 0 is x-        -- NB: Quot is supposed to truncate toward 0; Not clear to me if C guarantees this behavior.-        -- Brief googling suggests C99 does indeed truncate toward 0, but other C compilers might differ.-        p Quot [a, b] = let k = kindOf (hd "Quot" opArgs)-                            z = mkConst cfg $ mkConstCV k (0::Integer)-                        in protectDiv0 k "/" z a b-        p Rem  [a, b] = protectDiv0 (kindOf (hd "Rem" opArgs)) "%" a a b-        p UNeg [a]    = parens (text "-" <+> a)-        p Abs  [a]    = let f KFloat             = text "fabsf" P.<> parens a-                            f KDouble            = text "fabs"  P.<> parens a-                            f (KBounded False _) = text "/* unsigned, skipping call to abs */" <+> a-                            f (KBounded True 32) = text "labs"  P.<> parens a-                            f (KBounded True 64) = text "llabs" P.<> parens a-                            f KUnbounded         = case cgInteger cfg of-                                                     Nothing -> f $ KBounded True 32 -- won't matter, it'll be rejected later-                                                     Just i  -> f $ KBounded True i-                            f KReal              = case cgReal cfg of-                                                     Nothing           -> f KDouble -- won't matter, it'll be rejected later-                                                     Just CgFloat      -> f KFloat-                                                     Just CgDouble     -> f KDouble-                                                     Just CgLongDouble -> text "fabsl" P.<> parens a-                            f _                  = text "abs" P.<> parens a-                        in f (kindOf (hd "Abs" opArgs))-        -- for And/Or, translate to boolean versions if on boolean kind-        p And [a, b] | kindOf (hd "And" opArgs) == KBool = a <+> text "&&" <+> b-        p Or  [a, b] | kindOf (hd "Or"  opArgs) == KBool = a <+> text "||" <+> b-        p o [a, b]-          | Just co <- lookup o cBinOps-          = a <+> text co <+> b--        p Implies [a, b] | kindOf (hd "Implies" opArgs) == KBool = parens (text "!" P.<> a <+> text "||" <+> b)--        p NotEqual xs = mkDistinct xs-        p o args = die $ "Received operator " ++ show o ++ " applied to " ++ show args--        -- generate a pairwise inequality check-        mkDistinct args = fsep $ andAll $ walk args-          where walk []     = []-                walk (e:es) = map (pair e) es ++ walk es--                pair e1 e2  = parens (e1 <+> text "!=" <+> e2)--                -- like punctuate, but more spacing-                andAll []     = []-                andAll (d:ds) = go d ds-                     where go d' [] = [d']-                           go d' (e:es) = (d' <+> text "&&") : go e es--        -- Div0 needs to protect, but only when the arguments are not float/double. (Div by 0 for those are well defined to be Inf/NaN etc.)-        protectDiv0 k divOp def a b = case k of-                                        KFloat  -> res-                                        KDouble -> res-                                        _       -> wrap-           where res  = a <+> text divOp <+> b-                 wrap = parens (b <+> text "== 0") <+> text "?" <+> def <+> text ":" <+> parens res--        shift toLeft i a = a <+> text cop <+> i-          where cop | toLeft = "<<"-                    | True   = ">>"--        rotate toLeft i a s-          | i < 0   = rotate (not toLeft) (-i) a s-          | i == 0  = a-          | True    = case kindOf s of-                        KBounded True _             -> tbd $ "Rotation of signed quantities: " ++ show (toLeft, i, s)-                        KBounded False sz | i >= sz -> rotate toLeft (i `mod` sz) a s-                        KBounded False sz           ->     parens (a <+> text cop  <+> int i)-                                                      <+> text "|"-                                                      <+> parens (a <+> text cop' <+> int (sz - i))-                        KUnbounded                  -> shift toLeft (int i) a -- For SInteger, rotate is the same as shift in Haskell-                        _                           -> tbd $ "Rotation for unbounded quantity: " ++ show (toLeft, i, s)-          where (cop, cop') | toLeft = ("<<", ">>")-                            | True   = (">>", "<<")--        -- TBD: below we only support the values for extract that are "easy" to implement. These should cover-        -- almost all instances actually generated by SBV, however.-        extract hi lo i a  -- Isolate the bit-extraction case-          | hi == lo, KBounded _ sz <- kindOf i, hi < sz, hi >= 0-          = if hi == 0-            then text "(SBool)" <+> parens (a <+> text "& 1")-            else text "(SBool)" <+> parens (parens (a <+> text ">>" <+> int hi) <+> text "& 1")-        extract hi lo i a-          | srcSize `notElem` [64, 32, 16]-          = bad "Unsupported source size"-          | (hi + 1) `mod` 8 /= 0 || lo `mod` 8 /= 0-          = bad "Unsupported non-byte-aligned extraction"-          | tgtSize < 8 || tgtSize `mod` 8 /= 0-          = bad "Unsupported target size"-          | True-          = text cast <+> shifted-          where bad why    = tbd $ "extract with " ++ show (hi, lo, k, i) ++ " (Reason: " ++ why ++ ".)"--                k          = kindOf i-                srcSize    = intSizeOf k-                tgtSize    = hi - lo + 1-                signChange = srcSize == tgtSize--                cast-                  | signChange && hasSign k = "(SWord" ++ show srcSize ++ ")"-                  | signChange              = "(SInt"  ++ show srcSize ++ ")"-                  | True                    = "(SWord" ++ show tgtSize ++ ")"--                shifted-                  | lo == 0 = a-                  | True    = parens (a <+> text ">>" <+> int lo)--        -- TBD: ditto here for join, just like extract above-        join (i, j, a, b) = case (kindOf i, kindOf j) of-                              (KBounded False  8, KBounded False  8) -> parens (parens (text "(SWord16)" <+> a) <+> text "<< 8")  <+> text "|" <+> parens (text "(SWord16)" <+> b)-                              (KBounded False 16, KBounded False 16) -> parens (parens (text "(SWord32)" <+> a) <+> text "<< 16") <+> text "|" <+> parens (text "(SWord32)" <+> b)-                              (KBounded False 32, KBounded False 32) -> parens (parens (text "(SWord64)" <+> a) <+> text "<< 32") <+> text "|" <+> parens (text "(SWord64)" <+> b)-                              (k1,                k2)                -> tbd $ "join with " ++ show ((k1, i), (k2, j))---- same as doubleQuotes, except we have to make sure there are no line breaks..--- Otherwise breaks the generated code.. sigh-printQuotes :: Doc -> Doc-printQuotes d = text $ '"' : ppSameLine d ++ "\""---- Remove newlines.. Useful when generating Makefile and such-ppSameLine :: Doc -> String-ppSameLine = trim . render- where trim ""        = ""-       trim ('\n':cs) = ' ' : trim (dropWhile isSpace cs)-       trim (c:cs)    = c   : trim cs---- Align a bunch of docs to occupy the exact same length by padding in the left by space--- this is ugly and inefficient, but easy to code..-align :: [Doc] -> [Doc]-align ds = map (text . pad) ss-  where ss    = map render ds-        l     = maximum (0 : map length ss)-        pad s = replicate (l - length s) ' ' ++ s---- | Merge a bunch of bundles to generate code for a library. For the final--- config, we simply return the first config we receive, or the default if none.-mergeToLib :: String -> [(CgConfig, CgPgmBundle)] -> (CgConfig, CgPgmBundle)-mergeToLib libName cfgBundles-  | length nubKinds /= 1-  = error $  "Cannot merge programs with differing SInteger/SReal mappings. Received the following kinds:\n"-          ++ unlines (map show nubKinds)-  | True-  = (finalCfg, CgPgmBundle bundleKind $ sources ++ libHeader : [libDriver | anyDriver] ++ [libMake | anyMake])-  where bundles     = map snd cfgBundles-        kinds       = [k | CgPgmBundle k _ <- bundles]-        nubKinds    = nub kinds-        bundleKind  = case nubKinds of-                        bk:_ -> bk-                        []   -> error "Data.SBV.C: Impossible happened: mergeLibs: kinds ended up being empty!"-        files       = concat [fs | CgPgmBundle _ fs <- bundles]-        sigs        = concat [ss | (_, (CgHeader ss, _)) <- files]-        anyMake     = not (null [() | (_, (CgMakefile{}, _)) <- files])-        drivers     = [ds | (_, (CgDriver, ds)) <- files]-        anyDriver   = not (null drivers)-        mkFlags     = nub (concat [xs | (_, (CgMakefile xs, _)) <- files])-        sources     = [(f, (CgSource, [pre, libHInclude, post])) | (f, (CgSource, [pre, _, post])) <- files]-        sourceNms   = map fst sources-        libHeader   = (libName ++ ".h", (CgHeader sigs, [genHeader bundleKind libName sigs empty]))-        libHInclude = text "#include" <+> text (show (libName ++ ".h"))-        libMake     = ("Makefile", (CgMakefile mkFlags, [genLibMake anyDriver libName sourceNms mkFlags]))-        libDriver   = (libName ++ "_driver.c", (CgDriver, mergeDrivers libName libHInclude (zip (map takeBaseName sourceNms) drivers)))-        finalCfg    = case cfgBundles of-                        []         -> defaultCgConfig-                        ((c, _):_) -> c---- | Create a Makefile for the library-genLibMake :: Bool -> String -> [String] -> [String] -> Doc-genLibMake ifdr libName fs ldFlags = foldr1 ($$) [l | (True, l) <- lns]- where ifld = not (null ldFlags)-       ld | ifld = text "${LDFLAGS}"-          | True = empty-       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")-             , (True,  text "")-             , (True,  text "# include any user-defined .mk file in the current directory.")-             , (True,  text "-include *.mk")-             , (True,  text "")-             , (True,  text "CC?=gcc")-             , (True,  text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")-             , (ifld,  text "LDFLAGS?=" P.<> text (unwords ldFlags))-             , (True,  text "AR?=ar")-             , (True,  text "ARFLAGS?=cr")-             , (True,  text "")-             , (not ifdr,  text ("all: " ++ liba))-             , (ifdr,      text ("all: " ++ unwords [liba, libd]))-             , (True,  text "")-             , (True,  text liba P.<> text (": " ++ unwords os))-             , (True,  text "\t${AR} ${ARFLAGS} $@ $^")-             , (True,  text "")-             , (ifdr,  text libd P.<> text (": " ++ unwords [libd ++ ".c", libh]))-             , (ifdr,  text ("\t${CC} ${CCFLAGS} $< -o $@ " ++ liba) <+> ld)-             , (ifdr,  text "")-             , (True,  vcat (zipWith mkObj os fs))-             , (True,  text "clean:")-             , (True,  text "\trm -f *.o")-             , (True,  text "")-             , (True,  text "veryclean: clean")-             , (not ifdr,  text "\trm -f" <+> text liba)-             , (ifdr,      text "\trm -f" <+> text (unwords [liba, libd]))-             , (True,  text "")-             ]-       nm = text libName-       liba = libName ++ ".a"-       libh = libName ++ ".h"-       libd = libName ++ "_driver"-       os   = map (`replaceExtension` ".o") fs-       mkObj o f =  text o P.<> text (": " ++ unwords [f, libh])-                 $$ text "\t${CC} ${CCFLAGS} -c $< -o $@"-                 $$ text ""---- | Create a driver for a library-mergeDrivers :: String -> Doc -> [(FilePath, [Doc])] -> [Doc]-mergeDrivers libName inc ds = pre : concatMap mkDFun ds ++ [callDrivers (map fst ds)]-  where pre =  text "/* Example driver program for" <+> text libName P.<> text ". */"-            $$ text "/* Automatically generated by SBV. Edit as you see fit! */"-            $$ text ""-            $$ text "#include <stdio.h>"-            $$ inc-        mkDFun (f, [_pre, _header, body, _post]) = [header, body, post]-           where header =  text ""-                        $$ text ("void " ++ f ++ "_driver(void)")-                        $$ text "{"-                 post   =  text "}"-        mkDFun (f, _) = die $ "mergeDrivers: non-conforming driver program for " ++ show f-        callDrivers fs =   text ""-                       $$  text "int main(void)"-                       $$  text "{"-                       $+$ nest 2 (vcat (map call fs))-                       $$  nest 2 (text "return 0;")-                       $$  text "}"-        call f =  text psep-               $$ text ptag-               $$ text psep-               $$ text (f ++ "_driver();")-               $$ text ""-           where tag  = "** Driver run for " ++ f ++ ":"-                 ptag = "printf(\"" ++ tag ++ "\\n\");"-                 lsep = replicate (length tag) '='-                 psep = "printf(\"" ++ lsep ++ "\\n\");"---- Does this operation with this result kind require an LD flag?-getLDFlag :: (Op, Kind) -> [String]-getLDFlag (o, k) = flag o-  where math = ["-lm"]--        flag (IEEEFP FP_Cast{})                                     = math-        flag (IEEEFP fop)       | fop `elem` requiresMath           = math-        flag Abs                | k `elem` [KFloat, KDouble, KReal] = math-        flag _                                                      = []--        requiresMath = [ FP_Abs-                       , FP_FMA-                       , FP_Sqrt-                       , FP_Rem-                       , FP_Min-                       , FP_Max-                       , FP_RoundToIntegral-                       , FP_ObjEqual-                       , FP_IsSubnormal-                       , FP_IsInfinite-                       , FP_IsNaN-                       , FP_IsNegative-                       , FP_IsPositive-                       , FP_IsNormal-                       , FP_IsZero-                       ]--{- HLint ignore module "Redundant lambda" -}+-- Default SBV-to-C compiler. This module deliberately remains a thin facade+-- so the implementation can coexist with the compatibility backend in+-- "Data.SBV.Compilers.C.Legacy".+--+-- == Execution model and supported values+--+-- The compiler evaluates a finite symbolic expression graph; it does not+-- invoke an SMT solver at run time. Generated standalone programs and static+-- libraries support:+--+-- * Booleans and signed or unsigned bit-vectors of any positive width.+-- * Exact GMP-backed integers, rational-valued reals, and rationals. The+--   historical bounded integer and native floating-point real mappings remain+--   available through @cgIntegerSize@ and @cgSRealType@.+-- * Native and arbitrary-format IEEE floating point. Arbitrary formats and+--   directed native rounding use LibBF.+-- * Characters, strings, lists, finite or cofinite sets, tuples, and concrete+--   algebraic datatypes, including recursive datatypes.+-- * Finite lookup tables and persistent arrays created from constants,+--   writes, retained lambdas, or caller-provided lookup callbacks. Direct+--   array equality enumerates supported finite key domains, subject to+--   @cgArrayEqualityLimit@ (256 keys by default).+-- * First-order @smtFunction@ definitions and SBV's firstified+--   @smtHOFunction@ specializations, including recursive and mutually+--   recursive groups, closed nested array lambdas, explicit closure+--   environments, hard constraints as executable preconditions, scalar and+--   grouped results, and multi-function static libraries.+-- * Regular-expression membership and language equality, compiled using bounded+--   automata without additional dependencies. Generation budgets are configurable;+--   successfully generated matchers accept strings of arbitrary length.+--+-- Numeric lowering includes exact-width arithmetic, comparisons, shifts,+-- rotations, joins and extractions, overflow predicates, conversions,+-- divisibility, and integer exponentiation. Mapped reals additionally support+-- the C @libm@ transcendental operations. Exact rational reals reject those+-- operations because their results cannot in general be represented by GMP+-- rationals; select @cgSRealType@ when an approximation is acceptable.+--+-- == Deliberate boundaries+--+-- Quantifiers, special solver relations, uninterpreted sorts, and soft+-- constraints are rejected. General extensional array equality and arrays nested+-- in compared values remain unsupported. Array lambdas must be closed; capturing+-- outer symbolic values is rejected during generation. The C backend compiles+-- higher-order uses after SBV has firstified them; it does not expose symbolic+-- functions as runtime C values.+--+-- Import "Data.SBV.Compilers.C.Legacy" to retain the previous compiler while+-- migrating code that encounters one of these boundaries.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C+  ( compileToC+  , compileToCLib+  , compileToC'+  , compileToCLib'+  ) where++import Data.SBV.Compilers.C.Backend (compileToC, compileToC', compileToCLib, compileToCLib')
+ Data/SBV/Compilers/C/ADT.hs view
@@ -0,0 +1,1083 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.ADT+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Algebraic-data-type lowering for the SBV-to-C compiler.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.ADT+  ( adtKinds+  , resolveADTReferences+  , adtCType+  , adtForwardTypeDecls+  , adtTypeDecls+  , adtTypeDeclsFor+  , adtDeclarationDependencies+  , adtEqualityRuntimeDecls+  , adtEqualityRuntime+  , adtOwnershipTypePrototypes+  , adtOwnershipTypeDecls+  , adtOwnedCloneName+  , adtOwnedReleaseName+  , adtDriverInit+  , adtValue+  , adtConst+  , adtExpr+  , adtUsesExact+  , adtNeedsOwnership+  , adtIsRecursive+  , adtDriverValue+  , adtPrint+  , adtPrintHelpers+  , adtConstructors+  ) where++import qualified Data.Graph as DG+import Data.List                       (find, nub)+import qualified Data.Set as Set+import qualified Data.Text as T++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Array      (arrayStoredLoad, arrayStoredValue)+import Data.SBV.Compilers.C.BV         (isWideBV, wideBVEqual)+import Data.SBV.Compilers.C.FP         (arbitraryFPEqual, arbitraryFPObjectEqual, nativeFPObjectEqual)+import Data.SBV.Compilers.C.GMP        (gmpDriverAssign, gmpFunctionName, gmpOutputType, isExactGMPKind)+import Data.SBV.Compilers.C.List       ( listClone+                                       , listDriverClear+                                       , listDriverInit+                                       , listEqual+                                       , listNeedsDriverInit+                                       , listRelease+                                       )+import Data.SBV.Compilers.C.Lowering   (CLowering(..), expressionLowering)+import Data.SBV.Compilers.C.Syntax     (cUnusedAttribute, cCommentText)+import Data.SBV.Compilers.C.Set        ( setClone+                                       , setDriverClear+                                       , setDriverInit+                                       , setEqual+                                       , setNeedsDriverInit+                                       , setRelease+                                       )+import Data.SBV.Compilers.C.Tuple      ( tupleOwnedInitName+                                       , tupleOwnedReleaseName+                                       , tupleOwnedSetName+                                       , tupleNeedsOwnership+                                       )+import Data.SBV.Compilers.C.Types      (isConcreteADT, adtCType, elementCType, tupleFieldName, adtOwnedInitName, adtOwnedSetName, adtOwnedCloneName, adtOwnedReleaseName, adtEqualName)+import Data.SBV.Compilers.C.Value      (byValueEqual, managedValueClone, managedValueRelease, valueNeedsOwnership)+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data+import Data.SBV.Core.Kind              (expandKinds, substituteADTVars)+import Data.SBV.Core.Symbolic          (ADTOp(..))++-- | A concrete ADT field and whether its declaration is a recursive pointer+-- edge within the same strongly connected component.+data ADTField = ADTField Kind Bool++-- | Return the used concrete, non-built-in ADT kinds in dependency order.+-- The first set supplies every registered ADT template and the second supplies+-- the kinds actually reached by the program. References through 'KApp' are+-- accepted for both acyclic and recursive declarations. Recursive components+-- are kept adjacent so their C layouts can use forward-declared pointer edges.+adtKinds :: Set.Set Kind -> Set.Set Kind -> [Kind]+adtKinds registeredKinds usedKinds = concatMap orderedComponent (DG.stronglyConnComp dependencyNodes)+ where registeredADTs = nub (filter isConcreteADT (Set.toAscList registeredKinds))+       usedADTs       = nub (filter isConcreteADT (Set.toAscList usedKinds))+       adts           = closeRegistry usedADTs++       dependencyNodes = [(kind, adtKey kind, dependencies kind) | kind <- adts]++       closeRegistry current+         | length expanded == length current = current+         | True                              = closeRegistry expanded+        where referenced = [ application+                           | kind <- current+                           , application@KApp{} <- referenceApplications kind+                           ]+              expanded = nub (current ++ map (resolveADTReferences registeredADTs) referenced)++       referenceApplications (KADT typeName parameters constructors) =+         [ application+         | (_, fields) <- constructors+         , field <- fields+         , application@KApp{} <- expandKinds (substituteADTVars typeName parameters field)+         ]+       referenceApplications kind = error $ "SBV->C: Expected an ADT kind, received " ++ show kind++       dependencies kind =+         [ (referencedName, referencedArguments)+         | KApp referencedName referencedArguments <- referenceApplications kind+         ]++       orderedComponent (DG.AcyclicSCC kind)           = [kind]+       orderedComponent (DG.CyclicSCC recursiveKinds) = recursiveKinds++       adtKey (KADT typeName parameters _) = (typeName, map snd parameters)+       adtKey kind = error $ "SBV->C: Expected an ADT kind, received " ++ show kind++-- | Emit forward declarations that permit collection descriptors to refer to+-- ADT element types before their tagged-union layouts are complete.+adtForwardTypeDecls :: [Kind] -> Doc+adtForwardTypeDecls []   = empty+adtForwardTypeDecls adts = text . unlines $ concatMap forwardDeclaration adts+ where forwardDeclaration kind =+         [ "#ifndef " ++ adtForwardGuard kind+         , "#define " ++ adtForwardGuard kind+         , "typedef struct " ++ adtCType kind ++ " " ++ adtCType kind ++ ";"+         , "#endif"+         , ""+         ]++-- | Emit public tagged-union declarations for all ADT kinds used by a program.+adtTypeDecls :: CgConfig -> [Kind] -> Doc+adtTypeDecls cfg adts = adtTypeDeclsFor cfg adts adts++-- | Emit selected public tagged-union declarations using the complete ADT+-- registry to resolve constructor fields. This supports dependency-ordered+-- interleaving with tuple declarations.+adtTypeDeclsFor :: CgConfig -> [Kind] -> [Kind] -> Doc+adtTypeDeclsFor _ _        []           = empty+adtTypeDeclsFor _ registry declarations = text . unlines $+     [ "/* Algebraic data types. Recursive fields form finite, acyclic pointer graphs. */"+     , "/* Inputs borrow these graphs; owned outputs and returns must be released. */"+     , cUnusedAttribute+     , ""+     ]+  ++ concatMap forwardDeclaration declarations+  ++ concatMap declaration declarations+  ++ dereferenceDeclarations+ where forwardDeclaration kind =+          [ "#ifndef " ++ adtForwardGuard kind+          , "#define " ++ adtForwardGuard kind+          , "typedef struct " ++ adtCType kind ++ " " ++ adtCType kind ++ ";"+          , "#endif"+          , ""+          ]++       declaration kind =+            [ "#ifndef " ++ adtGuard kind+            , "#define " ++ adtGuard kind+            , "typedef enum {"+            ]+         ++ zipWith (enumEntry kind) [1 :: Int ..] constructors+         ++ [ "} " ++ adtTagCType kind ++ ";"+            , "struct " ++ adtCType kind ++ " {"+            , "  " ++ adtTagCType kind ++ " tag;"+            ]+         ++ payloadDeclaration kind+         ++ [ "};"+            , "#endif"+            , ""+            ]+        where constructors = adtConstructorFields registry kind++       enumEntry kind index _ = "  " ++ adtTagName kind index ++ " = " ++ show (index - 1)+                             ++ if index == length (adtConstructorFields registry kind) then "" else ","++       payloadDeclaration kind+         | null populated = []+         | True           = ["  union {"] ++ concatMap constructorPayload populated ++ ["  } payload;"]+        where populated = [ (index, fields)+                          | (index, (_, fields)) <- zip [1 :: Int ..] (adtConstructorFields registry kind)+                          , not (null fields)+                          ]+              constructorPayload (constructorIndex, fields) =+                   ["    struct {"]+                ++ zipWith fieldDeclaration [1 :: Int ..] fields+                ++ ["    } " ++ adtConstructorMember constructorIndex ++ ";"]+              fieldDeclaration fieldIndex field = "      " ++ adtFieldCType field ++ " " ++ adtFieldName fieldIndex ++ ";"++       recursiveKinds = filter (adtIsRecursive registry) declarations++       dereferenceDeclarations = concatMap dereferenceDeclaration recursiveKinds++       dereferenceDeclaration kind =+         [ "#ifndef " ++ dereferenceGuard kind+         , "#define " ++ dereferenceGuard kind+         , "static inline SBV_CGEN_UNUSED " ++ adtCType kind ++ " " ++ adtDereferenceName kind+        ++ "(const " ++ adtCType kind ++ " *value)"+         , "{"+         , "  if (value == NULL) abort();"+         , "  return *value;"+         , "}"+         , "#endif"+         , ""+         ]++-- | Return complete by-value tuple and ADT dependencies of one ADT layout.+-- Recursive pointer fields need only a forward declaration and are excluded.+adtDeclarationDependencies :: [Kind] -> Kind -> [Kind]+adtDeclarationDependencies adts kind = nub+  [ fieldKind+  | (_, fields) <- adtConstructorFields adts kind+  , ADTField fieldKind recursive <- fields+  , not recursive+  , isTuple fieldKind || isConcreteADT fieldKind+  ]++-- | Emit forward declarations for the ADT equality helpers used by collection+-- element comparisons.+adtEqualityRuntimeDecls :: [Kind] -> Doc+adtEqualityRuntimeDecls []   = empty+adtEqualityRuntimeDecls adts = text . unlines $ concatMap prototypes [False, True]+ where prototypes strong =+         [ "static SBV_CGEN_UNUSED bool " ++ adtEqualName strong kind+        ++ "(" ++ adtCType kind ++ " left, " ++ adtCType kind ++ " right);"+         | kind <- adts+         ] ++ [""]++-- | Emit private structural-equality helpers for concrete ADTs. These+-- definitions follow the collection runtimes so managed fields can reuse the+-- same list and set equality semantics as top-level expressions.+adtEqualityRuntime :: CgConfig -> [Kind] -> Doc+adtEqualityRuntime cfg adts+  | null adts = empty+  | True      = text . unlines $ concatMap definitions [False, True]+ where definitions strong = concatMap (definition strong) adts++       definition strong kind =+          [ "static SBV_CGEN_UNUSED bool " ++ adtEqualName strong kind+         ++ "(" ++ adtCType kind ++ " left, " ++ adtCType kind ++ " right)"+          , "{"+          , "  if (left.tag != right.tag) return false;"+          , "  switch (left.tag) {"+          ]+        ++ concatMap (equalityCase strong kind) (zip [1 :: Int ..] (adtConstructorFields adts kind))+        ++ [ "    default: abort();"+           , "  }"+           , "}"+           , ""+           ]++       equalityCase strong kind (constructorIndex, (_, fields)) =+          ["    case " ++ adtTagName kind constructorIndex ++ ":"]+        ++ concatMap (nullChecks constructorIndex) (zip [1 :: Int ..] fields)+        ++ ["      return " ++ render (andExpressions comparisons) ++ ";"]+        where comparisons = zipWith (compareField strong constructorIndex) [1 :: Int ..] fields++       nullChecks constructorIndex (fieldIndex, ADTField _ True) =+         [ "      if (" ++ render (adtField (text "left") constructorIndex fieldIndex) ++ " == NULL"+        ++ " || " ++ render (adtField (text "right") constructorIndex fieldIndex) ++ " == NULL) abort();"+         ]+       nullChecks _ _ = []++       compareField strong constructorIndex fieldIndex (ADTField fieldKind recursive)+         | recursive = text (adtEqualName strong fieldKind)+                    P.<> parens (fsep (punctuate comma [deref "left", deref "right"]))+         | True      = adtFieldEqual cfg adts strong fieldKind+                         (adtField (text "left")  constructorIndex fieldIndex)+                         (adtField (text "right") constructorIndex fieldIndex)+        where deref side = text "*" P.<> parens (adtField (text side) constructorIndex fieldIndex)++-- | Emit forward declarations for the uniform ADT ownership helpers. These+-- precede tuple helper definitions so tuples and ADTs can contain one another+-- without imposing an ownership-definition order.+adtOwnershipTypePrototypes :: [Kind] -> Doc+adtOwnershipTypePrototypes []   = empty+adtOwnershipTypePrototypes adts = text . unlines $ concatMap prototypes adts+ where prototypes kind =+         [ "static inline SBV_CGEN_UNUSED void " ++ adtOwnedInitName kind+        ++ "(" ++ adtCType kind ++ " *value, " ++ adtTagCType kind ++ " tag);"+         , "static inline SBV_CGEN_UNUSED void " ++ adtOwnedReleaseName kind+        ++ "(" ++ adtCType kind ++ " *value);"+         , "static inline SBV_CGEN_UNUSED void " ++ adtOwnedSetName kind+        ++ "(" ++ adtCType kind ++ " *target, " ++ adtCType kind ++ " source);"+         , "static inline SBV_CGEN_UNUSED " ++ adtCType kind ++ " " ++ adtOwnedCloneName kind+        ++ "(" ++ adtCType kind ++ " source);"+         , ""+         ]++-- | Emit public ownership-helper definitions for concrete ADTs. Inputs borrow+-- their field storage. Cloned values own all managed fields of the active+-- constructor and must be released with 'adtOwnedReleaseName'; by-value ADTs+-- use the same uniform protocol so collections need no representation-specific+-- branch.+adtOwnershipTypeDecls :: CgConfig -> [Kind] -> Doc+adtOwnershipTypeDecls cfg adts+  | null adts = empty+  | True      = text . unlines $ concatMap declaration adts+ where declaration kind =+          [ "#ifndef " ++ ownershipGuard+          , "#define " ++ ownershipGuard+          , "/* Deep-ownership helpers for " ++ adtCType kind ++ ". */"+          , "/* Owned values have unique ownership; clone before copying and release every owner. */"+          , initSignature+          , "{"+          , "  if (value == NULL) abort();"+          , "  memset(value, 0, sizeof *value);"+          , "  value->tag = tag;"+          , "  switch (tag) {"+          ]+          ++ concatMap (constructorCase initializeField kind) indexedConstructors+          ++ [ "    default: abort();"+          , "  }"+          , "}"+          , ""+          , releaseSignature+          , "{"+          , "  if (value == NULL) return;"+          , "  switch (value->tag) {"+          ]+          ++ concatMap (constructorCase releaseField kind) indexedConstructors+          ++ [ "    default: abort();"+          , "  }"+          , "  memset(value, 0, sizeof *value);"+          , "}"+          , ""+          , setSignature+          , "{"+          , "  if (target == NULL) abort();"+          , "  if (target->tag != source.tag) {"+          , "    " ++ adtOwnedReleaseName kind ++ "(target);"+          , "    " ++ adtOwnedInitName kind ++ "(target, source.tag);"+          , "  }"+          , "  switch (source.tag) {"+          ]+          ++ concatMap (constructorCase setField kind) indexedConstructors+          ++ [ "    default: abort();"+          , "  }"+          , "}"+          , ""+          , cloneSignature+          , "{"+          , "  " ++ adtCType kind ++ " result;"+          , "  " ++ adtOwnedInitName kind ++ "(&result, source.tag);"+          , "  " ++ adtOwnedSetName kind ++ "(&result, source);"+          , "  return result;"+          , "}"+          , "#endif"+          , ""+         ]+         where ownershipGuard = adtCType kind ++ "_OWNERSHIP_DEFINED"++               initSignature = "static inline SBV_CGEN_UNUSED void "+                            ++ adtOwnedInitName kind+                            ++ "(" ++ adtCType kind ++ " *value, " ++ adtTagCType kind ++ " tag)"++               releaseSignature = "static inline SBV_CGEN_UNUSED void "+                               ++ adtOwnedReleaseName kind+                               ++ "(" ++ adtCType kind ++ " *value)"++               setSignature = "static inline SBV_CGEN_UNUSED void "+                           ++ adtOwnedSetName kind+                           ++ "(" ++ adtCType kind ++ " *target, " ++ adtCType kind ++ " source)"++               cloneSignature = "static inline SBV_CGEN_UNUSED "+                             ++ adtCType kind ++ " " ++ adtOwnedCloneName kind+                             ++ "(" ++ adtCType kind ++ " source)"++               indexedConstructors = zip [1 :: Int ..] (adtConstructorFields adts kind)++       constructorCase renderField kind (constructorIndex, (_, fields)) =+          [ "    case " ++ adtTagName kind constructorIndex ++ ": {" ]+          ++ concat (zipWith (renderField constructorIndex) [1 :: Int ..] fields)+          ++ [ "      break;"+          , "    }"+          ]++       initializeField constructorIndex fieldIndex (ADTField fieldKind recursive)+         | recursive+         = []+         | isExactGMPKind cfg fieldKind+         = let access  = ownedField "value->" constructorIndex fieldIndex+               mutable = gmpOutputType fieldKind+               local   = "field" ++ show constructorIndex ++ "_" ++ show fieldIndex+           in [ "      " ++ mutable ++ " " ++ local ++ " = (" ++ mutable ++ ") malloc(sizeof(*" ++ local ++ "));"+              , "      if (" ++ local ++ " == NULL) abort();"+              , "      " ++ gmpFunctionName fieldKind "init" ++ "(" ++ local ++ ");"+              , "      " ++ access ++ " = " ++ local ++ ";"+              ]+         | fieldKind == KString+         = [ "      " ++ ownedField "value->" constructorIndex fieldIndex+          ++ " = (SString) {NULL, 0, 0};"+           ]+         | isList fieldKind+         = [ "      " ++ ownedField "value->" constructorIndex fieldIndex+          ++ " = (" ++ elementCType fieldKind ++ ") {NULL, 0};"+           ]+         | isSet fieldKind+         = [ "      " ++ ownedField "value->" constructorIndex fieldIndex+          ++ " = (" ++ elementCType fieldKind ++ ") {NULL, 0, false};"+           ]+         | isArray fieldKind+         = ["      " ++ ownedField "value->" constructorIndex fieldIndex ++ " = NULL;"]+         | tupleNeedsOwnership cfg fieldKind+         = [ "      " ++ tupleOwnedInitName fieldKind+          ++ "(&" ++ ownedField "value->" constructorIndex fieldIndex ++ ");"+           ]+         | isConcreteADT fieldKind+         , adtNeedsOwnership cfg adts fieldKind+         = [ "      " ++ adtOwnedInitName fieldKind+          ++ "(&" ++ ownedField "value->" constructorIndex fieldIndex+          ++ ", " ++ adtTagName fieldKind 1 ++ ");"+           ]+         | True+         = []++       setField constructorIndex fieldIndex (ADTField fieldKind recursive)+         | recursive+         = [ "      " ++ adtCType fieldKind ++ " *" ++ copy+          ++ " = (" ++ adtCType fieldKind ++ " *) malloc(sizeof *" ++ copy ++ ");"+           , "      if (" ++ copy ++ " == NULL || " ++ source ++ " == NULL) abort();"+           , "      *" ++ copy ++ " = " ++ adtOwnedCloneName fieldKind ++ "(*" ++ source ++ ");"+           , "      if (" ++ target ++ " != NULL) {"+           , "        " ++ adtOwnedReleaseName fieldKind ++ "(" ++ target ++ ");"+           , "        free(" ++ target ++ ");"+           , "      }"+           , "      " ++ target ++ " = " ++ copy ++ ";"+           ]+         | isExactGMPKind cfg fieldKind+         = [ "      " ++ gmpFunctionName fieldKind "set"+          ++ "((" ++ gmpOutputType fieldKind ++ ") " ++ target ++ ", " ++ source ++ ");"+           ]+         | fieldKind == KString+         = [ "      const SString " ++ copy+          ++ " = " ++ render (managedValueClone fieldKind (text source)) ++ ";"+           , "      " ++ render (managedValueRelease fieldKind (text ("&" ++ target)))+           , "      " ++ target ++ " = " ++ copy ++ ";"+           ]+         | isList fieldKind+         = [ "      const " ++ elementCType fieldKind ++ " " ++ copy+          ++ " = " ++ render (listClone fieldKind (text source)) ++ ";"+           , "      " ++ render (listRelease fieldKind (text target))+           , "      " ++ target ++ " = " ++ copy ++ ";"+           ]+         | isSet fieldKind+         = [ "      const " ++ elementCType fieldKind ++ " " ++ copy+          ++ " = " ++ render (setClone fieldKind (text source)) ++ ";"+           , "      " ++ render (setRelease fieldKind (text target))+           , "      " ++ target ++ " = " ++ copy ++ ";"+           ]+         | isArray fieldKind+         = [ "      " ++ elementCType fieldKind ++ " " ++ copy+          ++ " = " ++ render (managedValueClone fieldKind (text source)) ++ ";"+           , "      " ++ render (managedValueRelease fieldKind (text ("&" ++ target)))+           , "      " ++ target ++ " = " ++ copy ++ ";"+           ]+         | tupleNeedsOwnership cfg fieldKind+         = ["      " ++ tupleOwnedSetName fieldKind ++ "(&" ++ target ++ ", " ++ source ++ ");"]+         | isConcreteADT fieldKind+         , adtNeedsOwnership cfg adts fieldKind+         = ["      " ++ adtOwnedSetName fieldKind ++ "(&" ++ target ++ ", " ++ source ++ ");"]+         | True+         = ["      " ++ target ++ " = " ++ source ++ ";"]+        where target = ownedField "target->" constructorIndex fieldIndex+              source = ownedField "source."  constructorIndex fieldIndex+              copy   = "copy" ++ show constructorIndex ++ "_" ++ show fieldIndex++       releaseField constructorIndex fieldIndex (ADTField fieldKind recursive)+         | recursive+         = [ "      if (" ++ access ++ " != NULL) {"+           , "        " ++ adtOwnedReleaseName fieldKind ++ "(" ++ access ++ ");"+           , "        free(" ++ access ++ ");"+           , "      }"+           ]+         | isExactGMPKind cfg fieldKind+         = [ "      if (" ++ access ++ " != NULL) {"+           , "        " ++ gmpFunctionName fieldKind "clear" ++ "((" ++ gmpOutputType fieldKind ++ ") " ++ access ++ ");"+           , "        free((void *) " ++ access ++ ");"+           , "      }"+           ]+         | fieldKind == KString+         = ["      " ++ render (managedValueRelease fieldKind (text ("&" ++ access)))]+         | isList fieldKind+         = ["      " ++ render (listRelease fieldKind (text access))]+         | isSet fieldKind+         = ["      " ++ render (setRelease fieldKind (text access))]+         | isArray fieldKind+         = ["      " ++ render (managedValueRelease fieldKind (text ("&" ++ access)))]+         | tupleNeedsOwnership cfg fieldKind+         = ["      " ++ tupleOwnedReleaseName fieldKind ++ "(&" ++ access ++ ");"]+         | isConcreteADT fieldKind && adtNeedsOwnership cfg adts fieldKind+         = ["      " ++ adtOwnedReleaseName fieldKind ++ "(&" ++ access ++ ");"]+         | True+         = []+        where access = ownedField "value->" constructorIndex fieldIndex++       ownedField root constructorIndex fieldIndex = root+                                                    ++ "payload."+                                                    ++ adtConstructorMember constructorIndex+                                                    ++ "."+                                                    ++ adtFieldName fieldIndex++-- | Initialize a generated-driver ADT and populate its active constructor+-- from a seed. Managed fields use the public owned-ADT storage protocol; other+-- fields use the supplied scalar renderer. The statement renderer initializes+-- retained values that occur through nested aggregate fields.+adtDriverInit :: CgConfig -> [Kind] -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> String -> Integer -> Doc+adtDriverInit cfg adts renderValue initializeValue kind externalName seed+  | isConcreteADT kind+  , adtNeedsOwnership cfg adts kind+  =  text (adtCType kind) <+> text externalName P.<> semi+  $$ initialize kind (text externalName) constructorIndex+  $$ vcat (assignConstructor maximumDepth kind (text externalName) externalName constructorIndex fields seed)+  | True+  = error $ "SBV->C: Expected an owned ADT, received " ++ show kind+ where maximumDepth = max 3 (length adts + 1)+       (constructorIndex, fields) = chooseConstructor maximumDepth kind seed++       initialize fieldKind access index = text (adtOwnedInitName fieldKind)+         P.<> parens (fsep (punctuate comma [text "&" P.<> parens access, text (adtTagName fieldKind index)]))+         P.<> semi++       release fieldKind access = text (adtOwnedReleaseName fieldKind)+         P.<> parens (text "&" P.<> parens access)+         P.<> semi++       assignConstructor depth _ access accessName index fieldKinds fieldSeed = concat+         (zipWith (assignField depth access accessName index) [1 :: Int ..] (zip fieldKinds [fieldSeed ..]))++       assignField depth access accessName constructor fieldIndex (field, nestedSeed) =+         assignAt depth field fieldAccess fieldName nestedSeed+        where fieldAccess = adtField access constructor fieldIndex+              fieldName   = accessName ++ "_constructor_" ++ show constructor ++ "_field_" ++ show fieldIndex++       assignAt depth (ADTField fieldKind recursive) access accessName fieldSeed+         | recursive+         = let nestedDepth                   = depth - 1+               (nestedIndex, nestedFields)  = chooseConstructor nestedDepth fieldKind fieldSeed+               dereferenced                 = text "*" P.<> parens access+           in [ access <+> text "=" <+> parens (text (adtCType fieldKind) <+> text "*")+                  <+> text "malloc" P.<> parens (text "sizeof" <+> text "*" P.<> parens access) P.<> semi+              , text "if" <+> parens (access <+> text "== NULL") <+> text "abort" P.<> parens empty P.<> semi+              , initialize fieldKind dereferenced nestedIndex+              ]+           ++ assignConstructor nestedDepth fieldKind dereferenced (accessName ++ "_recursive") nestedIndex nestedFields fieldSeed+         | isExactGMPKind cfg fieldKind+         = exactAssignments fieldKind access fieldSeed+         | fieldKind == KString+         = [access <+> text "=" <+> managedValueClone fieldKind (renderValue fieldKind fieldSeed) P.<> semi]+         | isArray fieldKind+         = [ initializeValue fieldKind accessName fieldSeed+           , access <+> text "=" <+> text accessName P.<> semi+           ]+         | isList fieldKind+         = collectionAssignment listNeedsDriverInit listDriverInit listDriverClear listClone+         | isSet fieldKind+         = collectionAssignment setNeedsDriverInit setDriverInit setDriverClear setClone+         | KTuple fieldKinds <- fieldKind+         , tupleNeedsOwnership cfg fieldKind+         = concat (zipWith assignTupleField [1 :: Int ..] (zip fieldKinds [fieldSeed ..]))+         | isConcreteADT fieldKind+         , adtNeedsOwnership cfg adts fieldKind+         = let (nestedIndex, nestedFields) = chooseConstructor depth fieldKind fieldSeed+           in release fieldKind access+            : initialize fieldKind access nestedIndex+            : assignConstructor depth fieldKind access accessName nestedIndex nestedFields fieldSeed+         | True+         = [access <+> text "=" <+> renderValue fieldKind fieldSeed P.<> semi]+        where assignTupleField fieldIndex (nestedKind, nestedSeed) = assignAt depth (ADTField nestedKind False) nestedAccess nestedName nestedSeed+                where nestedAccess = access P.<> text "." P.<> text (tupleFieldName fieldIndex)+                      nestedName   = accessName ++ "_field_" ++ show fieldIndex++              collectionAssignment needsDriverInit driverInit driverClear clone+                | needsDriverInit cfg fieldKind+                = [ driverInit cfg renderValue initializeValue fieldKind accessName fieldSeed+                  , access <+> text "=" <+> clone fieldKind (text accessName) P.<> semi+                  , driverClear cfg fieldKind accessName+                  ]+                | True+                = [access <+> text "=" <+> clone fieldKind (renderValue fieldKind fieldSeed) P.<> semi]++       chooseConstructor depth fieldKind fieldSeed+         | null eligible = error $ "SBV->C: Recursive ADT " ++ show fieldKind+                                ++ " has no finite constructor for a generated driver value"+         | True          = let (index, (_, selectedFields)) = eligible !! fromInteger (mod fieldSeed (fromIntegral (length eligible)))+                           in (index, selectedFields)+        where eligible = [(index, constructor)+                         | (index, constructor@(_, candidateFields)) <- zip [1 :: Int ..] (adtConstructorFields adts fieldKind)+                         , all (fits depth) candidateFields+                         ]++       fits _     (ADTField _         False) = True+       fits depth (ADTField fieldKind True)  = depth > 0 && constructible (depth - 1) fieldKind++       constructible depth fieldKind = any (all (fits depth) . snd) (adtConstructorFields adts fieldKind)++       exactAssignments fieldKind access value = gmpDriverAssign fieldKind access (integer value)++-- | Render a concrete ADT value as a C99 compound literal using the enclosing+-- program's complete registry, shared with nested constant rendering.+adtConst :: [Kind] -> (CV -> Doc) -> CV -> Maybe Doc+adtConst adts renderValue cv@(CV kind (CADT (constructorName, fieldValues)))+  | isConcreteADT kind+  , Just (constructorIndex, fieldKinds) <- findConstructor adts kind constructorName+  , map fst fieldValues == fieldKinds+  = Just $ adtValue adts kind constructorIndex+        [arrayStoredValue fieldKind (renderValue (CV fieldKind fieldValue)) | (fieldKind, fieldValue) <- fieldValues]+  | isConcreteADT kind+  = error $ "SBV->C: Malformed ADT constant " ++ show cv+adtConst _ _ _ = Nothing++-- | Lower ADT construction, tests, accessors, equality, conditionals, and labels.+adtExpr :: CgConfig -> [Kind] -> Op -> [SV] -> SV -> [Doc] -> Maybe CLowering+adtExpr cfg adts op svs resultSV args+  | not (isConcreteADT resultKind || any (isConcreteADT . kindOf) svs)+  = Nothing+  | LkUp{} <- op+  = Nothing+  | TupleConstructor{} <- op+  = Nothing+  | TupleAccess{} <- op+  = Nothing+  | Uninterpreted{} <- op+  = Nothing+  | True+  = case (op, svs, args) of+      (ADTOp (ADTConstructor constructorName kind), fields, renderedFields)+        | kind == resultKind+        , Just (constructorIndex, fieldKinds) <- findConstructor adts kind (T.unpack constructorName)+        , map kindOf fields == fieldKinds+        -> lowerConstructor kind constructorIndex (zipWith arrayStoredValue fieldKinds renderedFields)+      (ADTOp (ADTTester testerName operationResultKind), [value], [renderedValue])+        | operationResultKind == resultKind+        , Just constructorIndex <- findTester adts (kindOf value) (T.unpack testerName)+        -> lower $ adtTag renderedValue <+> text "==" <+> text (adtTagName (kindOf value) constructorIndex)+      -- The operation records SBV's scalar result kind, which strips any+      -- surrounding arrays. The accessor field and result SV retain the full kind.+      (ADTOp (ADTAccessor accessorName _operationResultKind), [value], [renderedValue])+        | Just (constructorIndex, fieldIndex, fieldKind, recursive) <- findAccessor adts (kindOf value) (T.unpack accessorName)+        , fieldKind == resultKind+        -> let field = if recursive+                       then text (adtDereferenceName fieldKind)+                         P.<> parens (adtField renderedValue constructorIndex fieldIndex)+                       else adtField renderedValue constructorIndex fieldIndex+           in if isArray resultKind then Just (arrayStoredLoad resultSV field) else lower field+      (Equal strong, [left, right], [renderedLeft, renderedRight])+        | kindOf left == kindOf right+        -> lower $ adtEqual cfg adts strong (kindOf left) renderedLeft renderedRight+      (NotEqual, [left, right], [renderedLeft, renderedRight])+        | kindOf left == kindOf right+        -> lower $ text "!" P.<> parens (adtEqual cfg adts False (kindOf left) renderedLeft renderedRight)+      (comparison, [left, right], [renderedLeft, renderedRight])+        | adtIsEnumeration adts (kindOf left)+        , kindOf left == kindOf right+        , Just comparisonSymbol <- adtComparisonSymbol comparison+        -> lower $ adtTag renderedLeft <+> text comparisonSymbol <+> adtTag renderedRight+      (Label label, [_], [renderedValue])+        -> lower $ renderedValue <+> text "/*" <+> cCommentText label <+> text "*/"+      _ -> error $ "SBV->C: ADT lowering does not support " ++ adtOperationName op+                ++ " with argument kinds " ++ show (map kindOf svs)+                ++ " and result kind " ++ show resultKind+                ++ "; constructors "+                ++ show [constructorName | (constructorName, _) <- adtConstructors adts (sourceADTKind resultKind svs)]+ where resultKind = kindOf resultSV++       lower = Just . expressionLowering []++       lowerConstructor kind constructorIndex renderedFields+         | null recursiveFields+         = lower (adtValue adts kind constructorIndex renderedFields)+         | True+         = Just CLowering+             { loweringExpression   = adtValueWithStorage adts kind constructorIndex storeField renderedFields+             , loweringDeclarations = [text (adtCType fieldKind) <+> text (backingName fieldIndex) P.<> semi+                                      | (fieldIndex, fieldKind, _) <- recursiveFields+                                      ]+             , loweringSetup        = [text (backingName fieldIndex) <+> text "=" <+> field P.<> semi+                                      | (fieldIndex, _, field) <- recursiveFields+                                      ]+             , loweringRequirements = Set.empty+             }+        where fieldInfo = snd (adtConstructorFields adts kind !! (constructorIndex - 1))+              recursiveFields = [ (fieldIndex, fieldKind, field)+                                | (fieldIndex, (ADTField fieldKind True, field)) <- zip [1 :: Int ..] (zip fieldInfo renderedFields)+                                ]++              backingName fieldIndex = "sbv_local_adt_recursive_" ++ show resultSV ++ "_" ++ show fieldIndex++              storeField fieldIndex _ True  _     = text "&" P.<> text (backingName fieldIndex)+              storeField _          _ False field = field++-- | Test whether an ADT contains an exact GMP-backed integer, real, or+-- rational field.+adtUsesExact :: CgConfig -> [Kind] -> Kind -> Bool+adtUsesExact cfg adts = any constructorUsesExact . adtConstructors adts+ where constructorUsesExact (_, fields) = any fieldUsesExact fields+       fieldUsesExact = any (isExactGMPKind cfg) . expandKinds++-- | Test whether an ADT needs deep ownership because it contains collection+-- storage, exact storage, recursive pointers, or another managed aggregate.+adtNeedsOwnership :: CgConfig -> [Kind] -> Kind -> Bool+adtNeedsOwnership cfg adts = needsOwnership Set.empty+ where needsOwnership visited kind+         | kind `Set.member` visited = adtIsRecursive adts kind+         | adtUsesExact cfg adts kind = True+         | True                       = any (any fieldNeedsOwnership . snd) (adtConstructorFields adts kind)+        where next = Set.insert kind visited+              fieldNeedsOwnership (ADTField _         True)  = True+              fieldNeedsOwnership (ADTField fieldKind False)+                | isConcreteADT fieldKind = needsOwnership next fieldKind+                | True                    = valueNeedsOwnership cfg fieldKind++-- | Construct a deterministic driver value, choosing a constructor from the+-- supplied integer and delegating field values to the caller.+adtDriverValue :: [Kind] -> (Kind -> Integer -> Doc) -> Kind -> Integer -> Doc+adtDriverValue adts renderField = construct (max 3 (length adts + 1))+ where construct :: Int -> Kind -> Integer -> Doc+       construct depth kind seed+         | null constructors = error $ "SBV->C: Cannot construct an uninterpreted sort in the C driver: " ++ show kind+         | True              = adtValue adts kind constructorIndex (zipWith renderADTField fields [seed ..])+        where constructors     = adtConstructorFields adts kind+              eligible = [ (index, constructor)+                         | (index, constructor@(_, candidateFields)) <- zip [1 :: Int ..] constructors+                         , all (fits depth) candidateFields+                         ]+              (constructorIndex, (_, fields))+                | null eligible = error $ "SBV->C: Recursive ADT " ++ show kind+                                       ++ " has no finite constructor for a generated driver value"+                | True          = eligible !! fromInteger (mod seed (fromIntegral (length eligible)))++              renderADTField (ADTField fieldKind recursive) fieldSeed+                | isConcreteADT fieldKind = construct (if recursive then depth - 1 else depth) fieldKind fieldSeed+                | True                    = renderField fieldKind fieldSeed++       fits _     (ADTField _         False) = True+       fits depth (ADTField fieldKind True)  = depth > 0 && constructible (depth - 1) fieldKind++       constructible depth kind = any (all (fits depth) . snd) (adtConstructorFields adts kind)++-- | Render C statements that print an ADT value by constructor name and fields.+adtPrint :: [Kind] -> (Kind -> Doc -> Doc) -> Kind -> Doc -> Doc+adtPrint adts printField kind value+  | adtIsRecursive adts kind = text (adtPrintName kind) P.<> parens value P.<> semi+  | True                     = adtPrintSwitch adts printField kind value++-- | Emit mutually recursive driver-side printers for recursive ADTs.+adtPrintHelpers :: [Kind] -> (Kind -> Doc -> Doc) -> Doc+adtPrintHelpers adts printField+  | null recursiveKinds = empty+  | True                = vcat (map prototype recursiveKinds)+                       $$ text ""+                       $$ vcat (map definition recursiveKinds)+ where recursiveKinds = filter (adtIsRecursive adts) adts+       prototype kind = text "static SBV_CGEN_UNUSED void" <+> text (adtPrintName kind)+                     P.<> parens (text (adtCType kind) <+> text "value")+                     P.<> semi+       definition kind = text "#ifndef" <+> text (adtPrintGuard kind)+                      $$ text "#define" <+> text (adtPrintGuard kind)+                      $$ text "static SBV_CGEN_UNUSED void" <+> text (adtPrintName kind)+                      P.<> parens (text (adtCType kind) <+> text "value")+                      $$ text "{"+                      $$ nest 2 (adtPrintSwitch adts printField kind (text "value"))+                      $$ text "}"+                      $$ text "#endif"+                      $$ text ""++-- | Render the tag switch shared by inline and recursive ADT printers.+adtPrintSwitch :: [Kind] -> (Kind -> Doc -> Doc) -> Kind -> Doc -> Doc+adtPrintSwitch adts printField kind value+  = text "switch" <+> parens (adtTag value) <+> text "{"+ $$ nest 2 (vcat (zipWith printConstructor [1 :: Int ..] (adtConstructorFields adts kind))+         $$ text "default: printf(\"<invalid ADT tag>\"); break;")+ $$ text "}"+ where printConstructor constructorIndex (constructorName, fields)+         =  text "case" <+> text (adtTagName kind constructorIndex) P.<> colon+         $$ nest 2 (text "printf" P.<> parens (fsep (punctuate comma [text "\"%s\"", text (show constructorName)])) P.<> semi+                 $$ printFields constructorIndex fields+                 $$ text "break" P.<> semi)++       printFields _                []     = empty+       printFields constructorIndex fields =+            text "printf(\"(\");"+         $$ vcat (zipWith (printOne constructorIndex) [1 :: Int ..] fields)+         $$ text "printf(\")\");"++       printOne constructorIndex fieldIndex (ADTField fieldKind recursive)+         =  (if fieldIndex == 1 then empty else text "printf(\", \");")+         $$ if recursive+            then text "if" <+> parens (fieldValue <+> text "== NULL")+              <+> text "printf(\"<null recursive ADT>\");"+              <+> text "else"+              <+> printField fieldKind (text "*" P.<> parens fieldValue)+            else printField fieldKind fieldValue+        where fieldValue = adtField value constructorIndex fieldIndex++-- | Return the driver-side printer name for a recursive ADT.+adtPrintName :: Kind -> String+adtPrintName kind = "sbv_adt_print_" ++ adtCType kind++-- | Return the preprocessor guard for one driver-side recursive ADT printer.+adtPrintGuard :: Kind -> String+adtPrintGuard kind = adtPrintName kind ++ "_DEFINED"++-- | Return constructors with parameter variables and 'KApp' references+-- replaced by their concrete kinds.+adtConstructors :: [Kind] -> Kind -> [(String, [Kind])]+adtConstructors adts kind = [(constructorName, [fieldKind | ADTField fieldKind _ <- fields])+                            | (constructorName, fields) <- adtConstructorFields adts kind+                            ]++-- | Return concrete constructor fields while retaining which direct 'KApp'+-- references must use pointers to break recursive C layouts.+adtConstructorFields :: [Kind] -> Kind -> [(String, [ADTField])]+adtConstructorFields adts kind@(KADT typeName parameters constructors)+  | isConcreteADT kind = map substituteConstructor constructors+  | True               = error $ "SBV->C: Expected a concrete ADT kind, received " ++ show kind+ where substituteConstructor (constructorName, fields) = (constructorName, map substituteField fields)++       substituteField field = ADTField concrete recursive+        where substituted = substituteADTVars typeName parameters field+              concrete    = resolveADTReferences adts substituted+              recursive   = case substituted of+                              KApp{} -> adtReachable adts concrete kind+                              _ | any (\application -> adtReachable adts (resolveADTReferences adts application) kind)+                                      [application | application@KApp{} <- expandKinds substituted]+                                -> error $ "SBV->C: Recursive ADT references nested inside composite fields are not supported: " ++ show kind+                                         ++ ". Put the recursive reference in a direct constructor field instead."+                                | True -> False+adtConstructorFields _ kind = error $ "SBV->C: Expected an ADT kind, received " ++ show kind++-- | Return whether the second ADT is reachable from the first through ADT+-- declaration references. The visited set makes recursive registries finite.+adtReachable :: [Kind] -> Kind -> Kind -> Bool+adtReachable adts source target = walk Set.empty source+ where walk visited current+         | current == target            = True+         | current `Set.member` visited = False+         | True                         = any (walk (Set.insert current visited)) (adtDependencies adts current)++-- | Return the concrete ADTs referenced directly or through composite fields+-- by one concrete ADT declaration.+adtDependencies :: [Kind] -> Kind -> [Kind]+adtDependencies adts (KADT typeName parameters constructors) = nub+  [ resolveADTReferences adts application+  | (_, fields) <- constructors+  , field <- fields+  , application@KApp{} <- expandKinds (substituteADTVars typeName parameters field)+  ]+adtDependencies _ kind = error $ "SBV->C: Expected an ADT kind, received " ++ show kind++-- | Resolve concrete ADT applications occurring inside a supported composite+-- field without recursively expanding the referenced declaration.+resolveADTReferences :: [Kind] -> Kind -> Kind+resolveADTReferences adts kind@(KApp typeName arguments) =+  case [ (parameters, constructors)+       | KADT candidateName parameters constructors <- adts+       , candidateName == typeName+       , length parameters == length arguments+       ] of+    ((parameters, constructors) : _) -> KADT typeName (zip (map fst parameters) arguments) constructors+    [] -> error $ "SBV->C: Cannot resolve ADT reference " ++ show kind+             ++ "; available concrete ADTs: " ++ show adts+resolveADTReferences adts (KList elementKind) = KList (resolveADTReferences adts elementKind)+resolveADTReferences adts (KSet elementKind) = KSet (resolveADTReferences adts elementKind)+resolveADTReferences adts (KTuple fieldKinds) = KTuple (map (resolveADTReferences adts) fieldKinds)+resolveADTReferences adts (KArray keyKind valueKind) =+  KArray (resolveADTReferences adts keyKind) (resolveADTReferences adts valueKind)+resolveADTReferences _ kind = kind++-- | Render the field-level equality semantics used inside an ADT comparison.+adtFieldEqual :: CgConfig -> [Kind] -> Bool -> Kind -> Doc -> Doc -> Doc+adtFieldEqual cfg adts strong kind left right+  | isWideBV kind                              = wideBVEqual kind left right+  | isFP kind && strong                        = arbitraryFPObjectEqual kind left right+  | isFP kind                                  = arbitraryFPEqual kind left right+  | strong && (isFloat kind || isDouble kind) = nativeFPObjectEqual left right+  | isExactGMPKind cfg kind                    = adtExactEqual kind left right+  | kind == KString                            = byValueEqual cfg strong kind left right+  | isList kind                                = listEqual kind left right+  | isSet kind                                 = setEqual kind left right+  | isArray kind                               = byValueEqual cfg strong kind left right+  | KTuple fields <- kind                      = tupleEqual cfg adts strong fields left right+  | isConcreteADT kind                         = adtEqual cfg adts strong kind left right+  | True                                       = left <+> text "==" <+> right++-- | Render exact equality directly with GMP's public comparison API.+adtExactEqual :: Kind -> Doc -> Doc -> Doc+adtExactEqual KUnbounded left right = text "mpz_cmp"+                                   P.<> parens (fsep (punctuate comma [left, right]))+                                   <+> text "== 0"+adtExactEqual exactKind left right+  | exactKind `elem` [KReal, KRational]+  = text "mpq_cmp"+      P.<> parens (fsep (punctuate comma [left, right]))+      <+> text "== 0"+adtExactEqual kind _ _ = error $ "SBV->C: Expected an exact ADT field, received " ++ show kind++-- | Render structural equality for a tuple nested in an ADT field.+tupleEqual :: CgConfig -> [Kind] -> Bool -> [Kind] -> Doc -> Doc -> Doc+tupleEqual cfg adts strong fields left right = andExpressions comparisons+ where comparisons = zipWith compareField [1 :: Int ..] fields+       compareField index fieldKind = adtFieldEqual cfg adts strong fieldKind+         (parens left  P.<> text ".field" P.<> int index)+         (parens right P.<> text ".field" P.<> int index)++-- | Render tag-sensitive structural equality for two ADT values.+adtEqual :: CgConfig -> [Kind] -> Bool -> Kind -> Doc -> Doc -> Doc+adtEqual cfg adts strong kind left right+  | adtIsRecursive adts kind = text (adtEqualName strong kind)+                            P.<> parens (fsep (punctuate comma [left, right]))+  | True                     = parens $ tagEquality <+> text "&&" <+> constructorEquality+ where tagEquality = parens (adtTag left <+> text "==" <+> adtTag right)+       constructorEquality = parens . orExpressions $ zipWith constructorCase [1 :: Int ..] (adtConstructors adts kind)+       constructorCase constructorIndex (_, fields) = andExpressions+         (parens (adtTag left <+> text "==" <+> text (adtTagName kind constructorIndex))+        : zipWith (fieldEquality constructorIndex) [1 :: Int ..] fields)+       fieldEquality constructorIndex fieldIndex fieldKind = adtFieldEqual cfg adts strong fieldKind+         (adtField left  constructorIndex fieldIndex)+         (adtField right constructorIndex fieldIndex)++-- | Return whether an ADT has at least one pointer-backed recursive field.+adtIsRecursive :: [Kind] -> Kind -> Bool+adtIsRecursive adts = any (any recursive . snd) . adtConstructorFields adts+ where recursive (ADTField _ isRecursive) = isRecursive++-- | Return the generated checked-dereference helper for a recursive ADT edge.+adtDereferenceName :: Kind -> String+adtDereferenceName kind = "sbv_adt_dereference_" ++ adtCType kind++-- | Return the guard protecting one recursive ADT dereference helper.+dereferenceGuard :: Kind -> String+dereferenceGuard kind = adtDereferenceName kind ++ "_DEFINED"++-- | Join Boolean C expressions with short-circuiting conjunction.+andExpressions :: [Doc] -> Doc+andExpressions []          = text "true"+andExpressions expressions = parens (fsep (punctuate (text " &&") expressions))++-- | Join Boolean C expressions with short-circuiting disjunction.+orExpressions :: [Doc] -> Doc+orExpressions []          = text "false"+orExpressions expressions = parens (fsep (punctuate (text " ||") expressions))++-- | Locate a constructor and return its one-based tag and concrete fields.+findConstructor :: [Kind] -> Kind -> String -> Maybe (Int, [Kind])+findConstructor adts kind constructorName = do+  (index, (_, fields)) <- find ((== constructorName) . fst . snd)+                               (zip [1 :: Int ..] (adtConstructors adts kind))+  pure (index, fields)++-- | Locate the constructor named by a canonical @is-Constructor@ tester.+findTester :: [Kind] -> Kind -> String -> Maybe Int+findTester adts kind testerName = fst <$> find matches (zip [1 :: Int ..] (adtConstructors adts kind))+ where matches (_, (constructorName, _)) = testerName == "is-" ++ constructorName++-- | Locate the constructor field named by a canonical+-- @getConstructor_fieldIndex@ accessor.+findAccessor :: [Kind] -> Kind -> String -> Maybe (Int, Int, Kind, Bool)+findAccessor adts kind accessorName = findMatch candidates+ where candidates = [(constructorIndex, fieldIndex, fieldKind, recursive)+                    | (constructorIndex, (constructorName, fields)) <- zip [1 :: Int ..] (adtConstructorFields adts kind)+                    , (fieldIndex, ADTField fieldKind recursive) <- zip [1 :: Int ..] fields+                    , accessorName == "get" ++ constructorName ++ "_" ++ show fieldIndex+                    ]+       findMatch []    = Nothing+       findMatch (x:_) = Just x++-- | Return the C type used for a supported ADT field, introducing a pointer+-- precisely for a recursive dependency edge.+adtFieldCType :: ADTField -> String+adtFieldCType (ADTField kind True) = adtCType kind ++ " *"+adtFieldCType (ADTField kind False)+  | isConcreteADT kind = adtCType kind+adtFieldCType (ADTField kind False) = elementCType kind+++-- | Render the tag-selection expression for an ADT value.+adtTag :: Doc -> Doc+adtTag value = parens value P.<> text ".tag"++-- | Render the payload-selection expression for an ADT field.+adtField :: Doc -> Int -> Int -> Doc+adtField value constructorIndex fieldIndex = parens value+  P.<> text ".payload."+  P.<> text (adtConstructorMember constructorIndex)+  P.<> text "."+  P.<> text (adtFieldName fieldIndex)++-- | Return the generated payload member for a one-based constructor index.+adtConstructorMember :: Int -> String+adtConstructorMember index = "constructor" ++ show index++-- | Return the generated field member for a one-based field index.+adtFieldName :: Int -> String+adtFieldName index = "field" ++ show index++-- | Return the generated enumeration type used for an ADT tag.+adtTagCType :: Kind -> String+adtTagCType kind = adtCType kind ++ "_Tag"++-- | Return the generated enumeration constant for one ADT constructor.+adtTagName :: Kind -> Int -> String+adtTagName kind constructorIndex = adtCType kind ++ "_TAG_" ++ show constructorIndex++-- | Return the preprocessor guard protecting one ADT declaration.+adtGuard :: Kind -> String+adtGuard kind = adtCType kind ++ "_DEFINED"++-- | Return the preprocessor guard protecting one ADT forward declaration.+adtForwardGuard :: Kind -> String+adtForwardGuard kind = adtCType kind ++ "_DECLARED"++-- | Render a C99 tagged-union compound literal.+adtValue :: [Kind] -> Kind -> Int -> [Doc] -> Doc+adtValue adts kind constructorIndex = adtValueWithStorage adts kind constructorIndex storeField+ where storeField _ fieldKind True field+         = text "&"+        P.<> parens (   parens (text (adtCType fieldKind) P.<> brackets (text "1"))+                    P.<> braces field+                   )+        P.<> brackets (text "0")+       storeField _ _ False field = field++-- | Render a C99 tagged-union compound literal while allowing the caller to+-- choose how each recursive pointer field receives its backing storage.+adtValueWithStorage :: [Kind] -> Kind -> Int -> (Int -> Kind -> Bool -> Doc -> Doc) -> [Doc] -> Doc+adtValueWithStorage adts kind constructorIndex storeField fields+  | constructorIndex < 1 || constructorIndex > length constructors+  = error $ "SBV->C: Invalid ADT constructor index " ++ show constructorIndex ++ " for " ++ show kind+  | length fields /= length expectedFields+  = error $ "SBV->C: ADT literal field mismatch for " ++ show kind+  | True+  = parens (text (adtCType kind)) P.<> braces (fsep (punctuate comma initializers))+ where constructors = adtConstructors adts kind+       expectedFields = snd (constructors !! (constructorIndex - 1))+       initializers = text ".tag" <+> text "=" <+> text (adtTagName kind constructorIndex)+                    : zipWith initializer [1 :: Int ..] (zip fields fieldInfo)+       fieldInfo = snd (adtConstructorFields adts kind !! (constructorIndex - 1))+       initializer fieldIndex (field, ADTField fieldKind recursive) = text ".payload."+                                                                    P.<> text (adtConstructorMember constructorIndex)+                                                                    P.<> text "."+                                                                    P.<> text (adtFieldName fieldIndex)+                                                                    <+> text "=" <+> storeField fieldIndex fieldKind recursive field++-- | Return a total diagnostic name for an operation involving an ADT.+adtOperationName :: Op -> String+adtOperationName (ADTOp (ADTConstructor opName _)) = "constructor " ++ show opName+adtOperationName (ADTOp (ADTTester      opName _)) = "tester "      ++ show opName+adtOperationName (ADTOp (ADTAccessor    opName _)) = "accessor "    ++ show opName+adtOperationName LkUp{}                            = "table lookup"+adtOperationName (Equal strong)                    = if strong then "strong equality" else "equality"+adtOperationName NotEqual                          = "inequality"+adtOperationName Ite                               = "conditional"+adtOperationName (Label label)                     = "label " ++ show label+adtOperationName _                                 = "an unsupported operation"++-- | Recover the ADT kind participating in a failed lowering for diagnostics.+sourceADTKind :: Kind -> [SV] -> Kind+sourceADTKind resultKind _+  | isConcreteADT resultKind = resultKind+sourceADTKind _ svs = case filter (isConcreteADT . kindOf) svs of+  value : _ -> kindOf value+  []        -> error "SBV->C: Missing ADT kind in ADT lowering diagnostic"++-- | Return whether every constructor of an ADT is nullary.+adtIsEnumeration :: [Kind] -> Kind -> Bool+adtIsEnumeration adts = all (null . snd) . adtConstructors adts++-- | Return the C comparison token supported for enumeration ADTs.+adtComparisonSymbol :: Op -> Maybe String+adtComparisonSymbol LessThan    = Just "<"+adtComparisonSymbol GreaterThan = Just ">"+adtComparisonSymbol LessEq      = Just "<="+adtComparisonSymbol GreaterEq   = Just ">="+adtComparisonSymbol _           = Nothing
+ Data/SBV/Compilers/C/Arena.hs view
@@ -0,0 +1,76 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Arena+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Shared emission of per-call storage arenas for text and collections.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Arena (CArena(..), arenaRuntime) where++-- | Separate ownership domains sharing the same allocation protocol. Keep+-- their C types and lifetimes independent even though their emitter is shared.+data CArena = TextArena  -- ^ Byte-addressed UTF-8 string storage.+            | ListArena -- ^ Aligned storage for symbolic-list elements.+            | SetArena  -- ^ Aligned storage for symbolic-set elements.++-- | Emit overflow-checked allocation and whole-arena cleanup. Empty allocations+-- return null without allocating. Collection storage retains its long-double+-- alignment and checks both multiplication and header-addition overflow; text+-- storage accepts a byte count directly. Nodes own only their payload buffer,+-- not the managed values referenced by collection elements.+arenaRuntime :: CArena -> [String]+arenaRuntime arena+  = [ "/* Per-call ownership arena for " ++ description ++ " temporaries. */"+    , "typedef struct " ++ nodeType ++ " { struct " ++ nodeType ++ " *next; " ++ payloadType ++ " data[]; } " ++ nodeType ++ ";"+    , "typedef struct { " ++ nodeType ++ " *head; } " ++ contextType ++ ";"+    ]+ ++ separator+ ++ [ "static " ++ resultType ++ " *" ++ prefix ++ "_alloc(" ++ contextType ++ " *ctx, size_t count" ++ elementParameter ++ ")"+    , "{"+    , "  if (count == 0) return NULL;"+    ]+ ++ [ line+    | not byteStorage+    , line <- [ "  if (element_size == 0 || count > SIZE_MAX / element_size) abort();"+              , "  const size_t bytes = count * element_size;"+              ]+    ]+ ++ [ "  if (" ++ byteCount ++ " > SIZE_MAX - sizeof(" ++ nodeType ++ ")) abort();"+    , "  " ++ nodeType ++ " *node = (" ++ nodeType ++ " *) malloc(sizeof(*node) + " ++ byteCount ++ ");"+    , "  if (node == NULL) abort();"+    , "  node->next = ctx->head; ctx->head = node; return node->data;"+    , "}"+    ]+ ++ separator+ ++ [ "static void " ++ prefix ++ "_ctx_end(" ++ contextType ++ " *ctx)"+    , "{"+    , "  while (ctx->head != NULL) {"+    , "    " ++ nodeType ++ " *next = ctx->head->next; free(ctx->head); ctx->head = next;"+    , "  }"+    , "}"+    ]+ where stem = case arena of+                TextArena -> "text"+                ListArena -> "list"+                SetArena  -> "set"+       description = case arena of+                       TextArena -> "string"+                       ListArena -> "symbolic-list"+                       SetArena  -> "symbolic-set"+       byteStorage = case arena of+                       TextArena -> True+                       _         -> False+       prefix           = "sbv_" ++ stem+       nodeType         = prefix ++ "_node"+       contextType      = prefix ++ "_ctx"+       payloadType      = if byteStorage then "uint8_t" else "long double"+       resultType       = if byteStorage then "uint8_t" else "void"+       byteCount        = if byteStorage then "count"   else "bytes"+       elementParameter = if byteStorage then ""        else ", size_t element_size"+       separator        = ["" | byteStorage]
+ Data/SBV/Compilers/C/Array.hs view
@@ -0,0 +1,855 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Array+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Persistent functional-array lowering for the SBV-to-C compiler.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Array+  ( arrayKinds+  , arrayCType+  , arrayInputCType+  , arrayOutputCType+  , arrayForwardTypeDecls+  , arrayOutputReadName+  , arrayOutputReleaseName+  , arrayExportName+  , arrayStoredValue+  , arrayStoredLoad+  , arrayTypeDecls+  , arrayRuntime+  , arrayContextStart+  , arrayContextEnd+  , arrayInputSetup+  , arrayDriverCallback+  , arrayDriverInput+  , arrayDriverStoredInput+  , arrayLambdaName+  , arrayConst+  , arrayExpr+  , arrayReadName+  , arrayEqualName+  ) where++import Data.List (nubBy, tails)++import qualified Data.Set as Set+import qualified Data.Text as T++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>), render)++import Data.SBV.Compilers.C.BV         (isWideBV)+import Data.SBV.Compilers.C.GMP        (gmpFunctionName, gmpNewName, gmpOutputType, isExactGMPKind)+import Data.SBV.Compilers.C.Lowering   (CLowering(..), CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Syntax     (cUnusedAttribute, cCommentText)+import Data.SBV.Compilers.C.Types      ( isConcreteADT+                                       , constElementCType+                                       , arrayKindTag+                                       , arrayOutputCTypeName+                                       , arrayStoredCloneName+                                       , arrayStoredReleaseName+                                       , elementCType+                                       )+import Data.SBV.Compilers.C.Value      (byValueEqual, managedValueClone, managedValueRelease, valueNeedsOwnership)+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data+import Data.SBV.Core.Symbolic          (smtLambdaInfo)++-- | Return and validate the distinct array kinds used by a program. Arrays may+-- occur as values, but not as keys: array-key matching would require general+-- extensional equality, which the C backend cannot implement for arbitrary+-- domains. Deduplicate by C type: Boolean and unsigned one-bit keys or values+-- have the same representation and share their runtime helpers.+arrayKinds :: Set.Set Kind -> [Kind]+arrayKinds = nubBy (\left right -> arrayCType left == arrayCType right) . map validate . filter isArray . Set.toAscList+ where validate k@(KArray keyKind valueKind)+         | isArray keyKind+         = error $ "SBV->C: Array-valued array keys require unsupported extensional equality: " ++ show k+         | supported keyKind && supported valueKind+         = k+         | True+         = error $ "SBV->C: Array kind is not yet supported: " ++ show k+       validate kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++       supported kind = case kind of+         KBool                    -> True+         KBounded{}               -> True+         KUnbounded               -> True+         KReal                    -> True+         KRational                -> True+         KFloat                   -> True+         KDouble                  -> True+         KFP{}                    -> True+         KChar                    -> True+         KString                  -> True+         KList elementKind        -> supported elementKind+         KSet elementKind         -> supported elementKind+         KTuple fields            -> all supported fields+         KArray keyKind valueKind -> not (isArray keyKind) && supported keyKind && supported valueKind+         KADT{}                   -> isRoundingMode kind || isConcreteADT kind+         _                        -> False++-- | Return the public opaque-pointer type used for an SBV array kind.+arrayCType :: Kind -> String+arrayCType kind@KArray{} = "SBVArray_" ++ arrayKindTag kind+arrayCType kind          = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Return the public callback-descriptor type accepted for an array-valued+-- C input. The descriptor and its context are borrowed for the duration of+-- the generated call.+arrayInputCType :: Kind -> String+arrayInputCType kind = "SBVArrayInput_" ++ arraySuffix kind++-- | Return the public owned-descriptor type produced for an array-valued C+-- output or return value.+arrayOutputCType :: Kind -> String+arrayOutputCType = arrayOutputCTypeName++-- | Return the public helper name used to read an owned array output.+arrayOutputReadName :: Kind -> String+arrayOutputReadName kind = "sbv_array_output_read_" ++ arraySuffix kind++-- | Return the public helper name used to release an owned array output.+arrayOutputReleaseName :: Kind -> String+arrayOutputReleaseName kind = "sbv_array_output_release_" ++ arraySuffix kind++-- | Return the public helper name used to retain an owned array output.+arrayOutputRetainName :: Kind -> String+arrayOutputRetainName kind = "sbv_array_output_retain_" ++ arraySuffix kind++-- | Return the public helper name used to borrow an owned output as an input+-- descriptor for another generated call.+arrayOutputAsInputName :: Kind -> String+arrayOutputAsInputName kind = "sbv_array_output_as_input_" ++ arraySuffix kind++-- | Return the internal helper name used to export a function-scoped array.+arrayExportName :: Kind -> String+arrayExportName kind = "sbv_array_export_" ++ arraySuffix kind++-- | Return the internal helper name that exports an array into the generated+-- function's temporary ownership arena.+arrayStoredExportName :: Kind -> String+arrayStoredExportName kind = "sbv_array_stored_export_" ++ arraySuffix kind++-- | Convert an internal array expression to the retained descriptor pointer+-- representation used when an array is stored inside another value. Other+-- kinds are returned unchanged.+arrayStoredValue :: Kind -> Doc -> Doc+arrayStoredValue kind value+  | isArray kind+  = text (arrayStoredExportName kind)+      P.<> parens (fsep (punctuate comma [text "&sbv_local_array_ctx", value]))+  | True+  = value++-- | Borrow a retained descriptor pointer as an internal array root for the+-- remainder of a generated call.+arrayStoredLoad :: SV -> Doc -> CLowering+arrayStoredLoad resultSV descriptor = CLowering+  { loweringExpression   = text "&" P.<> text nodeName+  , loweringDeclarations = [ text "const" <+> text (arrayOutputCType kind) <+> text "*" P.<> text descriptorName P.<> semi+                           , text (arrayNodeType kind) <+> text nodeName P.<> semi+                           ]+  , loweringSetup        = [ text descriptorName <+> text "=" <+> descriptor P.<> semi+                           , text "if" P.<> parens (text descriptorName <+> text "== NULL" <+> text "||" <+> text descriptorName P.<> text "->lookup == NULL")+                             <+> text "abort" P.<> parens empty P.<> semi+                           , text nodeName <+> text "=" <+> parens (text (arrayNodeType kind))+                             <+> braces (fsep (punctuate comma descriptorFields)) P.<> semi+                           ]+  , loweringRequirements = Set.singleton CRequiresArrays+  }+ where kind             = kindOf resultSV+       descriptorName   = "sbv_local_array_descriptor_" ++ show resultSV+       nodeName         = "sbv_local_array_" ++ show resultSV+       descriptorFields = [ text ".kind = SBV_ARRAY_CALLBACK"+                          , text ".lookup ="  <+> text descriptorName P.<> text "->lookup"+                          , text ".context =" <+> text descriptorName P.<> text "->context"+                          , text ".retain ="  <+> text descriptorName P.<> text "->retain"+                          , text ".release =" <+> text descriptorName P.<> text "->release"+                          ]++-- | Emit descriptor forward declarations needed by aggregate layouts that+-- store arrays by pointer. The complete descriptor remains delayed until its+-- key and value layouts are available.+arrayForwardTypeDecls :: [Kind] -> Doc+arrayForwardTypeDecls []    = empty+arrayForwardTypeDecls kinds = text . unlines $+     commonDeclarations+  ++ concatMap declaration kinds+ where commonDeclarations =+         [ "/* Forward declarations for retained array descriptors. */"+         , cUnusedAttribute+         , "#ifndef SBV_ARRAY_CONTEXT_LIFETIME_DEFINED"+         , "#define SBV_ARRAY_CONTEXT_LIFETIME_DEFINED"+         , "typedef const void *(*SBVArrayContextRetain)(const void *context);"+         , "typedef void (*SBVArrayContextRelease)(const void *context);"+         , "#endif"+         , ""+         ]++       declaration kind@KArray{} =+         [ "#ifndef " ++ arrayForwardGuard kind+         , "#define " ++ arrayForwardGuard kind+         , "typedef struct " ++ arrayOutputCType kind ++ " " ++ arrayOutputCType kind ++ ";"+         , "static inline SBV_CGEN_UNUSED " ++ arrayOutputCType kind ++ " *" ++ arrayStoredCloneName kind+        ++   "(const " ++ arrayOutputCType kind ++ " *value);"+         , "static inline SBV_CGEN_UNUSED void " ++ arrayStoredReleaseName kind+        ++   "(" ++ arrayOutputCType kind ++ " **value);"+         , "#endif"+         , ""+         ]+       declaration kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Emit opaque public array types for every kind used by a generated+-- program. Input descriptors are borrowed during a call. Output descriptors+-- own retained contexts and must be released with their generated helper.+arrayTypeDecls :: [Kind] -> Doc+arrayTypeDecls [] = empty+arrayTypeDecls kinds = text . unlines $+     [ "/* Persistent functional arrays. Internal references are valid for one call. */"+     , "/* Input contexts are borrowed unless an escaping result invokes their retain */"+     , "/* callback. Owned outputs must be released with the generated release helper. */"+     , "/* Callback results borrow their context; aggregate reads borrow the array owner. */"+     , "/* Clone a managed read result to outlive its owner. The as_input helper only borrows. */"+     , "/* Lookups must be stable; escaping non-null contexts require both retain and release. */"+     ]+  ++ concatMap declaration kinds+ where declaration kind@(KArray keyKind valueKind)+         = let inputType       = arrayInputCType kind+               outputType      = arrayOutputCType kind+               lookupType      = arrayLookupType kind+               readOutput      = arrayOutputReadName kind+               retainOutput    = arrayOutputRetainName kind+               releaseOutput   = arrayOutputReleaseName kind+               asInput         = arrayOutputAsInputName kind+               cloneStored     = arrayStoredCloneName kind+               releaseStored   = arrayStoredReleaseName kind+               keyType         = elementCType keyKind+               valueType       = elementCType valueKind+           in [ "#ifndef " ++ arrayGuard kind+           , "#define " ++ arrayGuard kind+           , "/* Owned descriptors carry one reference. Retain copied descriptors and release each owner. */"+           , "/* The input adapter is borrowed; a generated callee retains it if the array escapes. */"+           , "#ifndef " ++ arrayForwardGuard kind+           , "#define " ++ arrayForwardGuard kind+           , "typedef struct " ++ outputType ++ " " ++ outputType ++ ";"+           , "static inline SBV_CGEN_UNUSED " ++ outputType ++ " *" ++ cloneStored ++ "(const " ++ outputType ++ " *value);"+           , "static inline SBV_CGEN_UNUSED void " ++ releaseStored ++ "(" ++ outputType ++ " **value);"+           , "#endif"+           , "typedef struct " ++ arrayNodeType kind ++ " " ++ arrayNodeType kind ++ ";"+           , "typedef const " ++ arrayNodeType kind ++ " *" ++ arrayCType kind ++ ";"+           , "typedef " ++ valueType ++ " (*" ++ lookupType ++ ")(const void *context, " ++ keyType ++ " key);"+           , "typedef struct { " ++ lookupType ++ " lookup; const void *context; SBVArrayContextRetain retain; SBVArrayContextRelease release; } " ++ inputType ++ ";"+           , "struct " ++ outputType ++ " { " ++ lookupType ++ " lookup; const void *context; SBVArrayContextRetain retain; SBVArrayContextRelease release; };"+           , "static inline " ++ valueType ++ " " ++ readOutput ++ "(" ++ outputType ++ " array, " ++ keyType ++ " key)"+           , "{ if (array.lookup == NULL) abort(); return array.lookup(array.context, key); }"+           , "static inline " ++ outputType ++ " " ++ retainOutput ++ "(" ++ outputType ++ " array)"+           , "{"+           , "  if (array.context != NULL) {"+           , "    if (array.retain == NULL) abort();"+           , "    array.context = array.retain(array.context);"+           , "    if (array.context == NULL) abort();"+           , "  }"+           , "  return array;"+           , "}"+           , "static inline void " ++ releaseOutput ++ "(" ++ outputType ++ " *array)"+           , "{ if (array == NULL) return; if (array->context != NULL) { if (array->release == NULL) abort(); array->release(array->context); } array->lookup = NULL; array->context = NULL; array->retain = NULL; array->release = NULL; }"+           , "static inline " ++ inputType ++ " " ++ asInput ++ "(" ++ outputType ++ " array)"+           , "{ " ++ inputType ++ " input = {array.lookup, array.context, array.retain, array.release}; return input; }"+           , "static inline SBV_CGEN_UNUSED " ++ outputType ++ " *" ++ cloneStored ++ "(const " ++ outputType ++ " *value)"+           , "{"+           , "  if (value == NULL) abort();"+           , "  " ++ outputType ++ " *copy = (" ++ outputType ++ " *) malloc(sizeof *copy);"+           , "  if (copy == NULL) abort();"+           , "  *copy = " ++ retainOutput ++ "(*value);"+           , "  return copy;"+           , "}"+           , "static inline SBV_CGEN_UNUSED void " ++ releaseStored ++ "(" ++ outputType ++ " **value)"+           , "{"+           , "  if (value == NULL || *value == NULL) return;"+           , "  " ++ releaseOutput ++ "(*value);"+           , "  free(*value);"+           , "  *value = NULL;"+           , "}"+           , "#endif"+           , ""+           ]+       declaration kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Emit the node layouts and newest-write-first lookup helpers for every+-- array kind used by a generated program.+arrayRuntime :: CgConfig -> [Kind] -> Doc+arrayRuntime _   []    = empty+arrayRuntime cfg kinds = text . unlines $+     [ "/* Persistent functional-array runtime. */"+     , "typedef enum { SBV_ARRAY_CONSTANT, SBV_ARRAY_STORE, SBV_ARRAY_CALLBACK } SBVArrayNodeKind;"+     , "typedef struct sbv_array_temp sbv_array_temp;"+     , "struct sbv_array_temp { sbv_array_temp *next; void *value; void (*release)(void *value); };"+     , "typedef struct { sbv_array_temp *temporaries; } sbv_array_ctx;"+     , ""+     , "static SBV_CGEN_UNUSED void sbv_array_ctx_remember(sbv_array_ctx *ctx, void *value, void (*release)(void *value))"+     , "{"+     , "  if (ctx == NULL || value == NULL || release == NULL) abort();"+     , "  sbv_array_temp *temporary = (sbv_array_temp *) malloc(sizeof *temporary);"+     , "  if (temporary == NULL) abort();"+     , "  temporary->next = ctx->temporaries;"+     , "  temporary->value = value;"+     , "  temporary->release = release;"+     , "  ctx->temporaries = temporary;"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED void sbv_array_ctx_end(sbv_array_ctx *ctx)"+     , "{"+     , "  while (ctx != NULL && ctx->temporaries != NULL) {"+     , "    sbv_array_temp *temporary = ctx->temporaries;"+     , "    ctx->temporaries = temporary->next;"+     , "    temporary->release(temporary->value);"+     , "    free(temporary);"+     , "  }"+     , "}"+     , ""+     ]+  ++ concatMap runtime kinds+ where runtime kind@(KArray keyKind valueKind) =+         let nodeType    = arrayNodeType kind+             arrayType   = arrayCType kind+             keyType     = elementCType keyKind+             valueType   = elementCType valueKind+             readName    = arrayReadName kind+             keyEquality = P.render $ keyEqual cfg keyKind (text "array->key") (text "key")+         in [ "struct " ++ nodeType ++ " {"+            , "  SBVArrayNodeKind kind;"+            , "  " ++ arrayType ++ " parent;"+            , "  " ++ keyType ++ " key;"+            , "  " ++ valueType ++ " value;"+            , "  " ++ arrayLookupType kind ++ " lookup;"+            , "  const void *context;"+            , "  SBVArrayContextRetain retain;"+            , "  SBVArrayContextRelease release;"+            , "};"+            , ""+            , "static SBV_CGEN_UNUSED " ++ valueType ++ " " ++ readName ++ "(" ++ arrayType ++ " array, " ++ keyType ++ " key)"+            , "{"+            , "  while (array->kind == SBV_ARRAY_STORE) {"+            , "    if (" ++ keyEquality ++ ") return array->value;"+            , "    array = array->parent;"+            , "  }"+            , "  if (array->kind == SBV_ARRAY_CALLBACK) return array->lookup(array->context, key);"+            , "  return array->value;"+            , "}"+            , ""+            ]+         ++ ownershipRuntime cfg kind+         ++ storedArrayRuntime kind+       runtime kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Emit the per-kind bridge that turns a call-scoped array node into an+-- owned descriptor pointer tracked by the function's temporary arena.+storedArrayRuntime :: Kind -> [String]+storedArrayRuntime kind@KArray{} =+  [ "static SBV_CGEN_UNUSED void " ++ releaseVoid ++ "(void *value)"+  , "{"+  , "  " ++ outputType ++ " *array = (" ++ outputType ++ " *) value;"+  , "  " ++ arrayOutputReleaseName kind ++ "(array);"+  , "  free(array);"+  , "}"+  , ""+  , "static SBV_CGEN_UNUSED " ++ outputType ++ " *" ++ exportStored+ ++   "(sbv_array_ctx *ctx, " ++ arrayCType kind ++ " array)"+  , "{"+  , "  " ++ outputType ++ " *result = (" ++ outputType ++ " *) malloc(sizeof *result);"+  , "  if (result == NULL) abort();"+  , "  *result = " ++ arrayExportName kind ++ "(array);"+  , "  sbv_array_ctx_remember(ctx, result, " ++ releaseVoid ++ ");"+  , "  return result;"+  , "}"+  , ""+  ]+ where outputType   = arrayOutputCType kind+       exportStored = arrayStoredExportName kind+       releaseVoid  = "sbv_array_stored_release_void_" ++ arraySuffix kind+storedArrayRuntime kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Emit the heap owner used when an array escapes its generated call. Store+-- chains are copied, exact keys and values are duplicated into a private GMP+-- arena, managed aggregates are deep-copied, and callback contexts are+-- retained through their lifetime protocol.+ownershipRuntime :: CgConfig -> Kind -> [String]+ownershipRuntime cfg kind@(KArray keyKind valueKind) =+  [ "typedef struct {"+  , "  size_t references;"+  , "  size_t node_count;"+  , "  " ++ nodeType ++ " *nodes;"+  ]+  ++ ["  sbv_gmp_ctx exact_values;" | hasExact]+  ++ [ "  const void *base_context;"+     , "  SBVArrayContextRelease base_release;"+     , "} " ++ ownerType ++ ";"+     , ""+     , "static SBV_CGEN_UNUSED " ++ valueType ++ " " ++ ownedLookup ++ "(const void *context, " ++ keyType ++ " key)"+     , "{"+     , "  const " ++ ownerType ++ " *owner = (const " ++ ownerType ++ " *) context;"+     , "  return " ++ arrayReadName kind ++ "(&owner->nodes[0], key);"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED const void *" ++ ownedRetain ++ "(const void *context)"+     , "{"+     , "  " ++ ownerType ++ " *owner = (" ++ ownerType ++ " *) context;"+     , "  ++owner->references;"+     , "  return context;"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED void " ++ ownedRelease ++ "(const void *context)"+     , "{"+     , "  " ++ ownerType ++ " *owner = (" ++ ownerType ++ " *) context;"+     , "  if (--owner->references != 0) return;"+     , "  if (owner->base_release != NULL) owner->base_release(owner->base_context);"+     ]+  ++ releaseManagedFields+  ++ ["  sbv_gmp_ctx_end(&owner->exact_values);" | hasExact]+  ++ [ "  free(owner->nodes);"+     , "  free(owner);"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED " ++ outputType ++ " " ++ arrayExportName kind ++ "(" ++ arrayType ++ " array)"+     , "{"+     , "  size_t count = 1;"+     , "  " ++ arrayType ++ " cursor = array;"+     , "  if (cursor == NULL) abort();"+     , "  while (cursor->kind == SBV_ARRAY_STORE) { if (cursor->parent == NULL) abort(); ++count; cursor = cursor->parent; }"+     , "  " ++ ownerType ++ " *owner = (" ++ ownerType ++ " *) calloc(1, sizeof(*owner));"+     , "  if (owner == NULL) abort();"+     , "  owner->nodes = (" ++ nodeType ++ " *) calloc(count, sizeof(*owner->nodes));"+     , "  if (owner->nodes == NULL) { free(owner); abort(); }"+     , "  owner->references = 1;"+     , "  owner->node_count = count;"+     , "  " ++ arrayType ++ " source = array;"+     , "  for (size_t i = 0; i < count; ++i) {"+     , "    owner->nodes[i] = *source;"+     , "    if (source->kind == SBV_ARRAY_STORE) {"+     , "      owner->nodes[i].parent = &owner->nodes[i + 1];"+     ]+  ++ cloneExact "key" keyKind+  ++ cloneManaged "key" keyKind+  ++ [ "    }"+     , "    if (source->kind != SBV_ARRAY_CALLBACK) {"+     ]+  ++ cloneExact "value" valueKind+  ++ cloneManaged "value" valueKind+  ++ [ "    }"+     , "    if (source->kind == SBV_ARRAY_CALLBACK && source->context != NULL) {"+     , "      if (source->retain == NULL || source->release == NULL) abort();"+     , "      owner->base_context = source->retain(source->context);"+     , "      if (owner->base_context == NULL) abort();"+     , "      owner->base_release = source->release;"+     , "      owner->nodes[i].context = owner->base_context;"+     , "    }"+     , "    if (source->kind == SBV_ARRAY_STORE) source = source->parent;"+     , "  }"+     , "  " ++ outputType ++ " output = {" ++ ownedLookup ++ ", owner, " ++ ownedRetain ++ ", " ++ ownedRelease ++ "};"+     , "  return output;"+     , "}"+     , ""+     ]+ where nodeType      = arrayNodeType kind+       arrayType     = arrayCType kind+       inputSuffix   = arraySuffix kind+       ownerType     = "sbv_array_owner_" ++ inputSuffix+       outputType    = arrayOutputCType kind+       ownedLookup   = "sbv_array_owned_lookup_" ++ inputSuffix+       ownedRetain   = "sbv_array_owned_retain_" ++ inputSuffix+       ownedRelease  = "sbv_array_owned_release_" ++ inputSuffix+       keyType       = elementCType keyKind+       valueType     = elementCType valueKind+       hasExact      = isExactGMPKind cfg keyKind || isExactGMPKind cfg valueKind++       releaseManagedFields+         | keyManaged || valueManaged+         = ["  for (size_t i = 0; owner->nodes != NULL && i < owner->node_count; ++i) {"]+        ++ [ "    if (owner->nodes[i].kind == SBV_ARRAY_STORE) " ++ release "key" keyKind+           | keyManaged+           ]+        ++ [ "    if (owner->nodes[i].kind != SBV_ARRAY_CALLBACK) " ++ release "value" valueKind+           | valueManaged+           ]+        ++ ["  }"]+         | True+         = []++       keyManaged   = arrayFieldNeedsOwnership cfg keyKind+       valueManaged = arrayFieldNeedsOwnership cfg valueKind++       release field fieldKind = P.render $ managedValueRelease fieldKind (text ("&owner->nodes[i]." ++ field))++       cloneExact field fieldKind+         | isExactGMPKind cfg fieldKind+         = [ "      " ++ gmpOutputType fieldKind ++ " copy = " ++ gmpNewName fieldKind ++ "(&owner->exact_values);"+           , "      " ++ gmpFunctionName fieldKind "set" ++ "(copy, source->" ++ field ++ ");"+           , "      owner->nodes[i]." ++ field ++ " = copy;"+           ]+         | True+         = []++       cloneManaged field fieldKind+         | arrayFieldNeedsOwnership cfg fieldKind+         = [ "      owner->nodes[i]." ++ field ++ " = "+          ++ P.render (managedValueClone fieldKind (text ("source->" ++ field))) ++ ";"+           ]+         | True+         = []++ownershipRuntime _ kind = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Materialize a borrowed public callback descriptor as an internal array+-- root. A null lookup callback is rejected before the symbolic program runs.+arrayInputSetup :: Int -> SV -> String -> [Doc]+arrayInputSetup typeWidth sv externalName+  | kind@KArray{} <- kindOf sv+  = [ text "if" P.<> parens (external P.<> text ".lookup == NULL") <+> text "abort" P.<> parens empty P.<> semi+    , text "if" P.<> parens (parens (external P.<> text ".retain == NULL") <+> text "!=" <+> parens (external P.<> text ".release == NULL")) <+> text "abort" P.<> parens empty P.<> semi+    , text "const" <+> text (arrayNodeType kind) <+> text nodeName <+> text "=" <+> braces (fsep (punctuate comma fields)) P.<> semi+    , text "const" <+> paddedType <+> text (show sv) <+> text "=" <+> text "&" P.<> text nodeName P.<> semi+    ]+ where external   = text externalName+       nodeName   = "sbv_local_array_input_" ++ show sv+       paddedType = text $ arrayCType (kindOf sv) ++ replicate (typeWidth - length (arrayCType (kindOf sv))) ' '+       fields     = [ text ".kind = SBV_ARRAY_CALLBACK"+                    , text ".lookup ="  <+> external P.<> text ".lookup"+                    , text ".context =" <+> external P.<> text ".context"+                    , text ".retain ="  <+> external P.<> text ".retain"+                    , text ".release =" <+> external P.<> text ".release"+                    ]+arrayInputSetup _ sv _ = error $ "SBV->C: Expected an array input, received " ++ show (kindOf sv)++-- | Emit the per-kind default-only callback used by example-driver array+-- values. Sharing one callback per array kind lets arrays appear at arbitrary+-- depth inside driver aggregates without requiring path-specific functions.+arrayDriverCallback :: CgConfig -> Kind -> Doc+arrayDriverCallback cfg kind@(KArray keyKind valueKind)+  = text "#ifndef" <+> text (arrayDriverGuard kind)+  $$ text "#define" <+> text (arrayDriverGuard kind)+  $$ text "static SBV_CGEN_UNUSED" <+> text (elementCType valueKind) <+> text callbackName+      P.<> parens (fsep (punctuate comma [text "const void *context", text (elementCType keyKind) <+> text "key"]))+  $$ text "{"+  $$ nest 2 (   parens (text "void") <+> text "key" P.<> semi+             $$ text "return" <+> result P.<> semi+            )+  $$ text "}"+  $$ text ""+  $$ retainContext+  $$ text ""+  $$ releaseContext+  $$ text "#endif"+ where callbackName = arrayDriverCallbackName kind+       retainName   = arrayDriverRetainName kind+       releaseName  = arrayDriverReleaseName kind+       result+         | isExactGMPKind cfg valueKind = parens (text (elementCType valueKind)) <+> text "context"+         | True                          = text "*" P.<> parens (parens (text (constElementCType valueKind) <+> text "*") <+> text "context")++       retainContext+         | isExactGMPKind cfg valueKind+         = text "static SBV_CGEN_UNUSED const void *" P.<> text retainName P.<> parens (text "const void *context")+           $$ text "{"+           $$ nest 2 (   text mutableType <+> text "copy =" <+> parens (text mutableType) <+> text "malloc(sizeof(*copy));"+                      $$ text "if (copy == NULL) abort();"+                      $$ vcat (map text exactCopy)+                      $$ text "return copy;"+                     )+           $$ text "}"+         | arrayFieldNeedsOwnership cfg valueKind+         = text "static SBV_CGEN_UNUSED const void *" P.<> text retainName P.<> parens (text "const void *context")+           $$ text "{"+           $$ nest 2 (   text (elementCType valueKind) <+> text "*copy =" <+> parens (text (elementCType valueKind) <+> text "*") <+> text "malloc(sizeof(*copy));"+                      $$ text "if (copy == NULL) abort();"+                      $$ text "*copy =" <+> managedValueClone valueKind managedContextValue P.<> semi+                      $$ text "return copy;"+                     )+           $$ text "}"+         | True+         = text "static SBV_CGEN_UNUSED const void *" P.<> text retainName P.<> parens (text "const void *context")+           $$ text "{"+           $$ nest 2 (   text (elementCType valueKind) <+> text "*copy =" <+> parens (text (elementCType valueKind) <+> text "*") <+> text "malloc(sizeof(*copy));"+                      $$ text "if (copy == NULL) abort();"+                      $$ text "*copy =" <+> managedContextValue P.<> semi+                      $$ text "return copy;"+                     )+           $$ text "}"++       releaseContext+         = text "static SBV_CGEN_UNUSED void" <+> text releaseName P.<> parens (text "const void *context")+           $$ text "{"+           $$ nest 2 (   managedClear+                      $$ exactClear+                      $$ text "free" P.<> parens (text "(void *) context") P.<> semi+                     )+           $$ text "}"++       managedContextValue = text "*" P.<> parens (parens (text (constElementCType valueKind) <+> text "*") <+> text "context")++       managedClear+         | arrayFieldNeedsOwnership cfg valueKind+         =  text (elementCType valueKind) <+> text "*value =" <+> parens (text (elementCType valueKind) <+> text "*") <+> text "context" P.<> semi+         $$ managedValueRelease valueKind (text "value")+         | True+         = empty++       mutableType+         | KUnbounded <- valueKind            = "mpz_ptr"+         | isExactGMPKind cfg valueKind        = "mpq_ptr"+         | True                                = error $ "SBV->C: Expected an exact callback value, received " ++ show valueKind++       exactCopy+         | KUnbounded <- valueKind = ["mpz_init_set(copy, (SInteger) context);"]+         | isExactGMPKind cfg valueKind+         = ["mpq_init(copy);", "mpq_set(copy, (" ++ elementCType valueKind ++ ") context);"]+         | True = error $ "SBV->C: Expected an exact callback value, received " ++ show valueKind++       exactClear+         | KUnbounded <- valueKind            = text "mpz_clear((mpz_ptr) context);"+         | isExactGMPKind cfg valueKind        = text "mpq_clear((mpq_ptr) context);"+         | True                                = empty+arrayDriverCallback _ kind = error $ "SBV->C: Expected an array input kind, received " ++ show kind++-- | Construct an example-driver descriptor around a named default value and+-- its generated callback. Exact GMP defaults already decay to pointers;+-- ordinary values are passed to the callback by address.+arrayDriverInput :: CgConfig -> Kind -> String -> String -> Doc+arrayDriverInput cfg kind inputName defaultName+  | KArray _ valueKind <- kind+  = let context+          | isExactGMPKind cfg valueKind = text defaultName+          | True                          = text "&" P.<> text defaultName+    in text "const" <+> text (arrayInputCType kind) <+> text inputName <+> text "="+         <+> braces (fsep (punctuate comma [ text ".lookup ="  <+> text (arrayDriverCallbackName kind)+                                          , text ".context =" <+> context+                                          , text ".retain ="  <+> text (arrayDriverRetainName kind)+                                          , text ".release =" <+> text (arrayDriverReleaseName kind)+                                          ])) P.<> semi+  | True+  = error $ "SBV->C: Expected an array input kind, received " ++ show kind++-- | Retain a generated input descriptor into the pointer representation used+-- by array-valued aggregate fields. The returned pointer owns both its heap+-- descriptor and one retained callback-context reference.+arrayDriverStoredInput :: Kind -> String -> String -> Doc+arrayDriverStoredInput kind@KArray{} externalName inputName+  =  text (arrayOutputCType kind) <+> text "*" P.<> text externalName <+> text "="+       <+> parens (text (arrayOutputCType kind) <+> text "*") <+> text "malloc(sizeof(*" P.<> text externalName P.<> text "));"+  $$ text "if" <+> parens (text externalName <+> text "== NULL") <+> text "abort();"+  $$ text "*" P.<> text externalName <+> text "="+       <+> text (arrayOutputRetainName kind)+       P.<> parens (parens (text (arrayOutputCType kind))+             <+> braces (fsep (punctuate comma [ text ".lookup ="  <+> text inputName P.<> text ".lookup"+                                               , text ".context =" <+> text inputName P.<> text ".context"+                                               , text ".retain ="  <+> text inputName P.<> text ".retain"+                                               , text ".release =" <+> text inputName P.<> text ".release"+                                               ]))) P.<> semi+arrayDriverStoredInput kind _ _ = error $ "SBV->C: Expected an array input kind, received " ++ show kind++-- | Render a concrete array model as a nested chain of C99 compound literals.+-- Association-list entries retain SBV's newest-write-first ordering.+arrayConst :: (CV -> Doc) -> CV -> Maybe Doc+arrayConst renderValue (CV kind@(KArray keyKind valueKind) (CArray (ArrayModel associations defaultValue)))+  = Just $ foldr store base associations+ where base = nodeLiteral [text ".kind = SBV_ARRAY_CONSTANT", text ".value =" <+> renderField valueKind defaultValue]++       store (key, value) parent = nodeLiteral+         [ text ".kind = SBV_ARRAY_STORE"+         , text ".parent =" <+> parent+         , text ".key ="    <+> renderValue (CV keyKind key)+         , text ".value ="  <+> renderField valueKind value+         ]++       renderField fieldKind fieldValue+         = arrayStoredValue fieldKind (renderValue (CV fieldKind fieldValue))++       nodeLiteral fields = parens $ text "&" P.<> parens (text (arrayNodeType kind)) P.<> braces (fsep (punctuate comma fields))+arrayConst _ _ = Nothing++-- | Lower array initialization, reads, writes, and array-valued conditionals.+-- Structured lambda-backed arrays, including free arrays, become callback+-- roots. Array-valued elements cross node boundaries through retained+-- descriptor pointers. The supplied name resolvers identify private defined+-- functions and lambda-lifted array callbacks. Equality calls a helper whose+-- finite key domain and enumeration limit are checked by the C renderer.+arrayExpr :: CgConfig+          -> (T.Text -> Maybe String)+          -> (SV -> Maybe String)+          -> Op+          -> [SV]+          -> SV+          -> [Doc]+          -> Maybe CLowering+arrayExpr cfg definedFunctionName structuredLambdaName op svs resultSV args+  | not (isArray resultKind || any isArray svs)+  = Nothing+  | True+  = case (op, svs, args) of+      (TupleConstructor{}, _, _) -> Nothing+      (TupleAccess{},      _, _) -> Nothing+      (ADTOp{},            _, _) -> Nothing+      (SeqOp{},            _, _) -> Nothing+      (SetOp{},            _, _) -> Nothing+      (LkUp{},             _, _) -> Nothing+      (Uninterpreted symbol, _, renderedArguments)+        | isArray resultKind+        , Just functionName <- definedFunctionName symbol+        -> Just $ arrayStoredLoad resultSV+             (namedCall functionName (text "&sbv_local_function_ctx" : renderedArguments))+        | True+        -> Nothing+      (ArrayInit (Left pair), [_], [defaultValue])+        | resultKind == uncurry KArray pair+        -> nodeLowering resultKind+             [text ".kind = SBV_ARRAY_CONSTANT", text ".value =" <+> storedValue (snd pair) defaultValue]+      (ArrayInit (Right lambdaDef), [], [])+        | Just _            <- smtLambdaInfo lambdaDef+        , Just callbackName <- structuredLambdaName resultSV+        -> nodeLowering resultKind+             [ text ".kind = SBV_ARRAY_CALLBACK"+             , text ".lookup ="  <+> text callbackName+             , text ".context =" <+> text "&sbv_local_function_ctx"+             , text ".retain ="  <+> text "sbv_function_ctx_retain_empty"+             , text ".release =" <+> text "sbv_function_ctx_release_owned"+             ]+        | True+        -> unsupported "lambda arrays without registered retained structured expressions"+      (ReadArray, [array, key], [renderedArray, renderedKey])+        | kindOf array == KArray (kindOf key) resultKind+        -> let readResult = namedCall (arrayReadName (kindOf array)) [renderedArray, renderedKey]+           in if isArray resultKind then Just (arrayStoredLoad resultSV readResult) else expression readResult+      (WriteArray, [array, key, value], [renderedArray, renderedKey, renderedValue])+        | resultKind == kindOf array+        , resultKind == KArray (kindOf key) (kindOf value)+        -> nodeLowering resultKind+             [ text ".kind = SBV_ARRAY_STORE"+             , text ".parent =" <+> renderedArray+             , text ".key ="    <+> renderedKey+             , text ".value ="  <+> storedValue (kindOf value) renderedValue+             ]+      (Label label, [_], [array])+        -> expression $ array <+> text "/*" <+> cCommentText label <+> text "*/"+      (Equal{}, initial:rest, a:as)+        | all ((== kindOf initial) . kindOf) rest+        -> expression $ conjunction [namedCall (arrayEqualName (kindOf initial)) [a, b] | b <- as]+      (NotEqual, initial:rest, _)+        | all ((== kindOf initial) . kindOf) rest+        -> expression $ conjunction [text "!" P.<> parens (namedCall (arrayEqualName (kindOf initial)) [a, b])+                                    | a:as <- tails args, b <- as]+      _                  -> error $ "SBV->C: Unsupported array operation " ++ show op+                           ++ " with argument kinds " ++ show (map kindOf svs)+                           ++ " and result kind " ++ show resultKind+ where resultKind = kindOf resultSV++       expression = Just . expressionLowering requirements++       conjunction [] = text "true"+       conjunction ds = hsep (punctuate (text " &&") (map parens ds))++       nodeLowering kind fields = Just CLowering+         { loweringExpression   = text "&" P.<> text nodeName+         , loweringDeclarations = [text (arrayNodeType kind) <+> text nodeName P.<> semi]+         , loweringSetup        = [text nodeName <+> text "=" <+> parens (text (arrayNodeType kind))+                                                    <+> braces (fsep (punctuate comma fields)) P.<> semi]+         , loweringRequirements = Set.fromList requirements+         }++       nodeName = "sbv_local_array_" ++ show resultSV++       storedValue = arrayStoredValue++       requirements = CRequiresArrays : concatMap kindRequirements (resultKind : map kindOf svs)++       kindRequirements kind+         | isWideBV kind                 = [CRequiresWideBV]+         | isFP kind                     = [CRequiresLibBF, CRequiresLibM]+         | isExactGMPKind cfg kind        = [CRequiresGMP]+         | kind `elem` [KFloat, KDouble] = [CRequiresLibM]+         | KArray keyKind valueKind <- kind+         = kindRequirements keyKind ++ kindRequirements valueKind+         | True = []++       unsupported feature = error $ "SBV->C: Arrays do not yet support " ++ feature ++ "."++       namedCall functionName callArgs = text functionName P.<> parens (fsep (punctuate comma callArgs))++-- | Name the private exact finite-domain array equality helper.+arrayEqualName :: Kind -> String+arrayEqualName kind = "sbv_array_equal_" ++ arraySuffix kind++-- | Initialize the arena that owns array descriptors embedded in temporary+-- generated values.+arrayContextStart :: Doc+arrayContextStart = text "sbv_array_ctx sbv_local_array_ctx = {NULL};"++-- | Release the array descriptors embedded in temporary generated values.+arrayContextEnd :: Doc+arrayContextEnd = text "sbv_array_ctx_end" P.<> parens (text "&sbv_local_array_ctx") P.<> semi++-- | Return the concrete node-structure name for an array kind.+arrayNodeType :: Kind -> String+arrayNodeType kind = "sbv_array_node_" ++ arraySuffix kind++-- | Return the lookup-helper name for an array kind.+arrayReadName :: Kind -> String+arrayReadName kind = "sbv_array_read_" ++ arraySuffix kind++-- | Return the callback-function-pointer type for an array kind.+arrayLookupType :: Kind -> String+arrayLookupType kind = "SBVArrayLookup_" ++ arraySuffix kind++-- | Return the generated example-driver callback name for an array kind.+arrayDriverCallbackName :: Kind -> String+arrayDriverCallbackName kind = "sbv_local_array_driver_lookup_" ++ arraySuffix kind++-- | Return the generated example-driver context-retain callback name.+arrayDriverRetainName :: Kind -> String+arrayDriverRetainName kind = "sbv_local_array_retain_driver_" ++ arraySuffix kind++-- | Return the generated example-driver context-release callback name.+arrayDriverReleaseName :: Kind -> String+arrayDriverReleaseName kind = "sbv_local_array_release_driver_" ++ arraySuffix kind++-- | Return the preprocessor guard that deduplicates a per-kind driver callback+-- when independently generated library components share an array type.+arrayDriverGuard :: Kind -> String+arrayDriverGuard kind = "SBV_ARRAY_DRIVER_CALLBACK_" ++ arraySuffix kind ++ "_DEFINED"++-- | Return the generated C lookup-helper name for a structured lambda array.+arrayLambdaName :: SV -> String+arrayLambdaName array = "sbv_array_lambda_" ++ show array++-- | Return the key/value suffix shared by the generated names for an array+-- kind.+arraySuffix :: Kind -> String+arraySuffix = arrayKindTag++-- | Return the preprocessor guard protecting an array type declaration.+arrayGuard :: Kind -> String+arrayGuard kind = arrayCType kind ++ "_DEFINED"++-- | Return the preprocessor guard protecting an array descriptor's forward+-- declaration and stored-value helper prototypes.+arrayForwardGuard :: Kind -> String+arrayForwardGuard kind = arrayOutputCType kind ++ "_FORWARD_DEFINED"++-- | Render the strong equality used to match array keys. Unlike IEEE numeric+-- equality, this recursively preserves object equality for aggregate fields.+keyEqual :: CgConfig -> Kind -> Doc -> Doc -> Doc+keyEqual cfg = byValueEqual cfg True++-- | Test whether an array field needs an independent deep copy when its node+-- escapes the generated call. Direct exact values use the owner's GMP arena.+arrayFieldNeedsOwnership :: CgConfig -> Kind -> Bool+arrayFieldNeedsOwnership cfg kind+  | isExactGMPKind cfg kind = False+  | isConcreteADT kind      = True+  | True                    = valueNeedsOwnership cfg kind
+ Data/SBV/Compilers/C/BV.hs view
@@ -0,0 +1,1031 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.BV+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Exact, portable lowering of non-native sized bit-vectors to C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.BV+  ( isWideBV+  , wideBVKinds+  , wideBVTypeDecls+  , bitVectorRuntime+  , wideBVConst+  , wideBVExpr+  , bitVectorCastExpr+  , nativeBVExpr+  , mappedIntegerKind+  , nativeBVOverflowExpr+  , wideBVLookupInRange+  , wideBVLookupIndex+  , wideBVEqual+  , wideBVNormalize+  , wideBVPrint+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.Bits                  (shiftL, shiftR, (.&.))+import Data.Char                  (toUpper)+import Data.List                  (intercalate, nub, stripPrefix, tails)+import qualified Data.Set as Set+import Numeric                    (showHex)++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Lowering  (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Core.Data++-- | True when a bit-vector cannot use the historical scalar C ABI. These+-- values are represented as little-endian arrays of 64-bit limbs.+isWideBV :: Kind -> Bool+isWideBV k = isBounded k+          && k /= KBounded False 1+          && intSizeOf k `notElem` [8, 16, 32, 64]++-- | The distinct non-native bit-vector kinds used by a program.+wideBVKinds :: Set.Set Kind -> [Kind]+wideBVKinds = filter isWideBV . Set.toAscList++-- | Type declarations and printing routines belonging in the public header.+wideBVTypeDecls :: [Kind] -> Doc+wideBVTypeDecls [] = empty+wideBVTypeDecls ks = text . unlines $+     ["/* Exact-width bit-vectors (least-significant limb first). */"+     , cUnusedAttribute]+  ++ concatMap decl ks+ where decl k = ["#ifndef " ++ guard k+                , "#define " ++ guard k+                , "typedef struct { uint64_t limb[" ++ show (limbs k) ++ "]; } " ++ cType k ++ ";"+                , "static inline SBV_CGEN_UNUSED void " ++ prefix k ++ "_fprint(FILE *stream, " ++ cType k ++ " value)"+                , "{"+                , "  size_t i = " ++ show (limbs k) ++ ";"+                , "  fputs(\"0x\", stream);"+                , "  while (i-- > 0) { fprintf(stream, \"%016\" PRIx64, value.limb[i]); }"+                , "}"+                , "#endif"+                , ""]++       guard k = "SBV_BV_" ++ map toUpper (tag k) ++ "_DEFINED"++-- | Runtime routines for each used exact-width type, together with the exact+-- native arithmetic, bit-manipulation, and cross-width helpers demanded by+-- the complete symbolic DAG. Native-only programs can require these helpers+-- even when no limb-backed type occurs. The optional integer width selects+-- modular arithmetic helpers for explicitly mapped 'SInteger' values too.+bitVectorRuntime :: Maybe Int -> [Kind] -> [(SV, SBVExpr)] -> Doc+bitVectorRuntime integerWidth ks asgns+  | null routines = empty+  | True          = text . unlines . map markUnused $+       [ "/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */"+       , cUnusedAttribute+       , ""+       ]+    ++ routines+ where specials (sv, SBVApp op args) = case op of+         Extract hi lo                  -> [SpecialExtract (kindOf (headArg "Extract" args)) hi lo (kindOf sv)]+         Join                           -> case args of+                                             [a, b] -> [SpecialJoin (kindOf a) (kindOf b) (kindOf sv)]+                                             _      -> badArity "Join" args+         Rol{}+           | source : _ <- args+           , isNativeBV source          -> [SpecialRotate (kindOf source)]+         Ror{}+           | source : _ <- args+           , isNativeBV source          -> [SpecialRotate (kindOf source)]+         Shl+           | source : _ <- args+           , isNativeBV source          -> [SpecialShift (kindOf source)]+         Shr+           | source : _ <- args+           , isNativeBV source          -> [SpecialShift (kindOf source)]+         Plus                           -> nativeArithmetic args SpecialAdd+         Minus                          -> nativeArithmetic args SpecialSub+         Times                          -> nativeArithmetic args SpecialMul+         UNeg                           -> nativeArithmetic args SpecialNeg+         Abs                            -> nativeArithmetic args SpecialAbs+         Quot                           -> nativeArithmetic args SpecialQuot+         Rem                            -> nativeArithmetic args SpecialRem+         ZeroExtend _                   -> [SpecialConvert False (kindOf (headArg "ZeroExtend" args)) (kindOf sv)]+         SignExtend _                   -> [SpecialConvert True  (kindOf (headArg "SignExtend" args)) (kindOf sv)]+         KindCast fr to+           | let source = mappedIntegerKind integerWidth fr+           , let target = mappedIntegerKind integerWidth to+           , isBounded source && isBounded target -> [SpecialConvert (hasSign source) source target]+         IEEEFP (FP_Reinterpret fr to)+           | isBounded fr && isBounded to -> [SpecialConvert False fr to]+         _                              -> []++       specialRuntime s = case s of+         SpecialExtract fr hi lo to      -> conversionRuntime (extractName fr hi lo to) False lo fr to+         SpecialJoin a b to              -> joinRuntime a b to+         SpecialConvert sign fr to       -> conversionRuntime (convertName sign fr to) sign 0 fr to+         SpecialRotate kind              -> rotationRuntime kind+         SpecialShift kind               -> shiftRuntime kind+         SpecialArithmetic arith kind    -> nativeArithmeticRuntime arith kind++       routines = concatMap coreRuntime ks+               ++ concatMap specialRuntime (nub (concatMap specials asgns))++       nativeArithmetic args arith = case args of+         source : _+           | let kind = mappedIntegerKind integerWidth (kindOf source)+           , isNativeBVKind kind -> [SpecialArithmetic (integerArithmetic (kindOf source) arith) kind]+         _                        -> []++       markUnused line+         | Just rest <- stripPrefix "static inline " line = "static inline SBV_CGEN_UNUSED " ++ rest+         | otherwise                                      = line++-- | Render a constant as a C99 compound literal.+wideBVConst :: Kind -> Integer -> Maybe Doc+wideBVConst k i+  | isWideBV k = Just . text $ "(" ++ cType k ++ "){{" ++ intercalate ", " (map word [0 .. limbs k - 1]) ++ "}}"+  | True       = Nothing+ where normalized = i `mod` (2 ^ intSizeOf k)+       word n     = u64 $ (normalized `shiftR` (64 * n)) .&. ((1 `shiftL` 64) - 1)++-- | Lower an operation involving a non-native bit-vector. A 'Nothing' result+-- means that the legacy scalar lowering should handle the operation.+wideBVExpr :: Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+wideBVExpr op svs resultKind args+  | not (isWideBV resultKind || any (isWideBV . kindOf) svs)+  = Nothing+  | LkUp{} <- op+  = Nothing+  | Uninterpreted{} <- op+  = Nothing+  | True+  = Just . expressionLowering [CRequiresWideBV] $ case (op, args, svs) of+      (Label _                       , [a]      , _)      -> a+      (Plus                          , [a, b]   , _)      -> call "add" [a, b]+      (Minus                         , [a, b]   , _)      -> call "sub" [a, b]+      (Times                         , [a, b]   , _)      -> call "mul" [a, b]+      (UNeg                          , [a]      , _)      -> call "neg" [a]+      (Abs                           , [a]      , _)      -> call "abs" [a]+      (And                           , [a, b]   , _)      -> call "and" [a, b]+      (Or                            , [a, b]   , _)      -> call "or" [a, b]+      (XOr                           , [a, b]   , _)      -> call "xor" [a, b]+      (Not                           , [a]      , _)      -> call "not" [a]+      (Equal _                       , [a, b]   , x:_)    -> argCall x "eq" [a, b]+      (NotEqual                      , as       , x:_)    -> fsep $ punctuate (text " &&")+                                                                 [text "!" P.<> parens (argCall x "eq" [a, b])+                                                                 | (a:rest) <- tails as, b <- rest]+      (LessThan                      , [a, b]   , x:_)    -> argCall x "lt" [a, b]+      (GreaterThan                   , [a, b]   , x:_)    -> argCall x "lt" [b, a]+      (LessEq                        , [a, b]   , x:_)    -> text "!" P.<> parens (argCall x "lt" [b, a])+      (GreaterEq                     , [a, b]   , x:_)    -> text "!" P.<> parens (argCall x "lt" [a, b])+      (Ite                           , [c, a, b], _)      -> c <+> text "?" <+> a <+> text ":" <+> b+      (Quot                          , [a, b]   , _)      -> call "quot" [a, b]+      (Rem                           , [a, b]   , _)      -> call "rem" [a, b]+      (Shl                           , [a, n]   , x:_)    -> argCall x "shl" [a, argCall x "shift_amount" [n]]+      (Shr                           , [a, n]   , x:_)    -> argCall x (if hasSign x then "ashr" else "lshr") [a, argCall x "shift_amount" [n]]+      (Rol n                         , [a]      , _)      -> call "rotl" [a, integer (fromIntegral n)]+      (Ror n                         , [a]      , _)      -> call "rotr" [a, integer (fromIntegral n)]+      (Extract hi lo                 , [a]      , x:_)    -> namedCall (extractName (kindOf x) hi lo resultKind) [a]+      (Join                          , [a, b]   , [x, y]) -> namedCall (joinName (kindOf x) (kindOf y) resultKind) [a, b]+      (ZeroExtend _                  , [a]      , x:_)    -> namedCall (convertName False (kindOf x) resultKind) [a]+      (SignExtend _                  , [a]      , x:_)    -> namedCall (convertName True  (kindOf x) resultKind) [a]+      (OverflowOp ov                 , as       , x:_)    -> argCall x (overflowName ov) as+      (IEEEFP (FP_Reinterpret fr to) , [a]      , _)+          | isBounded fr && isBounded to                  -> namedCall (convertName False fr to) [a]+      _                                                   -> error $ "SBV->C: exact bit-vector lowering does not yet support " ++ show op+                                                                  ++ " with argument kinds " ++ show (map kindOf svs)+                                                                  ++ " and result kind " ++ show resultKind+ where call suffix       = namedCall (prefix resultKind ++ "_" ++ suffix)+       argCall sv suffix = namedCall (prefix (kindOf sv) ++ "_" ++ suffix)++-- | Lower casts between native or limb-backed bit-vectors, including explicit+-- native integer mappings. Resolve only the representations: the source's+-- signedness controls extension, and narrowing preserves the target's low bits.+bitVectorCastExpr :: Maybe Int -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+bitVectorCastExpr integerWidth (KindCast fr to) [source] resultKind [value]+  | fr == kindOf source+  , to == resultKind+  , isBounded from+  , isBounded target+  = Just $ expressionLowering [CRequiresWideBV | isWideBV from || isWideBV target]+         $ namedCall (convertName (hasSign from) from target) [value]+ where from   = mappedIntegerKind integerWidth fr+       target = mappedIntegerKind integerWidth to+bitVectorCastExpr _ _ _ _ _ = Nothing++-- | Lower native-width arithmetic, conversion, and bit manipulation through+-- exact bit-vector helpers. This avoids C's signed-overflow, promotion,+-- signed-shift, and oversized-shift behavior while retaining the scalar+-- public ABI. Explicitly mapped integers share the modular arithmetic helpers,+-- with separate Euclidean division helpers matching their symbolic operations.+nativeBVExpr :: Maybe Int -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+nativeBVExpr integerWidth op svs resultKind args = case (op, svs, args) of+  (Extract hi lo , [source]   , [renderedSource])+    | isNativeBV source+    , isNativeBVKind resultKind+    -> lower $ namedCall (extractName (kindOf source) hi lo resultKind) [renderedSource]+  (Join          , [high, low], [renderedHigh, renderedLow])+    | isNativeBV high+    , isNativeBV low+    , isNativeBVKind resultKind+    -> lower $ namedCall (joinName (kindOf high) (kindOf low) resultKind) [renderedHigh, renderedLow]+  (ZeroExtend _  , [source]   , [renderedSource])+    | isNativeBV source+    , isNativeBVKind resultKind+    -> lower $ namedCall (convertName False (kindOf source) resultKind) [renderedSource]+  (SignExtend _  , [source]   , [renderedSource])+    | isNativeBV source+    , isNativeBVKind resultKind+    -> lower $ namedCall (convertName True (kindOf source) resultKind) [renderedSource]+  (Plus            , [left, right]   , [renderedLeft, renderedRight])+    | nativeBinary left right+    -> arithmetic SpecialAdd [renderedLeft, renderedRight]+  (Minus           , [left, right]   , [renderedLeft, renderedRight])+    | nativeBinary left right+    -> arithmetic SpecialSub [renderedLeft, renderedRight]+  (Times           , [left, right]   , [renderedLeft, renderedRight])+    | nativeBinary left right+    -> arithmetic SpecialMul [renderedLeft, renderedRight]+  (UNeg            , [source]        , [renderedSource])+    | nativeUnary source+    -> arithmetic SpecialNeg [renderedSource]+  (Abs             , [source]        , [renderedSource])+    | nativeUnary source+    -> arithmetic SpecialAbs [renderedSource]+  (Quot            , [left, right]   , [renderedLeft, renderedRight])+    | nativeBinary left right+    -> arithmetic SpecialQuot [renderedLeft, renderedRight]+  (Rem             , [left, right]   , [renderedLeft, renderedRight])+    | nativeBinary left right+    -> arithmetic SpecialRem [renderedLeft, renderedRight]+  (Shl             , [source, amount], [renderedSource, renderedAmount])+    | isNativeBV source+    , isNativeBV amount+    , kindOf source == resultKind+    -> lower $ namedCall (prefix resultKind ++ "_shl") [renderedSource, renderedAmount]+  (Shr             , [source, amount], [renderedSource, renderedAmount])+    | isNativeBV source+    , isNativeBV amount+    , kindOf source == resultKind+    -> lower $ namedCall (prefix resultKind ++ if hasSign source then "_ashr" else "_lshr") [renderedSource, renderedAmount]+  (Rol amount      , [source]        , [renderedSource])+    | isNativeBV source+    , kindOf source == resultKind+    -> lower $ namedCall (prefix resultKind ++ "_rotl") [renderedSource, integer (fromIntegral amount)]+  (Ror amount      , [source]        , [renderedSource])+    | isNativeBV source+    , kindOf source == resultKind+    -> lower $ namedCall (prefix resultKind ++ "_rotr") [renderedSource, integer (fromIntegral amount)]+  _ -> Nothing+ where lower = Just . expressionLowering []++       arithmeticKind = mappedIntegerKind integerWidth resultKind++       nativeUnary source = isNativeBVKind arithmeticKind && kindOf source == resultKind++       nativeBinary left right = nativeUnary left && kindOf right == resultKind++       arithmetic arith = lower . namedCall (prefix arithmeticKind ++ "_" ++ arithmeticSuffix (integerArithmetic resultKind arith))++-- | Select the integer representation used by arithmetic and conversion+-- helpers without changing the symbolic graph or its operation semantics.+mappedIntegerKind :: Maybe Int -> Kind -> Kind+mappedIntegerKind (Just bits) KUnbounded = KBounded True bits+mappedIntegerKind _           kind       = kind++-- | Integer division in the symbolic graph is Euclidean, even when a native+-- representation is selected. Bit-vector division remains truncating.+integerArithmetic :: Kind -> NativeArithmetic -> NativeArithmetic+integerArithmetic KUnbounded SpecialQuot = SpecialEuclideanQuot+integerArithmetic KUnbounded SpecialRem  = SpecialEuclideanRem+integerArithmetic _          arith       = arith++-- | Lower overflow predicates for scalar C bit-vector representations. The+-- one-bit unsigned case follows its Boolean truth table; wider native cases+-- avoid evaluating the overflowing operation itself, including signed+-- division of the minimum value by -1.+nativeBVOverflowExpr :: Op -> [SV] -> [Doc] -> Maybe CLowering+nativeBVOverflowExpr (OverflowOp ov) svs args+  | x:_ <- svs+  , let k = kindOf x+  , k == KBounded False 1+  = Just . expressionLowering [] $ case (ov, args) of+      (PlusOv False, [a, b]) -> a .&&. b+      (SubOv  False, [a, b]) -> parens (text "!" P.<> a) .&&. b+      (MulOv  False, [_, _]) -> text "false"+      (DivOv       , [_, _]) -> text "false"+      (NegOv       , [_])    -> text "false"+      _                      -> error $ "SBV->C: One-bit overflow operation is invalid or has an unexpected arity: " ++ show ov+  | x:_ <- svs+  , let k = kindOf x+  , isBounded k+  , not (isWideBV k)+  , intSizeOf k `elem` [8, 16, 32, 64]+  = Just . expressionLowering [] $ case (ov, args) of+      (PlusOv False, [a, b]) -> a .>. (maximumValue k .-. b)+      (PlusOv True , [a, b]) -> signedAdd k a b+      (SubOv  False, [a, b]) -> a .<. b+      (SubOv  True , [a, b]) -> signedSub k a b+      (MulOv  False, [a, b]) -> (b ./=. zero) .&&. (a .>. (maximumValue k ./. b))+      (MulOv  True , [a, b]) -> signedMul k a b+      (DivOv       , [a, b]) -> (a .==. minimumValue k) .&&. (b .==. negativeOne)+      (NegOv       , [a])    -> a .==. minimumValue k+      _                      -> error $ "SBV->C: Overflow operation has an unexpected arity: " ++ show ov+  | True = Nothing+ where x .<.  y = parens (x <+> text "<"  <+> y)+       x .>.  y = parens (x <+> text ">"  <+> y)+       x .==. y = parens (x <+> text "==" <+> y)+       x ./=. y = parens (x <+> text "!=" <+> y)+       x .&&. y = parens (x <+> text "&&" <+> y)+       x .||. y = parens (x <+> text "||" <+> y)+       x .+.  y = parens (x <+> text "+"  <+> y)+       x .-.  y = parens (x <+> text "-"  <+> y)+       x ./.  y = parens (x <+> text "/"  <+> y)++       zero        = text "0"+       negativeOne = text "-1"++       signedAdd k a b = ((b .>. zero) .&&. (a .>. (maximumValue k .-. b)))+                      .||. ((b .<. zero) .&&. (a .<. (minimumValue k .-. b)))++       signedSub k a b = ((b .<. zero) .&&. (a .>. (maximumValue k .+. b)))+                      .||. ((b .>. zero) .&&. (a .<. (minimumValue k .+. b)))++       signedMul k a b = ((a .>. zero) .&&. (((b .>. zero) .&&. (a .>. (maximumValue k ./. b)))+                                         .||. ((b .<. zero) .&&. (b .<. (minimumValue k ./. a)))))+                      .||. ((a .<. zero) .&&. (((b .>. zero) .&&. (a .<. (minimumValue k ./. b)))+                                          .||. ((b .<. zero) .&&. (b .<. (maximumValue k ./. a)))))++       minimumValue k = text $ "INT" ++ show (intSizeOf k) ++ "_MIN"+       maximumValue k = text $ (if hasSign k then "INT" else "UINT") ++ show (intSizeOf k) ++ "_MAX"+nativeBVOverflowExpr _ _ _ = Nothing++-- | Print a wide value without requiring a printf conversion specifier.+wideBVPrint :: Kind -> Doc -> Doc+wideBVPrint k value = namedCall (prefix k ++ "_fprint") [text "stdout", value]++-- | Test whether a wide bit-vector is a valid zero-based index below the+-- supplied table length.+wideBVLookupInRange :: Kind -> Int -> Doc -> Doc+wideBVLookupInRange k len value = namedCall (prefix k ++ "_index_in_range") [value, integer (fromIntegral len)]++-- | Convert a wide bit-vector known to be in range to a native C table index.+wideBVLookupIndex :: Kind -> Doc -> Doc+wideBVLookupIndex k value = namedCall (prefix k ++ "_index") [value]++-- | Compare two wide bit-vectors for exact bit-pattern equality.+wideBVEqual :: Kind -> Doc -> Doc -> Doc+wideBVEqual k left right = namedCall (prefix k ++ "_eq") [left, right]++-- | Canonicalize an externally supplied wide value by clearing unused bits in+-- its most-significant limb.+wideBVNormalize :: Kind -> Doc -> Doc+wideBVNormalize k value = namedCall (prefix k ++ "_norm") [value]++-- | Cross-width helpers discovered while walking the symbolic DAG.+data Special = SpecialExtract    Kind Int Int Kind+             | SpecialJoin       Kind Kind Kind+             | SpecialConvert    Bool Kind Kind+             | SpecialRotate     Kind+             | SpecialShift      Kind+             | SpecialArithmetic NativeArithmetic Kind+             deriving (Eq)++-- | Native scalar arithmetic operations that require exact modular C+-- helpers.+data NativeArithmetic = SpecialAdd+                      | SpecialSub+                      | SpecialMul+                      | SpecialNeg+                      | SpecialAbs+                      | SpecialQuot+                      | SpecialRem+                      | SpecialEuclideanQuot+                      | SpecialEuclideanRem+                      deriving (Eq)++-- | Emit one exact native-width arithmetic helper. Modular operations are+-- evaluated through unsigned bits; signed division is guarded against both+-- zero divisors and the otherwise undefined minimum-value quotient.+nativeArithmeticRuntime :: NativeArithmetic -> Kind -> [String]+nativeArithmeticRuntime arith kind =+     ["static inline " ++ ty ++ " " ++ functionName ++ "(" ++ parameters ++ ")"+     , "{"+     ]+  ++ body+  ++ ["}", ""]+ where ty           = cType kind+       rawTy        = cType (KBounded False width)+       width        = bitWidth kind+       mask         = u64 (topMask kind)+       signMask     = u64 (1 `shiftL` (width - 1))+       functionName = prefix kind ++ "_" ++ arithmeticSuffix arith+       parameters+         | arith `elem` [SpecialNeg, SpecialAbs] = ty ++ " a"+         | True                                   = ty ++ " a, " ++ ty ++ " b"++       raw value = "((uint64_t) (" ++ rawTy ++ ") " ++ value ++ ")"++       modular expression =+         ("  const " ++ rawTy ++ " bits = (" ++ rawTy ++ ") ((" ++ expression ++ ") & " ++ mask ++ ");")+         : returnBits "bits"++       returnBits bits+         | hasSign kind = ["  " ++ ty ++ " result; memcpy(&result, &" ++ bits ++ ", sizeof result); return result;"]+         | True         = ["  return (" ++ ty ++ ") " ++ bits ++ ";"]++       body = case arith of+         SpecialAdd           -> modular (raw "a" ++ " + " ++ raw "b")+         SpecialSub           -> modular (raw "a" ++ " - " ++ raw "b")+         SpecialMul           -> modular (raw "a" ++ " * " ++ raw "b")+         SpecialNeg           -> modular ("UINT64_C(0) - " ++ raw "a")+         SpecialAbs+           | hasSign kind -> modular ("(" ++ raw "a" ++ " & " ++ signMask ++ ") != 0 ? UINT64_C(0) - " ++ raw "a" ++ " : " ++ raw "a")+           | True         -> modular (raw "a")+         SpecialQuot          -> divisionBody "/" ("(" ++ ty ++ ") 0") "a"+         SpecialRem           -> divisionBody "%" "a" ("(" ++ ty ++ ") 0")+         SpecialEuclideanQuot -> euclideanBody True+         SpecialEuclideanRem  -> euclideanBody False++       -- Once zero and minimum/-1 are excluded, both division and its+       -- Euclidean correction fit the signed type. Subtract the negative+       -- divisor directly so its minimum value is never negated.+       euclideanBody quotient =+         [ "  if (b == (" ++ ty ++ ") 0) return a;"+         , "  if (a == " ++ minimumValue ++ " && b == (" ++ ty ++ ") -1) return " ++ (if quotient then "a" else "0") ++ ";"+         , "  const " ++ ty ++ " remainder = (" ++ ty ++ ") (a % b);"+         ]+         ++ if quotient+            then [ "  const " ++ ty ++ " quotient = (" ++ ty ++ ") (a / b);"+                 , "  return remainder < 0 ? (b > 0 ? quotient - 1 : quotient + 1) : quotient;"+                 ]+            else [ "  return remainder < 0 ? (b > 0 ? remainder + b : remainder - b) : remainder;"+                 ]++       divisionBody operator zeroResult overflowResult =+            ["  if (b == (" ++ ty ++ ") 0) return " ++ zeroResult ++ ";"]+         ++ signedOverflow+         ++ ["  return (" ++ ty ++ ") (a " ++ operator ++ " b);"]+        where signedOverflow+                | hasSign kind = ["  if (a == " ++ minimumValue ++ " && b == (" ++ ty ++ ") -1) return " ++ overflowResult ++ ";"]+                | True         = []++       minimumValue = "INT" ++ show width ++ "_MIN"++-- | Return the generated helper suffix for exact native arithmetic.+arithmeticSuffix :: NativeArithmetic -> String+arithmeticSuffix SpecialAdd           = "add"+arithmeticSuffix SpecialSub           = "sub"+arithmeticSuffix SpecialMul           = "mul"+arithmeticSuffix SpecialNeg           = "neg"+arithmeticSuffix SpecialAbs           = "abs"+arithmeticSuffix SpecialQuot          = "quot"+arithmeticSuffix SpecialRem           = "rem"+arithmeticSuffix SpecialEuclideanQuot = "equot"+arithmeticSuffix SpecialEuclideanRem  = "erem"++-- | Emit exact native-width rotations through an unsigned representation so+-- the result is independent of integer promotions and signed-shift rules.+rotationRuntime :: Kind -> [String]+rotationRuntime kind =+     signedConversion+  ++ ["static inline " ++ ty ++ " " ++ p ++ "_rotl(" ++ ty ++ " a, uint64_t amount)"+  , "{"+  , "  amount %= " ++ show width ++ ";"+  , "  if (amount == 0) return a;"+  , "  return " ++ finish ("(" ++ rawTy ++ ") ((((uint64_t) (" ++ rawTy ++ ") a) << amount) | (((uint64_t) (" ++ rawTy ++ ") a) >> (" ++ show width ++ " - amount)))") ++ ";"+  , "}"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_rotr(" ++ ty ++ " a, uint64_t amount)"+  , "{"+  , "  amount %= " ++ show width ++ ";"+  , "  if (amount == 0) return a;"+  , "  return " ++ finish ("(" ++ rawTy ++ ") ((((uint64_t) (" ++ rawTy ++ ") a) >> amount) | (((uint64_t) (" ++ rawTy ++ ") a) << (" ++ show width ++ " - amount)))") ++ ";"+  , "}"+  , ""+  ]+ where ty               = cType kind+       p                = prefix kind+       width            = bitWidth kind+       rawTy            = cType (KBounded False width)+       conversionName   = p ++ "_rotate_from_bits"+       signedConversion+         | hasSign kind = ["static inline " ++ ty ++ " " ++ conversionName ++ "(" ++ rawTy ++ " bits)"+                          , "{ " ++ ty ++ " result; memcpy(&result, &bits, sizeof result); return result; }"+                          , ""]+         | True         = []+       finish value+         | hasSign kind = conversionName ++ "(" ++ value ++ ")"+         | True         = value++-- | Emit exact native-width logical and arithmetic shifts. The shift amount+-- is interpreted as an unsigned bit-vector, and amounts at least as large as+-- the operand width produce SMT-Lib's defined zero or sign-filled result.+shiftRuntime :: Kind -> [String]+shiftRuntime kind =+     signedConversion+  ++ leftShift+  ++ rightShift+ where ty               = cType kind+       p                = prefix kind+       width            = bitWidth kind+       rawTy            = cType (KBounded False width)+       amountValue      = "(uint64_t) (" ++ rawTy ++ ") amount"+       mask             = u64 (topMask kind)+       signMask         = u64 (1 `shiftL` (width - 1))+       conversionName   = p ++ "_shift_from_bits"+       signedConversion+         | hasSign kind = ["static inline " ++ ty ++ " " ++ conversionName ++ "(" ++ rawTy ++ " bits)"+                          , "{ " ++ ty ++ " result; memcpy(&result, &bits, sizeof result); return result; }"+                          , ""]+         | True         = []+       finish value+         | hasSign kind = conversionName ++ "(" ++ value ++ ")"+         | True         = value+       leftShift = ["static inline " ++ ty ++ " " ++ p ++ "_shl(" ++ ty ++ " a, " ++ ty ++ " amount)"+                   , "{"+                   , "  const uint64_t n = " ++ amountValue ++ ";"+                   , "  const " ++ rawTy ++ " result = n >= " ++ show width ++ " ? (" ++ rawTy ++ ") 0 : (" ++ rawTy ++ ") ((uint64_t) (" ++ rawTy ++ ") a << n);"+                   , "  return " ++ finish "result" ++ ";"+                   , "}"+                   , ""]+       rightShift+         | hasSign kind = ["static inline " ++ ty ++ " " ++ p ++ "_ashr(" ++ ty ++ " a, " ++ ty ++ " amount)"+                          , "{"+                          , "  const uint64_t n = " ++ amountValue ++ ";"+                          , "  const uint64_t raw = (uint64_t) (" ++ rawTy ++ ") a;"+                          , "  const bool sign = (raw & " ++ signMask ++ ") != 0;"+                          , "  " ++ rawTy ++ " result;"+                          , "  if (n >= " ++ show width ++ ") result = sign ? (" ++ rawTy ++ ") " ++ mask ++ " : (" ++ rawTy ++ ") 0;"+                          , "  else { result = (" ++ rawTy ++ ") (raw >> n); if (sign && n != 0) result = (" ++ rawTy ++ ") ((uint64_t) result | (" ++ mask ++ " << (" ++ show width ++ " - n))); }"+                          , "  return " ++ finish "result" ++ ";"+                          , "}"+                          , ""]+         | True = ["static inline " ++ ty ++ " " ++ p ++ "_lshr(" ++ ty ++ " a, " ++ ty ++ " amount)"+                  , "{"+                  , "  const uint64_t n = " ++ amountValue ++ ";"+                  , "  return n >= " ++ show width ++ " ? (" ++ ty ++ ") 0 : (" ++ ty ++ ") ((uint64_t) (" ++ rawTy ++ ") a >> n);"+                  , "}"+                  , ""]++-- | Emit the complete modular-arithmetic runtime for one bit-vector kind.+coreRuntime :: Kind -> [String]+coreRuntime k =+  ["static inline " ++ ty ++ " " ++ p ++ "_zero(void)"+  , "{"+  , "  " ++ ty ++ " r = {{0}};"+  , "  return r;"+  , "}"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_norm(" ++ ty ++ " a)"+  , "{"+  , "  a.limb[" ++ show (n - 1) ++ "] &= " ++ u64 mask ++ ";"+  , "  return a;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_get(" ++ ty ++ " a, uint64_t bit)"+  , "{"+  , "  return bit < " ++ show w ++ " && ((a.limb[bit / 64] >> (bit % 64)) & UINT64_C(1)) != 0;"+  , "}"+  , ""+  , "static inline void " ++ p ++ "_set(" ++ ty ++ " *a, uint64_t bit, bool value)"+  , "{"+  , "  const uint64_t m = UINT64_C(1) << (bit % 64);"+  , "  if (value) { a->limb[bit / 64] |= m; } else { a->limb[bit / 64] &= ~m; }"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_is_zero(" ++ ty ++ " a)"+  , "{"+  , "  uint64_t v = 0;"+  , "  size_t i;"+  , "  for (i = 0; i < " ++ show n ++ "; ++i) { v |= a.limb[i]; }"+  , "  return v == 0;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_eq(" ++ ty ++ " a, " ++ ty ++ " b)"+  , "{"+  , "  uint64_t v = 0;"+  , "  size_t i;"+  , "  for (i = 0; i < " ++ show n ++ "; ++i) { v |= a.limb[i] ^ b.limb[i]; }"+  , "  return v == 0;"+  , "}"+  , ""+  , "static inline int " ++ p ++ "_cmpu(" ++ ty ++ " a, " ++ ty ++ " b)"+  , "{"+  , "  size_t i = " ++ show n ++ ";"+  , "  while (i-- > 0) { if (a.limb[i] < b.limb[i]) return -1; if (a.limb[i] > b.limb[i]) return 1; }"+  , "  return 0;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_lt(" ++ ty ++ " a, " ++ ty ++ " b)"+  , "{"+  ]+  ++ signedCompare+  ++ ["}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_add(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  " ++ ty ++ " r;"+     , "  uint64_t carry = 0;"+     , "  size_t i;"+     , "  for (i = 0; i < " ++ show n ++ "; ++i) {"+     , "    uint64_t s = a.limb[i] + b.limb[i];"+     , "    uint64_t c1 = s < a.limb[i];"+     , "    uint64_t t = s + carry;"+     , "    uint64_t c2 = t < s;"+     , "    r.limb[i] = t; carry = c1 | c2;"+     , "  }"+     , "  return " ++ p ++ "_norm(r);"+     , "}"+     , ""+     , "static inline uint64_t " ++ p ++ "_index(" ++ ty ++ " a)"+     , "{"+     , "  return a.limb[0];"+     , "}"+     , ""+     , "static inline bool " ++ p ++ "_index_in_range(" ++ ty ++ " a, uint64_t limit)"+     , "{"+     , "  size_t i;"+     , "  for (i = 1; i < " ++ show n ++ "; ++i) if (a.limb[i] != UINT64_C(0)) return false;"+     , "  return a.limb[0] < limit;"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_sub(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  " ++ ty ++ " r;"+     , "  uint64_t borrow = 0;"+     , "  size_t i;"+     , "  for (i = 0; i < " ++ show n ++ "; ++i) {"+     , "    uint64_t d = a.limb[i] - b.limb[i];"+     , "    uint64_t b1 = a.limb[i] < b.limb[i];"+     , "    uint64_t t = d - borrow;"+     , "    uint64_t b2 = d < borrow;"+     , "    r.limb[i] = t; borrow = b1 | b2;"+     , "  }"+     , "  return " ++ p ++ "_norm(r);"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_not(" ++ ty ++ " a)"+     , "{"+     , "  size_t i;"+     , "  for (i = 0; i < " ++ show n ++ "; ++i) { a.limb[i] = ~a.limb[i]; }"+     , "  return " ++ p ++ "_norm(a);"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_neg(" ++ ty ++ " a)"+     , "{"+     , "  " ++ ty ++ " one = " ++ p ++ "_zero(); one.limb[0] = 1;"+     , "  return " ++ p ++ "_add(" ++ p ++ "_not(a), one);"+     , "}"+     , ""+     ]+  ++ concatMap bitwise [("and", "&"), ("or", "|"), ("xor", "^")]+  ++ ["static inline " ++ ty ++ " " ++ p ++ "_shl(" ++ ty ++ " a, uint64_t amount)"+     , "{"+     , "  " ++ ty ++ " r = " ++ p ++ "_zero();"+     , "  uint64_t ws, bs; size_t i;"+     , "  if (amount >= " ++ show w ++ ") return r;"+     , "  ws = amount / 64; bs = amount % 64;"+     , "  for (i = " ++ show n ++ "; i-- > ws;) {"+     , "    r.limb[i] = a.limb[i - ws] << bs;"+     , "    if (bs != 0 && i > ws) r.limb[i] |= a.limb[i - ws - 1] >> (64 - bs);"+     , "  }"+     , "  return " ++ p ++ "_norm(r);"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_lshr(" ++ ty ++ " a, uint64_t amount)"+     , "{"+     , "  " ++ ty ++ " r = " ++ p ++ "_zero();"+     , "  uint64_t ws, bs; size_t i;"+     , "  if (amount >= " ++ show w ++ ") return r;"+     , "  ws = amount / 64; bs = amount % 64;"+     , "  for (i = 0; i + ws < " ++ show n ++ "; ++i) {"+     , "    r.limb[i] = a.limb[i + ws] >> bs;"+     , "    if (bs != 0 && i + ws + 1 < " ++ show n ++ ") r.limb[i] |= a.limb[i + ws + 1] << (64 - bs);"+     , "  }"+     , "  return " ++ p ++ "_norm(r);"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_ashr(" ++ ty ++ " a, uint64_t amount)"+     , "{"+     , "  " ++ ty ++ " r = " ++ p ++ "_zero(); uint64_t i;"+     , "  const bool sign = " ++ p ++ "_get(a, " ++ show (w - 1) ++ ");"+     , "  for (i = 0; i < " ++ show w ++ "; ++i) { " ++ p ++ "_set(&r, i, i + amount < " ++ show w ++ " ? " ++ p ++ "_get(a, i + amount) : sign); }"+     , "  return r;"+     , "}"+     , ""+     , "static inline uint64_t " ++ p ++ "_shift_amount(" ++ ty ++ " a)"+     , "{"+     , "  size_t i;"+     , "  for (i = 1; i < " ++ show n ++ "; ++i) if (a.limb[i] != 0) return " ++ show w ++ ";"+     , "  return a.limb[0] < " ++ show w ++ " ? a.limb[0] : " ++ show w ++ ";"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_rotl(" ++ ty ++ " a, uint64_t amount)"+     , "{"+     , "  amount %= " ++ show w ++ ";"+     , "  return amount == 0 ? a : " ++ p ++ "_or(" ++ p ++ "_shl(a, amount), " ++ p ++ "_lshr(a, " ++ show w ++ " - amount));"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_rotr(" ++ ty ++ " a, uint64_t amount)"+     , "{"+     , "  amount %= " ++ show w ++ ";"+     , "  return amount == 0 ? a : " ++ p ++ "_or(" ++ p ++ "_lshr(a, amount), " ++ p ++ "_shl(a, " ++ show w ++ " - amount));"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_mul(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  " ++ ty ++ " r = " ++ p ++ "_zero(); uint64_t bit;"+     , "  for (bit = 0; bit < " ++ show w ++ "; ++bit) {"+     , "    " ++ ty ++ " selected; uint64_t mask = UINT64_C(0) - (uint64_t) " ++ p ++ "_get(b, bit); size_t i;"+     , "    for (i = 0; i < " ++ show n ++ "; ++i) selected.limb[i] = a.limb[i] & mask;"+     , "    r = " ++ p ++ "_add(r, selected); a = " ++ p ++ "_shl(a, 1);"+     , "  }"+     , "  return r;"+     , "}"+     , ""+     , "static inline void " ++ p ++ "_udivrem(" ++ ty ++ " a, " ++ ty ++ " b, " ++ ty ++ " *q, " ++ ty ++ " *r)"+     , "{"+     , "  uint64_t bit; *q = " ++ p ++ "_zero(); *r = " ++ p ++ "_zero();"+     , "  if (" ++ p ++ "_is_zero(b)) { *r = a; return; }"+     , "  for (bit = " ++ show w ++ "; bit-- > 0;) {"+     , "    *r = " ++ p ++ "_shl(*r, 1); " ++ p ++ "_set(r, 0, " ++ p ++ "_get(a, bit));"+     , "    if (" ++ p ++ "_cmpu(*r, b) >= 0) { *r = " ++ p ++ "_sub(*r, b); " ++ p ++ "_set(q, bit, true); }"+     , "  }"+     , "}"+     , ""+     ]+  ++ division+  ++ ["static inline " ++ ty ++ " " ++ p ++ "_abs(" ++ ty ++ " a)"+     , "{"+     , if hasSign k then "  return " ++ p ++ "_get(a, " ++ show (w - 1) ++ ") ? " ++ p ++ "_neg(a) : a;" else "  return a;"+     , "}"+     , ""+     ]+  ++ overflowRuntime+ where ty   = cType k+       p    = prefix k+       w    = intSizeOf k+       n    = limbs k+       mask = topMask k++       signedCompare+         | hasSign k = ["  const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ ");"+                        , "  const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+                        , "  return sa != sb ? sa : " ++ p ++ "_cmpu(a, b) < 0;"]+         | True       = ["  return " ++ p ++ "_cmpu(a, b) < 0;"]++       bitwise (nm, op) =+         ["static inline " ++ ty ++ " " ++ p ++ "_" ++ nm ++ "(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  size_t i;"+         , "  for (i = 0; i < " ++ show n ++ "; ++i) { a.limb[i] " ++ op ++ "= b.limb[i]; }"+         , "  return " ++ p ++ "_norm(a);"+         , "}"+         , ""]++       division+         | hasSign k =+            ["static inline " ++ ty ++ " " ++ p ++ "_quot(" ++ ty ++ " a, " ++ ty ++ " b)"+            , "{"+            , "  " ++ ty ++ " q, r; const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ "); const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+            , "  " ++ p ++ "_udivrem(sa ? " ++ p ++ "_neg(a) : a, sb ? " ++ p ++ "_neg(b) : b, &q, &r);"+            , "  return sa != sb ? " ++ p ++ "_neg(q) : q;"+            , "}"+            , ""+            , "static inline " ++ ty ++ " " ++ p ++ "_rem(" ++ ty ++ " a, " ++ ty ++ " b)"+            , "{"+            , "  " ++ ty ++ " q, r; const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ "); const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+            , "  " ++ p ++ "_udivrem(sa ? " ++ p ++ "_neg(a) : a, sb ? " ++ p ++ "_neg(b) : b, &q, &r);"+            , "  return sa ? " ++ p ++ "_neg(r) : r;"+            , "}"+            , ""]+         | True =+            ["static inline " ++ ty ++ " " ++ p ++ "_quot(" ++ ty ++ " a, " ++ ty ++ " b)"+            , "{ " ++ ty ++ " q, r; " ++ p ++ "_udivrem(a, b, &q, &r); return q; }"+            , ""+            , "static inline " ++ ty ++ " " ++ p ++ "_rem(" ++ ty ++ " a, " ++ ty ++ " b)"+            , "{ " ++ ty ++ " q, r; " ++ p ++ "_udivrem(a, b, &q, &r); return r; }"+            , ""]++       overflowRuntime =+         ["static inline bool " ++ p ++ "_is_min(" ++ ty ++ " a)"+         , "{"+         , "  " ++ ty ++ " m = " ++ p ++ "_zero();"+         , "  " ++ p ++ "_set(&m, " ++ show (w - 1) ++ ", true);"+         , "  return " ++ p ++ "_eq(a, m);"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_uaddo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  return " ++ p ++ "_cmpu(" ++ p ++ "_add(a, b), a) < 0;"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_saddo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  const " ++ ty ++ " r = " ++ p ++ "_add(a, b);"+         , "  const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ ");"+         , "  const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+         , "  const bool sr = " ++ p ++ "_get(r, " ++ show (w - 1) ++ ");"+         , "  return sa == sb && sa != sr;"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_usubo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  return " ++ p ++ "_cmpu(a, b) < 0;"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_ssubo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  const " ++ ty ++ " r = " ++ p ++ "_sub(a, b);"+         , "  const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ ");"+         , "  const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+         , "  const bool sr = " ++ p ++ "_get(r, " ++ show (w - 1) ++ ");"+         , "  return sa != sb && sa != sr;"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_umulo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  " ++ ty ++ " q, r;"+         , "  if (" ++ p ++ "_is_zero(b)) return false;"+         , "  " ++ p ++ "_udivrem(" ++ p ++ "_mul(a, b), b, &q, &r);"+         , "  return !" ++ p ++ "_eq(q, a);"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_smulo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  " ++ ty ++ " q, r, limit = " ++ p ++ "_zero();"+         , "  const bool sa = " ++ p ++ "_get(a, " ++ show (w - 1) ++ ");"+         , "  const bool sb = " ++ p ++ "_get(b, " ++ show (w - 1) ++ ");"+         , "  const bool negative = sa != sb;"+         , "  uint64_t bit;"+         , "  if (sa) a = " ++ p ++ "_neg(a);"+         , "  if (sb) b = " ++ p ++ "_neg(b);"+         , "  if (" ++ p ++ "_is_zero(a) || " ++ p ++ "_is_zero(b)) return false;"+         , "  if (negative) " ++ p ++ "_set(&limit, " ++ show (w - 1) ++ ", true);"+         , "  else for (bit = 0; bit < " ++ show (w - 1) ++ "; ++bit) " ++ p ++ "_set(&limit, bit, true);"+         , "  " ++ p ++ "_udivrem(limit, b, &q, &r);"+         , "  return " ++ p ++ "_cmpu(a, q) > 0;"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_sdivo(" ++ ty ++ " a, " ++ ty ++ " b)"+         , "{"+         , "  return " ++ p ++ "_is_min(a) && " ++ p ++ "_eq(b, " ++ p ++ "_not(" ++ p ++ "_zero()));"+         , "}"+         , ""+         , "static inline bool " ++ p ++ "_snego(" ++ ty ++ " a)"+         , "{"+         , "  return " ++ p ++ "_is_min(a);"+         , "}"+         , ""]++-- | Emit a bit-preserving extraction, extension, or integral conversion.+conversionRuntime :: String -> Bool -> Int -> Kind -> Kind -> [String]+conversionRuntime nm signExtend sourceOffset fr to =+  ["static inline " ++ cType to ++ " " ++ nm ++ "(" ++ cType fr ++ " a)"+  , "{"+  , "  " ++ cType to ++ " r = " ++ zeroValue to ++ ";"+  , "  uint64_t i;"+  , "  for (i = 0; i < " ++ show copied ++ "; ++i) { " ++ setBit to "r" "i" (getBit fr "a" (offset "i")) ++ " }"+  ]+  ++ extension+  ++ ["  return " ++ normalize to "r" ++ ";"+     , "}"+     , ""]+ where available = max 0 (bitWidth fr - sourceOffset)+       copied    = min available (bitWidth to)+       offset i  = if sourceOffset == 0 then i else i ++ " + " ++ show sourceOffset+       extension+         | signExtend && bitWidth to > copied =+             ["  if (" ++ getBit fr "a" (show (bitWidth fr - 1)) ++ ") for (i = " ++ show copied ++ "; i < " ++ show (bitWidth to) ++ "; ++i) { " ++ setBit to "r" "i" "true" ++ " }"]+         | True                                      = []++-- | Emit concatenation code for a particular pair of operand kinds.+joinRuntime :: Kind -> Kind -> Kind -> [String]+joinRuntime a b to =+  ["static inline " ++ cType to ++ " " ++ joinName a b to ++ "(" ++ cType a ++ " high, " ++ cType b ++ " low)"+  , "{"+  , "  " ++ cType to ++ " r = " ++ zeroValue to ++ "; uint64_t i;"+  , "  for (i = 0; i < " ++ show (bitWidth b) ++ "; ++i) { " ++ setBit to "r" "i" (getBit b "low" "i") ++ " }"+  , "  for (i = 0; i < " ++ show (bitWidth a) ++ "; ++i) { " ++ setBit to "r" ("i + " ++ show (bitWidth b)) (getBit a "high" "i") ++ " }"+  , "  return " ++ normalize to "r" ++ ";"+  , "}"+  , ""]++-- | Render a target-independent bit read from a scalar or limb value.+getBit :: Kind -> String -> String -> String+getBit k value bit+  | isWideBV k                  = prefix k ++ "_get(" ++ value ++ ", " ++ bit ++ ")"+  | isBoolean k || isBounded k = "((((uint64_t) " ++ value ++ ") >> (" ++ bit ++ ")) & UINT64_C(1)) != 0"+  | otherwise                  = error $ "SBV->C: Cannot extract bits from " ++ show k++-- | Render a target-independent bit update to a scalar or limb value.+setBit :: Kind -> String -> String -> String -> String+setBit k value bit bitValue+  | isWideBV k                  = prefix k ++ "_set(&" ++ value ++ ", " ++ bit ++ ", " ++ bitValue ++ ");"+  | isBoolean k || isBounded k = value ++ " = (" ++ cType k ++ ") ((uint64_t) " ++ value ++ " | ((uint64_t) (" ++ bitValue ++ ") << (" ++ bit ++ ")));"+  | otherwise                  = error $ "SBV->C: Cannot set bits in " ++ show k++-- | Render the zero value for a scalar or limb representation.+zeroValue :: Kind -> String+zeroValue k+  | isWideBV k                  = prefix k ++ "_zero()"+  | isBoolean k || isBounded k = "(" ++ cType k ++ ") 0"+  | otherwise                  = error $ "SBV->C: Cannot construct a zero of " ++ show k++-- | Render canonicalization for a scalar or limb representation.+normalize :: Kind -> String -> String+normalize k value+  | isWideBV k                  = prefix k ++ "_norm(" ++ value ++ ")"+  | isBoolean k || isBounded k = value+  | otherwise                  = error $ "SBV->C: Cannot normalize " ++ show k++-- | Construct the collision-free name of an extraction helper.+extractName :: Kind -> Int -> Int -> Kind -> String+extractName fr hi lo to = "sbv_bv_extract_" ++ tag fr ++ "_" ++ show hi ++ "_" ++ show lo ++ "_" ++ tag to++-- | Construct the collision-free name of a concatenation helper.+joinName :: Kind -> Kind -> Kind -> String+joinName a b to = "sbv_bv_join_" ++ tag a ++ "_" ++ tag b ++ "_" ++ tag to++-- | Construct the collision-free name of an extension/conversion helper.+convertName :: Bool -> Kind -> Kind -> String+convertName sign fr to = "sbv_bv_" ++ (if sign then "sext_" else "zext_") ++ tag fr ++ "_" ++ tag to++-- | Render a C function call.+namedCall :: String -> [Doc] -> Doc+namedCall nm args = text nm P.<> parens (fsep (punctuate comma args))++-- | Select the first operation argument, reporting an internal arity error.+headArg :: String -> [a] -> a+headArg _ (a:_) = a+headArg nm []    = error $ "SBV->C: " ++ nm ++ " unexpectedly has no arguments"++-- | Report an internal arity error for an operation.+badArity :: String -> [a] -> b+badArity nm _ = error $ "SBV->C: " ++ nm ++ " has an unexpected arity"++-- | Return the generated helper suffix for an overflow predicate.+overflowName :: OvOp -> String+overflowName (PlusOv False) = "uaddo"+overflowName (PlusOv True)  = "saddo"+overflowName (SubOv  False) = "usubo"+overflowName (SubOv  True)  = "ssubo"+overflowName (MulOv  False) = "umulo"+overflowName (MulOv  True)  = "smulo"+overflowName DivOv          = "sdivo"+overflowName NegOv          = "snego"++-- | Return the logical bit width used by the C representation. Unlike+-- 'intSizeOf', this is defined for 'KBool', which occupies one logical bit.+bitWidth :: Kind -> Int+bitWidth k+  | isBoolean k = 1+  | otherwise   = intSizeOf k++-- | Test whether a symbolic value uses one of the scalar C bit-vector+-- representations, including the one-bit unsigned representation.+isNativeBV :: HasKind a => a -> Bool+isNativeBV value = isNativeBVKind (kindOf value)++-- | Test whether a kind uses one of the scalar C bit-vector representations.+isNativeBVKind :: Kind -> Bool+isNativeBVKind kind = isBounded kind && not (isWideBV kind)++-- | Return the number of 64-bit limbs needed by a kind.+limbs :: Kind -> Int+limbs k = (intSizeOf k + 63) `div` 64++-- | Return the mask for the final limb of a canonical value.+topMask :: Kind -> Integer+topMask k+  | r == 0    = (1 `shiftL` 64) - 1+  | otherwise = (1 `shiftL` r) - 1+ where r = intSizeOf k `mod` 64++-- | Return the C type name used for a bit-vector kind.+cType :: Kind -> String+cType KBool               = "SBool"+cType (KBounded False 1)  = "SBool"+cType (KBounded False w)  = "SWord" ++ show w+cType (KBounded True  w)  = "SInt"  ++ show w+cType k                   = error $ "SBV->C: Expected a C bit-vector type, received " ++ show k++-- | Return the compact signedness-and-width tag used in generated names.+tag :: Kind -> String+tag KBool               = "u1"+tag (KBounded False w)  = "u" ++ show w+tag (KBounded True  w)  = "s" ++ show w+tag k                   = error $ "SBV->C: Expected a bit-vector tag, received " ++ show k++-- | Return the namespace prefix for helpers belonging to a kind.+prefix :: Kind -> String+prefix k = "sbv_bv_" ++ tag k++-- | Render an integer as a padded, portable C @uint64_t@ literal.+u64 :: Integer -> String+u64 i = "UINT64_C(0x" ++ pad 16 (showHex i "") ++ ")"+ where pad n s = replicate (n - length s) '0' ++ s
+ Data/SBV/Compilers/C/Backend.hs view
@@ -0,0 +1,3143 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Backend+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Compilation of symbolic programs to C+-----------------------------------------------------------------------------++{-# LANGUAGE TupleSections #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Backend(compileToC, compileToCLib, compileToC', compileToCLib') where++import Data.SBV.Compilers.C.Types (isConcreteADTReference)+import Control.DeepSeq                 (rnf)+import Data.Char                       (isAsciiLower, isAsciiUpper, isDigit, isSpace, toLower)+import qualified Data.Foldable         as F (toList)+import qualified Data.Graph            as DG+import Data.List                       (intercalate, intersperse, isPrefixOf, nub, sortOn)+import qualified Data.Map.Strict       as Map+import Data.Maybe                      (fromJust, fromMaybe, isJust, isNothing, maybeToList)+import qualified Data.Set              as Set (Set, difference, empty, fromList, insert, intersection, map, member, notMember, null, toList, union, unions)+import qualified Data.Text             as T+import System.FilePath                 (replaceExtension, takeBaseName)+import System.Random++import Data.SBV.Core.Symbolic (LambdaInfo(..), ResultInp(..), ProgInfo(..), SMTDef(SMTDef), smtDefInfo, smtLambdaInfo)++-- Work around the fact that GHC 8.4.1 started exporting <>.. Hmm..+import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Core.Data+import Data.SBV.Core.Kind (expandKinds, kRoundingMode)+import Data.SBV.Compilers.C.ADT+import Data.SBV.Compilers.C.Array+import Data.SBV.Compilers.C.BV+import Data.SBV.Compilers.C.FP+import Data.SBV.Compilers.C.Finite (finiteDomainSize)+import Data.SBV.Compilers.C.GMP+import Data.SBV.Compilers.C.List+import Data.SBV.Compilers.C.Lowering+import Data.SBV.Compilers.C.NonLinear+import Data.SBV.Compilers.C.PseudoBoolean (assignPseudoBoolean)+import Data.SBV.Compilers.C.Real (mappedRealFloorWidth, mappedRealFloorCall, mappedRealFloorRuntime)+import Data.SBV.Compilers.C.RegExp (regexExpr)+import Data.SBV.Compilers.C.Set+import Data.SBV.Compilers.C.Syntax (cUnusedAttribute, cCommentText, cStringLiteral)+import Data.SBV.Compilers.C.Table+import Data.SBV.Compilers.C.Text+import qualified Data.SBV.Compilers.C.Types as CTypes (constElementCType, definedFunctionCName, elementCType, kindTag)+import Data.SBV.Compilers.C.Tuple+import Data.SBV.Compilers.C.Value ( byValueEqual, managedValueClone, managedValueRelease, valueNeedsOwnership+                                , valueDriverNeedsInitialization, valueDriverInit, valueDriverClear+                                )+import Data.SBV.Compilers.CodeGen++import Data.SBV.Utils.PrettyNum   (chex, showCFloat, showCDouble)++import GHC.Stack++---------------------------------------------------------------------------+-- * API+---------------------------------------------------------------------------++-- | Given a symbolic computation, render it as an equivalent collection of files+-- that make up a C program:+--+--   * The first argument is the directory name under which the files will be saved. To save+--     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.+--+--   * The second argument is the name of the C function to generate.+--+--   * The final argument is the function to be compiled.+--+-- Compilation will also generate a @Makefile@,  a header file, and a driver (test) program, etc. As a+-- result, we return whatever the code-gen function returns. Most uses should simply have @()@ as+-- the return type here, but the value can be useful if you want to chain the result of+-- one compilation act to the next.+-- Names must obey the public naming contract in "Data.SBV.Tools.CodeGen";+-- invalid or reserved names are rejected before any files are written.+--+-- Detected runtime failures in the generated code terminate the calling process;+-- there is no recoverable error-return interface. See the runtime contract in+-- "Data.SBV.Tools.CodeGen".+-- Callers must enter generated code in @FE_TONEAREST@ hardware rounding mode;+-- generated code does not check or change that mode.+compileToC :: Maybe FilePath -> String -> SBVCodeGen a -> IO a+compileToC mbDirName nm f = do (retVal, cfg, bundle) <- compileToC' nm f+                               renderCgPgmBundle mbDirName (cfg, bundle)+                               pure retVal++-- | Lower level version of 'compileToC', producing a t'CgPgmBundle'+compileToC' :: String -> SBVCodeGen a -> IO (a, CgConfig, CgPgmBundle)+compileToC' nm f = do validateCName "function" nm `seq` pure ()+                      rands <- randoms <$> newStdGen+                      result@(_, _, bundle) <- codeGen SBVToC (defaultCgConfig { cgDriverVals = rands }) nm f+                      bundle `seq` pure result++-- | Create code to generate a library archive (.a) from given symbolic functions. Useful when generating code+-- from multiple functions that work together as a library.+--+--   * The first argument is the directory name under which the files will be saved. To save+--     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.+--+--   * The second argument is the name of the archive to generate.+--+--   * The third argument is the list of functions to include, in the form of function-name/code pairs, similar+--     to the second and third arguments of 'compileToC', except in a list.+--+-- The component list must be nonempty and component names must be distinct.+-- Generated file names and driver entry points must not collide either.+-- As with 'compileToC', detected runtime failures terminate the calling process,+-- including when the generated functions are used as a library.+compileToCLib :: Maybe FilePath -> String -> [(String, SBVCodeGen a)] -> IO [a]+compileToCLib mbDirName libName comps = do (retVal, cfg, pgm) <- compileToCLib' libName comps+                                           renderCgPgmBundle mbDirName (cfg, pgm)+                                           pure retVal++-- | Lower level version of 'compileToCLib', producing a t'CgPgmBundle'+compileToCLib' :: String -> [(String, SBVCodeGen a)] -> IO ([a], CgConfig, CgPgmBundle)+compileToCLib' libName comps+  | null comps+  = error "SBV.compileToCLib: A library must contain at least one component."+  | not (null duplicates)+  = error $ "SBV.compileToCLib: Duplicate component names: " ++ unwords duplicates+  | True+  = do validateCName "library" libName `seq` pure ()+       mapM_ (\(fn, _) -> validateCName "component" fn `seq` pure ()) comps+       resCfgBundles <- mapM component comps+       let (finalCfg, finalPgm) = mergeToLib libName [(c, b) | (_, c, b) <- resCfgBundles]+       finalPgm `seq` pure ([r | (r, _, _) <- resCfgBundles], finalCfg, finalPgm)+ where duplicates = duplicateNames (map fst comps)++       component (componentName, program) = do+         rands <- randoms <$> newStdGen+         codeGen SBVToCLibraryComponent (defaultCgConfig { cgDriverVals = rands }) componentName program++-- | Report each repeated name once, preserving its first occurrence order.+duplicateNames :: [String] -> [String]+duplicateNames names = [nm | nm <- nub names, length (filter (== nm) names) > 1]++-- | Retain the first value for each key without repeated linear scans or+-- repeated rendering of documents. Original order is significant in C output.+uniqueOn :: Ord key => (value -> key) -> [value] -> [value]+uniqueOn key = go Set.empty+ where go _ [] = []+       go seen (value:rest)+         | valueKey `Set.member` seen = go seen rest+         | True                       = value : go (Set.insert valueKey seen) rest+         where valueKey = key value++-- | Validate public C names before rendering. Use a portable ASCII spelling,+-- excluding language keywords and namespaces owned by the generated runtime+-- and its headers. User-supplied C declarations remain the caller's responsibility.+validateCName :: String -> String -> ()+validateCName role nm+  | not validIdentifier = reject "expected an ASCII C identifier"+  | nm `elem` keywords  = reject "C keyword"+  | reserved            = reject "reserved C/backend name"+  | True                = ()+ where reject reason = error $ "SBV->C: Invalid " ++ role ++ " name " ++ show nm ++ ": " ++ reason ++ "."+       letter c = isAsciiLower c || isAsciiUpper c+       validIdentifier = case nm of+                           initial : rest -> (letter initial || initial == '_') && all (\c -> letter c || isDigit c || c == '_') rest+                           []           -> False+       keywords = words ("auto break case char const continue default do double else enum extern float for goto if inline int long register"+                  ++ " restrict return short signed sizeof static struct switch typedef union unsigned void volatile while alignas alignof"+                  ++ " bool constexpr false nullptr static_assert thread_local true typeof typeof_unqual")+       reserved = any (`isPrefixOf` nm)+                    ["_", "sbv_", "SBV", "SWord", "SInt", "SFP", "mp_", "mpz_", "mpq_", "mpf_", "gmp_", "bf_", "BF_", "GMP_"+                    , "FLT_", "DBL_", "LDBL_", "FP_", "FE_", "va_"]+               || nm `elem` integerMacros+               || nm `elem` words ("SBool SFloat SDouble SReal SRational SChar SString RoundingMode div_t ldiv_t lldiv_t size_t ptrdiff_t intmax_t"+                  ++ " uintmax_t intptr_t uintptr_t FILE fpos_t NULL EOF stdin stdout stderr BUFSIZ FILENAME_MAX FOPEN_MAX L_tmpnam"+                  ++ " SEEK_CUR SEEK_END SEEK_SET TMP_MAX EXIT_SUCCESS EXIT_FAILURE RAND_MAX MB_CUR_MAX HUGE_VAL HUGE_VALF HUGE_VALL"+                  ++ " INFINITY NAN MATH_ERRNO MATH_ERREXCEPT math_errhandling errno limb_t slimb_t fenv_t fexcept_t"+                  ++ " SIZE_MAX PTRDIFF_MAX PTRDIFF_MIN SIG_ATOMIC_MIN SIG_ATOMIC_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX")+               || nm `elem` [sign ++ "int" ++ flavor ++ show bits ++ "_t" | sign <- ["", "u"], flavor <- ["", "_least", "_fast"], bits <- [8, 16, 32, 64 :: Int]]+               || (role /= "parameter" && (nm `elem` libraryFunctions || nm `elem` mathFunctions))++       -- External library identifiers may be shadowed in a prototype's+       -- parameter scope, but cannot be redefined as generated entry points.+       libraryFunctions = words ("main abort exit quick_exit _Exit atexit at_quick_exit malloc calloc realloc free aligned_alloc abs labs llabs div ldiv"+                  ++ " lldiv atoi atol atoll atof strtol strtoll strtoul strtoull strtof strtod strtold rand srand"+                  ++ " getenv system bsearch qsort mblen mbtowc wctomb mbstowcs wcstombs remove rename tmpfile tmpnam fclose fflush fopen"+                  ++ " freopen setbuf setvbuf fprintf fscanf printf scanf snprintf sprintf sscanf vfprintf vfscanf vprintf vscanf vsnprintf"+                  ++ " vsprintf vsscanf fgetc fgets fputc fputs getc getchar putc putchar puts ungetc fread fwrite fgetpos fseek fsetpos"+                  ++ " ftell rewind clearerr feof ferror perror memcpy memmove memcmp memchr memset strcat strncat strchr strrchr strcmp"+                  ++ " strncmp strcoll strcpy strncpy strcspn strerror strlen strpbrk strspn strstr strtok strxfrm fpclassify isfinite"+                  ++ " isinf isnan isnormal signbit isgreater isgreaterequal isless islessequal islessgreater isunordered")+       mathFunctions = [base ++ suffix | base <- words ("acos asin atan atan2 cos sin tan acosh asinh atanh cosh sinh tanh exp exp2 expm1 frexp ldexp log log10 log1p log2"+                  ++ " logb modf scalbn scalbln cbrt fabs hypot pow sqrt erf erfc lgamma tgamma ceil floor nearbyint rint lrint llrint"+                  ++ " round lround llround trunc fmod remainder remquo copysign nan nextafter nexttoward fdim fmax fmin fma"), suffix <- ["", "f", "l"]]++       integerMacros = [sign ++ flavor ++ width ++ suffix+                       | sign <- ["INT", "UINT"], flavor <- ["", "_LEAST", "_FAST"]+                       , width <- ["8", "16", "32", "64", "MAX", "PTR"], suffix <- ["_MIN", "_MAX", "_C"]]+                    ++ [prefix ++ conversion ++ flavor ++ width+                       | prefix <- ["PRI", "SCN"], conversion <- ["d", "i", "o", "u", "x", "X"]+                       , flavor <- ["", "LEAST", "FAST"], width <- ["8", "16", "32", "64", "MAX", "PTR"]]++-- | Bind each public parameter to a disjoint implementation-only name. C+-- parameter names do not affect linkage or the positional calling convention.+privateParameters :: String -> [(String, CgVal)] -> [(String, CgVal)]+privateParameters prefix = zipWith (\index (_, value) -> (prefix ++ show index, value)) [0 :: Int ..]++---------------------------------------------------------------------------+-- * Implementation+---------------------------------------------------------------------------++-- | C targets differ only in whether optional build metadata must survive+-- until library merging. The user's requested output configuration is retained.+data SBVToC = SBVToC | SBVToCLibraryComponent++-- | Select the current lowering pipeline, retaining component build metadata+-- until a library's dependencies have been combined.+instance CgTarget SBVToC where+  targetName _                       = "C"+  translate SBVToC                   = cgen False+  translate SBVToCLibraryComponent   = cgen True++-- | Report an unexpected compiler input or violated internal invariant.+die :: String -> a+die msg = error $ "SBV->C: Unexpected: " ++ msg++-- | Report an operation without an executable lowering.+tbd :: String -> a+tbd msg = error $ "SBV->C: Not yet supported: " ++ msg++-- | Assemble the generated translation unit, public header, and optional+-- driver and build instructions from the symbolic result.+cgen :: Bool -> CgConfig -> String -> CgState -> Result -> CgPgmBundle+cgen retainBuildMetadata cfg nm st sbvProg+   -- Force type declarations, the signature, and the main program so any+   -- type-conversion exceptions appear while constructing the bundle.+   = foldr (seq . validateCName "parameter") () interfaceNames `seq`+     rnf (render extraTypes) `seq` rnf (render sig) `seq` rnf (render (vcat body)) `seq` result+  where result = CgPgmBundle bundleKind+                        $ filt [ ("Makefile"   , (CgMakefile flags          , [genMake usesFloating (cgGenDriver cfg) nm nmd flags]))+                               , (nm  ++ ".h"  , (CgCHeader (CgCHeaderInfo usesFloating extraTypes [sig] extProtos), [genHeader usesFloating bundleKind nm [sig] extProtos extraTypes]))+                               , (nmd ++ ".c"  , (CgDriver                  , driver))+                               , (nm  ++ ".c"  , (CgSource                  , body))+                               ]++        (body, requirements) = genCProg cfg adts lists sets nm implementationSig sbvProg privateIns privateOuts mbRet extDecls+        privateIns          = privateParameters "sbv_input_" ins+        privateOuts         = privateParameters "sbv_output_" allOuts+        implementationSig   = pprCFunHeader cfg nm privateIns privateOuts mbRet++        bundleKind = (cgInteger cfg, cgReal cfg)++        extraTypes =  roundingModeTypeDecls usesRoundingModeType+                   $$ (if hasRequirement CRequiresWideBV then wideBVTypeDecls (wideBVKinds kinds) else empty)+                   $$ (if hasRequirement CRequiresLibBF  then arbitraryFPTypeDecls (arbitraryFPKinds kinds) else empty)+                   $$ (if hasRequirement CRequiresGMP    then gmpTypeDecls cfg kinds else empty)+                   $$ (if hasRequirement CRequiresText   then textTypeDecls kinds else empty)+                   $$ (if hasRequirement CRequiresArrays then arrayForwardTypeDecls arrays else empty)+                   $$ tupleForwardTypeDecls tuples+                   $$ adtForwardTypeDecls adts+                   $$ listForwardTypeDecls lists+                   $$ setForwardTypeDecls sets+                   $$ (if hasRequirement CRequiresLists  then listTypeDecls cfg lists else empty)+                   $$ (if hasRequirement CRequiresSets   then setTypeDecls cfg sets else empty)+                   $$ structuralTypeDecls cfg adts tuples+                   $$ adtOwnershipTypePrototypes adts+                   $$ tupleOwnershipTypeDecls cfg tuples+                   $$ adtOwnershipTypeDecls cfg adts+                   $$ (if hasRequirement CRequiresLists then listOwnershipTypeDecls cfg lists else empty)+                   $$ (if hasRequirement CRequiresSets  then setOwnershipTypeDecls cfg sets else empty)+                   $$ (if hasRequirement CRequiresArrays then arrayTypeDecls arrays else empty)+        kinds           = Set.unions [reskinds sbvProg, usedKinds]+        usesFloating    = any (cFloatingKind cfg) kinds+        usedKinds       = Set.union interfaceKinds (cProgramUsedKinds sbvProg)+        interfaceKinds  = Set.fromList . concatMap expandKinds+                        $ concatMap cgValKinds (map snd ins ++ map snd outs ++ cgReturns st)+          where cgValKinds (CgAtomic sv) = [kindOf sv]+                cgValKinds (CgArray svs) = map kindOf svs+        arrays          = arrayKinds kinds+        lists           = listKinds kinds+        sets            = setKinds kinds+        adts            = adtKinds kinds usedKinds+        tuples          = tupleKinds (Set.map (resolveADTReferences adts) kinds)++        hasRequirement requirement = requirement `Set.member` requirements++        usesRoundingModeType = any (any isRoundingMode . expandKinds) kinds++        randVals = cgDriverVals cfg+        driver   = genDriver cfg adts randVals nm ins allOuts mbRet++        filt xs  = [c | c@(_, (k, _)) <- xs, need k]+          where need k | isCgDriver   k = cgGenDriver cfg+                       | isCgMakefile k = retainBuildMetadata || cgGenMakefile cfg+                       | True           = True++        nmd      = nm ++ "_driver"+        sig      = pprCFunHeader cfg nm ins allOuts mbRet+        ins      = cgInputs st+        outs     = cgOutputs st+        allOuts  = outs ++ returnOuts+        mbRet    = case cgReturns st of+                     [CgAtomic resultSV] -> Just resultSV+                     _                   -> Nothing++        returnOuts = case cgReturns st of+                       []           -> []+                       [CgAtomic{}] -> []+                       results      -> zipWith (\index returnValue -> (returnName index, returnValue)) [0 :: Int ..] results++        returnName index = availableName 0+          where availableName prefixLength+                  | candidate `elem` interfaceNames = availableName (prefixLength + 1)+                  | True                            = candidate+                  where candidate = concat (replicate prefixLength "sbv_") ++ "result_" ++ show index++        interfaceNames = map fst (ins ++ outs)++        extProtos = case cgPrototypes st of+                     [] -> empty+                     xs -> vcat $ text "/* User given prototypes: */" : map text xs+        extDecls  = case cgDecls st of+                     [] -> empty+                     xs -> vcat $ text "/* User given declarations: */" : map text xs+        flags    = requirementLDFlags requirements ++ cgLDFlags st++-- | Collect types used by the entry point and all retained function/lambda+-- bodies. A private computation can construct and consume an ADT without that+-- type appearing in any public signature or top-level assignment. Constants,+-- parameters, and table entries count even when their body has no assignments.+cProgramUsedKinds :: Result -> Set.Set Kind+cProgramUsedKinds result = Set.fromList . concatMap expandKinds $+     assignmentKinds assignments+  ++ map (kindOf . fst) (snd (resConsts result))+  ++ tableKinds (resTables result)+  ++ concat [lambdaKinds body | (_, (definition, _)) <- resDefinitions result, Just body <- [smtDefInfo definition]]+ where SBVPgm program = resAsgns result+       assignments = F.toList program++       assignmentKinds expressions = concat+         [ map kindOf (value : arguments)+        ++ case operation of+             ArrayInit (Right lambdaDef) | Just body <- smtLambdaInfo lambdaDef -> lambdaKinds body+             _                                                                 -> []+         | (value, SBVApp operation arguments) <- expressions]++       lambdaKinds body = map kindOf (liOutput body : map snd (liParams body) ++ map fst (liConsts body))+                       ++ assignmentKinds (F.toList (liAssignments body))+                       ++ tableKinds (liTables body)++       tableKinds tables = concat [keyKind : valueKind : map kindOf entries | ((_, keyKind, valueKind), entries) <- tables]++-- | Emit tuple and ADT layouts in their joint by-value dependency order.+-- Forward-declared recursive ADT pointers impose no ordering constraint.+structuralTypeDecls :: CgConfig -> [Kind] -> [Kind] -> Doc+structuralTypeDecls cfg adts tuples = vcat (map declaration orderedKinds)+ where allKinds        = tuples ++ adts+       availableKinds  = Set.fromList allKinds+       dependencyNodes = [(kind, kind, filter (`Set.member` availableKinds) (dependencies kind)) | kind <- allKinds]+       orderedKinds     = concatMap orderedComponent (DG.stronglyConnComp dependencyNodes)++       dependencies (KTuple fieldKinds) = [ resolved+                                           | fieldKind <- fieldKinds+                                           , let resolved = resolveADTReferences adts fieldKind+                                           , isTuple resolved || isConcreteADTReference resolved+                                           ]+       dependencies kind+         | isConcreteADTReference kind = adtDeclarationDependencies adts kind+         | True                   = []++       orderedComponent (DG.AcyclicSCC kind) = [kind]+       orderedComponent (DG.CyclicSCC kinds) = error $ "SBV->C: Recursive by-value tuple/ADT layout: " ++ show kinds++       declaration kind+         | isTuple kind           = tupleTypeDecls [kind]+         | isConcreteADTReference kind = adtTypeDeclsFor cfg adts [kind]+         | True                   = error $ "SBV->C: Expected a tuple or ADT layout, received " ++ show kind++-- | Pretty print a function type. A single return value uses C's return+-- position when its representation permits; aggregate return groups and+-- multiple returns are passed as output parameters by the caller.+pprCFunHeader :: CgConfig -> String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> Doc+pprCFunHeader cfg fn ins outs mbRet = retType <+> text fn P.<> parens (fsep (punctuate comma params))+  where params  = map (mkParam cfg) ins ++ map (mkPParam cfg) outs ++ exactResult+        retType = case mbRet of+                    Just sv | isArray sv                           -> text (arrayOutputCType (kindOf sv))+                    Just sv | not (isExactGMPKind cfg (kindOf sv)) -> pprCWord False sv+                    _                                              -> text "void"++        exactResult = case mbRet of+                        Just sv | isExactGMPKind cfg (kindOf sv) -> [text (gmpOutputType (kindOf sv)) <+> text "sbv_result"]+                        _                                        -> []++-- | Render a generated C input parameter.+mkParam :: CgConfig -> (String, CgVal) -> Doc+mkParam _   (n, CgAtomic sv)+  | isArray sv = text "const" <+> text (arrayInputCType (kindOf sv)) <+> text n+mkParam _   (n, CgAtomic sv)     = pprCWord True sv <+> text n+mkParam _   (_, CgArray [])        = die "mkParam: CgArray with no elements!"+mkParam cfg (n, CgArray (sv:_))+  | isExactGMPKind cfg kind = text "const" <+> text (gmpArrayType kind) <+> text "*" P.<> text n+  | isArray kind            = text "const" <+> text (arrayInputCType kind) <+> text "*" P.<> text n+  | True                    = pprCWord True sv <+> text "*" P.<> text n+  where kind = kindOf sv++-- | Render a generated C output parameter.+mkPParam :: CgConfig -> (String, CgVal) -> Doc+mkPParam _   (n, CgAtomic sv)+  | isArray sv = text (arrayOutputCType (kindOf sv)) <+> text "*" P.<> text n+mkPParam cfg (n, CgAtomic sv)+  | isExactGMPKind cfg (kindOf sv) = text (gmpOutputType (kindOf sv)) <+> text n+  | True                           = pprCWord False sv <+> text "*" P.<> text n+mkPParam _   (_, CgArray [])        = die "mkPParam: CgArray with no elements!"+mkPParam cfg (n, CgArray (sv:_))+  | isExactGMPKind cfg kind = text (gmpArrayType kind) <+> text "*" P.<> text n+  | isArray kind            = text (arrayOutputCType kind) <+> text "*" P.<> text n+  | True                    = pprCWord False sv <+> text "*" P.<> text n+  where kind = kindOf sv++-- | Renders as "const SWord8 s0", etc. the first parameter is the width of the typefield+declSV :: Int -> SV -> Doc+declSV w sv = text "const" <+> pad (showCType sv) <+> text (show sv)+  where pad s = text $ s ++ replicate (w - length s) ' '++-- | Return the proper declaration and the result as a pair. No consts+declSVNoConst :: Int -> SV -> (Doc, Doc)+declSVNoConst w sv = (text "     " <+> pad (showCType sv), text (show sv))+  where pad s = text $ s ++ replicate (w - length s) ' '++-- | Shared rendering information for one generated function. Constants are+-- scoped to that function, while the ADT registry describes the whole bundle.+data CRenderEnv = CRenderEnv+  { renderConfig    :: CgConfig   -- ^ Representation and runtime-check choices.+  , renderADTs      :: [Kind]     -- ^ Complete concrete ADT registry.+  , renderConstants :: [(SV, CV)] -- ^ Constants still eligible for inline rendering.+  }++-- | Renders as "s0", etc, or the corresponding constant.+showSV :: CRenderEnv -> SV -> Doc+showSV env sv+  | sv == falseSV                              = text "false"+  | sv == trueSV                               = text "true"+  | Just cv <- sv `lookup` renderConstants env = mkConst env cv+  | True                                       = text $ show sv++-- | Words as it would map to a C word+pprCWord :: HasKind a => Bool -> a -> Doc+pprCWord cnst v = (if cnst then text "const" else empty) <+> text (showCType v)++-- | Almost a "show", but map "SWord1" to "SBool"+-- which is used for extracting one-bit words. This is OK since C's bool type+-- handles arithmetic fine, and maps nicely to our `SWord 1`. (Same isn't true for `SInt 1`, which+-- doesn't have an easy counter-part on the C side.+showCType :: HasKind a => a -> String+showCType i = case kindOf i of+                KBounded False 1 -> "SBool"+                KBounded False w -> "SWord" ++ show w+                KBounded True  w -> "SInt"  ++ show w+                k@KArray{}        -> arrayCType k+                k@KTuple{}        -> tupleCType k+                k@KADT{}+                  | not (isRoundingMode k) && not (isUninterpreted k) -> adtCType k+                k@KFP{}           -> arbitraryFPCType k+                KString           -> "SString"+                KChar             -> "SChar"+                k@KList{}         -> listCType k+                k@KSet{}          -> setCType k+                k                -> show k++-- | The printf specifier for the type+specifier :: CgConfig -> SV -> Doc+specifier cfg = specifierKind cfg . kindOf++-- | Return the @printf@ conversion for a supported scalar kind.+specifierKind :: CgConfig -> Kind -> Doc+specifierKind cfg kind = case kind of+  KVar{}        -> die $ "variable sort: " ++ show kind+  KBool         -> spec (False, 1)+  KBounded b i  -> spec (b, i)+  KUnbounded    -> spec (True, fromJust (cgInteger cfg))+  KReal         -> specF (fromJust (cgReal cfg))+  KFloat        -> specF CgFloat+  KDouble       -> specF CgDouble+  KString       -> text "%s"+  KChar         -> text "%c"+  KRational     -> die   "rational sort"+  KFP{}         -> die   "arbitrary float sort"+  KList k       -> die $ "list sort: "   ++ show k+  KSet  k       -> die $ "set sort: "    ++ show k+  KApp s _      -> die $ "ADT app: "     ++ s+  k@(KADT s _ _)+    | isRoundingMode k -> text "%d"+    | True             -> die $ "ADT: " ++ s+  KTuple k      -> die $ "tuple sort: "  ++ show k+  KArray  k1 k2 -> die $ "array sort: "  ++ show (k1, k2)+  where u8InHex = cgShowU8InHex cfg++        spec :: (Bool, Int) -> Doc+        spec (False,  1) = text "%d"+        spec (False,  8)+          | u8InHex      = text "0x%02\"PRIx8\""+          | True         = text "%\"PRIu8\""+        spec (True,   8) = text "%\"PRId8\""+        spec (False, 16) = text "0x%04\"PRIx16\"U"+        spec (True,  16) = text "%\"PRId16\""+        spec (False, 32) = text "0x%08\"PRIx32\"UL"+        spec (True,  32) = text "%\"PRId32\"L"+        spec (False, 64) = text "0x%016\"PRIx64\"ULL"+        spec (True,  64) = text "%\"PRId64\"LL"+        spec (s, sz)     = die $ "Format specifier at type " ++ (if s then "SInt" else "SWord") ++ show sz++        specF :: CgSRealType -> Doc+        specF CgFloat      = text "%a"+        specF CgDouble     = text "%a"+        specF CgLongDouble = text "%Lf"++-- | Make a constant value of the given type. Explicitly mapped integers are+-- reduced to their requested width; bounded constants are already normalized.+-- The enclosing program's ADT registry is reused throughout nested literals.+--   There are many options here, using binary, decimal, etc. We simply use decimal for values 8-bits or less,+--   and hex otherwise.+mkConst :: CRenderEnv -> CV -> Doc+mkConst env = renderConstant+ where+  cfg  = renderConfig env+  adts = renderADTs env++  renderConstant (CV KReal (CAlgReal (AlgRational False _)))+    = error "SBV->C: Inexact SReal literals do not specify an exact value and cannot be compiled."+  renderConstant (CV KReal (CAlgReal AlgInterval{}))+    = error "SBV->C: Interval SReal literals do not specify an exact value and cannot be compiled."+  renderConstant (CV KReal (CAlgReal AlgPolyRoot{}))+    = error "SBV->C: Algebraic SReal literals are not supported; use an explicitly chosen rational approximation."+  renderConstant cv+    | Just d <- roundingModeConst cv = d+  renderConstant cv+    | Just d <- arrayConst renderConstant cv = d+  renderConstant cv+    | Just d <- tupleConst renderConstant cv = d+  renderConstant cv+    | Just d <- adtConst adts renderConstant cv = d+  renderConstant cv+    | Just d <- listConst renderConstant cv = d+  renderConstant cv+    | Just d <- setConst renderConstant cv = d+  renderConstant cv+    | Just d <- gmpConst cfg cv = d+  renderConstant (CV k (CInteger i))+    | Just d <- wideBVConst k i = d+  renderConstant (CV KReal (CAlgReal (AlgRational _ r))) = double (fromRational r :: Double) P.<> sRealSuffix (fromJust (cgReal cfg))+    where sRealSuffix CgFloat      = text "F"+          sRealSuffix CgDouble     = empty+          sRealSuffix CgLongDouble = text "L"+  renderConstant (CV KUnbounded       (CInteger i)) = renderConstant (normCV (CV (KBounded True (fromJust (cgInteger cfg))) (CInteger i)))+  renderConstant (CV (KBounded sg sz) (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (sg, sz)+  renderConstant (CV KBool            (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (False, 1)+  renderConstant (CV KFloat           (CFloat f))   = text $ showCFloat f+  renderConstant (CV KDouble          (CDouble d))  = text $ showCDouble d+  renderConstant (CV k@KFP{}          (CFP fp))     = fromJust (arbitraryFPConst k fp)+  renderConstant cv@(CV KString       CString{})     = fromJust (textConst cv)+  renderConstant cv@(CV KChar         CChar{})       = fromJust (textConst cv)+  renderConstant cv                                 = die $ "mkConst: " ++ show cv++-- | Render a bounded literal using its signedness, width, and display mode.+showSizedConst :: Bool -> Integer -> (Bool, Int) -> Doc+showSizedConst _   i   (False,  1) = text (if i == 0 then "false" else "true")+showSizedConst u8h i t@(False,  8)+  | u8h                            = text $ T.unpack (chex False True t i)+  | True                           = integer i+showSizedConst _   i   (True,   8) = integer i+showSizedConst _   i t@(False, 16) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  16) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(False, 32) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  32) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(False, 64) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  64) = text $ T.unpack $ chex False True t i+showSizedConst _   i   (s, sz)     = die $ "Constant " ++ show i ++ " at type " ++ (if s then "SInt" else "SWord") ++ show sz++-- | Invoke the C compiler with contraction disabled after user flags, including+-- during LTO linking. Explicit calls to @fma@ are not implicit contraction.+cCompilerCommand :: Bool -> Bool -> String+cCompilerCommand floating gmp = "${CC} ${CCFLAGS}" ++ (if gmp then " ${GMP_CFLAGS}" else "")+                                                 ++ (if floating then " -ffp-contract=off" else "")++-- | Does a representation require the floating-point compilation contract?+cFloatingKind :: CgConfig -> Kind -> Bool+cFloatingKind cfg kind = isFloat kind || isDouble kind || isFP kind || (isReal kind && isJust (cgReal cfg))++-- | Generate a makefile. The first argument is True if we have a driver.+genMake :: Bool -> Bool -> String -> String -> [String] -> Doc+genMake floating ifdr fn dn ldFlags = foldr1 ($$) [l | (True, l) <- lns]+ where ifld = not (null ldFlags)+       gmp  = "-lgmp" `elem` ldFlags+       ld = text "${LDFLAGS}" <+> if ifld then text "${SBV_LIBS}" else empty+       renderedLDFlags = unwords $ filter (/= "-lgmp") ldFlags ++ ["${GMP_LIBS}" | gmp]+       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")+             , (True, text "")+             , (True, text "# include any user-defined .mk file in the current directory.")+             , (True, text "-include *.mk")+             , (True, text "")+             , (True, text "CC?=gcc")+             , (True, text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")+             , (gmp,  text "GMP_CFLAGS?=$(shell pkg-config --cflags gmp)")+             , (gmp,  text "GMP_LIBS?=$(shell pkg-config --libs gmp)")+             , (ifld, text "SBV_LIBS?=" P.<> text renderedLDFlags)+             , (True, text "")+             , (ifdr, text "all:" <+> nmd)+             , (ifdr, text "")+             , (True, nmo P.<> text (": " ++ ppSameLine (hsep [nmc, nmh])))+             , (True, text ("\t" ++ cCompilerCommand floating gmp) <+> text "-c $< -o $@")+             , (True, text "")+             , (ifdr, nmdo P.<> text (": " ++ ppSameLine (hsep [nmdc, nmh])))+             , (ifdr, text ("\t" ++ cCompilerCommand floating gmp) <+> text "-c $< -o $@")+             , (ifdr, text "")+             , (ifdr, nmd P.<> text (": " ++ ppSameLine (hsep [nmo, nmdo])))+             , (ifdr, text ("\t" ++ cCompilerCommand floating False) <+> text "$^ -o $@" <+> ld)+             , (ifdr, text "")+             , (True, text "clean:")+             , (True, text "\trm -f *.o")+             , (True, text "")+             , (ifdr, text "veryclean: clean")+             , (ifdr, text "\trm -f" <+> nmd)+             , (ifdr, text "")+             ]+       nm   = text fn+       nmd  = text dn+       nmh  = nm P.<> text ".h"+       nmc  = nm P.<> text ".c"+       nmo  = nm P.<> text ".o"+       nmdc = nmd P.<> text ".c"+       nmdo = nmd P.<> text ".o"++-- | Generate the header+genHeader :: Bool -> (Maybe Int, Maybe CgSRealType) -> String -> [Doc] -> Doc -> Doc -> Doc+genHeader floating (ik, rk) fn sigs protos extraTypes =+     text "/* Header file for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit! */"+  $$ text ""+  $$ text "#ifndef" <+> tag+  $$ text "#define" <+> tag+  $$ text ""+  $$ (if floating then vcat [text "#if defined(__FAST_MATH__) || (defined(__FINITE_MATH_ONLY__) && __FINITE_MATH_ONLY__ > 0)"+                           , text "#error \"SBV-generated C requires IEEE floating-point semantics; disable fast-math and finite-math-only.\""+                           , text "#endif"] else empty)+  $$ text ""+  $$ text "#include <stdio.h>"+  $$ text "#include <stdlib.h>"+  $$ text "#include <inttypes.h>"+  $$ text "#include <stdint.h>"+  $$ text "#include <stdbool.h>"+  $$ text "#include <string.h>"+  $$ text "#include <math.h>"+  $$ (if floating then vcat [text "#include <float.h>"+                           , text "#if FLT_EVAL_METHOD != 0"+                           , text "#error \"SBV-generated C requires FLT_EVAL_METHOD == 0; indeterminate or excess-precision floating evaluation is unsupported.\""+                           , text "#endif"] else empty)+  $$ text ""+  $$ text "/* Floating-point calling convention:"+  $$ text " * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even)."+  $$ text " * Callbacks must preserve this mode before returning or re-entering."+  $$ text " * Generated code does not check or change the hardware rounding mode."+  $$ text " * Custom builds must disable implicit FP contraction, including at LTO link time."+  $$ text " */"+  $$ text ""+  $$ text "/* The boolean type */"+  $$ text "typedef bool SBool;"+  $$ text ""+  $$ text "/* The float type */"+  $$ text "typedef float SFloat;"+  $$ text ""+  $$ text "/* The double type */"+  $$ text "typedef double SDouble;"+  $$ text ""+  $$ text "/* Unsigned bit-vectors */"+  $$ text "typedef uint8_t  SWord8;"+  $$ text "typedef uint16_t SWord16;"+  $$ text "typedef uint32_t SWord32;"+  $$ text "typedef uint64_t SWord64;"+  $$ text ""+  $$ text "/* Signed bit-vectors */"+  $$ text "typedef int8_t  SInt8;"+  $$ text "typedef int16_t SInt16;"+  $$ text "typedef int32_t SInt32;"+  $$ text "typedef int64_t SInt64;"+  $$ text ""+  $$ imapping+  $$ rmapping+  $$ extraTypes+  $$ text ("/* Entry point prototype" ++ plu ++ ": */")+  $$ vcat (map (P.<> semi) sigs)+  $$ text ""+  $$ protos+  $$ text "#endif /*" <+> tag <+> text "*/"+  $$ text ""+ where nm  = text fn+       tag = text "SBV_GENERATED_" P.<> nm P.<> text "_HEADER_INCLUDED"+       plu = if length sigs /= 1 then "s" else ""+       imapping = case ik of+                    Nothing -> empty+                    Just i  ->    text "/* User requested mapping for SInteger.                                 */"+                               $$ text "/* NB. Loss of precision: Target type is subject to modular arithmetic. */"+                               $$ text ("typedef SInt" ++ show i ++ " SInteger;")+                               $$ text ""+       rmapping = case rk of+                    Nothing -> empty+                    Just t  ->    text "/* User requested mapping for SReal.                          */"+                               $$ text "/* NB. Loss of precision: Target type is subject to rounding. */"+                               $$ text ("typedef " ++ show t ++ " SReal;")+                               $$ text ""++-- | Insert an empty separating line when the condition holds.+sepIf :: Bool -> Doc+sepIf b = if b then text "" else empty++-- | Test whether an ADT value needs the caller-owned deep-storage ABI.+isOwnedADT :: CgConfig -> [Kind] -> SV -> Bool+isOwnedADT cfg adts sv = isADT sv+                     && not (isRoundingMode sv)+                     && adtNeedsOwnership cfg adts (kindOf sv)++-- | Generate an example driver program+genDriver :: CgConfig -> [Kind] -> [Integer] -> String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> [Doc]+genDriver cfg adts randVals fn publicInputs publicOutputs mbRet+  = [pre, include, callbacks, printHelpers, header, body, post]+ where env  = CRenderEnv cfg adts []+       inps = privateParameters "sbv_driver_input_" publicInputs+       outs = privateParameters "sbv_driver_output_" publicOutputs+       publicName local = fromMaybe local (lookup local publicNames)+       publicNames = zip (map fst (inps ++ outs)) (map fst (publicInputs ++ publicOutputs))++       pre         =  text "/* Example driver program for" <+> nm P.<> text ". */"+                   $$ text "/* Automatically generated by SBV. Edit as you see fit! */"+                   $$ text ""+                   $$ text "#include <stdio.h>"+       include     = text "#include" <+> doubleQuotes (nm P.<> text ".h")+       callbacks   = vcat (map (arrayDriverCallback cfg) inputArrayKinds)+       header      =  text ""+                   $$ text "int main(void)"+                   $$ text "{"+       body        =  text ""+                   $$ nest 2 (   vcat (map mkInp pairedInputs)+                           $$ vcat (map mkOut outs)+                           $$ sepIf (not (null [() | (_, _, CgArray{}) <- pairedInputs]) || not (null outs))+                           $$ call+                           $$ text ""+                           $$ (case mbRet of+                              Just sv | isArray sv+                                      -> displayArray "sbv_result" displayCall resultVar (kindOf sv)+                              Just sv | isTuple sv+                                      -> displayTuple displayCall resultVar (kindOf sv)+                              Just sv | isADT sv && not (isRoundingMode sv)+                                      -> displayADT displayCall resultVar (kindOf sv)+                              Just sv | isList sv+                                      -> displayList displayCall resultVar (kindOf sv)+                              Just sv | isSet sv+                                      -> displaySet displayCall resultVar (kindOf sv)+                              Just sv | isWideBV (kindOf sv)+                                      -> text "printf" P.<> parens (printQuotes (displayCall <+> text "=")) P.<> semi+                                      $$ wideBVPrint (kindOf sv) resultVar P.<> semi+                                      $$ text "printf(\"\\n\");"+                              Just sv | isFP (kindOf sv)+                                      -> text "printf" P.<> parens (printQuotes (displayCall <+> text "=")) P.<> semi+                                      $$ arbitraryFPPrint (kindOf sv) resultVar P.<> semi+                                      $$ text "printf(\"\\n\");"+                              Just sv | isExactGMPKind cfg (kindOf sv)+                                      -> text "printf" P.<> parens (printQuotes (displayCall <+> text "=")) P.<> semi+                                      $$ gmpPrint (kindOf sv) resultVar P.<> semi+                                      $$ text "printf(\"\\n\");"+                              Just sv | kindOf sv `elem` [KChar, KString]+                                      -> text "printf" P.<> parens (printQuotes (displayCall <+> text "=")) P.<> semi+                                      $$ textPrint (kindOf sv) resultVar P.<> semi+                                      $$ text "printf(\"\\n\");"+                              Just sv -> text "printf" P.<> parens (printQuotes (displayCall <+> text "=" <+> specifier cfg sv P.<> text "\\n")+                                                                              P.<> comma <+> resultVar) P.<> semi+                              Nothing -> text "printf" P.<> parens (printQuotes (displayCall <+> text "->\\n")) P.<> semi)+                           $$ vcat (map display outs)+                           $$ driverCleanup+                           )+       post        =   text ""+                   $+$ nest 2 (text "return 0" P.<> semi)+                   $$  text "}"+                   $$  text ""+       nm                 = text fn+       inputArrayKinds    = nub . concatMap collectInputArrays $ concatMap inputKinds inps+       inputKinds (_, CgAtomic sv) = [kindOf sv]+       inputKinds (_, CgArray svs) = map kindOf svs++       collectInputArrays = collect Set.empty+        where collect visited kind+                | kind `Set.member` visited = []+                | KApp{} <- kind+                = collect nextVisited (resolveADTReferences adts kind)+                | KArray keyKind valueKind <- kind+                = kind : collect nextVisited keyKind ++ collect nextVisited valueKind+                | KTuple fieldKinds <- kind+                = concatMap (collect nextVisited) fieldKinds+                | KList elementKind <- kind+                = collect nextVisited elementKind+                | KSet elementKind <- kind+                = collect nextVisited elementKind+                | isConcreteADTReference kind+                = concatMap (concatMap (collect nextVisited) . snd) (adtConstructors adts kind)+                | True+                = []+               where nextVisited = Set.insert kind visited+       pairedInputs = matchRands randVals inps+       inputSeeds   = matchInputSeeds randVals inps+       matchRands _      []                                 = []+       matchRands []     _                                  = die "Run out of driver values!"+       matchRands (r:rs) ((n, CgAtomic sv)            : cs)+         | KArray _ valueKind <- kindOf sv                   = ([mkRValKind valueKind r], n, CgAtomic sv) : matchRands rs cs+       matchRands (r:rs) ((n, CgAtomic sv)            : cs) = ([mkRVal sv r], n, CgAtomic sv) : matchRands rs cs+       matchRands _      ((n, CgArray [])             : _ ) = die $ "Unsupported empty array input " ++ show n+       matchRands rs     ((n, a@(CgArray sws@(sv:_))) : cs)+          | length frs /= l                                 = die "Run out of driver values!"+          | True                                            = (map (mkRVal sv) frs, n, a) : matchRands srs cs+          where l          = length sws+                (frs, srs) = splitAt l rs+       matchInputSeeds _      []                            = []+       matchInputSeeds []     _                             = die "Run out of driver values!"+       matchInputSeeds (r:rs) ((n, CgAtomic{})        : cs) = (n, [r]) : matchInputSeeds rs cs+       matchInputSeeds _      ((n, CgArray [])        : _ ) = die $ "Unsupported empty array input " ++ show n+       matchInputSeeds rs     ((n, CgArray values@(_:_)) : cs)+         | length seeds == length values                       = (n, seeds) : matchInputSeeds rest cs+         | True                                                = die "Run out of driver values!"+        where (seeds, rest) = splitAt (length values) rs+       inputSeed n = case inputGroupSeeds n of+                       seed:_ -> seed+                       []     -> die $ "Missing driver seed for composite input " ++ show n+       inputGroupSeeds n = case lookup n inputSeeds of+                            Just seeds -> seeds+                            Nothing    -> die $ "Missing driver seed for composite input " ++ show n+       inputElementName n index = n ++ "_element_" ++ show (index :: Int)+       inputNeedsInitialization kind+         | isConcreteADTReference kind = adtNeedsOwnership cfg adts kind+         | True                        = valueDriverNeedsInitialization cfg kind+       mkRVal sv = mkRValKind (kindOf sv)+       mkRValKind kind r+         | isRoundingMode kind            = roundingModeDriverValue r+         | isExactGMPKind cfg kind         = integer r+         | kind `elem` [KChar, KString]    = textDriverValue kind r+         | isList kind                     = listDriverValue mkRValKind kind r+         | isSet kind                      = setDriverValue mkRValKind kind r+         | KTuple fieldKinds <- kind       = tupleValue kind (zipWith mkField fieldKinds [0 :: Integer ..])+         | isADT kind                      = adtDriverValue adts mkRValKind kind r+         | True                            = mkConst env $ mkConstCV kind r+         where mkField fieldKind offset = mkRValKind fieldKind (r + offset)+       driverValueInit = valueDriverInit cfg mkRValKind initializeComposite++       -- Only these constructors need the complete ADT registry or the public+       -- versus stored array ABI. All other dispatch belongs to Value.+       -- Resolving KApp re-enters the generic dispatcher with the concrete kind.+       initializeComposite kind externalName seed+         | KApp{} <- kind                   = driverValueInit (resolveADTReferences adts kind) externalName seed+         | isArray kind                    = initializeArray kind externalName seed+         | isConcreteADTReference kind+         , adtNeedsOwnership cfg adts kind  = adtDriverInit cfg adts mkRValKind driverValueInit kind externalName seed+         | isConcreteADTReference kind      = text (adtCType kind) <+> text externalName <+> text "="+                                           <+> adtDriverValue adts mkRValKind kind seed P.<> semi+         | True                            = die $ "Expected an array or ADT driver kind, received " ++ show kind+       initializeArray kind@(KArray _ valueKind) externalName seed+         = let defaultName = externalName ++ "_default"+               inputName   = externalName ++ "_input"+           in driverValueInit valueKind defaultName seed+              $$ arrayDriverInput cfg kind inputName defaultName+              $$ arrayDriverStoredInput kind externalName inputName+              $$ driverValueClear valueKind defaultName+       initializeArray kind _ _ = die $ "Expected an array driver kind, received " ++ show kind+       driverValueClear kind externalName+         | isConcreteADTReference kind+         , not (adtNeedsOwnership cfg adts kind) = empty+         | True                                 = valueDriverClear cfg kind externalName+       mkInp (_, n, CgAtomic sv)+         | KArray _ valueKind <- kindOf sv+         = let defaultName = n ++ "_default"+           in driverValueInit valueKind defaultName (inputSeed n)+              $$ arrayDriverInput cfg (kindOf sv) n defaultName+       mkInp ([_], n, CgAtomic sv)+         | inputNeedsInitialization (kindOf sv) = driverValueInit (kindOf sv) n (inputSeed n)+       mkInp (_,   _, CgAtomic{})         = empty  -- constant, no need to declare+       mkInp (_,   n, CgArray [])         = die $ "Unsupported empty array value for " ++ show n+       mkInp (vs, n, CgArray sws@(sv:_))+         | isExactGMPKind cfg kind = text (gmpArrayType kind) <+> text n P.<> brackets (int lengthOfArray) P.<> semi+                                  $$ vcat (zipWith initialize [0 :: Int ..] vs)+                                  $$ displayInputArray+         | inputNeedsInitialization kind+         = vcat [initializeElement elementName seed | (elementName, seed) <- zip elementNames (inputGroupSeeds n)]+        $$ text "const" <+> text inputType <+> text n P.<> brackets (int lengthOfArray)+           <+> text "=" <+> braces (fsep (punctuate comma (map text elementNames))) P.<> semi+        $$ displayInputArray+         | True                    = pprCWord True sv <+> text n P.<> brackets (int lengthOfArray) <+> text "= {"+                                  $$ nest 4 (fsep (punctuate comma (align vs)))+                                  $$ text "};"+                                  $$ displayInputArray+         where kind          = kindOf sv+               lengthOfArray = length sws++               initialize index = gmpDriverInitialize kind (text n P.<> brackets (int index))++               elementNames = [inputElementName n index | index <- [0 .. lengthOfArray - 1]]+               inputType+                 | isArray kind = arrayInputCType kind+                 | True         = showCType kind+               initializeElement elementName seed+                 | KArray _ valueKind <- kind+                 = driverValueInit valueKind (elementName ++ "_default") seed+                $$ arrayDriverInput cfg kind elementName (elementName ++ "_default")+                 | True+                 = driverValueInit kind elementName seed++               displayInputArray = text ""+                                $$ text "printf" P.<> parens (printQuotes (text "Contents of input array" <+> text (publicName n) P.<> text ":\\n")) P.<> semi+                                $$ display (n, CgArray sws)+                                $$ text ""+       mkOut (v, CgAtomic sv)+         | isArray sv                          = text (arrayOutputCType (kindOf sv)) <+> text v <+> text "=" <+> braces (text "0") P.<> semi+         | isExactGMPKind cfg (kindOf sv)      = gmpDriverInit (kindOf sv) (text v) (text "0")+         | kindOf sv == KString                = text "SString" <+> text v <+> text "=" <+> braces (text "0") P.<> semi+         | isList sv                           = text (listCType (kindOf sv)) <+> text v <+> text "=" <+> braces (text "0") P.<> semi+         | isSet sv                            = text (setCType (kindOf sv)) <+> text v <+> text "=" <+> braces (text "0") P.<> semi+         | tupleNeedsOwnership cfg (kindOf sv) = text (tupleCType (kindOf sv)) <+> text v+                                             <+> text "=" <+> braces (text "0") P.<> semi+         | isOwnedADT cfg adts sv              = text (adtCType (kindOf sv)) <+> text v+                                             <+> text "=" <+> braces (text "0") P.<> semi+         | True                                = pprCWord False sv <+> text v P.<> semi+       mkOut (v, CgArray [])         = die $ "Unsupported empty array value for " ++ show v+       mkOut (v, CgArray sws@(sv:_))+         | isExactGMPKind cfg kind = text (gmpArrayType kind) <+> text v P.<> brackets (int lengthOfArray) P.<> semi+                                  $$ vcat [gmpDriverInitialize kind (text v P.<> brackets (int index)) (text "0") | index <- [0 .. lengthOfArray - 1]]+         | isArray kind            = text (arrayOutputCType kind) <+> text v P.<> brackets (int lengthOfArray)+                                  <+> text "=" <+> braces (text "0") P.<> semi+         | True                    = pprCWord False sv <+> text v P.<> brackets (int lengthOfArray) P.<> semi+         where kind          = kindOf sv+               lengthOfArray = length sws+       resultVar = text "sbv_result"+       call = case mbRet of+                Nothing -> fcall P.<> semi+                Just sv+                  | isExactGMPKind cfg (kindOf sv)      -> gmpDriverInit (kindOf sv) resultVar (text "0")+                                                        $$ fcall P.<> semi+                  | isArray sv                          -> text (arrayOutputCType (kindOf sv)) <+> resultVar+                                                       <+> text "=" <+> fcall P.<> semi+                  | tupleNeedsOwnership cfg (kindOf sv) -> text (tupleCType (kindOf sv)) <+> resultVar+                                                       <+> text "=" <+> fcall P.<> semi+                  | isOwnedADT cfg adts sv              -> text (adtCType (kindOf sv)) <+> resultVar+                                                       <+> text "=" <+> fcall P.<> semi+                  | kindOf sv == KString                -> text "SString" <+> resultVar <+> text "=" <+> fcall P.<> semi+                  | isList sv                           -> text (listCType (kindOf sv)) <+> resultVar+                                                       <+> text "=" <+> fcall P.<> semi+                  | isSet sv                            -> text (setCType (kindOf sv)) <+> resultVar+                                                       <+> text "=" <+> fcall P.<> semi+                  | True                                -> pprCWord True sv <+> resultVar <+> text "=" <+> fcall P.<> semi+       fcall       = functionCall id+       displayCall = nm P.<> parens (fsep (punctuate comma (map displayInput pairedInputs ++ map (mkOVal publicName) outs ++ exactResultArg)))+       displayInput input@(_, inputName, CgAtomic sv)+         | kindOf sv == KString || isTuple sv || isADT sv || isWideBV (kindOf sv) || isFP sv+         = text (publicName inputName)+         | True = mkCVal publicName input+       displayInput input = mkCVal publicName input+       functionCall rename = nm P.<> parens (fsep (punctuate comma (map (mkCVal rename) pairedInputs ++ map (mkOVal rename) outs ++ exactResultArg)))+       exactResultArg = case mbRet of+                          Just sv | isExactGMPKind cfg (kindOf sv) -> [resultVar]+                          _                                        -> []+       mkCVal rename ([v], n, CgAtomic sv)+         | inputNeedsInitialization (kindOf sv) = text (rename n)+         | True                                = v+       mkCVal _      (vs, n, CgAtomic{}) = die $ "Unexpected driver value computed for " ++ show n ++ render (hcat vs)+       mkCVal rename (_,  n, CgArray{})  = text (rename n)+       mkOVal rename (n, CgAtomic sv)+         | isExactGMPKind cfg (kindOf sv) = text (rename n)+         | True                           = text "&" P.<> text (rename n)+       mkOVal rename (n, CgArray{}) = text (rename n)+       display (n, CgAtomic sv)+         | isArray sv                           = displayArray n label (text n) (kindOf sv)+         | isTuple sv                           = displayTuple label (text n) (kindOf sv)+         | isADT sv && not (isRoundingMode sv) = displayADT label (text n) (kindOf sv)+         | isList sv                            = displayList label (text n) (kindOf sv)+         | isSet sv                             = displaySet label (text n) (kindOf sv)+         | isWideBV (kindOf sv)                 = text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+                                                $$ wideBVPrint (kindOf sv) (text n) P.<> semi+                                                $$ text "printf(\"\\n\");"+         | isFP (kindOf sv)                     = text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+                                                $$ arbitraryFPPrint (kindOf sv) (text n) P.<> semi+                                                $$ text "printf(\"\\n\");"+         | isExactGMPKind cfg (kindOf sv)       = text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+                                                $$ gmpPrint (kindOf sv) (text n) P.<> semi+                                                $$ text "printf(\"\\n\");"+         | kindOf sv `elem` [KChar, KString]     = text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+                                                $$ textPrint (kindOf sv) (text n) P.<> semi+                                                $$ text "printf(\"\\n\");"+         | True                                 = text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=" <+> specifier cfg sv+                                                                                         P.<> text "\\n") P.<> comma <+> text n) P.<> semi+         where label = text (publicName n)+       display (n, CgArray [])         = die $ "Unsupported empty array value for " ++ show n+       display (n, CgArray sws@(sv:_)) = text "int" <+> nctr P.<> semi+                                      $$ text "for(" P.<> nctr <+> text "= 0;" <+> nctr <+> text "<" <+> int len <+> text "; ++" P.<> nctr P.<> text ")"+                                      $$ text "{"+                                      $$ nest 2 displayEntry+                                      $$ text "}"+         where nctr      = text n P.<> text "_ctr"+               entry     = text n P.<> text "[" P.<> nctr P.<> text "]"+               entrySpec = text (publicName n) P.<> text "[%" P.<> int tab P.<> text "d]"+               kind      = kindOf sv+               len       = length sws+               tab       = length $ show (len - 1)++               displayEntry+                 | isArray kind = displayArrayEntry kind+                 | True         = text "printf" P.<> parens (printQuotes (text " " <+> entrySpec <+> text "= ") P.<> comma <+> nctr) P.<> semi+                               $$ printValue kind entry+                               $$ text "printf(\"\\n\");"++               displayArrayEntry arrayKind@(KArray keyKind valueKind)+                 =  keySetup+                 $$ text "printf" P.<> parens (printQuotes (text " " <+> (entrySpec P.<> text "[0] =")) P.<> comma <+> nctr) P.<> semi+                 $$ printValue valueKind arrayValue+                 $$ text "printf(\"\\n\");"+                 $$ keyCleanup+                where keyName    = "sbv_local_array_key_" ++ n+                      key        = text keyName+                      keySetup   = driverValueInit keyKind keyName 0+                      keyCleanup = driverValueClear keyKind keyName+                      arrayValue+                        | n `elem` map fst inps+                        = entry P.<> text ".lookup" P.<> parens (fsep (punctuate comma [entry P.<> text ".context", key]))+                        | True+                        = text (arrayOutputReadName arrayKind) P.<> parens (fsep (punctuate comma [entry, key]))+               displayArrayEntry arrayKind = die $ "Expected an array return-group element, received " ++ show arrayKind++       displayArray stem label descriptor kind@(KArray keyKind valueKind)+         =  keySetup+         $$ text "printf" P.<> parens (printQuotes (text " " <+> label P.<> text "[0] =")) P.<> semi+         $$ printArrayValue+         $$ text "printf(\"\\n\");"+         $$ keyCleanup+        where keyName = "sbv_local_array_key_" ++ stem+              key     = text keyName++              keySetup   = driverValueInit  keyKind keyName 0+              keyCleanup = driverValueClear keyKind keyName++              value = text (arrayOutputReadName kind) P.<> parens (fsep (punctuate comma [descriptor, key]))+              printArrayValue = printValue valueKind value+       displayArray _ _ _ kind = die $ "Expected an array output, received " ++ show kind++       displayTuple label value kind@KTuple{}+         =  text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+         $$ printTupleValue value kind+         $$ text "printf(\"\\n\");"+       displayTuple _ _ kind = die $ "Expected a tuple output, received " ++ show kind++       displayADT label value kind+         =  text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+         $$ adtPrint adts printValue kind value+         $$ text "printf(\"\\n\");"++       displayList label value kind@KList{}+         =  text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+         $$ listPrint printValue kind value+         $$ text "printf(\"\\n\");"+       displayList _ _ kind = die $ "Expected a list output, received " ++ show kind++       displaySet label value kind@KSet{}+         =  text "printf" P.<> parens (printQuotes (text " " <+> label <+> text "=")) P.<> semi+         $$ setPrint printValue kind value+         $$ text "printf(\"\\n\");"+       displaySet _ _ kind = die $ "Expected a set output, received " ++ show kind++       printHelpers = adtPrintHelpers adts printValue++       printTupleValue _     (KTuple []) = text "printf(\"()\");"+       printTupleValue value (KTuple fieldKinds)+         =  text "printf(\"(\");"+         $$ vcat (intersperse (text "printf(\", \");") (zipWith printField [1 :: Int ..] fieldKinds))+         $$ text "printf(\")\");"+        where printField index fieldKind = printValue fieldKind (parens value P.<> text "." P.<> text (tupleFieldName index))+       printTupleValue _ kind = die $ "Expected a tuple value, received " ++ show kind++       printValue kind value+         | KTuple{} <- kind                        = printTupleValue value kind+         | KList{} <- kind                         = listPrint printValue kind value+         | KSet{} <- kind                          = setPrint printValue kind value+         | KArray{} <- kind                        = printStoredArray value kind+         | isADT kind && not (isRoundingMode kind) = adtPrint adts printValue kind value+         | isWideBV kind                           = wideBVPrint kind value P.<> semi+         | isFP kind                               = arbitraryFPPrint kind value P.<> semi+         | isExactGMPKind cfg kind                 = gmpPrint kind value P.<> semi+         | kind `elem` [KChar, KString]             = textPrint kind value P.<> semi+         | True                                    = text "printf" P.<> parens (printQuotes (specifierKind cfg kind) P.<> comma <+> value) P.<> semi++       printStoredArray descriptor kind@(KArray keyKind valueKind)+         =  text "{"+         $$ nest 2 (   text "if" P.<> parens (descriptor <+> text "== NULL") <+> text "abort" P.<> parens empty P.<> semi+                    $$ keySetup+                    $$ text "printf(\"[0] =\");"+                    $$ printValue valueKind storedValue+                    $$ keyCleanup+                   )+         $$ text "}"+        where keyName     = "sbv_local_array_stored_key_" ++ kindTag kind+              key         = text keyName+              keySetup    = driverValueInit keyKind keyName 0+              keyCleanup  = driverValueClear keyKind keyName+              storedValue = text (arrayOutputReadName kind)+                         P.<> parens (fsep (punctuate comma [text "*" P.<> parens descriptor, key]))+       printStoredArray _ kind = die $ "Expected a stored array, received " ++ show kind++       driverCleanup = vcat $ inputCleanup ++ outputCleanup ++ returnCleanup+         where inputCleanup = [ clearInputElement (kindOf sv) n+                              | (_, n, CgAtomic sv) <- pairedInputs+                              , inputNeedsInitialization (kindOf sv)+                              ]+                           ++ [ clearInputElement (kindOf sv) elementName+                              | (_, n, CgArray svs) <- pairedInputs+                              , (index, sv) <- zip [0 :: Int ..] svs+                              , inputNeedsInitialization (kindOf sv)+                              , let elementName+                                      | isExactGMPKind cfg (kindOf sv) = n ++ "[" ++ show index ++ "]"+                                      | True                          = inputElementName n index+                              ]+               clearInputElement (KArray _ valueKind) elementName = driverValueClear valueKind (elementName ++ "_default")+               clearInputElement kind                elementName = driverValueClear kind elementName++               outputCleanup = concatMap clearOutput outs+               clearOutput (n, CgAtomic sv) = [outputValueClear (kindOf sv) n]+               clearOutput (n, CgArray svs) = [outputValueClear (kindOf sv) (n ++ "[" ++ show index ++ "]")+                                             | (index, sv) <- zip [0 :: Int ..] svs+                                             ]+               returnCleanup = [outputValueClear (kindOf sv) "sbv_result" | sv <- maybeToList mbRet]++               -- Public array outputs own an exported descriptor. Collection+               -- outputs own their elements; driver inputs merely borrow them.+               outputValueClear kind externalName+                 | isArray kind                                = text (arrayOutputReleaseName kind) P.<> parens address P.<> semi+                 | kind == KString || isList kind || isSet kind = managedValueRelease kind address+                 | True                                        = driverValueClear kind externalName+                where address = text "&" P.<> text externalName++-- | Generate the C program+genCProg :: CgConfig+         -> [Kind]+         -> [Kind]+         -> [Kind]+         -> String+         -> Doc+         -> Result+         -> [(String, CgVal)]+         -> [(String, CgVal)]+         -> Maybe SV+         -> Doc+         -> ([Doc], Set.Set CRequirement)+genCProg cfg adts lists sets fn proto+         (Result pinfo kindInfo _tvals _ovals cgs topInps (_, preConsts) tbls _uis definitions+                 (SBVPgm asgns) cstrs origAsserts _)+         inVars outVars mbRet extDecls+  | not (null usorts)+  = error $ "SBV->C: Cannot compile functions with uninterpreted sorts: " ++ intercalate ", " usorts+  | not (null unsupportedSets)+  = notyet $ "Sets with element kinds " ++ intercalate ", " (map (show . setElementKind) unsupportedSets)+  | any (requiresExtensionalEquality adts (Equal True) . pure . setElementKind) sets+  = error "SBV->C: Set elements require general extensional array equality."+  | or [requiresExtensionalEquality adts (Equal True) [keyKind] | KArray keyKind _ <- arrays]+  = error "SBV->C: Array keys require general extensional array equality."+  | any containsNestedSet kindInfo+  = notyet "Sets nested in arrays or unsupported aggregate types"+  | not (null unsupportedLists)+  = notyet $ "Lists with element kinds " ++ intercalate ", " (map (show . listElementKind) unsupportedLists)+  | any containsNestedList kindInfo+  = notyet "Lists nested in arrays or unsupported aggregate types"+  | not $ null (progSpecialRels pinfo)+  = error "SBV->C: Cannot compile in the presence of special relations."+  | hasQuants pinfo+  = error "SBV->C: Cannot compile in the presence of quantified variables."+  | not (null unstructuredDefinitions)+  = error $ "SBV->C: Cannot compile SMT-text-only function definitions: " ++ intercalate ", " unstructuredDefinitions+  | (callbackName, captures) : _ <- capturingArrayLambdas+  = error $ unlines+      [ "SBV->C: Array lambdas that capture outer symbolic values are not supported."+      , "  Callback: " ++ callbackName+      , "  Captured values: " ++ intercalate ", " [show sv ++ " :: " ++ show (kindOf sv) | sv <- captures]+      , "Only closed lambdaArray bodies can be compiled: use the index, literal constants, and local computations."+      , "Support for captured array-lambda environments is deferred; captured values are never approximated or ignored."+      ]+  | (functionName, captures) : _ <- capturingFunctions+  = error $ unlines+      [ "SBV->C: Defined functions with implicit captures of outer symbolic values are not supported."+      , "  Function: " ++ functionName+      , "  Captured values: " ++ intercalate ", " [show sv ++ " :: " ++ show (kindOf sv) | sv <- captures]+      , "Pass captured values as explicit function arguments, or use Closure with an explicit closureEnv for higher-order operations."+      ]+  | not (null softConstraints)+  = tbd "Soft constraints"+  | not (null unsupportedConstraintAttributes)+  = tbd $ "Constraint attributes: " ++ intercalate ", " unsupportedConstraintAttributes+  | True+  = ([pre, header, post], requirements)+ where notyet m = error $ "SBV->C: " ++ m ++ " are currently not supported by the C compiler. Please get in touch if you'd like support for this feature!"++       asserts | cgIgnoreAsserts cfg = []+               | True                = origAsserts++       usorts = [s | k@(KADT s _ _) <- Set.toList kindInfo, isUninterpreted k]++       pre    =  text "/* File:" <+> doubleQuotes (nm P.<> text ".c") P.<> text ". Automatically generated by SBV. Do not edit! */"+              $$ text ""++       header = text "#include" <+> doubleQuotes (nm P.<> text ".h")+             $$ (if requires CRequiresLibBF then text "#include <libbf.h>" else empty)++       wideKinds        = wideBVKinds kindInfo+       fpKinds          = arbitraryFPKinds kindInfo+       arrays           = arrayKinds kindInfo+       unsupportedLists = filter (not . listSupported cfg) lists+       unsupportedSets  = filter (not . setSupported cfg) sets+       post   = text ""+             $$ (if any (cFloatingKind cfg) kindInfo then nativeFPCompilePragmas else empty)+             $$ vcat (map codeSeg cgs)+             $$ extDecls+             $$ mappedRealFloorRuntime cfg allAssignments+             $$ bitVectorRuntime (cgInteger cfg) wideKinds allAssignments+             $$ (if requires CRequiresGMP    then gmpRuntime cfg kindInfo allAssignments else empty)+             $$ (if requires CRequiresLibBF  then arbitraryFPRuntime cfg fpKinds allAssignments else empty)+             $$ (if requires CRequiresNativeFPRounding then nativeFPRuntime else empty)+             $$ (if requires CRequiresIntegerPower     then mappedIntegerPowerRuntime cfg else empty)+             $$ (if requires CRequiresText             then textRuntime cfg usesExactInteger else empty)+             $$ adtEqualityRuntimeDecls adts+             $$ (if requires CRequiresLists            then listRuntimeDecls cfg lists else empty)+             $$ (if requires CRequiresSets             then setRuntimeDecls cfg sets else empty)+             $$ (if requires CRequiresLists            then listRuntime cfg usesExactInteger lists else empty)+             $$ (if requires CRequiresSets             then setRuntime cfg (map snd . adtConstructors adts . resolveADTReferences adts) sets else empty)+             $$ (if requires CRequiresArrays           then arrayRuntime cfg arrays else empty)+             $$ adtEqualityRuntime cfg adts+             $$ vcat [ppArrayEquality cfg adts kind | kind <- equalityArrayKinds]+             $$ definedFunctionResultRuntime functionResultKinds+             $$ (if hasStructuredCallbacks then definedFunctionContextType requirements else empty)+             $$ vcat functionPrototypes+             $$ vcat arrayLambdaPrototypes+             $$ vcat functionDocs+             $$ vcat arrayLambdaDocs+             $$ proto+             $$ text "{"+             $$ text ""+             $$ nest 2 (   gmpStart+                        $$ textStart+                        $$ listStart+                        $$ setStart+                        $$ arrayStart+                        $$ functionResultStart+                        $$ functionContextStart+                        $$ vcat (concatMap (genIO True . (\v -> (isAlive v, v))) inVars)+                        $$ constantDeclarations+                        $$ scheduledAssignments+                        $$ sepIf (not (null assignments) || not (null tbls))+                        $$ vcat (concatMap (genIO False . (True,)) outVars)+                        $$ exactReturn+                        $$ arrayReturn+                        $$ ownedTupleReturn+                        $$ exactADTReturn+                        $$ textReturn+                        $$ listReturn+                        $$ setReturn+                        $$ functionResultEnd+                        $$ arrayEnd+                        $$ setEnd+                        $$ listEnd+                        $$ textEnd+                        $$ gmpEnd+                        $$ normalReturn+                       )+             $$ text "}"+             $$ text ""++       nm = text fn++       assignments = F.toList asgns++       constraints = F.toList cstrs++       softConstraints = [() | (True, _, _) <- constraints]++       unsupportedConstraintAttributes = nub [attribute+                                              | (_, attributes, _) <- constraints+                                              , (attribute, _) <- attributes+                                              , attribute /= ":named"+                                              ]++       runtimeChecks = sortOn (cLocation allConsts . fst)+                    $ [(sv, snd (genAssert assertion)) | assertion@(_, _, sv) <- asserts]+                   ++ [(sv, snd (genConstraint constraint)) | constraint@(_, _, sv) <- constraints]++       functionNames = [(T.pack functionName, CTypes.definedFunctionCName functionName) | (functionName, _) <- definitions]++       structuredDefinitions = [ (functionName, resultKind, dependencies, functionType, lambdaInfo)+                               | (functionName, (definition@(SMTDef resultKind dependencies _ _), functionType)) <- definitions+                               , Just lambdaInfo <- [smtDefInfo definition]+                               ]++       unstructuredDefinitions = [ functionName+                                 | (functionName, (definition, _)) <- definitions+                                 , Nothing <- [smtDefInfo definition]+                                 ]++       topLevelArrayLambdaDefinitions = [ (arrayLambdaName sv, sv, lambdaInfo)+                                        | (sv, SBVApp (ArrayInit (Right lambdaDef)) []) <- assignments+                                        , Just lambdaInfo <- [smtLambdaInfo lambdaDef]+                                        ]++       topLevelArrayLambdaNames = [(sv, callbackName) | (callbackName, sv, _) <- topLevelArrayLambdaDefinitions]++       arrayLambdaDefinitions =+            topLevelArrayLambdaDefinitions+         ++ concat [nestedArrayLambdaDefinitions callbackName lambdaInfo+                   | (callbackName, _, lambdaInfo) <- topLevelArrayLambdaDefinitions+                   ]+         ++ concat [nestedArrayLambdaDefinitions (CTypes.definedFunctionCName functionName) lambdaInfo+                   | (functionName, _, _, _, lambdaInfo) <- structuredDefinitions+                   ]++       nestedArrayLambdaDefinitions scope LambdaInfo{liAssignments = nestedAssignments}+         = concat [ (callbackName, sv, lambdaInfo) : nestedArrayLambdaDefinitions callbackName lambdaInfo+                  | (sv, SBVApp (ArrayInit (Right lambdaDef)) []) <- F.toList nestedAssignments+                  , let callbackName = scopedArrayLambdaName scope sv+                  , Just lambdaInfo <- [smtLambdaInfo lambdaDef]+                  ]++       functionAssignments    = concatMap (\(_, _, _, _, lambdaInfo) -> F.toList (liAssignments lambdaInfo)) structuredDefinitions+       arrayLambdaAssignments = concatMap (\(_, _, lambdaInfo) -> F.toList (liAssignments lambdaInfo)) arrayLambdaDefinitions+       lambdaAssignments      = functionAssignments ++ arrayLambdaAssignments+       allAssignments         = assignments ++ lambdaAssignments+       capturingArrayLambdas  = [ (callbackName, captures)+                               | (callbackName, _, lambdaInfo) <- arrayLambdaDefinitions+                               , let captures = cLambdaFreeValues lambdaInfo+                               , not (null captures)+                               ]+       capturingFunctions     = [ (functionName, captures)+                               | (functionName, _, _, _, lambdaInfo) <- structuredDefinitions+                               , let captures = cLambdaFreeValues lambdaInfo+                               , not (null captures)+                               ]+       equalityArrayKinds     = uniqueOn arrayEqualName+                                    [kindOf value | (_, SBVApp op (value:_)) <- allAssignments+                                                , op `elem` [Equal False, Equal True, NotEqual]+                                                , isArray value]++       functionPrototypes  = [ definedFunctionSignature functionName resultKind (liParams lambdaInfo) P.<> semi+                             | (functionName, resultKind, _, _, lambdaInfo) <- structuredDefinitions+                             ]++       generatedFunctions =+         [ ppDefinedFunction cfg adts functionNames functionName resultKind functionType lambdaInfo+         | (functionName, resultKind, _, functionType, lambdaInfo) <- structuredDefinitions+         ]+       functionDocs        = map fst generatedFunctions++       functionResultKinds = nub $+            [ resultKind+            | (_, resultKind, _, _, _) <- structuredDefinitions+            , definedFunctionResultNeedsClone cfg adts resultKind+            ]+         ++ [ kindOf (liOutput lambdaInfo)+            | (_, _, lambdaInfo) <- arrayLambdaDefinitions+            , definedFunctionResultNeedsClone cfg adts (kindOf (liOutput lambdaInfo))+            ]++       generatedArrayLambdas = [ppArrayLambda cfg adts functionNames callbackName sv lambdaInfo+                               | (callbackName, sv, lambdaInfo) <- arrayLambdaDefinitions+                               ]+       arrayLambdaPrototypes  = [arrayLambdaSignature callbackName sv lambdaInfo P.<> semi+                                | (callbackName, sv, lambdaInfo) <- arrayLambdaDefinitions+                                ]+       arrayLambdaDocs        = map fst generatedArrayLambdas++       (scheduledAssignments, scheduledRequirements) =+         scheduleC env functionNames topLevelArrayLambdaNames+                   (map fst allConsts ++ concatMap (cgValues . snd) inVars) assignments tbls True typeWidth+                   evaluationRoots++       evaluationRoots = runtimeChecks ++ [(sv, empty) | sv <- concatMap (cgValues . snd) outVars ++ maybe [] pure mbRet]++       cgValues (CgAtomic sv) = [sv]+       cgValues (CgArray svs) = svs++       requirements = Set.unions+         [ kindRequirements+         , scheduledRequirements+         , Set.unions (map snd generatedFunctions)+         , Set.unions (map snd generatedArrayLambdas)+         , Set.unions [operationRequirements cfg (op, kindOf sv) | (sv, SBVApp op _) <- assignments]+         ]++       kindRequirements = Set.fromList $+            [CRequiresWideBV | not (null wideKinds)]+         ++ [CRequiresLibBF  | not (null fpKinds)]+         ++ [CRequiresLibM   | not (null fpKinds)]+         ++ [CRequiresGMP    | usesGMP]+         ++ [CRequiresText   | KString `Set.member` kindInfo || KChar `Set.member` kindInfo]+         ++ [CRequiresLists  | not (null lists)]+         ++ [CRequiresSets   | not (null sets)]+         ++ [CRequiresArrays | not (null arrays)]++       requires requirement = requirement `Set.member` requirements++       usesGMP          = any (isExactGMPKind cfg) kindInfo+       usesExactInteger = isExactGMPKind cfg KUnbounded && KUnbounded `Set.member` kindInfo++       containsNestedList = containsUnsupportedCollection isList++       containsNestedSet = containsUnsupportedCollection isSet++       containsUnsupportedCollection isCollection = walk Set.empty+        where walk _ kind+                | isCollection kind+                = False+              walk visited (KTuple fields)+                = any (walk visited) fields+              walk visited (KList elementKind)+                = walk visited elementKind+              walk visited (KSet elementKind)+                = walk visited elementKind+              walk visited (KArray keyKind valueKind)+                = walk visited keyKind || walk visited valueKind+              walk visited kind+                | isADT kind+                , not (isRoundingMode kind)+                , not (isUninterpreted kind)+                =    not (kind `Set.member` visited)+                  && any (any (walk (Set.insert kind visited)) . snd) (adtConstructors adts kind)+              walk _ kind+                = any isCollection (expandKinds kind)++       listElementKind (KList elementKind) = elementKind+       listElementKind kind                = die $ "Expected a list kind, received " ++ show kind++       setElementKind (KSet elementKind) = elementKind+       setElementKind kind               = die $ "Expected a set kind, received " ++ show kind++       gmpStart+         | requires CRequiresGMP = gmpContextStart+         | True                     = empty+       gmpEnd+         | requires CRequiresGMP = gmpContextEnd+         | True                     = empty++       textStart+         | requires CRequiresText = textContextStart+         | True                    = empty+       textEnd+         | requires CRequiresText = textContextEnd+         | True                    = empty++       listStart+         | requires CRequiresLists = listContextStart+         | True                    = empty+       listEnd+         | requires CRequiresLists = listContextEnd+         | True                    = empty++       setStart+         | requires CRequiresSets = setContextStart+         | True                   = empty+       setEnd+         | requires CRequiresSets = setContextEnd+         | True                   = empty++       arrayStart+         | requires CRequiresArrays = arrayContextStart+         | True                     = empty++       arrayEnd+         | requires CRequiresArrays = arrayContextEnd+         | True                     = empty++       functionContextStart+         | hasStructuredCallbacks = definedFunctionContextInitialization requirements+         | True                   = empty++       hasStructuredCallbacks = not (null structuredDefinitions && null arrayLambdaDefinitions)++       functionResultStart+         | requires CRequiresFunctionResults = text "sbv_function_result_ctx sbv_local_function_result_ctx = {NULL};"+         | True                               = empty++       functionResultEnd+         | requires CRequiresFunctionResults = text "sbv_function_result_ctx_end(&sbv_local_function_result_ctx);"+         | True                               = empty++       exactReturn = case mbRet of+                       Just sv | isExactGMPKind cfg (kindOf sv)+                               -> gmpSet (kindOf sv) (text "sbv_result") (showSV env sv) P.<> semi+                       _       -> empty++       arrayReturn = case mbRet of+                       Just sv | isArray sv+                               -> text "const" <+> text (arrayOutputCType (kindOf sv)) <+> text "sbv_result" <+> text "="+                                  <+> text (arrayExportName (kindOf sv)) P.<> parens (showSV env sv) P.<> semi+                       _       -> empty++       ownedTupleReturn = case mbRet of+                            Just sv+                              | tupleNeedsOwnership cfg (kindOf sv)+                              -> text "const" <+> text (tupleCType (kindOf sv)) <+> text "sbv_result" <+> text "="+                                 <+> text (tupleOwnedCloneName (kindOf sv)) P.<> parens (showSV env sv) P.<> semi+                            _ -> empty++       exactADTReturn = case mbRet of+                          Just sv+                            | isOwnedADT cfg adts sv+                            -> text "const" <+> text (adtCType (kindOf sv)) <+> text "sbv_result" <+> text "="+                           <+> text (adtOwnedCloneName (kindOf sv))+                                 P.<> parens (showSV env sv)+                                 P.<> semi+                          _ -> empty++       textReturn = case mbRet of+                      Just sv | kindOf sv == KString+                              -> text "const SString sbv_result =" <+> textClone (showSV env sv) P.<> semi+                      _       -> empty++       listReturn = case mbRet of+                      Just sv | isList sv+                              -> text "const" <+> text (listCType (kindOf sv)) <+> text "sbv_result ="+                              <+> listClone (kindOf sv) (showSV env sv) P.<> semi+                      _       -> empty++       setReturn = case mbRet of+                     Just sv | isSet sv+                             -> text "const" <+> text (setCType (kindOf sv)) <+> text "sbv_result ="+                             <+> setClone (kindOf sv) (showSV env sv) P.<> semi+                     _       -> empty++       normalReturn = case mbRet of+                        Just sv | isArray sv                           -> text "return sbv_result;"+                        Just sv | tupleNeedsOwnership cfg (kindOf sv) -> text "return sbv_result;"+                        Just sv | isOwnedADT cfg adts sv               -> text "return sbv_result;"+                        Just sv | kindOf sv == KString                 -> text "return sbv_result;"+                        Just sv | isList sv                            -> text "return sbv_result;"+                        Just sv | isSet sv                             -> text "return sbv_result;"+                        Just sv | not (isExactGMPKind cfg (kindOf sv)) -> mkRet sv+                        _                                             -> empty++       codeSeg (fnm, ls) =  text "/* User specified custom code for" <+> doubleQuotes (text fnm) <+> text "*/"+                         $$ vcat (map text ls)+                         $$ text ""++       ins = case topInps of+               ResultTopInps (is, []) -> is+               ResultTopInps is       -> die $ "Unexpected trackers: " ++ show is+               ResultLamInps is       -> die $ "Unexpected inputs  : " ++ show is++       typeWidth = getMax 0 $ [len (kindOf s) | (s, _) <- assignments] ++ [len (kindOf s) | NamedSymVar s _ <- ins]+                where len (KVar s)           = die $ "Variable: " ++ s+                      len KReal{}            = 5+                      len KFloat{}           = 6 -- SFloat+                      len KDouble{}          = 7 -- SDouble+                      len KString{}          = 7 -- SString+                      len KChar{}            = 5 -- SChar+                      len k@KList{}          = length (listCType k)+                      len k@KSet{}           = length (setCType k)+                      len KUnbounded{}       = 8+                      len KBool              = 5 -- SBool+                      len (KBounded False n) = 5 + length (show n) -- SWordN+                      len (KBounded True  n) = 4 + length (show n) -- SIntN+                      len KRational{}        = length "SRational"+                      len (KFP eb sb)         = 6 + length (show eb) + length (show sb)+                      len k@KArray{}         = length (arrayCType k)+                      len k@KTuple{}         = length (tupleCType k)+                      len (KApp s _)         = die $ "Uninterpreted ADT app: " ++ s+                      len k@(KADT s _ _)+                        | isRoundingMode k = length (show k)+                        | isUninterpreted k = die $ "Uninterpreted ADT: " ++ s+                        | True             = length (adtCType k)++                      getMax m []     = m+                      getMax m (x:xs) = getMax (m `max` x) xs++       allConsts = (falseSV, falseCV) : (trueSV, trueCV) : preConsts+       (constantDeclarations, consts) = stabilizeCConstants cfg adts typeWidth (filter ((`Set.member` usedVariables) . fst) allConsts)+       env = CRenderEnv cfg adts consts++       usedVariables = cReachableValues cfg (Map.fromList assignments) tbls (map fst evaluationRoots)++       isAlive :: (String, CgVal) -> Bool+       isAlive (_, CgAtomic sv) = sv `Set.member` usedVariables+       isAlive (_, _)           = True++       genIO :: Bool -> (Bool, (String, CgVal)) -> [Doc]+       genIO True  (alive, (cNm, CgAtomic sv))+         | isArray sv = [statement | alive, statement <- arrayInputSetup typeWidth sv cNm]+         | isSet sv   = [declSV typeWidth sv <+> text "=" <+> setNormalize (kindOf sv) (text cNm) P.<> semi | alive]+         | True       = [declSV typeWidth sv <+> text "=" <+> inputValue cNm sv P.<> semi | alive]+       genIO False (alive, (cNm, CgAtomic sv))+         | isArray sv                          = [text "*" P.<> text cNm <+> text "=" <+> text (arrayExportName (kindOf sv)) P.<> parens (showSV env sv) P.<> semi | alive]+         | isExactGMPKind cfg (kindOf sv)      = [gmpSet (kindOf sv) (text cNm) (showSV env sv) P.<> semi | alive]+         | kindOf sv == KString                = [text "*" P.<> text cNm <+> text "=" <+> textClone (showSV env sv) P.<> semi | alive]+         | isList sv                           = [text "*" P.<> text cNm <+> text "=" <+> listClone (kindOf sv) (showSV env sv) P.<> semi | alive]+         | isSet sv                            = [text "*" P.<> text cNm <+> text "=" <+> setClone (kindOf sv) (showSV env sv) P.<> semi | alive]+         | tupleNeedsOwnership cfg (kindOf sv) = [text "*" P.<> text cNm <+> text "=" <+> text (tupleOwnedCloneName (kindOf sv)) P.<> parens (showSV env sv) P.<> semi | alive]+         | isOwnedADT cfg adts sv              = [ text "*" P.<> text cNm <+> text "="+                                               <+> text (adtOwnedCloneName (kindOf sv))+                                                     P.<> parens (showSV env sv)+                                                     P.<> semi+                                                 | alive+                                                 ]+         | True                                = [text "*" P.<> text cNm <+> text "=" <+> showSV env sv P.<> semi | alive]+       genIO isInp (_,     (cNm, CgArray sws)) = zipWith genElt sws [(0::Int)..]+         where genElt sv i+                 | isInp                         = vcat (genIO True (sv `Set.member` usedVariables, (entry, CgAtomic sv)))+                 | isExactGMPKind cfg kind      = gmpSet kind (text entry) value P.<> semi+                 | isArray kind                 = text entry <+> text "=" <+> text (arrayExportName kind) P.<> parens value P.<> semi+                 | kind == KString              = text entry <+> text "=" <+> textClone value P.<> semi+                 | isList kind                  = text entry <+> text "=" <+> listClone kind value P.<> semi+                 | isSet kind                   = text entry <+> text "=" <+> setClone kind value P.<> semi+                 | tupleNeedsOwnership cfg kind = text entry <+> text "=" <+> text (tupleOwnedCloneName kind) P.<> parens value P.<> semi+                 | isOwnedADT cfg adts sv        = text entry <+> text "=" <+> text (adtOwnedCloneName kind) P.<> parens value P.<> semi+                 | True                         = text entry <+> text "=" <+> value P.<> semi+                 where entry = cNm ++ "[" ++ show i ++ "]"+                       kind  = kindOf sv+                       value = showSV env sv++       inputValue cNm sv+         | isWideBV k = wideBVNormalize k (text cNm)+         | isFP k      = arbitraryFPNormalize k (text cNm)+         | True        = text cNm+         where k = kindOf sv++       mkRet sv = text "return" <+> showSV env sv P.<> semi++       genAssert (msg, cs, sv) = (cLocation consts sv, doc)+         where doc =     text "/* ASSERTION:" <+> cCommentText msg+                     $$  maybe empty (vcat . map cCommentText) (locInfo (getCallStack <$> cs))+                     $$  text " */"+                     $$  text "if" P.<> parens (showSV env sv)+                     $$  text "{"+                     $+$ nest 2 (vcat [errOut, text "exit(-1);"])+                     $$  text "}"+                     $$  text ""+               errOut = text "fprintf" P.<> parens (fsep (punctuate comma [ text "stderr"+                                                                          , cStringLiteral "%s:%d:ASSERTION FAILED: %s\n"+                                                                          , text "__FILE__"+                                                                          , text "__LINE__"+                                                                          , cStringLiteral msg+                                                                          ])) P.<> semi+               locInfo (Just ps) = let loc (f, sl) = concat [srcLocFile sl, ":", show (srcLocStartLine sl), ":", show (srcLocStartCol sl), ":", f ]+                                   in case map loc ps of+                                         []     -> Nothing+                                         (f:rs) -> Just $ (" * SOURCE   : " ++ f) : map (" *            " ++)  rs+               locInfo _         = Nothing++       genConstraint (_, attributes, sv) = (cLocation consts sv, doc)+         where doc =  text "/* CONSTRAINT */"+                   $$ text "if" P.<> parens (text "!" P.<> parens (showSV env sv))+                   $$ text "{"+                   $+$ nest 2 (vcat [errOut, text "exit(-1);"])+                   $$ text "}"+                   $$ text ""++               description = fromMaybe "unnamed" (lookup ":named" attributes)++               errOut = text "fprintf" P.<> parens (fsep (punctuate comma [ text "stderr"+                                                                          , cStringLiteral "%s:%d:CONSTRAINT FAILED: %s\n"+                                                                          , text "__FILE__"+                                                                          , text "__LINE__"+                                                                          , cStringLiteral description+                                                                          ])) P.<> semi++-- | Return the source-order location used to interleave a value's dependent+-- declarations. Constants are available before every generated assignment.+cLocation :: [(SV, CV)] -> SV -> Int+cLocation constants sv@(SV _ (NodeId (_, _, nodeIndex)))+  | isJust (lookup sv constants) = -1+  | True                         = nodeIndex++-- | Render one finite lookup table at the point where all its elements are+-- available. Constant top-level tables may use static storage; lambda-local+-- tables always use automatic storage so their entries may depend on parameters.+ppTable :: CRenderEnv -> Bool -> ((Int, Kind, Kind), [SV]) -> (Int, Doc)+ppTable env allowStatic ((tableIndex, _, resultKind), elements)+  = (location, storage <+> text tableElementType <+> tableName P.<> text "[] = {"+              $$ nest 4 (fsep (punctuate comma (align (map renderElement elements))))+              $$ text "};")+ where cfg = renderConfig env+       location = maximum (-1 : map (cLocation (renderConstants env)) elements)+       renderElement element = arrayStoredValue resultKind (showSV env element)+       tableElementType+         | isArray resultKind = CTypes.constElementCType resultKind+         | True               = "const " ++ showCType resultKind+       storage+         | allowStatic && location == -1 && not (tableMustBeLocal cfg resultKind) = text "static"+         | True                                                                  = empty+       tableName = text ("table" ++ show tableIndex)++-- | Declare the private ownership-arena bundle threaded through generated SBV+-- functions and retained array callbacks. The retain bridge creates empty+-- arenas so an escaping lambda can produce fresh managed values without+-- retaining storage owned by the call that created it.+-- Define its unused-function annotation even when no other runtime is needed.+definedFunctionContextType :: Set.Set CRequirement -> Doc+definedFunctionContextType requirements = text . unlines $+     [ cUnusedAttribute+     , ""+     , "typedef struct {"+     ]+  ++ ["  void *" ++ fieldName ++ ";" | (_, _, fieldName) <- functionContextFields]+  ++ [ "} sbv_function_ctx;"+     , ""+     , "static SBV_CGEN_UNUSED const void *sbv_function_ctx_retain_empty(const void *context)"+     , "{"+     , "  if (context == NULL) abort();"+     , "  const sbv_function_ctx *source = (const sbv_function_ctx *) context;"+     , "  (void) source;"+     , "  sbv_function_ctx *owned = (sbv_function_ctx *) calloc(1, sizeof *owned);"+     , "  if (owned == NULL) abort();"+     ]+  ++ concatMap retainArena activeArenas+  ++ [ "  return owned;"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED void sbv_function_ctx_release_owned(const void *context)"+     , "{"+     , "  sbv_function_ctx *owned = (sbv_function_ctx *) context;"+     , "  if (owned == NULL) return;"+     ]+  ++ concatMap releaseArena activeArenas+  ++ [ "  free(owned);"+     , "}"+     , ""+     ]+ where activeArenas = [ arena+                      | arena@(requirement, _, _, _) <- contextArenas+                      , requirement `Set.member` requirements+                      ]++       contextArenas = [ (requirement, fieldName, contextType, contextType ++ "_end")+                       | (requirement, contextType, fieldName) <- functionContextFields+                       ]++       retainArena (_, fieldName, contextType, _) =+         [ "  if (source->" ++ fieldName ++ " != NULL) {"+         , "    " ++ contextType ++ " *arena = (" ++ contextType ++ " *) calloc(1, sizeof *arena);"+         , "    if (arena == NULL) abort();"+         , "    owned->" ++ fieldName ++ " = arena;"+         , "  }"+         ]++       releaseArena (_, fieldName, contextType, contextEnd) =+         [ "  if (owned->" ++ fieldName ++ " != NULL) {"+         , "    " ++ contextEnd ++ "((" ++ contextType ++ " *) owned->" ++ fieldName ++ ");"+         , "    free(owned->" ++ fieldName ++ ");"+         , "  }"+         ]++-- | Initialize a private function-context bundle from the ownership arenas+-- available in the surrounding generated function.+definedFunctionContextInitialization :: Set.Set CRequirement -> Doc+definedFunctionContextInitialization requirements+  = text "sbv_function_ctx sbv_local_function_ctx =" <+> braces (fsep (punctuate comma fields)) P.<> semi+ where fields = [ field requirement fieldName ("sbv_local_" ++ fieldName ++ "_ctx")+                | (requirement, _, fieldName) <- functionContextFields+                ]++       field requirement fieldName contextName+         = text ("." ++ fieldName ++ " =") <+> if requirement `Set.member` requirements+                                                   then text ("&" ++ contextName)+                                                   else text "NULL"++-- | Test whether a private function result needs a stable deep copy because+-- its by-value representation contains independently owned aggregate storage.+definedFunctionResultNeedsClone :: CgConfig -> [Kind] -> Kind -> Bool+definedFunctionResultNeedsClone cfg adts kind+  | kind == KString        = True+  | isList kind            = True+  | isSet kind             = True+  | KTuple{} <- kind       = tupleNeedsOwnership cfg kind+  | isConcreteADTReference kind = adtNeedsOwnership cfg adts kind+  | True                   = False++-- | Shared ownership-context fields: requirement, C arena type, and field+-- name. Private functions and array callbacks must bind the same arenas.+functionContextFields :: [(CRequirement, String, String)]+functionContextFields =+  [ (CRequiresGMP, "sbv_gmp_ctx", "gmp")+  , (CRequiresText, "sbv_text_ctx", "text")+  , (CRequiresLists, "sbv_list_ctx", "list")+  , (CRequiresSets, "sbv_set_ctx", "set")+  , (CRequiresArrays, "sbv_array_ctx", "array")+  , (CRequiresFunctionResults, "sbv_function_result_ctx", "function_result")+  ]++-- | Borrow required parent arenas and bind a local function context to them.+functionContextSetup :: Set.Set CRequirement -> Doc+functionContextSetup requirements+  = vcat [ text contextType <+> text ("*sbv_local_parent_" ++ fieldName ++ "_ctx = (" ++ contextType ++ " *) sbv_local_parent_function_ctx->" ++ fieldName ++ ";")+        $$ text contextType <+> text ("sbv_local_" ++ fieldName ++ "_ctx = *sbv_local_parent_" ++ fieldName ++ "_ctx;")+         | (requirement, contextType, fieldName) <- functionContextFields, requirement `Set.member` requirements+         ]+ $$ text "sbv_function_ctx sbv_local_function_ctx = *sbv_local_parent_function_ctx; (void) sbv_local_function_ctx;"+ $$ vcat [text ("sbv_local_function_ctx." ++ fieldName ++ " = &sbv_local_" ++ fieldName ++ "_ctx;")+         | (requirement, _, fieldName) <- functionContextFields, requirement `Set.member` requirements+         ]++-- | Publish arena allocations back to the parent before returning a result.+functionContextCommit :: Set.Set CRequirement -> Doc+functionContextCommit requirements+  = vcat [text ("*sbv_local_parent_" ++ fieldName ++ "_ctx = sbv_local_" ++ fieldName ++ "_ctx;")+         | (requirement, _, fieldName) <- functionContextFields, requirement `Set.member` requirements+         ]++-- | Return the generated helper name that clones one private managed result+-- into the shared function-result arena.+definedFunctionResultCloneName :: Kind -> String+definedFunctionResultCloneName kind = "sbv_function_result_clone_" ++ CTypes.kindTag kind++-- | Render a deep clone into the shared private function-result arena.+definedFunctionResultClone :: Kind -> Doc -> Doc+definedFunctionResultClone kind value+  = text (definedFunctionResultCloneName kind)+      P.<> parens (fsep (punctuate comma [text "&sbv_local_function_result_ctx", value]))++-- | Emit temporary ownership storage for managed values returned by private+-- generated functions or retained array callbacks. Public boundaries clone+-- these values once more before this arena is released.+definedFunctionResultRuntime :: [Kind] -> Doc+definedFunctionResultRuntime []    = empty+definedFunctionResultRuntime kinds = text . unlines $+     [ "/* Stable storage for managed private-function and array-lambda results. */"+     , "typedef void (*sbv_function_result_release)(void *);"+     , "typedef struct sbv_function_result_node {"+     , "  struct sbv_function_result_node *next;"+     , "  void *value;"+     , "  sbv_function_result_release release;"+     , "} sbv_function_result_node;"+     , "typedef struct { sbv_function_result_node *head; } sbv_function_result_ctx;"+     , ""+     , "static SBV_CGEN_UNUSED void sbv_function_result_ctx_remember(sbv_function_result_ctx *ctx, void *value, sbv_function_result_release release)"+     , "{"+     , "  sbv_function_result_node *node = (sbv_function_result_node *) malloc(sizeof(*node));"+     , "  if (ctx == NULL || value == NULL || release == NULL || node == NULL) abort();"+     , "  node->next = ctx->head;"+     , "  node->value = value;"+     , "  node->release = release;"+     , "  ctx->head = node;"+     , "}"+     , ""+     , "static SBV_CGEN_UNUSED void sbv_function_result_ctx_end(sbv_function_result_ctx *ctx)"+     , "{"+     , "  while (ctx->head != NULL) {"+     , "    sbv_function_result_node *node = ctx->head;"+     , "    ctx->head = node->next;"+     , "    node->release(node->value);"+     , "    free(node);"+     , "  }"+     , "}"+     , ""+     ]+  ++ concatMap helpers kinds+ where helpers kind =+         [ "static SBV_CGEN_UNUSED void " ++ releaseName ++ "(void *opaque)"+         , "{"+         , "  " ++ cType ++ " *value = (" ++ cType ++ " *) opaque;"+         , "  " ++ render (managedValueRelease kind (text "value"))+         , "  free(value);"+         , "}"+         , ""+         , "static SBV_CGEN_UNUSED " ++ cType ++ " " ++ cloneName ++ "(sbv_function_result_ctx *ctx, " ++ cType ++ " value)"+         , "{"+         , "  " ++ cType ++ " *result = (" ++ cType ++ " *) malloc(sizeof(*result));"+         , "  if (result == NULL) abort();"+         , "  *result = " ++ render (managedValueClone kind (text "value")) ++ ";"+         , "  sbv_function_result_ctx_remember(ctx, result, " ++ releaseName ++ ");"+         , "  return *result;"+         , "}"+         , ""+         ]+        where cType       = showCType kind+              cloneName   = definedFunctionResultCloneName kind+              releaseName = "sbv_function_result_release_" ++ CTypes.kindTag kind++-- | Render the private C signature shared by a defined function's prototype+-- and implementation.+definedFunctionSignature :: String -> Kind -> [(Quantifier, SV)] -> Doc+definedFunctionSignature originalName resultKind parameters+  = text "static" <+> text resultType <+> text (CTypes.definedFunctionCName originalName)+      P.<> parens renderedParameters+ where resultType+         | isArray resultKind = CTypes.elementCType resultKind+         | True               = showCType resultKind++       renderedParameters = fsep . punctuate comma $+           text "sbv_function_ctx *const sbv_local_parent_function_ctx"+         : [text "const" <+> text (showCType parameter) <+> text (show parameter) | (_, parameter) <- parameters]++-- | Lower one first-order SBV function definition from its retained expression+-- DAG. All definitions use demand-driven control flow so operations protected+-- by conditionals and short-circuiting Boolean operations remain protected in+-- C, including partial ADT selectors in acyclic functions. Closed nested array+-- lambdas are lambda-lifted into private callbacks;+-- SBV's firstified higher-order specializations arrive through the same+-- first-order representation.+ppDefinedFunction :: CgConfig+                  -> [Kind]+                  -> [(T.Text, String)]+                  -> String+                  -> Kind+                  -> SBVType+                  -> LambdaInfo+                  -> (Doc, Set.Set CRequirement)+ppDefinedFunction cfg adts functionNames originalName declaredResultKind (SBVType signatureKinds)+                  LambdaInfo{ liAssignments = functionProgram+                            , liParams      = parameters+                            , liOutput      = functionOutput+                            , liConsts      = constants+                            , liTables      = tables+                            }+  | null signatureKinds+  = die $ "Empty type for defined function " ++ show originalName+  | declaredResultKind /= resultKind+  = die $ "Result-kind mismatch in defined function " ++ show originalName+  | map (kindOf . snd) parameters /= parameterKinds+  = die $ "Parameter-kind mismatch in defined function " ++ show originalName+  | any ((/= ALL) . fst) parameters+  = die $ "Non-universal parameter in defined function " ++ show originalName+  | kindOf functionOutput /= resultKind+  = die $ "Output-kind mismatch in defined function " ++ show originalName+  | not (null unsupportedManagedKinds)+  = tbd $ "Managed values in defined function " ++ show originalName ++ ": " ++ intercalate ", " (map show unsupportedManagedKinds)+  | True+  = (functionDoc, functionRequirements)+ where (parameterKinds, resultKind) = (init signatureKinds, last signatureKinds)+       assignments                  = F.toList functionProgram+       functionConsts               = (falseSV, falseCV) : (trueSV, trueCV) : constants+       reachableValues              = cReachableValues cfg (Map.fromList assignments) tables [functionOutput]+       (constantDeclarations, renderingConsts) = stabilizeCConstants cfg adts typeWidth (filter ((`Set.member` reachableValues) . fst) functionConsts)+       env = CRenderEnv cfg adts renderingConsts+       functionValues               = functionOutput : map snd parameters ++ map fst assignments ++ map fst constants+       typeWidth                    = maximum (0 : map (length . showCType) functionValues)+       nestedLambdaNames            = [ (sv, scopedArrayLambdaName (CTypes.definedFunctionCName originalName) sv)+                                      | (sv, SBVApp (ArrayInit (Right _)) _) <- assignments+                                      ]+       unsupportedManagedKinds      = nub [ kind+                                          | value <- functionValues+                                          , let kind = kindOf value+                                          , functionValueHasUnsupportedManagedStorage kind+                                          ]++       functionValueHasUnsupportedManagedStorage kind+         | isExactGMPKind cfg kind = False+         | kind == KString         = False+         | isList kind             = False+         | isSet kind              = False+         | isArray kind            = False+         | KTuple fields <- kind   = any functionValueHasUnsupportedManagedStorage fields+         | isConcreteADTReference kind  = False+         | True                    = valueNeedsOwnership cfg kind++       (scheduledAssignments, scheduledRequirements) =+         scheduleC env functionNames nestedLambdaNames+                   (map fst functionConsts ++ map snd parameters) assignments tables False typeWidth [(functionOutput, empty)]++       functionRequirements = Set.unions+         [ Set.fromList $ [CRequiresGMP             | any (isExactGMPKind cfg) expandedFunctionKinds]+                       ++ [CRequiresText            | KString `elem` expandedFunctionKinds]+                       ++ [CRequiresLists           | any isList expandedFunctionKinds]+                       ++ [CRequiresSets            | any isSet expandedFunctionKinds]+                       ++ [CRequiresArrays          | any isArray expandedFunctionKinds]+                       ++ [CRequiresFunctionResults | definedFunctionResultNeedsClone cfg adts resultKind]+         , scheduledRequirements+         , Set.unions [operationRequirements cfg (op, kindOf sv) | (sv, SBVApp op _) <- assignments]+         ]++       expandedFunctionKinds = concatMap (expandKinds . kindOf) functionValues++       contextSetup  = functionContextSetup functionRequirements+       contextCommit = functionContextCommit functionRequirements++       functionDoc+         = definedFunctionSignature originalName resultKind parameters+          $$ text "{"+          $$ nest 2 (   contextSetup+                     $$ constantDeclarations+                     $$ functionAssignments+                     $$ functionResultDeclaration <+> text "sbv_local_function_result =" <+> functionResult P.<> semi+                     $$ contextCommit+                     $$ text "return sbv_local_function_result;"+                    )+          $$ text "}"+          $$ text ""++       functionAssignments = scheduledAssignments++       functionResult+         | isArray resultKind+         = arrayStoredValue resultKind (showSV env functionOutput)+         | definedFunctionResultNeedsClone cfg adts resultKind+         = definedFunctionResultClone resultKind (showSV env functionOutput)+         | True+         = showSV env functionOutput++       functionResultType+         | isArray resultKind = CTypes.elementCType resultKind+         | True               = showCType resultKind++       functionResultDeclaration+         | isArray resultKind = text functionResultType+         | True               = text "const" <+> text functionResultType++-- | Collect every operand, including values retained inside an operator+-- instead of its ordinary argument list and the entries of referenced tables.+-- Defaults omitted by unchecked or provably in-range lookups are not live.+cExpressionDependencies :: CgConfig -> [((Int, Kind, Kind), [SV])] -> SBVExpr -> [SV]+cExpressionDependencies cfg tables (SBVApp op arguments) = arguments ++ case op of+  LkUp (tableIndex, indexKind, _, tableLength) index defaultValue+    -> index : [defaultValue | tableNeedsBounds cfg indexKind, isJust (snd (tableIndexAndBounds cfg indexKind tableLength empty))]+            ++ [value | ((candidateIndex, _, _), values) <- tables, candidateIndex == tableIndex, value <- values]+  IEEEFP (FP_Cast _ _ rmSV) -> [rmSV]+  _                       -> []++-- | Find the complete demand closure of a collection of roots. Inputs and+-- constants are included, so declaration liveness and evaluation scheduling+-- use the same dependency graph.+cReachableValues :: CgConfig -> Map.Map SV SBVExpr -> [((Int, Kind, Kind), [SV])] -> [SV] -> Set.Set SV+cReachableValues cfg assignments tables = foldl reach Set.empty+ where reach visited sv+         | sv `Set.member` visited = visited+         | True = foldl reach (Set.insert sv visited)+                        (maybe [] (cExpressionDependencies cfg tables) (Map.lookup sv assignments))++-- | Give managed constants function-wide backing storage. Rendering compound+-- literals inside a conditional would otherwise leave dangling pointers when+-- a descriptor is used after that branch exits. A lowering may elide a live+-- operand, such as an unreachable table default, so acknowledge each binding+-- even if its rendered use disappears.+stabilizeCConstants :: CgConfig -> [Kind] -> Int -> [(SV, CV)] -> (Doc, [(SV, CV)])+stabilizeCConstants cfg adts typeWidth constants+  = ( vcat [ declSV typeWidth sv <+> text "=" <+> mkConst env cv P.<> semi+          $$ text "(void)" <+> text (show sv) P.<> semi+           | (sv, cv) <- stabilized+           ]+    , filter ((`Set.notMember` stabilizedValues) . fst) constants+    )+ where env = CRenderEnv cfg adts constants+       stabilized = [(sv, cv) | (sv, cv) <- constants, isArray sv || definedFunctionResultNeedsClone cfg adts (kindOf sv)]+       stabilizedValues = Set.fromList (map fst stabilized)++-- | Recognize total bit-vector operations that may be computed before a+-- guard when all their dependencies are already safe. Restrict speculation+-- to the exact bit-vector runtime: calls, selectors, allocation, and native+-- floating-point operations retain their demand ordering.+cSpeculatable :: SV -> SBVExpr -> Bool+cSpeculatable result (SBVApp op arguments) = all bitVector (result : arguments) && totalOperation op+ where bitVector sv = kindOf sv == KBool || isBounded sv++       totalOperation operation = case operation of+         Plus        -> True+         Times       -> True+         Minus       -> True+         UNeg        -> True+         Abs         -> True+         Quot        -> True+         Rem         -> True+         Equal{}     -> True+         NotEqual    -> True+         LessThan    -> True+         GreaterThan -> True+         LessEq      -> True+         GreaterEq   -> True+         Ite         -> True+         Implies     -> True+         And         -> True+         Or          -> True+         XOr         -> True+         Not         -> True+         Shl         -> True+         Shr         -> True+         Rol{}       -> True+         Ror{}       -> True+         Extract{}   -> True+         Join        -> True+         _           -> False++-- | Path-sensitive scheduling facts. Tables, unlike hoisted values, are local+-- to the C block that declares them. Memoized values accumulate across paths.+data CAvailability = CAvailability+  { definitelyAvailable :: Set.Set SV  -- ^ Values computed on every incoming path.+  , possiblyAvailable   :: Set.Set SV  -- ^ Values computed on some incoming path.+  , availableCTables    :: Set.Set Int -- ^ Tables declared in the current scope.+  , memoizedValues      :: Set.Set SV  -- ^ Values requiring a runtime readiness check.+  }++-- | Schedule a collection of demanded values and their following statements.+-- Branch-local work stays under its guard, while declarations are hoisted so+-- values computed on both paths can safely be reused after the join. Root+-- statements let entry points retain runtime checks even without live outputs.+scheduleC :: CRenderEnv+          -> [(T.Text, String)]+          -> [(SV, String)]+          -> [SV]+          -> [(SV, SBVExpr)]+          -> [((Int, Kind, Kind), [SV])]+          -> Bool+          -> Int+          -> [(SV, Doc)]+          -> (Doc, Set.Set CRequirement)+scheduleC env functionNames lambdaNames initialValues assignments tables allowStatic typeWidth roots+  = (vcat eagerDocs $$ declarations $$ statements, Set.union requirements eagerRequirements)+ where cfg = renderConfig env+       initialAvailability = CAvailability eagerValues eagerValues Set.empty Set.empty+       (analyzed, _, _, _) = schedulePass Set.empty+       guardedValues = memoizedValues analyzed+       (_, statements, requirements, extraDeclarations) = guardedValues `seq` schedulePass guardedValues+       declarations = vcat [typ <+> var <+> (if sv `Set.member` guardedValues then text "= {0}" else empty) P.<> semi+                           | (sv, _) <- assignments+                           , sv `Set.member` reachableValues+                           , sv `Set.notMember` eagerValues+                           , let (typ, var) = declSVNoConst typeWidth sv+                           ]+                   $$ vcat [text "bool" <+> readyName sv <+> text "= false;" | sv <- Set.toList guardedValues]+                   $$ vcat (uniqueOn render extraDeclarations)++       assignmentMap   = Map.fromList assignments+       reachableValues = cReachableValues cfg assignmentMap tables (map fst roots)++       -- The first pass discovers which values need readiness flags. The+       -- second pass receives that completed set explicitly. Even forcing+       -- first-pass documents cannot create a dependency on the second pass.+       readyName sv = text ("sbv_ready_" ++ show sv)++       (eagerValues, eagerReversed) = foldl speculate (Set.fromList initialValues, []) assignments+       eagerLowerings = [ppExpr env functionNames lambdaNames expression sv+                               (declSV typeWidth sv) (declSVNoConst typeWidth sv) True+                        | (sv, expression) <- reverse eagerReversed]+       eagerDocs = [doc | (doc, _, _) <- eagerLowerings]+       eagerRequirements = Set.unions [needed | (_, needed, _) <- eagerLowerings]++       speculate available@(values, emitted) assignment@(sv, expression)+         | sv `Set.member` reachableValues+         , cSpeculatable sv expression+         , all (`Set.member` values) (cExpressionDependencies cfg tables expression)+         = (Set.insert sv values, assignment : emitted)+         | True+         = available++       schedulePass markedValues = emitRoots initialAvailability roots+        where+         emitRoots available [] = (available, empty, Set.empty, [])+         emitRoots available ((sv, action):rest) =+           let (withValue, valueDocs, valueRequirements, valueDeclarations) = emit available sv+               (withRest, restDocs, restRequirements, restDeclarations) = emitRoots withValue rest+           in ( withRest+              , valueDocs $$ action $$ restDocs+              , Set.union valueRequirements restRequirements+              , valueDeclarations ++ restDeclarations+              )++         emit available sv+           | sv `Set.member` definitelyAvailable available+           = (available, empty, Set.empty, [])+           | True+           = let (after, docs, needed, decls) = emitAssignment available sv+                 marked = docs $$ if sv `Set.member` markedValues then readyName sv <+> text "= true;" else empty+                 guarded = text "if" P.<> parens (text "!" P.<> readyName sv)+                        $$ text "{"+                        $$ nest 2 marked+                        $$ text "}"+             in if sv `Set.member` possiblyAvailable available+                  then (after { availableCTables = availableCTables available+                              , memoizedValues = Set.insert sv (memoizedValues after)+                              }, guarded, needed, decls)+                  else (after, marked, needed, decls)++         emitAssignment available sv+           | Just expression@(SBVApp op arguments) <- Map.lookup sv assignmentMap+           = case (op, arguments) of+               (LkUp tableInfo index defaultValue, [])+                 -> tableLookup available sv expression tableInfo index defaultValue+               (Ite, [condition, trueValue, falseValue])+                 -> conditional available sv condition trueValue falseValue+               (And, [left, right])+                 | kindOf sv == KBool+                 -> conditional available sv left right falseSV+               (Or, [left, right])+                 | kindOf sv == KBool+                 -> conditional available sv left trueSV right+               (Implies, [left, right])+                 | kindOf sv == KBool+                 -> conditional available sv left right trueSV+               _ -> let (withArguments, argumentDocs, argumentRequirements, argumentDeclarations) = emitMany available+                                                                                                             (cExpressionDependencies cfg tables expression)+                        (withTable, tableDocs) = emitTable withArguments op+                        (assignmentDoc, assignmentRequirements, assignmentDeclarations) =+                          ppExpr env functionNames lambdaNames expression sv (text (show sv))+                                 (declSVNoConst typeWidth sv) False+                    in ( insertAvailableValue sv withTable+                       , argumentDocs $$ tableDocs $$ assignmentDoc+                       , Set.union argumentRequirements assignmentRequirements+                       , argumentDeclarations ++ assignmentDeclarations+                       )+           | True+           = die $ "Missing assignment while scheduling C evaluation: " ++ show sv++         emitMany available [] = (available, empty, Set.empty, [])+         emitMany available (sv:svs) =+           let (withValue, valueDocs, valueRequirements, valueDeclarations) = emit available sv+               (withRest, restDocs, restRequirements, restDeclarations) = emitMany withValue svs+           in ( withRest+              , valueDocs $$ restDocs+              , Set.union valueRequirements restRequirements+              , valueDeclarations ++ restDeclarations+              )++         emitTable available op+           | LkUp (tableIndex, _, _, _) _ _ <- op+           , tableIndex `Set.notMember` availableCTables available+           = case [table | table@((candidateIndex, _, _), _) <- tables, candidateIndex == tableIndex] of+               [table] -> (insertAvailableTable tableIndex available, snd (ppTable env allowStatic table))+               _       -> die "Missing table while scheduling C evaluation"+           | True+           = (available, empty)++         tableLookup available result expression (tableIndex, indexKind, _, tableLength) index defaultValue =+           let (withIndex, indexDocs, indexRequirements, indexDeclarations) = emit available index+               (afterLookup, lookupDocs, lookupRequirements, lookupDeclarations) = selectValue withIndex+           in ( afterLookup+              , indexDocs $$ lookupDocs+              , Set.union indexRequirements lookupRequirements+              , indexDeclarations ++ lookupDeclarations+              )+           where elements = case [values | ((candidateIndex, _, _), values) <- tables, candidateIndex == tableIndex] of+                              [values] | length values == tableLength -> values+                              _ -> die "Missing or inconsistent table while scheduling C evaluation"+                 (nativeIndex, outOfRange) = tableIndexAndBounds cfg indexKind tableLength (showSV env index)+                 checkedBounds = if tableNeedsBounds cfg indexKind then outOfRange else Nothing+                 entriesReady current = all (`Set.member` definitelyAvailable current) elements++                 selectValue current+                   | entriesReady current+                   , isNothing checkedBounds || defaultValue `Set.member` definitelyAvailable current+                   = renderLookup cfg current+                   | Just check <- checkedBounds+                   = let (withDefault, defaultDocs, defaultRequirements, defaultDeclarations) = emitChoice current defaultValue+                         (withEntry, entryDocs, entryRequirements, entryDeclarations) = selectEntry current+                     in ( insertAvailableValue result (joinAvailability current [withDefault, withEntry])+                        , text "if" P.<> parens check+                       $$ text "{" $$ nest 2 defaultDocs $$ text "}"+                       $$ text "else"+                       $$ text "{" $$ nest 2 entryDocs $$ text "}"+                        , Set.union defaultRequirements entryRequirements+                        , defaultDeclarations ++ entryDeclarations+                        )+                   | True+                   = selectEntry current++                 selectEntry current+                   | entriesReady current+                   , isNothing checkedBounds || defaultValue `Set.member` definitelyAvailable current+                   = renderLookup (cfg {cgRTC = False}) current+                   | True+                   = let cases = [(position, emitChoice current value) | (position, value) <- zip [0 :: Int ..] elements]+                         renderCase (position, (_, docs, _, _)) = text "case" <+> int position P.<> colon+                                                             $$ text "{"+                                                             $$ nest 2 (docs $$ text "break;")+                                                             $$ text "}"+                         availableAfter = joinAvailability current [values | (_, (values, _, _, _)) <- cases]+                     in ( insertAvailableValue result availableAfter+                        , text "switch" P.<> parens (text "(uint64_t)" <+> parens nativeIndex)+                       $$ text "{"+                       $$ nest 2 (vcat (map renderCase cases)+                               $$ text "default:"+                               $$ nest 2 (text "/* Unreachable for checked indices; invalid unchecked index. */" $$ text "abort();"))+                       $$ text "}"+                        , Set.unions [needed | (_, (_, _, needed, _)) <- cases]+                        , concat [decls | (_, (_, _, _, decls)) <- cases]+                        )++                 emitChoice current value =+                   let (withValue, docs, needed, decls) = emit current value+                   in ( insertAvailableValue result withValue+                      , docs $$ text (show result) <+> text "=" <+> showSV env value P.<> semi+                      , needed+                      , decls+                      )++                 renderLookup loweringConfig current =+                   let SBVApp op _ = expression+                       (withTable, tableDocs) = emitTable current op+                       (docs, needed, decls) = ppExpr env{renderConfig = loweringConfig} functionNames lambdaNames expression result+                                                     (text (show result)) (declSVNoConst typeWidth result) False+                   in (insertAvailableValue result withTable, tableDocs $$ docs, needed, decls)++         conditional available result condition trueValue falseValue =+           let (withCondition, conditionDocs, conditionRequirements, conditionDeclarations) = emit available condition+               shared = Set.intersection (mandatoryValues withCondition trueValue) (mandatoryValues withCondition falseValue)+               (withCommon, commonDocs, commonRequirements, commonDeclarations) = emitMany withCondition (Set.toList shared)+               (withTrue, trueDocs, trueRequirements, trueDeclarations) = emit withCommon trueValue+               (withFalse, falseDocs, falseRequirements, falseDeclarations) = emit withCommon falseValue+               branch label branchDocs branchValue = text label+                                                  $$ text "{"+                                                  $$ nest 2 (branchDocs $$ assign branchValue)+                                                  $$ text "}"+               assign value = text (show result) <+> text "=" <+> showSV env value P.<> semi+               docs = conditionDocs+                   $$ commonDocs+                   $$ text "if" P.<> parens (showSV env condition)+                   $$ branch "" trueDocs trueValue+                   $$ branch "else" falseDocs falseValue+               needed = Set.unions [conditionRequirements, commonRequirements, trueRequirements, falseRequirements]+               -- Values are declared outside the branches, but branch-local C+               -- table declarations do not remain in scope after the join.+               availableAfter = joinAvailability withCommon [withTrue, withFalse]+               branchDeclarations = conditionDeclarations ++ commonDeclarations ++ trueDeclarations ++ falseDeclarations+           in (insertAvailableValue result availableAfter, docs, needed, branchDeclarations)++         -- Sharing a mandatory dependency is safe even for partial operations:+         -- either branch will demand it. Stop at nested guards rather than+         -- treating their inactive alternatives as mandatory dependencies.+         mandatoryValues available = walk Set.empty+           where walk visited sv+                   | sv `Set.member` definitelyAvailable available || sv `Set.member` visited = visited+                   | True = foldl walk (Set.insert sv visited) dependencies+                   where dependencies = case Map.lookup sv assignmentMap of+                           Just (SBVApp Ite (condition:_)) -> [condition]+                           Just (SBVApp (LkUp _ index _) _) -> [index]+                           Just (SBVApp op (left:_))+                             | kindOf sv == KBool, op `elem` [And, Or, Implies] -> [left]+                           Just expression -> cExpressionDependencies cfg tables expression+                           Nothing         -> []++         joinAvailability current [] = current+         joinAvailability current branches@(initial:rest) = current+           { definitelyAvailable = foldl Set.intersection (definitelyAvailable initial) (map definitelyAvailable rest)+           , possiblyAvailable = Set.unions (map possiblyAvailable branches)+           , memoizedValues = Set.unions (map memoizedValues branches)+           }++         insertAvailableValue value available = available+           { definitelyAvailable = Set.insert value (definitelyAvailable available)+           , possiblyAvailable = Set.insert value (possiblyAvailable available)+           }++         insertAvailableTable tableIndex available = available {availableCTables = Set.insert tableIndex (availableCTables available)}++-- | Give a lambda-lifted array callback a name unique to its lexical owner.+scopedArrayLambdaName :: String -> SV -> String+scopedArrayLambdaName scope arraySV = scope ++ "_nested_" ++ show arraySV++-- | Render the private C signature for a structured array callback.+-- Captures are rejected separately before any callback is lowered.+arrayLambdaSignature :: String -> SV -> LambdaInfo -> Doc+arrayLambdaSignature callbackName arraySV LambdaInfo{liParams = parameters}+  = case (kindOf arraySV, parameters) of+      (KArray _ valueKind, [(ALL, parameter)])+        -> text "static" <+> text (arrayLambdaResultType valueKind) <+> text callbackName+             P.<> parens (fsep (punctuate comma [text "const void *context", text (showCType (kindOf parameter)) <+> text (show parameter)]))+      (KArray{}, _) -> die $ "Expected exactly one universal array-lambda parameter, received " ++ show parameters+      (kind, _)     -> die $ "Expected an array-valued lambda node, received " ++ show kind++-- | Return the C callback result type for an array element kind.+arrayLambdaResultType :: Kind -> String+arrayLambdaResultType kind+  | isArray kind = CTypes.elementCType kind+  | True         = showCType kind++-- | Conservatively check the complete retained body for free symbolic values,+-- independently of scheduling or dead-code elimination. Include values hidden+-- in operators, every table entry/default, the result itself, and free values+-- of nested array lambdas. Each nested callback is also checked separately,+-- so capturing its enclosing lambda's parameter is rejected too.+cLambdaFreeValues :: LambdaInfo -> [SV]+cLambdaFreeValues lambdaInfo = Set.toList $ Set.fromList uses `Set.difference` bound+ where assignments = F.toList (liAssignments lambdaInfo)+       bound       = Set.fromList (falseSV : trueSV : map fst assignments ++ map snd (liParams lambdaInfo) ++ map fst (liConsts lambdaInfo))+       uses        = liOutput lambdaInfo : concatMap (dependencies . snd) assignments ++ concatMap snd (liTables lambdaInfo)++       dependencies (SBVApp op arguments) = arguments ++ case op of+         LkUp _ index defaultValue -> [index, defaultValue]+         IEEEFP (FP_Cast _ _ rm)   -> [rm]+         ArrayInit (Right lambdaDef)+           | Just nested <- smtLambdaInfo lambdaDef -> cLambdaFreeValues nested+         _                        -> []++-- | Lower a retained one-argument array lambda into a C lookup callback. Its+-- local DAG uses the ordinary lowering pipeline, so scalar and managed values+-- share the same semantics and ownership arenas as the enclosing generated+-- function.+ppArrayLambda :: CgConfig+              -> [Kind]+              -> [(T.Text, String)]+              -> String+              -> SV+              -> LambdaInfo+              -> (Doc, Set.Set CRequirement)+ppArrayLambda cfg adts functionNames callbackName arraySV lambdaInfo@LambdaInfo{ liAssignments = lambdaPgm+                                                                              , liParams      = parameters+                                                                              , liOutput      = lambdaOutput+                                                                              , liConsts      = constants+                                                                              , liTables      = tables+                                                                              }+  = case (kindOf arraySV, parameters) of+      (KArray keyKind valueKind, [(ALL, parameter)])+        | kindOf parameter /= keyKind+        -> die $ "Array-lambda parameter kind " ++ show (kindOf parameter) ++ " does not match " ++ show keyKind+        | kindOf lambdaOutput /= valueKind+        -> die $ "Array-lambda result kind " ++ show (kindOf lambdaOutput) ++ " does not match " ++ show valueKind+        | True+        -> (helper keyKind valueKind parameter, requirements)+      (KArray{}, _) -> die $ "Expected exactly one universal array-lambda parameter, received " ++ show parameters+      (kind, _)     -> die $ "Expected an array-valued lambda node, received " ++ show kind+ where assignments = F.toList lambdaPgm+       lambdaConsts = (falseSV, falseCV) : (trueSV, trueCV) : constants+       reachableValues = cReachableValues cfg (Map.fromList assignments) tables [lambdaOutput]+       (constantDeclarations, renderingConsts) = stabilizeCConstants cfg adts typeWidth (filter ((`Set.member` reachableValues) . fst) lambdaConsts)+       env = CRenderEnv cfg adts renderingConsts+       lambdaValues = lambdaOutput : map snd parameters ++ map fst assignments ++ map fst constants ++ concatMap snd tables+       typeWidth    = maximum (0 : map (length . showCType) lambdaValues)++       nestedLambdaNames = [ (sv, scopedArrayLambdaName callbackName sv)+                           | (sv, SBVApp (ArrayInit (Right _)) _) <- assignments+                           ]+       definedFunctionCalls = [ symbol+                              | (_, SBVApp (Uninterpreted symbol) _) <- assignments+                              , isJust (lookup symbol functionNames)+                              ]++       (scheduledAssignments, scheduledRequirements) =+         scheduleC env functionNames nestedLambdaNames+                   (map fst lambdaConsts ++ map snd parameters) assignments tables False typeWidth [(lambdaOutput, empty)]++       requirements = Set.unions+         [ contextRequirements+         , scheduledRequirements+         , Set.unions [operationRequirements cfg (op, kindOf sv) | (sv, SBVApp op _) <- assignments]+         ]++       expandedLambdaKinds = concatMap (expandKinds . kindOf) lambdaValues++       contextRequirements = Set.fromList $+            [CRequiresGMP    | any (isExactGMPKind cfg) expandedLambdaKinds]+         ++ [CRequiresText   | any (`elem` [KChar, KString]) expandedLambdaKinds]+         ++ [CRequiresLists  | any isList expandedLambdaKinds]+         ++ [CRequiresSets   | any isSet expandedLambdaKinds]+         ++ [CRequiresArrays | any isArray expandedLambdaKinds]+         ++ [CRequiresFunctionResults | definedFunctionResultNeedsClone cfg adts (kindOf lambdaOutput)]++       helper _ valueKind _+         = arrayLambdaSignature callbackName arraySV lambdaInfo+          $$ text "{"+          $$ nest 2 (   contextSetup+                     $$ constantDeclarations+                     $$ scheduledAssignments+                     $$ lambdaResultDeclaration valueKind <+> text "sbv_local_lambda_result" <+> text "=" <+> lambdaResult P.<> semi+                     $$ contextCommit+                     $$ text "return sbv_local_lambda_result;"+                    )+          $$ text "}"+          $$ text ""++       lambdaResult+         | isArray lambdaOutput+         = arrayStoredValue (kindOf lambdaOutput) (showSV env lambdaOutput)+         | definedFunctionResultNeedsClone cfg adts (kindOf lambdaOutput)+         = definedFunctionResultClone (kindOf lambdaOutput) (showSV env lambdaOutput)+         | True+         = showSV env lambdaOutput++       lambdaResultDeclaration valueKind+         | isArray lambdaOutput = text (arrayLambdaResultType valueKind)+         | True                 = text "const" <+> text (arrayLambdaResultType valueKind)++       contextSetup+         | not needsFunctionContext = parens (text "void") <+> text "context" P.<> semi+         | True+         =  text "sbv_function_ctx *const sbv_local_parent_function_ctx = (sbv_function_ctx *) context;"+         $$ functionContextSetup contextRequirements++       contextCommit = functionContextCommit contextRequirements++       needsFunctionContext = not (Set.null contextRequirements && null definedFunctionCalls)+++-- | Lower native IEEE operations not handled by the explicit LibBF adapters.+handleIEEE :: FPOp -> [(SV, CV)] -> [(SV, Doc)] -> Doc -> Doc+handleIEEE w consts as var = cvt w+  where same f                   = (f, f)+        named fnm dnm f          = (f fnm, f dnm)++        unary f [a]         = f a+        unary _ args        = wrongArity 1 args+        binary f [a, b]     = f a b+        binary _ args       = wrongArity 2 args+        ternary f [a, b, c] = f a b c+        ternary _ args      = wrongArity 3 args+        wrongArity expected args = die $ "Native floating-point operation " ++ show w ++ " expects "+                                      ++ show (expected :: Int) ++ " arguments, received " ++ show (length args)++        cvt FP_Cast{} = die "Floating-point cast escaped the exact cast lowering pipeline"++        cvt (FP_Reinterpret f t) = case (f, t) of+                                     (KBounded False 32, KFloat)  -> cast $ cpy "sizeof(SFloat)"+                                     (KBounded False 64, KDouble) -> cast $ cpy "sizeof(SDouble)"+                                     (KFloat,  KBounded False 32) -> cast $ cpy "sizeof(SWord32)"+                                     (KDouble, KBounded False 64) -> cast $ cpy "sizeof(SWord64)"+                                     _                            -> die $ "Reinterpretation from : " ++ show f ++ " to " ++ show t+                                    where cpy sz = unary $ \a -> text "memcpy" P.<> parens (fsep (punctuate comma+                                                                 [text "&" P.<> var, text "&" P.<> a, text sz]))+        cvt FP_Abs               = dispatch $ named "fabsf" "fabs" $ \nm _ -> unary $ \a -> text nm P.<> parens a+        cvt FP_Neg               = dispatch $ same $ \_ -> unary $ \a -> text "-" P.<> a+        cvt FP_Add               = dispatch $ same $ \_ -> binary $ \a b -> a <+> text "+" <+> b+        cvt FP_Sub               = dispatch $ same $ \_ -> binary $ \a b -> a <+> text "-" <+> b+        cvt FP_Mul               = dispatch $ same $ \_ -> binary $ \a b -> a <+> text "*" <+> b+        cvt FP_Div               = dispatch $ same $ \_ -> binary $ \a b -> a <+> text "/" <+> b+        cvt FP_FMA               = dispatch $ named "fmaf"  "fma"  $ \nm _ -> ternary $ \a b c -> text nm P.<> parens (fsep (punctuate comma [a, b, c]))+        cvt FP_Sqrt              = dispatch $ named "sqrtf" "sqrt" $ \nm _ -> unary $ \a       -> text nm P.<> parens a+        cvt FP_Rem               = dispatch $ named "remainderf" "remainder" $ \nm _ -> binary $ \a b -> text nm P.<> parens (fsep (punctuate comma [a, b]))+        cvt FP_RoundToIntegral   = dispatch $ named "rintf" "rint" $ \nm _ -> unary $ \a       -> text nm P.<> parens a+        cvt FP_Min               = dispatch $ named "fminf" "fmin" $ \nm k -> binary $ \a b    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))+        cvt FP_Max               = dispatch $ named "fmaxf" "fmax" $ \nm k -> binary $ \a b    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))+        cvt FP_ObjEqual          = dispatch $ same $ \_ -> binary $ \a b -> nativeFPObjectEqual a b+        cvt FP_IsNormal          = dispatch $ same $ \_ -> unary $ \a -> text "isnormal" P.<> parens a+        cvt FP_IsSubnormal       = dispatch $ same $ \_ -> unary $ \a -> text "FP_SUBNORMAL == fpclassify" P.<> parens a+        cvt FP_IsZero            = dispatch $ same $ \_ -> unary $ \a -> text "FP_ZERO == fpclassify" P.<> parens a+        cvt FP_IsInfinite        = dispatch $ same $ \_ -> unary $ \a -> text "isinf" P.<> parens a+        cvt FP_IsNaN             = dispatch $ same $ \_ -> unary $ \a -> text "isnan" P.<> parens a+        cvt FP_IsNegative        = dispatch $ same $ \_ -> unary $ \a -> text "!isnan" P.<> parens a <+> text "&&" <+> text "signbit"  P.<> parens a+        cvt FP_IsPositive        = dispatch $ same $ \_ -> unary $ \a -> text "!isnan" P.<> parens a <+> text "&&" <+> text "!signbit" P.<> parens a++        -- grab the rounding-mode, if present, and make sure it's RoundNearestTiesToEven. Otherwise skip.+        fpArgs = case as of+                   []            -> []+                   ((m, _):args)+                     | isRoundingMode m -> case checkRM (m `lookup` consts) of+                                             Nothing          -> args+                                             Just (Left  msg) -> die msg+                                             Just (Right msg) -> tbd msg+                     | True              -> as++        -- Explicit non-default and symbolic rounding modes are handled by the+        -- LibBF adapters before this native fallback is selected.+        checkRM (Just cv@(CV k v))+          | k == kRoundingMode = case v of+                                   CADT ("RoundNearestTiesToEven", []) -> Nothing+                                   CADT (s,                        []) -> Just (Right $ "handleIEEE: Unsupported rounding-mode: " ++ show s ++ " for: " ++ show w)+                                   _                                   -> Just (Left  $ "handleIEEE: Unexpected value for rounding-mode: " ++ show cv ++ " for: " ++ show w)+        checkRM (Just cv) = Just (Left  $ "handleIEEE: Expected rounding-mode, but got: " ++ show cv ++ " for: " ++ show w)+        checkRM Nothing   = Just (Right $ "handleIEEE: Non-constant rounding-mode for: " ++ show w)++        pickOp _          []             = die $ "Cannot determine float/double kind for op: " ++ show w+        pickOp (fOp, dOp) args@((a,_):_) = case kindOf a of+                                             KFloat  -> fOp KFloat  (map snd args)+                                             KDouble -> dOp KDouble (map snd args)+                                             k       -> die $ "handleIEEE: Expected double/float args, but got: " ++ show k ++ " for: " ++ show w++        dispatch (fOp, dOp) = pickOp (fOp, dOp) fpArgs+        cast f              = f (map snd fpArgs)++        -- In SMT-Lib, fpMin/fpMax is underspecified when given +0/-0 as the two arguments. (In any order.)+        -- In C, the second argument is returned. (I think, might depend on the architecture, optimizations etc.).+        -- We'll translate it so that we deterministically return +0.+        -- There's really no good choice here.+        wrapMinMax k a b s = parens cond <+> text "?" <+> fzero <+> text ":" <+> s+          where fzero = text $ if k == KFloat then showCFloat 0 else showCDouble 0+                cond  =                   parens (text "FP_ZERO == fpclassify" P.<> parens a)                                  -- a is zero+                        <+> text "&&" <+> parens (text "FP_ZERO == fpclassify" P.<> parens b)                                  -- b is zero+                        <+> text "&&" <+> parens (text "signbit" P.<> parens a <+> text "!=" <+> text "signbit" P.<> parens b) -- a and b differ in sign++-- | Lower and render one symbolic assignment together with the facilities it+-- requires from the generated C translation unit.+ppExpr :: CRenderEnv+       -> [(T.Text, String)]+       -> [(SV, String)]+       -> SBVExpr+       -> SV+       -> Doc+       -> (Doc, Doc)+       -> Bool+       -> (Doc, Set.Set CRequirement, [Doc])+ppExpr env functionNames structuredLambdaNames (SBVApp op opArgs) resultSV lhs (typ, var) declareResult+  | requiresExtensionalEquality adts op (map kindOf opArgs)+  , not (op `elem` [Equal False, Equal True, NotEqual] && all isArray opArgs)+  = error $ "SBV->C: " ++ show op ++ " requires general extensional array equality, including array-valued elements or fields."+  | True+  = ( vcat $ declarations+          ++ loweringSetup selected+          ++ [assignment]+    , loweringRequirements selected+    , loweringDeclarations selected+    )+  where cfg    = renderConfig env+        adts   = renderADTs env+        consts = renderConstants env++        declarations+          | declareResult = loweringDeclarations selected+          | True          = []++        doNotAssign (IEEEFP FP_Reinterpret{})+          | not (isFP (kindOf resultSV) || any (isFP . kindOf) opArgs)+          , not (isWideBV (kindOf resultSV) || any (isWideBV . kindOf) opArgs)+          = True   -- generates a memcpy instead; no simple assignment+        doNotAssign PseudoBoolean{} = True   -- assigns through an overflow-safe reduction+        doNotAssign _              = False++        renderedArgs = map (showSV env) opArgs++        -- Precedence is intentional, not a uniqueness invariant: aggregate+        -- storage operations precede scalar operations touching their fields;+        -- exact/mapped casts precede native fallbacks. In particular FP owns+        -- BV/FP reinterpretation, including interchange vectors wider than 64.+        -- Ite and short-circuit booleans are scheduled separately; only total+        -- bit-vector Ite can reach this dispatch through eager speculation.+        selected = fromMaybe legacy $ chooseLowering+          [ arrayExpr cfg (`lookup` functionNames) (`lookup` structuredLambdaNames) op opArgs resultSV renderedArgs+          , tableExpr cfg (showSV env) op resultSV+          , setExpr cfg op opArgs (kindOf resultSV) renderedArgs+          , nonLinearExpr cfg op opArgs (kindOf resultSV) renderedArgs+          , regexExpr cfg op resultSV renderedArgs+          , textExpr cfg op opArgs (kindOf resultSV) renderedArgs+          , listExpr cfg op opArgs resultSV renderedArgs+          , adtExpr cfg adts op opArgs resultSV renderedArgs+          , tupleExpr op opArgs resultSV renderedArgs+          , gmpExpr cfg op opArgs (kindOf resultSV) renderedArgs+          , bitVectorCastExpr (cgInteger cfg) op opArgs (kindOf resultSV) renderedArgs+          , arbitraryFPExpr cfg consts op opArgs (kindOf resultSV) renderedArgs+          , nativeFPExpr consts op opArgs (kindOf resultSV) renderedArgs+          , nativeBVExpr (cgInteger cfg) op opArgs (kindOf resultSV) renderedArgs+          , nativeBVOverflowExpr op opArgs renderedArgs+          , wideBVExpr op opArgs (kindOf resultSV) renderedArgs+          ]++        legacy = expressionLowering [] (p op renderedArgs)++        rhs = loweringExpression selected++        assignment+          | doNotAssign op+          = (if declareResult then typ <+> var P.<> semi else empty) <+> rhs P.<> semi+          | True+          = lhs <+> text "=" <+> rhs P.<> semi++        rtc = cgRTC cfg++        functionName symbol = fromMaybe (T.unpack symbol) (lookup symbol functionNames)++        functionArguments symbol arguments+          | isJust (lookup symbol functionNames) = text "&sbv_local_function_ctx" : arguments+          | True                                 = arguments++        cBinOps = [ (Plus, "+"), (Times, "*"), (Minus, "-")+                  , (Equal False, "==")  -- no strong equality!+                  , (NotEqual, "!="), (LessThan, "<"), (GreaterThan, ">"), (LessEq, "<="), (GreaterEq, ">=")+                  , (And, "&"), (Or, "|"), (XOr, "^")+                  ]++        hd _ (h:_) = h+        hd w []    = error $ "Data.SBV.C.ppExpr: Impossible happened: " ++ w ++ ", received empty list!"++        p :: Op -> [Doc] -> Doc+        p ReadArray{}          _   = die "Array read escaped the persistent-array lowering pipeline"+        p WriteArray{}         _   = die "Array write escaped the persistent-array lowering pipeline"+        p ArrayInit{}          _   = die "Array initialization escaped the persistent-array lowering pipeline"+        p QuantifiedBool{}     _   = solverOnly "quantified Boolean expressions"+        p SpecialRelOp{}       _   = solverOnly "special relations"+        p RegExOp{}            _   = die "Regex comparison escaped the bounded-automaton lowering pipeline"+        p (StrOp StrInRe{})    _   = die "Regex membership escaped the bounded-automaton lowering pipeline"+        p (Label s)           [a]  = a <+> text "/*" <+> cCommentText s <+> text "*/"+        p (IEEEFP w)            as = handleIEEE w consts (zip opArgs as) var+        p (PseudoBoolean pb)    as = assignPseudoBoolean pb as var+        p OverflowOp{}         _   = die "Overflow operation escaped the exact bit-vector lowering pipeline"+        p NonLinear{}          _   = die "Non-linear operation escaped the dedicated lowering pipeline"+        p castOp@KindCast{}    [a]+          | Just width <- mappedRealFloorWidth cfg castOp+          = mappedRealFloorCall width a+        p (KindCast _ to)      [a]  = parens (text (showCType to)) <+> a+        p (Uninterpreted s) []+          | isJust (lookup s functionNames)+          = text "/* Defined function */" <+> text (functionName s) P.<> parens (text "&sbv_local_function_ctx")+          | True+          = text "/* Uninterpreted constant */" <+> text (functionName s)+        p (Uninterpreted s) as = text "/* Uninterpreted function */" <+> text (functionName s)+                                  P.<> parens (fsep (punctuate comma (functionArguments s as)))+        p Extract{}       _      = die "Bit-vector extraction escaped the exact bit-vector lowering pipeline"+        p Join            _      = die "Bit-vector concatenation escaped the exact bit-vector lowering pipeline"+        p ZeroExtend{}    _      = die "Zero extension escaped the exact bit-vector lowering pipeline"+        p SignExtend{}    _      = die "Sign extension escaped the exact bit-vector lowering pipeline"+        p Rol{}           _      = die "Left rotation escaped the exact bit-vector lowering pipeline"+        p Ror{}           _      = die "Right rotation escaped the exact bit-vector lowering pipeline"+        p Shl{}           _      = die "Left shift escaped the exact bit-vector lowering pipeline"+        p Shr{}           _      = die "Right shift escaped the exact bit-vector lowering pipeline"+        p Not          [a]       = case kindOf (hd "Not" opArgs) of+                                   -- be careful about booleans, bitwise complement is not correct for them!+                                   KBool -> text "!" P.<> a+                                   _     -> text "~" P.<> a+        p Ite [a, b, c] = a <+> text "?" <+> b <+> text ":" <+> c+        p (LkUp (t, k, _, len) ind def) []+          | not rtc                    = lkUp -- ignore run-time-checks per user request+          | needsCheckL && needsCheckR = cndLkUp checkBoth+          | needsCheckL                = cndLkUp checkLeft+          | needsCheckR                = cndLkUp checkRight+          | True                       = lkUp+          where index  = showSV env ind+                defVal = showSV env def++                lkUp = text "table" P.<> int t P.<> brackets renderedIndex+                cndLkUp cnd = cnd <+> text "?" <+> defVal <+> text ":" <+> lkUp++                checkLeft+                  | isWideBV k = text "!" P.<> parens (wideBVLookupInRange k len index)+                  | True       = index <+> text "< 0"++                checkRight+                  | isWideBV k = text "!" P.<> parens (wideBVLookupInRange k len index)+                  | True       = index <+> text ">=" <+> int len++                checkBoth  = parens (checkLeft <+> text "||" <+> checkRight)++                renderedIndex+                  | isWideBV k = wideBVLookupIndex k index+                  | True       = index++                canOverflow True  sz = (2::Integer)^(sz-1)-1 >= fromIntegral len+                canOverflow False sz = (2::Integer)^sz    -1 >= fromIntegral len++                (needsCheckL, needsCheckR) = case k of+                                               KVar{}          -> die $ "array index with variable: " ++ show k+                                               KBool           -> (False, canOverflow False (1::Int))+                                               KBounded sg sz+                                                 | isWideBV k -> (sg, not sg)+                                                 | True       -> (sg, canOverflow sg sz)+                                               KReal           -> die "array index with real value"+                                               KFloat          -> die "array index with float value"+                                               KDouble         -> die "array index with double value"+                                               KFP{}           -> die "array index with arbitrary float value"+                                               KRational       -> die "array index with rational value"+                                               KString         -> die "array index with string value"+                                               KChar           -> die "array index with character value"+                                               KUnbounded      -> case cgInteger cfg of+                                                                    Nothing -> (True, True) -- won't matter, it'll be rejected later+                                                                    Just i  -> (True, canOverflow True i)+                                               KList     s     -> die $ "List sort "   ++ show s+                                               KSet      s     -> die $ "Set sort "    ++ show s+                                               KTuple    s     -> die $ "Tuple sort "  ++ show s+                                               KArray    k1 k2 -> die $ "Array  sort " ++ show (k1, k2)+                                               KApp      s _   -> die $ "ADT app: " ++ s+                                               KADT      s _ _ -> die $ "ADT: "     ++ s++        -- Integral quotient/remainder use the dedicated GMP or bit-vector+        -- helpers above. Keep zero-divisor protection in the scalar fallback;+        -- native IEEE division itself must retain its infinities and NaNs.+        p (Divides n) [a]    = mappedIntegerDivides n a+        p Quot        [a, b] = let k = kindOf (hd "Quot" opArgs)+                                   z = mkConst env $ mkConstCV k (0::Integer)+                               in protectDiv0 k "/" z a b+        p Rem         [a, b] = protectDiv0 (kindOf (hd "Rem" opArgs)) "%" a a b+        p UNeg        [a]    = parens (text "-" <+> a)+        p Abs         [a]    = let f KFloat             = text "fabsf" P.<> parens a+                                   f KDouble            = text "fabs"  P.<> parens a+                                   f (KBounded False _) = text "/* unsigned, skipping call to abs */" <+> a+                                   f (KBounded True 32) = text "labs"  P.<> parens a+                                   f (KBounded True 64) = text "llabs" P.<> parens a+                                   f KUnbounded         = case cgInteger cfg of+                                                            Nothing -> f $ KBounded True 32 -- won't matter, it'll be rejected later+                                                            Just i  -> f $ KBounded True i+                                   f KReal              = case cgReal cfg of+                                                            Nothing           -> f KDouble -- won't matter, it'll be rejected later+                                                            Just CgFloat      -> f KFloat+                                                            Just CgDouble     -> f KDouble+                                                            Just CgLongDouble -> text "fabsl" P.<> parens a+                                   f _                  = text "abs" P.<> parens a+                               in f (kindOf (hd "Abs" opArgs))+        -- for And/Or, translate to boolean versions if on boolean kind+        p And [a, b] | kindOf (hd "And" opArgs) == KBool = a <+> text "&&" <+> b+        p Or  [a, b] | kindOf (hd "Or"  opArgs) == KBool = a <+> text "||" <+> b+        p o [a, b]+          | Just co <- lookup o cBinOps+          = a <+> text co <+> b++        p Implies [a, b] | kindOf (hd "Implies" opArgs) == KBool = parens (text "!" P.<> a <+> text "||" <+> b)++        p NotEqual xs = mkDistinct xs+        p o args      = die $ "Received operator " ++ show o ++ " applied to " ++ show args++        solverOnly feature = error $ "SBV->C: " ++ feature ++ " has solver-only semantics and cannot be compiled to executable C"++        mappedIntegerDivides divisor value+          | divisor > maximumMagnitude = parens (value <+> text "==" <+> text "0")+          | True = parens $ magnitude <+> text "%" <+> uint64 divisor <+> text "==" <+> uint64 0+          where width = case cgInteger cfg of+                          Just w  -> w+                          Nothing -> die "Exact integer divisibility escaped the GMP lowering pipeline"++                maximumMagnitude = 2 ^ (width - 1)+                magnitude        = parens $ value <+> text "< 0"+                                         <+> text "?" <+> uint64 0 <+> text "-" <+> asUnsigned value+                                         <+> text ":" <+> asUnsigned value+                asUnsigned a     = parens (text "uint64_t") <+> a+                uint64 n         = text "UINT64_C" P.<> parens (integer n)++        -- generate a pairwise inequality check+        mkDistinct args = fsep $ andAll $ walk args+          where walk []     = []+                walk (e:es) = map (pair e) es ++ walk es++                pair e1 e2  = parens (e1 <+> text "!=" <+> e2)++                -- like punctuate, but more spacing+                andAll []     = []+                andAll (d:ds) = go d ds+                     where go d' [] = [d']+                           go d' (e:es) = (d' <+> text "&&") : go e es++        -- Div0 needs to protect, but only when the arguments are not float/double. (Div by 0 for those are well defined to be Inf/NaN etc.)+        protectDiv0 k divOp def a b = case k of+                                        KFloat  -> res+                                        KDouble -> res+                                        _       -> wrap+           where res  = a <+> text divOp <+> b+                 wrap = parens (b <+> text "== 0") <+> text "?" <+> def <+> text ":" <+> parens res++-- | Render exact equality over a finite array domain. Each iteration performs+-- two ordered lookups and an SMT object comparison; no backing arrays are+-- materialized. Reject excessive domains before any C files are emitted.+ppArrayEquality :: CgConfig -> [Kind] -> Kind -> Doc+ppArrayEquality cfg adts kind@(KArray keyKind valueKind)+  | requiresExtensionalEquality adts (Equal True) [valueKind]+  = error $ "SBV->C: Nested extensional array equality is not supported: array values of kind " ++ show valueKind+         ++ " contain arrays. This comparison is not approximated."+  | cgArrayEqualityMaxKeys cfg == 0+  = error "SBV->C: Extensional array equality is disabled by cgArrayEqualityLimit 0. Select a positive limit to permit finite-domain comparisons."+  | Nothing <- cardinality+  = error $ "SBV->C: Extensional array equality cannot enumerate key domain " ++ show keyKind+         ++ ". Only supported finite domains can be compared; raising cgArrayEqualityLimit does not enable infinite or unsupported domains."+  | Just count <- cardinality, count > cgArrayEqualityMaxKeys cfg+  = error $ "SBV->C: Extensional array equality for " ++ show keyKind ++ " requires " ++ show count+       ++ " keys, exceeding cgArrayEqualityLimit " ++ show (cgArrayEqualityMaxKeys cfg)+       ++ ". Raise cgArrayEqualityLimit explicitly to permit this work."+  | True+  = text "static SBV_CGEN_UNUSED bool" <+> text (arrayEqualName kind)+      P.<> parens (text (arrayCType kind ++ " left, " ++ arrayCType kind ++ " right"))+ $$ text "{"+ $$ nest 2 (enumerate "sbv_local_key" keyKind compareAt $$ text "return true;")+ $$ text "}"+ $$ text ""+ where cardinality = finiteDomainSize (map snd . adtConstructors adts) keyKind++       compareAt key = text ("const " ++ showCType keyKind ++ " key =") <+> key P.<> semi+                    $$ text ("const " ++ CTypes.elementCType valueKind ++ " left_value = " ++ arrayReadName kind ++ "(left, key);")+                    $$ text ("const " ++ CTypes.elementCType valueKind ++ " right_value = " ++ arrayReadName kind ++ "(right, key);")+                    $$ text "if" P.<> parens (text "!" P.<> parens (byValueEqual cfg True valueKind (text "left_value") (text "right_value")))+                    $$ nest 2 (text "return false;")++       enumerate scope key yield+         | key == KBool || key == KBounded False 1+         = counted scope 2 (\counter -> yield (parens (text "SBool") <+> counter))+         | key == KFloat   = floating scope key 32 yield+         | key == KDouble  = floating scope key 64 yield+         | KFP eb sb <- key = floating scope key (eb + sb) yield+         | isWideBV key+         = limbEnumeration scope key (intSizeOf key) yield+         | isBounded key+         = let raw       = scope ++ "_raw"+               keyDoc    = if hasSign key then text scope else text raw+               signedKey = if hasSign key+                              then text (showCType key ++ " " ++ scope ++ "; memcpy(&" ++ scope ++ ", &" ++ raw ++ ", sizeof " ++ scope ++ ");")+                              else empty+           in text ("uint" ++ show (intSizeOf key) ++ "_t " ++ raw ++ " = 0;")+           $$ text "do {"+           $$ nest 2 (signedKey $$ yield keyDoc $$ text ("++" ++ raw ++ ";"))+           $$ text ("} while (" ++ raw ++ " != 0);")+         | key == KChar+         = counted scope 0x30000 yield+         | isRoundingMode key+         = counted scope 5 (\counter -> yield (parens (text (showCType key)) <+> counter))+         | KTuple fields <- key+         = enumerateFields scope fields (yield . tupleValue key)+         | isConcreteADTReference key+         = vcat [ text "{" $$ nest 2 (enumerateFields (scope ++ "_c" ++ show index) fields (yield . adtValue adts key index)) $$ text "}"+                | (index, (_, fields)) <- zip [1 :: Int ..] (adtConstructors adts key)]+         | True+         = die $ "Cannot enumerate array key kind " ++ show key++       limbEnumeration :: String -> Kind -> Int -> (Doc -> Doc) -> Doc+       limbEnumeration scope key width yield =+         let limbCount  = (width + 63) `div` 64+             limb index = scope ++ ".limb[" ++ show index ++ "]"+             topMask    = 2 ^ (1 + (width - 1) `mod` 64) - 1 :: Integer+         in text (showCType key ++ " " ++ scope ++ " = {{0}};")+         $$ text "do {"+         $$ nest 2 (yield (text scope)+                 $$ text ("for (size_t i = 0; i < " ++ show limbCount ++ "; ++i) { if (++" ++ scope ++ ".limb[i] != 0) break; }")+                 $$ text (limb (limbCount - 1) ++ " &= UINT64_C(" ++ show topMask ++ ");"))+         $$ text ("} while (" ++ intercalate " || " [limb i ++ " != 0" | i <- [0 .. limbCount - 1]] ++ ");")++       floating :: String -> Kind -> Int -> (Doc -> Doc) -> Doc+       floating scope key width yield =+         let seen        = scope ++ "_nan_seen"+             visit value = text "const bool is_nan =" <+> (if isFP key then arbitraryFPIsNaN key value else text "isnan" P.<> parens value) P.<> semi+                        $$ text ("if (!is_nan || !" ++ seen ++ ") {")+                        $$ nest 2 (text (seen ++ " |= is_nan;") $$ yield value)+                        $$ text "}"+             raw         = scope ++ "_raw"+             nativeLoop = text ("uint" ++ show width ++ "_t " ++ raw ++ " = 0;")+                       $$ text "do {"+                       $$ nest 2 (text (showCType key ++ " " ++ scope ++ "; memcpy(&" ++ scope ++ ", &" ++ raw ++ ", sizeof " ++ scope ++ ");")+                               $$ visit (text scope) $$ text ("++" ++ raw ++ ";"))+                       $$ text ("} while (" ++ raw ++ " != 0);")+         in text ("bool " ++ seen ++ " = false;")+         $$ if isFP key then limbEnumeration scope key width visit else nativeLoop++       enumerateFields scope fields yield = fieldsFrom (1 :: Int) fields []+         where fieldsFrom _ [] values = yield (reverse values)+               fieldsFrom index (field:rest) values = enumerate (scope ++ "_f" ++ show index) field+                                                         (\value -> fieldsFrom (index + 1) rest (value : values))++       counted scope count yield = text ("for (uint32_t " ++ scope ++ " = 0; " ++ scope ++ " < " ++ show (count :: Integer) ++ "; ++" ++ scope ++ ") {")+                                $$ nest 2 (yield (text scope))+                                $$ text "}"+ppArrayEquality _ _ kind = die $ "Expected an array equality kind, received " ++ show kind++-- | Detect comparisons that transitively require array equality, resolving+-- recursive ADT references without revisiting already inspected definitions.+-- Array-valued data can still be constructed, selected, and transported.+requiresExtensionalEquality :: [Kind] -> Op -> [Kind] -> Bool+requiresExtensionalEquality adts op kinds = comparesElements op && any (containsArray Set.empty) kinds+ where comparesElements Equal{}               = True+       comparesElements NotEqual              = True+       comparesElements (SeqOp SeqIndexOf{})   = True+       comparesElements (SeqOp SeqContains{})  = True+       comparesElements (SeqOp SeqPrefixOf{})  = True+       comparesElements (SeqOp SeqSuffixOf{})  = True+       comparesElements (SeqOp SeqReplace{})   = True+       comparesElements _                     = False++       containsArray _       KArray{}            = True+       containsArray visited (KList elementKind)  = containsArray visited elementKind+       containsArray visited (KSet elementKind)   = containsArray visited elementKind+       containsArray visited (KTuple fields)      = any (containsArray visited) fields+       containsArray visited kind+         | isConcreteADTReference kind+         , kind `Set.notMember` visited+         = any (any (containsArray (Set.insert kind visited)) . snd) (adtConstructors adts kind)+         | True+         = False++-- | Quote a document after removing line breaks, for generated format strings.+printQuotes :: Doc -> Doc+printQuotes d = text $ '"' : ppSameLine d ++ "\""++-- | Flatten a document onto one line for generated build commands and labels.+ppSameLine :: Doc -> String+ppSameLine = trim . render+ where trim ""        = ""+       trim ('\n':cs) = ' ' : trim (dropWhile isSpace cs)+       trim (c:cs)    = c   : trim cs++-- | Left-pad documents so their rendered representations have equal width.+align :: [Doc] -> [Doc]+align ds = map (text . pad) ss+  where ss    = map render ds+        l     = maximum (0 : map length ss)+        pad s = replicate (l - length s) ' ' ++ s++-- | Merge component bundles. Code-generation options have already been+-- applied per component; the returned config describes the merged artifacts+-- and permits overwriting only when every component explicitly permits it.+-- Other returned settings are representative of the first component.+mergeToLib :: String -> [(CgConfig, CgPgmBundle)] -> (CgConfig, CgPgmBundle)+mergeToLib libName cfgBundles+  | length nubKinds /= 1+  = error $  "Cannot merge programs with differing SInteger/SReal mappings. Received the following kinds:\n"+          ++ unlines (map show nubKinds)+  | not (null duplicateFiles)+  = error $ "SBV.compileToCLib: Conflicting generated file names: " ++ unwords duplicateFiles+  | not (null duplicateSymbols)+  = error $ "SBV.compileToCLib: Conflicting generated entry points: " ++ unwords duplicateSymbols+  | True+  = (finalCfg, CgPgmBundle bundleKind resultFiles)+  where bundles     = map snd cfgBundles+        kinds       = [k | CgPgmBundle k _ <- bundles]+        nubKinds    = nub kinds+        bundleKind  = case nubKinds of+                        bk:_ -> bk+                        []   -> error "Data.SBV.C: Impossible happened: mergeLibs: kinds ended up being empty!"+        files       = concat [fs | CgPgmBundle _ fs <- bundles]+        headerMeta  = [metadata | (_, (CgCHeader metadata, _)) <- files]+        typeDecls   = uniqueOn render (map cgHeaderTypes headerMeta)+        sigs        = concatMap cgHeaderSignatures headerMeta+        extProtos   = vcat $ uniqueOn render (map cgHeaderPrototypes headerMeta)+        floating    = any cgHeaderFloating headerMeta+        anyMake     = any (cgGenMakefile . fst) cfgBundles+        drivers     = [(takeBaseName sourceName, ds)+                      | (_, CgPgmBundle _ componentFiles) <- cfgBundles+                      , (sourceName, (CgSource, _)) <- componentFiles+                      , (_, (CgDriver, ds)) <- componentFiles+                      ]+        anyDriver   = not (null drivers)+        mkFlags     = nub (concat [xs | (_, (CgMakefile xs, _)) <- files])+        sources     = [(f, (CgSource, replaceHeader f parts)) | (f, (CgSource, parts)) <- files]+        replaceHeader _ [pre, _, post] = [pre, libHInclude, post]+        replaceHeader f _ = die $ "Invalid C source bundle layout for " ++ f+        sourceNms   = map fst sources+        libHeader   = (libName ++ ".h", (CgCHeader (CgCHeaderInfo floating (vcat typeDecls) sigs extProtos), [genHeader floating bundleKind libName sigs extProtos (vcat typeDecls)]))+        libHInclude =  text "#include" <+> text (show (libName ++ ".h"))+                    $$ if "-lbf" `elem` mkFlags then text "#include <libbf.h>" else empty+        libMake     = ("Makefile", (CgMakefile mkFlags, [genLibMake floating anyDriver libName sourceNms mkFlags]))+        libDriver   = (libName ++ "_driver.c", (CgDriver, mergeDrivers libName libHInclude drivers))+        resultFiles = sources ++ libHeader : [libDriver | anyDriver] ++ [libMake | anyMake]+        duplicateFiles = duplicateNames (map (map toLower . fst) resultFiles)+        duplicateSymbols = duplicateNames $ map takeBaseName sourceNms ++ [fn ++ "_driver" | (fn, _) <- drivers] ++ ["main" | anyDriver]+        finalCfg    = case cfgBundles of+                        []         -> defaultCgConfig+                        ((c, _):_) -> c { cgGenDriver = anyDriver+                                        , cgGenMakefile = anyMake+                                        , cgOverwriteGenerated = all (cgOverwriteGenerated . fst) cfgBundles+                                        }++-- | Create a Makefile for the library+genLibMake :: Bool -> Bool -> String -> [String] -> [String] -> Doc+genLibMake floating ifdr libName fs ldFlags = foldr1 ($$) [l | (True, l) <- lns]+ where ifld = not (null ldFlags)+       gmp  = "-lgmp" `elem` ldFlags+       ld = text "${LDFLAGS}" <+> if ifld then text "${SBV_LIBS}" else empty+       renderedLDFlags = unwords $ filter (/= "-lgmp") ldFlags ++ ["${GMP_LIBS}" | gmp]+       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")+             , (True,  text "")+             , (True,  text "# include any user-defined .mk file in the current directory.")+             , (True,  text "-include *.mk")+             , (True,  text "")+             , (True,  text "CC?=gcc")+             , (True,  text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")+             , (gmp,   text "GMP_CFLAGS?=$(shell pkg-config --cflags gmp)")+             , (gmp,   text "GMP_LIBS?=$(shell pkg-config --libs gmp)")+             , (ifld,  text "SBV_LIBS?=" P.<> text renderedLDFlags)+             , (True,  text "AR?=ar")+             , (True,  text "ARFLAGS?=cr")+             , (True,  text "")+             , (not ifdr,  text ("all: " ++ liba))+             , (ifdr,      text ("all: " ++ unwords [liba, libd]))+             , (True,  text "")+             , (True,  text liba P.<> text (": " ++ unwords os))+             , (True,  text "\trm -f $@.tmp")+             , (True,  text "\t${AR} ${ARFLAGS} $@.tmp $^")+             , (True,  text "\tmv -f $@.tmp $@")+             , (True,  text "")+             , (ifdr,  text libd P.<> text (": " ++ unwords [libd ++ ".c", libh, liba]))+             , (ifdr,  text ("\t" ++ cCompilerCommand floating gmp ++ " $< -o $@ " ++ liba) <+> ld)+             , (ifdr,  text "")+             , (True,  vcat (zipWith mkObj os fs))+             , (True,  text "clean:")+             , (True,  text "\trm -f *.o")+             , (True,  text "")+             , (True,  text "veryclean: clean")+             , (not ifdr,  text "\trm -f" <+> text (unwords [liba, liba ++ ".tmp"]))+             , (ifdr,      text "\trm -f" <+> text (unwords [liba, libd, liba ++ ".tmp"]))+             , (True,  text "")+             ]+       nm = text libName+       liba = libName ++ ".a"+       libh = libName ++ ".h"+       libd = libName ++ "_driver"+       os   = map (`replaceExtension` ".o") fs+       mkObj o f =  text o P.<> text (": " ++ unwords [f, libh])+                 $$ text ("\t" ++ cCompilerCommand floating gmp ++ " -c $< -o $@")+                 $$ text ""++-- | Create a driver for a library+mergeDrivers :: String -> Doc -> [(FilePath, [Doc])] -> [Doc]+mergeDrivers libName inc ds = pre : concatMap mkDFun ds ++ [callDrivers (map fst ds)]+  where pre =  text "/* Example driver program for" <+> text libName P.<> text ". */"+            $$ text "/* Automatically generated by SBV. Edit as you see fit! */"+            $$ text ""+            $$ text "#include <stdio.h>"+            $$ inc+        mkDFun (f, [_pre, _include, callbacks, helpers, _header, body, _post]) = [callbacks, helpers, header, body, post]+           where header =  text ""+                        $$ text ("void " ++ f ++ "_driver(void)")+                        $$ text "{"+                 post   =  text "}"+        mkDFun (f, _) = die $ "mergeDrivers: non-conforming driver program for " ++ show f+        callDrivers fs =   text ""+                       $$  text "int main(void)"+                       $$  text "{"+                       $+$ nest 2 (vcat (map call fs))+                       $$  nest 2 (text "return 0;")+                       $$  text "}"+        call f =  text psep+               $$ text ptag+               $$ text psep+               $$ text (f ++ "_driver();")+               $$ text ""+           where tag  = "** Driver run for " ++ f ++ ":"+                 ptag = "printf(\"" ++ tag ++ "\\n\");"+                 lsep = replicate (length tag) '='+                 psep = "printf(\"" ++ lsep ++ "\\n\");"++-- | Return the runtime requirements introduced by a legacy scalar operation.+operationRequirements :: CgConfig -> (Op, Kind) -> Set.Set CRequirement+operationRequirements cfg (o, k) = Set.fromList (required o)+  where required (IEEEFP FP_Cast{}) = math+        required castOp@KindCast{}+          | Just _ <- mappedRealFloorWidth cfg castOp = math+        required (IEEEFP fop)+          | fop `elem` requiresMath = math+        required Abs+          | usesNativeFloatingPoint k = math+        required _ = []++        math = [CRequiresLibM]++        usesNativeFloatingPoint KFloat = True+        usesNativeFloatingPoint KDouble = True+        usesNativeFloatingPoint KReal   = not (isExactGMPKind cfg KReal)+        usesNativeFloatingPoint _       = False++        requiresMath = [ FP_Abs+                       , FP_FMA+                       , FP_Sqrt+                       , FP_Rem+                       , FP_Min+                       , FP_Max+                       , FP_RoundToIntegral+                       , FP_ObjEqual+                       , FP_IsSubnormal+                       , FP_IsInfinite+                       , FP_IsNaN+                       , FP_IsNegative+                       , FP_IsPositive+                       , FP_IsNormal+                       , FP_IsZero+                       ]++-- | Translate collected runtime requirements to external C linker options.+requirementLDFlags :: Set.Set CRequirement -> [String]+requirementLDFlags requirements =+  [ flag+  | (requirement, flag) <- [ (CRequiresGMP, "-lgmp")+                           , (CRequiresLibBF, "-lbf")+                           , (CRequiresLibM, "-lm")+                           ]+  , requirement `Set.member` requirements+  ]++{- HLint ignore module "Redundant lambda" -}
+ Data/SBV/Compilers/C/FP.hs view
@@ -0,0 +1,1261 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.FP+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- LibBF-backed lowering of arbitrary IEEE-754 floating-point values to C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.FP+  ( arbitraryFPKinds+  , roundingModeTypeDecls+  , roundingModeConst+  , roundingModeDriverValue+  , arbitraryFPTypeDecls+  , arbitraryFPRuntime+  , arbitraryFPConst+  , arbitraryFPExpr+  , nativeFPRuntime+  , nativeFPExpr+  , nativeFPCompilePragmas+  , arbitraryFPNormalize+  , arbitraryFPPrint+  , arbitraryFPCType+  , arbitraryFPEqual+  , arbitraryFPObjectEqual+  , arbitraryFPIsNaN+  , nativeFPObjectEqual+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.Bits                       (shiftL, shiftR, (.&.))+import Data.List                       (intercalate, nub, tails)+import qualified Data.Set as Set+import Numeric                         (showHex)++import qualified LibBF as BF++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.BV        (isWideBV, mappedIntegerKind)+import Data.SBV.Compilers.C.GMP       (isExactGMPKind)+import Data.SBV.Compilers.C.Lowering  (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Real      (mappedRealFloorWidth)+import Data.SBV.Compilers.CodeGen      (CgConfig(..), CgSRealType(..))+import Data.SBV.Core.Data+import Data.SBV.Core.SizedFloats       (FP(..), mkBFOpts)++-- | Disable implicit contraction in generated translation units without+-- changing the caller's compilation state through a public header. The+-- Makefiles also pass @-ffp-contract=off@: Clang can ignore these pragmas when+-- contraction is explicitly enabled on the command line. Explicit FMA calls+-- retain their single-rounding semantics.+nativeFPCompilePragmas :: Doc+nativeFPCompilePragmas = text . unlines $+  ["/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */"+  , "#if defined(__clang__)"+  , "#pragma STDC FP_CONTRACT OFF"+  , "#endif"+  , ""]++-- | The distinct arbitrary floating-point kinds used by a program.+arbitraryFPKinds :: Set.Set Kind -> [Kind]+arbitraryFPKinds = map validate . filter isFP . Set.toAscList+ where validate k@(KFP eb _)+         | eb <= 61 = k+         | True     = error $ "SBV->C: LibBF supports arbitrary floating-point exponent widths only up to 61 bits, received " ++ show k+       validate k = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | Declare the public C enumeration used for symbolic rounding modes.+roundingModeTypeDecls :: Bool -> Doc+roundingModeTypeDecls required+  | required = text . unlines $+      ["/* IEEE-754 rounding modes. */"+      , "#ifndef SBV_ROUNDING_MODE_DEFINED"+      , "#define SBV_ROUNDING_MODE_DEFINED"+      , "typedef enum { SBV_RM_RNE = 0, SBV_RM_RNA = 1, SBV_RM_RTP = 2, SBV_RM_RTN = 3, SBV_RM_RTZ = 4 } RoundingMode;"+      , "#endif"+      , ""]+  | True     = empty++-- | Render an SBV rounding-mode constant as a public C enumerator.+roundingModeConst :: CV -> Maybe Doc+roundingModeConst (CV k (CADT (constructorName, [])))+  | isRoundingMode k = text . fst <$> lookup constructorName roundingModeNames+roundingModeConst _ = Nothing++-- | Select a deterministic rounding-mode enumerator for a generated driver.+roundingModeDriverValue :: Integer -> Doc+roundingModeDriverValue sample = text cName+ where (cName, _) = map snd roundingModeNames !! fromInteger (sample `mod` toInteger (length roundingModeNames))++-- | Declare the raw IEEE interchange representation used at the public C ABI.+arbitraryFPTypeDecls :: [Kind] -> Doc+arbitraryFPTypeDecls [] = empty+arbitraryFPTypeDecls ks = text . unlines $+     ["/* Arbitrary IEEE-754 values, encoded as raw interchange bits. */"+     , cUnusedAttribute]+  ++ concatMap decl ks+ where decl k = ["#ifndef " ++ typeGuard k+                , "#define " ++ typeGuard k+                , "typedef struct { uint64_t limb[" ++ show (limbs k) ++ "]; } " ++ arbitraryFPCType k ++ ";"+                , "static inline SBV_CGEN_UNUSED void " ++ prefix k ++ "_fprint(FILE *stream, " ++ arbitraryFPCType k ++ " value)"+                , "{"+                , "  size_t i = " ++ show (limbs k) ++ ";"+                , "  fputs(\"0x\", stream);"+                , "  while (i-- > 0) fprintf(stream, \"%016\" PRIx64, value.limb[i]);"+                , "}"+                , "#endif"+                , ""]++       typeGuard (KFP eb sb) = "SBV_FP_E" ++ show eb ++ "_S" ++ show sb ++ "_DEFINED"+       typeGuard k           = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | Emit the LibBF adapter and helpers for arbitrary formats and conversions+-- that require exact rounding.+arbitraryFPRuntime :: CgConfig -> [Kind] -> [(SV, SBVExpr)] -> Doc+arbitraryFPRuntime cfg ks asgns+  | null ks && null floatCasts = empty+  | True                       = text . unlines . map markUnused $+     ["/* LibBF-backed arbitrary floating-point runtime. */"+     , cUnusedAttribute+     , ""+     , "static inline bf_rnd_t sbv_bf_rounding_mode(int mode)"+     , "{"+     , "  switch (mode) {"+     , "    case 0: return BF_RNDN;"+     , "    case 1: return BF_RNDNA;"+     , "    case 2: return BF_RNDU;"+     , "    case 3: return BF_RNDD;"+     , "    case 4: return BF_RNDZ;"+     , "    default: abort();"+     , "  }"+     , "}"+     , ""+     , "static void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)"+     , "{"+     , "  (void) opaque;"+     , "  return realloc(ptr, size);"+     , "}"+     , ""]+  ++ concatMap formatRuntime ks+  ++ concat [exactBridgeRuntime | any castUsesExact floatCasts]+  ++ concat [longDoubleBridgeRuntime | cgReal cfg == Just CgLongDouble, any castUsesReal floatCasts]+  ++ concatMap reinterpretRuntime (nub (concatMap reinterprets asgns))+  ++ concatMap (castRuntime cfg) floatCasts+ where markUnused line = case splitAt 7 line of+                           ("static ", rest) -> "static SBV_CGEN_UNUSED " ++ rest+                           _                 -> line++       reinterprets (_, SBVApp (IEEEFP (FP_Reinterpret fr to)) _)+         | isFP fr || isFP to = [Reinterpret fr to]+       reinterprets _ = []++       casts (_, SBVApp (IEEEFP (FP_Cast fr to _)) _)+         | supportedFPCast cfg fr to+         , not (exactNativeFPCast (floatCastKind cfg fr) (floatCastKind cfg to)) = [FloatCast fr to]+       casts (_, SBVApp castOp@(KindCast fr to) _)+         | Nothing <- mappedRealFloorWidth cfg castOp+         , mappedFloatCast cfg fr to = [FloatCast fr to]+       casts _ = []++       floatCasts = nub (concatMap casts asgns)++       castUsesExact (FloatCast fr to) = isExactGMPKind cfg fr || isExactGMPKind cfg to+       castUsesReal  (FloatCast fr to) = KReal `elem` [fr, to]++-- | Shared ownership predicate for cast lowering and helper emission. Keeping+-- this decision in one place prevents generation of calls without definitions.+supportedFPCast :: CgConfig -> Kind -> Kind -> Bool+supportedFPCast cfg fr to = isFP fr || isFP to || mappedFloatCast cfg fr to+                        || (native fr && (native to || isBounded to || isExactGMPKind cfg to))+                        || (native to && (isBounded fr || isExactGMPKind cfg fr))+ where native kind = isFloat kind || isDouble kind++-- | Render an arbitrary floating-point constant in raw interchange form.+arbitraryFPConst :: Kind -> FP -> Maybe Doc+arbitraryFPConst k@(KFP eb sb) (FP _ _ value) = Just . text $ rawLiteral k bits+ where bits = BF.bfToBits (mkBFOpts eb sb BF.NearEven) value+arbitraryFPConst _ _ = Nothing++-- | Lower an operation requiring LibBF-backed floating-point semantics. A+-- 'Nothing' result delegates native RNE operations, table lookup, and+-- user-defined functions to the general C renderer.+-- Numeric floating casts use the bridge unless their native conversion is+-- provably exact: C casts and @rint@ would otherwise depend on the caller's+-- hardware rounding mode, even for RNE.+arbitraryFPExpr :: CgConfig -> [(SV, CV)] -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+arbitraryFPExpr cfg consts op svs resultKind args+  | Just _ <- mappedRealFloorWidth cfg op+  = Nothing+  | IEEEFP (FP_Cast fr to rm) <- op+  , let target = floatCastKind cfg to+  , exactNativeFPCast (floatCastKind cfg fr) target+  , value:_ <- reverse args+  , let ignored = maybe [text (show rm)] (const []) (lookup rm consts)+  , let cast = parens (text (if isFloat target then "SFloat" else "SDouble")) <+> value+  = Just . expressionLowering [] $ case ignored of+      [] -> cast+      _  -> parens $ fsep (punctuate comma (map (text "(void)" <+>) ignored ++ [cast]))+  | not (isFP resultKind+      || any (isFP . kindOf) svs+      || isSupportedCast)+  = Nothing+  | LkUp{} <- op+  = Nothing+  | Uninterpreted{} <- op+  = Nothing+  | True+  = Just . expressionLowering requirements $ case (op, args, svs) of+      (Label _         , [a]         , _)            -> a+      (UNeg            , [a]         , x:_)          -> argCall x "neg" [a]+      (Abs             , [a]         , x:_)          -> argCall x "abs" [a]+      (Plus            , [a, b]      , x:_)          -> argCall x "add" [a, b, text "BF_RNDN"]+      (Minus           , [a, b]      , x:_)          -> argCall x "sub" [a, b, text "BF_RNDN"]+      (Times           , [a, b]      , x:_)          -> argCall x "mul" [a, b, text "BF_RNDN"]+      (Quot            , [a, b]      , x:_)          -> argCall x "div" [a, b, text "BF_RNDN"]+      (Equal False     , [a, b]      , x:_)          -> argCall x "eq" [a, b]+      (Equal True      , [a, b]      , x:_)          -> argCall x "obj_eq" [a, b]+      (NotEqual        , as          , x:_)          -> distinctExpr x as+      (LessThan        , [a, b]      , x:_)          -> argCall x "lt" [a, b]+      (GreaterThan     , [a, b]      , x:_)          -> argCall x "lt" [b, a]+      (LessEq          , [a, b]      , x:_)          -> argCall x "le" [a, b]+      (GreaterEq       , [a, b]      , x:_)          -> argCall x "le" [b, a]+      (IEEEFP fpOp     , as          , fpArgs)       -> fpExpr fpOp as fpArgs+      (KindCast fr to  , [a]         , _)            -> namedCall (castName fr to)+                                                         ([text "&sbv_local_gmp_ctx" | isExactGMPKind cfg to]+                                                       ++ [a, text (if fr == KReal && to == KUnbounded then "BF_RNDD" else "BF_RNDN")])+      _                                              -> unsupported+ where argCall sv suffix = namedCall (prefix (kindOf sv) ++ "_" ++ suffix)++       distinctExpr sv as = fsep $ punctuate (text " &&")+                                  [text "!" P.<> parens (argCall sv "eq" [a, b])+                                  | (a:rest) <- tails as, b <- rest]++       fpExpr fpOp as fpArgs = case (fpOp, as, fpArgs) of+         (FP_Abs              , [a]           , x:_)    -> argCall x "abs" [a]+         (FP_Neg              , [a]           , x:_)    -> argCall x "neg" [a]+         (FP_Add              , [_rm, a, b]   , r:x:_)  -> argCall x "add" [a, b, bfRoundingMode consts r]+         (FP_Sub              , [_rm, a, b]   , r:x:_)  -> argCall x "sub" [a, b, bfRoundingMode consts r]+         (FP_Mul              , [_rm, a, b]   , r:x:_)  -> argCall x "mul" [a, b, bfRoundingMode consts r]+         (FP_Div              , [_rm, a, b]   , r:x:_)  -> argCall x "div" [a, b, bfRoundingMode consts r]+         (FP_FMA              , [_rm, a, b, c], r:x:_)  -> argCall x "fma" [a, b, c, bfRoundingMode consts r]+         (FP_Sqrt             , [_rm, a]      , r:x:_)  -> argCall x "sqrt" [a, bfRoundingMode consts r]+         (FP_Rem              , [a, b]        , x:_)    -> argCall x "rem" [a, b]+         (FP_RoundToIntegral  , [_rm, a]      , r:x:_)  -> argCall x "round" [a, bfRoundingMode consts r]+         (FP_Min              , [a, b]        , x:_)    -> argCall x "min" [a, b]+         (FP_Max              , [a, b]        , x:_)    -> argCall x "max" [a, b]+         (FP_ObjEqual         , [a, b]        , x:_)    -> argCall x "obj_eq" [a, b]+         (FP_IsNormal         , [a]           , x:_)    -> argCall x "is_normal" [a]+         (FP_IsSubnormal      , [a]           , x:_)    -> argCall x "is_subnormal" [a]+         (FP_IsZero           , [a]           , x:_)    -> argCall x "is_zero" [a]+         (FP_IsInfinite       , [a]           , x:_)    -> argCall x "is_infinite" [a]+         (FP_IsNaN            , [a]           , x:_)    -> argCall x "is_nan" [a]+         (FP_IsNegative       , [a]           , x:_)    -> argCall x "is_negative" [a]+         (FP_IsPositive       , [a]           , x:_)    -> argCall x "is_positive" [a]+         (FP_Reinterpret fr to, [a]           , _)      -> namedCall (reinterpretName fr to) [a]+         (FP_Cast fr to rm    , [a]           , _)      -> namedCall (castName fr to) (castArgs to a rm)+         (FP_Cast fr to rm    , [_rm, a]      , _)      -> namedCall (castName fr to) (castArgs to a rm)+         _                                              -> unsupported++       castArgs to a rm+         | isExactGMPKind cfg to = [text "&sbv_local_gmp_ctx", a, bfRoundingMode consts rm]+         | True                  = [a, bfRoundingMode consts rm]++       requirements = [CRequiresLibBF, CRequiresLibM] ++ [CRequiresGMP | usesExact]++       usesExact = isExactGMPKind cfg resultKind || any (isExactGMPKind cfg . kindOf) svs++       isSupportedCast = case op of+         IEEEFP (FP_Cast fr to _) -> supportedFPCast cfg fr to+         KindCast fr to          -> mappedFloatCast cfg fr to+         _                        -> False++       unsupported = error $ "SBV->C: arbitrary floating-point lowering does not yet support " ++ show op+                          ++ " with argument kinds " ++ show (map kindOf svs)+                          ++ " and result kind " ++ show resultKind++-- | Identify scalar casts whose entire source range is exactly representable+-- in the destination. No rounding, software adapter, or hardware rounding-mode+-- change is needed for any valid SBV rounding mode.+exactNativeFPCast :: Kind -> Kind -> Bool+exactNativeFPCast from to+  | to `notElem` [KFloat, KDouble] = False+  | from == to                   = True+  | from == KFloat, to == KDouble = True+  | isBounded from+  , not (isWideBV from)           = intSizeOf from - (if hasSign from then 1 else 0) <= significandBits to+  | True                         = False++-- | Emit LibBF adapters for native 'SFloat' and 'SDouble' operations whose+-- rounding mode cannot safely be expressed as an ordinary C expression.+nativeFPRuntime :: Doc+nativeFPRuntime = text . unlines . map markUnused $+     ["/* Exact rounding adapters for native floating-point operations. */"+     , cUnusedAttribute+     , ""+     , "static inline bf_rnd_t sbv_native_bf_rounding_mode(int mode)"+     , "{"+     , "  switch (mode) {"+     , "    case 0: return BF_RNDN;"+     , "    case 1: return BF_RNDNA;"+     , "    case 2: return BF_RNDU;"+     , "    case 3: return BF_RNDD;"+     , "    case 4: return BF_RNDZ;"+     , "    default: abort();"+     , "  }"+     , "}"+     , ""+     , "static void *sbv_native_bf_realloc(void *opaque, void *ptr, size_t size)"+     , "{"+     , "  (void) opaque;"+     , "  return realloc(ptr, size);"+     , "}"+     , ""+     ]+  ++ concatMap format [("SFloat", "float", 24, 8), ("SDouble", "double", 53, 11)]+ where markUnused line = case splitAt 14 line of+                           ("static inline ", rest) -> "static inline SBV_CGEN_UNUSED " ++ rest+                           _                        -> line++       format :: (String, String, Int, Int) -> [String]+       format (cType, tag, precision, exponentBits) =+            ["static inline bf_flags_t sbv_native_" ++ tag ++ "_flags(bf_rnd_t rnd)"+            , "{ return (bf_flags_t) rnd | BF_FLAG_SUBNORMAL | bf_set_exp_bits(" ++ show exponentBits ++ "); }"+            , ""+            , "static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_finish(bf_t *value, bf_rnd_t rnd)"+            , "{"+            , "  double result;"+            , "  bf_get_float64(value, &result, rnd);"+            , "  return (" ++ cType ++ ") result;"+            , "}"+            , ""+            , "static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_binary(" ++ cType ++ " a, " ++ cType ++ " b, bf_rnd_t rnd, int op)"+            , "{"+            , "  bf_context_t ctx; bf_t x, y, r; " ++ cType ++ " result;"+            , "  bf_context_init(&ctx, sbv_native_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &y); bf_init(&ctx, &r);"+            , "  bf_set_float64(&x, (double) a); bf_set_float64(&y, (double) b);"+            , "  if (op == 0) bf_add(&r, &x, &y, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd));"+            , "  else if (op == 1) bf_sub(&r, &x, &y, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd));"+            , "  else if (op == 2) bf_mul(&r, &x, &y, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd));"+            , "  else bf_div(&r, &x, &y, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd));"+            , "  result = sbv_native_" ++ tag ++ "_finish(&r, rnd);"+            , "  bf_delete(&r); bf_delete(&y); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""+            ]+         ++ concatMap (binaryWrapper cType tag) [("add", 0), ("sub", 1), ("mul", 2), ("div", 3)]+         ++ ["static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_sqrt(" ++ cType ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, r; " ++ cType ++ " result;"+            , "  bf_context_init(&ctx, sbv_native_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &r); bf_set_float64(&x, (double) a);"+            , "  bf_sqrt(&r, &x, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd)); result = sbv_native_" ++ tag ++ "_finish(&r, rnd);"+            , "  bf_delete(&r); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""+            , "static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_round(" ++ cType ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x; " ++ cType ++ " result;"+            , "  bf_context_init(&ctx, sbv_native_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a);"+            , "  bf_rint(&x, rnd); result = sbv_native_" ++ tag ++ "_finish(&x, rnd);"+            , "  bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""+            , "static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_fma(" ++ cType ++ " a, " ++ cType ++ " b, " ++ cType ++ " c, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, y, z, r; " ++ cType ++ " result;"+            , "  bf_context_init(&ctx, sbv_native_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &y); bf_init(&ctx, &z); bf_init(&ctx, &r);"+            , "  bf_set_float64(&x, (double) a); bf_set_float64(&y, (double) b); bf_set_float64(&z, (double) c);"+            , "  bf_mul(&r, &x, &y, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDN);"+            , "  bf_add(&r, &r, &z, " ++ show precision ++ ", sbv_native_" ++ tag ++ "_flags(rnd)); result = sbv_native_" ++ tag ++ "_finish(&r, rnd);"+            , "  bf_delete(&r); bf_delete(&z); bf_delete(&y); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""+            ]++       binaryWrapper :: String -> String -> (String, Int) -> [String]+       binaryWrapper cType tag (suffix, operation) =+         ["static inline " ++ cType ++ " sbv_native_" ++ tag ++ "_" ++ suffix ++ "(" ++ cType ++ " a, " ++ cType ++ " b, bf_rnd_t rnd)"+         , "{ return sbv_native_" ++ tag ++ "_binary(a, b, rnd, " ++ show operation ++ "); }"+         , ""]++-- | Lower explicitly rounded native floating-point arithmetic. RNE remains a+-- direct native C operation under the public FE_TONEAREST calling convention;+-- other constants and symbolic modes use LibBF without changing hardware+-- rounding. The caller precondition is not checked at runtime.+nativeFPExpr :: [(SV, CV)] -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+nativeFPExpr consts (IEEEFP fpOp) svs resultKind args+  | resultKind `elem` [KFloat, KDouble]+  = case (fpOp, args, svs) of+      (FP_Add             , [_rm, a, b]   , r:_) | needsAdapter r -> lower "add"   [a, b] r+      (FP_Sub             , [_rm, a, b]   , r:_) | needsAdapter r -> lower "sub"   [a, b] r+      (FP_Mul             , [_rm, a, b]   , r:_) | needsAdapter r -> lower "mul"   [a, b] r+      (FP_Div             , [_rm, a, b]   , r:_) | needsAdapter r -> lower "div"   [a, b] r+      (FP_FMA             , [_rm, a, b, c], r:_) | needsAdapter r -> lower "fma"   [a, b, c] r+      (FP_Sqrt            , [_rm, a]      , r:_) | needsAdapter r -> lower "sqrt"  [a] r+      (FP_RoundToIntegral , [_rm, a]      , r:_) | needsAdapter r -> lower "round" [a] r+      _                                                           -> Nothing+  | True = Nothing+ where lower suffix values rm = Just . expressionLowering+                                   [CRequiresLibBF, CRequiresLibM, CRequiresNativeFPRounding]+                                 $ namedCall (nativePrefix resultKind ++ suffix)+                                             (values ++ [nativeBFRoundingMode consts rm])++       needsAdapter rm = case rm `lookup` consts of+         Just (CV k (CADT ("RoundNearestTiesToEven", []))) | isRoundingMode k -> False+         Just (CV k (CADT (_, [])))                        | isRoundingMode k -> True+         Nothing                                           | isRoundingMode rm -> True+         _ -> error $ "SBV->C: Expected a rounding mode, received " ++ show rm++       nativePrefix KFloat  = "sbv_native_float_"+       nativePrefix KDouble = "sbv_native_double_"+       nativePrefix k       = error $ "SBV->C: Expected a native floating-point kind, received " ++ show k+nativeFPExpr _ _ _ _ _ = Nothing++-- | Render a LibBF rounding mode for a native floating-point adapter.+nativeBFRoundingMode :: [(SV, CV)] -> SV -> Doc+nativeBFRoundingMode consts sv = case sv `lookup` consts of+  Just (CV k (CADT (rmName, [])))+    | isRoundingMode k -> maybe bad (text . snd) (lookup rmName roundingModeNames)+  Nothing+    | isRoundingMode sv -> namedCall "sbv_native_bf_rounding_mode" [text (show sv)]+  _                     -> bad+ where bad = error $ "SBV->C: Expected a rounding mode, received " ++ show sv++-- | Canonicalize externally supplied raw bits by clearing unused high bits.+arbitraryFPNormalize :: Kind -> Doc -> Doc+arbitraryFPNormalize k value = namedCall (prefix k ++ "_norm") [value]++-- | Print arbitrary floating-point interchange bits as fixed-width hexadecimal.+arbitraryFPPrint :: Kind -> Doc -> Doc+arbitraryFPPrint k value = namedCall (prefix k ++ "_fprint") [text "stdout", value]++-- | Compare two arbitrary floating-point interchange values using SMT object+-- equality: all NaNs compare equal and the two signed zeroes remain distinct.+arbitraryFPObjectEqual :: Kind -> Doc -> Doc -> Doc+arbitraryFPObjectEqual k left right = namedCall (prefix k ++ "_obj_eq") [left, right]++-- | Classify a raw arbitrary-format value without performing arithmetic.+arbitraryFPIsNaN :: Kind -> Doc -> Doc+arbitraryFPIsNaN kind value = namedCall (prefix kind ++ "_is_nan") [value]++-- | Compare two arbitrary floating-point values using IEEE equality.+arbitraryFPEqual :: Kind -> Doc -> Doc -> Doc+arbitraryFPEqual k left right = namedCall (prefix k ++ "_eq") [left, right]++-- | Compare two native floating-point values using SMT object equality: all+-- NaNs compare equal and the two signed zeroes remain distinct.+nativeFPObjectEqual :: Doc -> Doc -> Doc+nativeFPObjectEqual left right = choose (renderedIsNaN left) (renderedIsNaN right)+                              $ choose (renderedIsNegativeZero left) (renderedIsNegativeZero right)+                              $ choose (renderedIsNegativeZero right) (renderedIsNegativeZero left) (equal left right)+ where choose condition ifTrue ifFalse = condition <+> text "?" <+> ifTrue <+> text ":" <+> ifFalse+       renderedIsNaN value          = text "isnan" P.<> parens value+       equal x y                    = parens (x <+> text "==" <+> y)+       renderedIsNegativeZero value = parens (text "signbit" P.<> parens value <+> text "&&" <+> equal value (text "0"))++-- | Return the public C type name for an arbitrary floating-point kind.+arbitraryFPCType :: Kind -> String+arbitraryFPCType (KFP eb sb) = "SFP" ++ show eb ++ "_" ++ show sb+arbitraryFPCType k           = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | A bit-preserving conversion between a floating-point interchange value+-- and a bit-vector of the same width.+data Reinterpret = Reinterpret Kind Kind deriving Eq++-- | A value conversion implemented by the LibBF runtime.+data FloatCast = FloatCast Kind Kind deriving Eq++-- | Emit a bit-preserving conversion between raw C representations.+reinterpretRuntime :: Reinterpret -> [String]+reinterpretRuntime (Reinterpret fr to)+  | reprWidth fr /= reprWidth to = error $ "SBV->C: Cannot reinterpret representations of different widths: " ++ show (fr, to)+  | True =+      ["static inline " ++ reprCType to ++ " " ++ reinterpretName fr to ++ "(" ++ reprCType fr ++ " a)"+      , "{"+      , "  " ++ reprCType to ++ " r = " ++ reprZero to ++ "; uint64_t i;"+      , "  for (i = 0; i < " ++ show (reprWidth to) ++ "; ++i) { " ++ reprSetBit to "r" "i" (reprGetBit fr "a" "i") ++ " }"+      , "  return " ++ reprNormalize to "r" ++ ";"+      , "}"+      , ""]++-- | Construct the collision-free name of a reinterpretation helper.+reinterpretName :: Kind -> Kind -> String+reinterpretName fr to = "sbv_fp_reinterpret_" ++ reprTag fr ++ "_" ++ reprTag to++-- | Resolve explicit native mappings for numeric conversion helpers. A native+-- real mapping to long double has no fixed SBV IEEE kind; retain 'KReal' so the+-- bridge can use the target C compiler's format instead of assuming binary64.+floatCastKind :: CgConfig -> Kind -> Kind+floatCastKind cfg KReal = case cgReal cfg of+                           Just CgFloat  -> KFloat+                           Just CgDouble -> KDouble+                           _             -> KReal+floatCastKind cfg kind = mappedIntegerKind (cgInteger cfg) kind++-- | Test whether a cast crosses an explicitly mapped floating representation,+-- including integer mappings used as a floating-point source or destination.+mappedFloatCast :: CgConfig -> Kind -> Kind -> Bool+mappedFloatCast cfg fr to = (from /= fr || target /= to || mappedReal)+                        && (floating from || floating target || mappedReal)+ where from   = floatCastKind cfg fr+       target = floatCastKind cfg to+       floating kind = isFP kind || isFloat kind || isDouble kind+       mappedReal = KReal `elem` [fr, to] && case cgReal cfg of+                                             Just{}  -> True+                                             Nothing -> False++-- | Emit a LibBF-backed value conversion between supported numeric formats.+castRuntime :: CgConfig -> FloatCast -> [String]+castRuntime cfg (FloatCast source target) = case (fr, to) of+  (KFP{}, KFP{}) ->+    ["static inline " ++ reprCType to ++ " " ++ helperName ++ "(" ++ reprCType fr ++ " a, bf_rnd_t rnd)"+    , "{"+    , "  bf_context_t ctx; bf_t x; " ++ reprCType to ++ " raw;"+    , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ prefix fr ++ "_decode(&ctx, &x, a);"+    , "  bf_round(&x, " ++ show (significandBits to) ++ ", " ++ prefix to ++ "_flags(rnd)); raw = " ++ prefix to ++ "_encode(&x);"+    , "  bf_delete(&x); bf_context_end(&ctx); return raw;"+    , "}"+    , ""]+  (KFloat, KFP{})               -> fromNative "SFloat"+  (KDouble, KFP{})              -> fromNative "SDouble"+  (KReal, KFP{}) | longDouble fr -> fromNative "SReal"+  (KFP{}, KFloat)               -> toNative "SFloat" True+  (KFP{}, KDouble)              -> toNative "SDouble" False+  (KFP{}, KReal) | longDouble to -> toNative "SReal" False+  _ | isNativeFloat fr && isNativeFloat to      -> nativeToNative+  _ | isExactGMPKind cfg fr && isNativeFloat to -> exactToNative+  _ | isNativeFloat fr && isExactGMPKind cfg to -> nativeToExact+  _ | isExactGMPKind cfg fr && isFP to -> exactToFP+  _ | isFP fr && isExactGMPKind cfg to -> fpToExact+  _ | isBounded fr && isSomeFloat to -> integerToFP+  _ | isSomeFloat fr && isBounded to -> fpToInteger+  _                   -> error $ "SBV->C: Unsupported arbitrary floating-point cast: " ++ show (fr, to)+ where fr = floatCastKind cfg source+       to = floatCastKind cfg target+       helperName = castName source target++       fromNative sourceType =+         ["static inline " ++ reprCType to ++ " " ++ helperName ++ "(" ++ sourceType ++ " a, bf_rnd_t rnd)"+         , "{"+         , "  bf_context_t ctx; bf_t x; " ++ reprCType to ++ " raw;"+         , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ decodeFloating fr+         , "  bf_round(&x, " ++ show (significandBits to) ++ ", " ++ prefix to ++ "_flags(rnd)); raw = " ++ prefix to ++ "_encode(&x);"+         , "  bf_delete(&x); bf_context_end(&ctx); return raw;"+         , "}"+         , ""]++       toNative targetType singlePrecision =+            ["static inline " ++ targetType ++ " " ++ helperName ++ "(" ++ reprCType fr ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x; " ++ nativeResultType to ++ " result;"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ prefix fr ++ "_decode(&ctx, &x, a);"+            ]+         ++ ["  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd);" | singlePrecision]+         ++ ["  " ++ getNative to ++ " bf_delete(&x); bf_context_end(&ctx); return (" ++ targetType ++ ") result;"+            , "}"+            , ""]++       nativeToNative =+         ["static inline " ++ nativeCType to ++ " " ++ helperName ++ "(" ++ nativeCType fr ++ " a, bf_rnd_t rnd)"+         , "{"+         , "  bf_context_t ctx; bf_t x; " ++ nativeResultType to ++ " result;"+         , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ decodeFloating fr+         , "  bf_round(&x, " ++ precision to ++ ", " ++ nativeFlags to ++ "); " ++ getNative to+         , "  bf_delete(&x); bf_context_end(&ctx); return (" ++ nativeCType to ++ ") result;"+         , "}"+         , ""]++       integerToFP =+         ["static inline " ++ floatingCType to ++ " " ++ helperName ++ "(" ++ reprCType fr ++ " a, bf_rnd_t rnd)"+         , "{"+         , "  uint64_t words[" ++ show sourceWords ++ "]; uint64_t carry = 1; size_t i; limb_t j;"+         , "  const bool negative = " ++ (if hasSign fr then reprGetBit fr "a" (show (reprWidth fr - 1)) else "false") ++ ";"+         , "  bf_context_t ctx; bf_t x, chunk;" ++ integerResultDeclaration+         , "  for (i = 0; i < " ++ show sourceWords ++ "; ++i) {"+         , "    words[i] = 0;"+         , "    for (j = 0; j < 64 && i * 64 + j < " ++ show (reprWidth fr) ++ "; ++j)"+         , "      if (" ++ reprGetBit fr "a" "(i * 64 + j)" ++ ") words[i] |= UINT64_C(1) << j;"+         , "  }"+         , "  if (negative) for (i = 0; i < " ++ show sourceWords ++ "; ++i) {"+         , "    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;"+         , "  }"+         , "  words[" ++ show (sourceWords - 1) ++ "] &= " ++ u64 (reprTopMask fr) ++ ";"+         , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);"+         , "  for (i = " ++ show sourceWords ++ "; i-- > 0;) {"+         , "    bf_mul_2exp(&x, i == " ++ show (sourceWords - 1) ++ " ? " ++ show sourceTopBits ++ " : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+         , "    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+         , "  }"+         , "  if (negative) bf_neg(&x);"+         , "  bf_round(&x, " ++ precision to ++ ", " ++ floatingFlags to ++ ");" ++ integerFinish+         , "  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return " ++ integerResult ++ ";"+         , "}"+         , ""]++       fpToInteger =+         ["static inline " ++ reprCType to ++ " " ++ helperName ++ "(" ++ floatingCType fr ++ " a, bf_rnd_t rnd)"+         , "{"+         , "  bf_context_t ctx; bf_t x; " ++ reprCType integerBits ++ " raw = " ++ reprZero integerBits ++ "; limb_t i;"+         , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ decodeFloating fr ++ " bf_rint(&x, rnd);"+         , "  if (bf_is_finite(&x) && !bf_is_zero(&x)) {"+         , "    const slimb_t base = (slimb_t) x.len * LIMB_BITS;"+         , "    for (i = 0; i < " ++ show (reprWidth to) ++ "; ++i) {"+         , "      const slimb_t bit = (slimb_t) i - x.expn + base;"+         , "      if (bit >= 0 && bit < base) { " ++ reprSetBit integerBits "raw" "i" "((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0" ++ " }"+         , "    }"+         , "    if (x.sign) raw = " ++ negateRepr integerBits "raw" ++ ";"+         , "  }"+         , "  bf_delete(&x); bf_context_end(&ctx);"+         , if integerBits /= to+              then "  " ++ reprCType to ++ " result; memcpy(&result, &raw, sizeof result); return result;"+              else "  return " ++ reprNormalize to "raw" ++ ";"+         , "}"+         , ""]++       -- Reconstruct native signed results through their unsigned object+       -- representation, avoiding implementation-defined unsigned-to-signed casts.+       integerBits+         | KBounded True width <- to+         , not (isWideBV to) = KBounded False width+         | True             = to++       exactToFP+         | fr == KUnbounded =+            ["static inline " ++ reprCType to ++ " " ++ helperName ++ "(SInteger a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, chunk; " ++ reprCType to ++ " raw;"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk);"+            , "  sbv_bf_set_mpz(&x, &chunk, a); bf_round(&x, " ++ show (significandBits to) ++ ", " ++ prefix to ++ "_flags(rnd));"+            , "  raw = " ++ prefix to ++ "_encode(&x); bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return raw;"+            , "}"+            , ""]+         | fr == KReal =+            ["static inline " ++ reprCType to ++ " " ++ helperName ++ "(SReal a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, numerator, denominator, chunk; " ++ reprCType to ++ " raw;"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &numerator); bf_init(&ctx, &denominator); bf_init(&ctx, &chunk);"+            , "  sbv_bf_set_mpz(&numerator, &chunk, mpq_numref(a)); sbv_bf_set_mpz(&denominator, &chunk, mpq_denref(a));"+            , "  bf_div(&x, &numerator, &denominator, " ++ show (significandBits to) ++ ", " ++ prefix to ++ "_flags(rnd)); raw = " ++ prefix to ++ "_encode(&x);"+            , "  bf_delete(&chunk); bf_delete(&denominator); bf_delete(&numerator); bf_delete(&x); bf_context_end(&ctx); return raw;"+            , "}"+            , ""]+         | otherwise = error $ "SBV->C: Expected an exact GMP source kind, received " ++ show fr++       fpToExact+         | to == KUnbounded =+            ["static inline SInteger " ++ helperName ++ "(sbv_gmp_ctx *gmp_ctx, " ++ reprCType fr ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x; mpz_ptr result = sbv_gmp_new_integer(gmp_ctx);"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ prefix fr ++ "_decode(&ctx, &x, a); bf_rint(&x, rnd);"+            , "  sbv_bf_get_mpz(result, &x); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""]+         | to == KReal =+            ["static inline SReal " ++ helperName ++ "(sbv_gmp_ctx *gmp_ctx, " ++ reprCType fr ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x; mpq_ptr result = sbv_gmp_new_real(gmp_ctx);"+            , "  (void) rnd; bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ prefix fr ++ "_decode(&ctx, &x, a);"+            , "  sbv_bf_get_mpq(result, &x); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""]+         | otherwise = error $ "SBV->C: Expected an exact GMP target kind, received " ++ show to++       exactToNative+         | fr == KUnbounded =+            ["static inline " ++ nativeCType to ++ " " ++ helperName ++ "(SInteger a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, chunk; " ++ nativeResultType to ++ " result;"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); sbv_bf_set_mpz(&x, &chunk, a);"+            , "  bf_round(&x, " ++ precision to ++ ", " ++ nativeFlags to ++ "); " ++ getNative to+            , "  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (" ++ nativeCType to ++ ") result;"+            , "}"+            , ""]+         | fr == KReal =+            ["static inline " ++ nativeCType to ++ " " ++ helperName ++ "(SReal a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x, numerator, denominator, chunk; " ++ nativeResultType to ++ " result;"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &numerator); bf_init(&ctx, &denominator); bf_init(&ctx, &chunk);"+            , "  sbv_bf_set_mpz(&numerator, &chunk, mpq_numref(a)); sbv_bf_set_mpz(&denominator, &chunk, mpq_denref(a));"+            , "  bf_div(&x, &numerator, &denominator, " ++ precision to ++ ", " ++ nativeFlags to ++ "); " ++ getNative to+            , "  bf_delete(&chunk); bf_delete(&denominator); bf_delete(&numerator); bf_delete(&x); bf_context_end(&ctx); return (" ++ nativeCType to ++ ") result;"+            , "}"+            , ""]+         | otherwise = error $ "SBV->C: Expected an exact GMP source kind, received " ++ show fr++       nativeToExact+         | to == KUnbounded =+            ["static inline SInteger " ++ helperName ++ "(sbv_gmp_ctx *gmp_ctx, " ++ nativeCType fr ++ " a, bf_rnd_t rnd)"+            , "{"+            ]+         ++ ["  if (!isfinite(a)) { fputs(\"SBV->C: Cannot convert a non-finite mapped SReal to exact SInteger.\\n\", stderr); abort(); }" | source == KReal]+         ++ [ "  bf_context_t ctx; bf_t x; mpz_ptr result = sbv_gmp_new_integer(gmp_ctx);"+            , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ decodeFloating fr ++ " bf_rint(&x, rnd);"+            , "  sbv_bf_get_mpz(result, &x); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""]+         | to == KReal =+            ["static inline SReal " ++ helperName ++ "(sbv_gmp_ctx *gmp_ctx, " ++ nativeCType fr ++ " a, bf_rnd_t rnd)"+            , "{"+            , "  bf_context_t ctx; bf_t x; mpq_ptr result = sbv_gmp_new_real(gmp_ctx);"+            , "  (void) rnd; bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ decodeFloating fr+            , "  sbv_bf_get_mpq(result, &x); bf_delete(&x); bf_context_end(&ctx); return result;"+            , "}"+            , ""]+         | otherwise = error $ "SBV->C: Expected an exact GMP target kind, received " ++ show to++       nativeFlags KFloat                   = "BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd"+       nativeFlags KDouble                  = "BF_FLAG_SUBNORMAL | bf_set_exp_bits(11) | (bf_flags_t) rnd"+       nativeFlags KReal | longDouble KReal = "sbv_bf_long_double_flags(rnd)"+       nativeFlags k                        = error $ "SBV->C: Expected a native floating-point kind, received " ++ show k++       nativeCType KFloat                   = "SFloat"+       nativeCType KDouble                  = "SDouble"+       nativeCType KReal | longDouble KReal = "SReal"+       nativeCType k                        = error $ "SBV->C: Expected a native floating-point kind, received " ++ show k++       longDouble k = k == KReal && cgReal cfg == Just CgLongDouble++       precision k | longDouble k = "LDBL_MANT_DIG"+                   | True         = show (significandBits k)++       nativeResultType k | longDouble k = "long double"+                          | True         = "double"++       getNative k | longDouble k = "result = sbv_bf_get_long_double(&x, rnd);"+                   | True         = "bf_get_float64(&x, &result, rnd);"++       isNativeFloat k = k == KFloat || k == KDouble || longDouble k++       isSomeFloat k = isFP k || isNativeFloat k++       floatingCType k+         | isFP k          = reprCType k+         | isNativeFloat k = nativeCType k+         | otherwise       = error $ "SBV->C: Expected a floating-point kind, received " ++ show k++       floatingFlags k+         | isFP k          = prefix k ++ "_flags(rnd)"+         | isNativeFloat k = nativeFlags k+         | otherwise       = error $ "SBV->C: Expected a floating-point kind, received " ++ show k++       decodeFloating k+         | isFP k          = prefix k ++ "_decode(&ctx, &x, a);"+         | longDouble k    = "bf_init(&ctx, &x); sbv_bf_set_long_double(&x, a);"+         | isNativeFloat k = "bf_init(&ctx, &x); bf_set_float64(&x, (double) a);"+         | otherwise       = error $ "SBV->C: Expected a floating-point kind, received " ++ show k++       integerResultDeclaration+         | isFP to          = " " ++ reprCType to ++ " raw;"+         | isNativeFloat to = " " ++ nativeResultType to ++ " result;"+         | otherwise        = error $ "SBV->C: Expected a floating-point target kind, received " ++ show to++       integerFinish+         | isFP to          = " raw = " ++ prefix to ++ "_encode(&x);"+         | isNativeFloat to = " " ++ getNative to+         | otherwise        = error $ "SBV->C: Expected a floating-point target kind, received " ++ show to++       integerResult+         | isFP to          = "raw"+         | isNativeFloat to = "(" ++ nativeCType to ++ ") result"+         | otherwise        = error $ "SBV->C: Expected a floating-point target kind, received " ++ show to++       sourceWords   = (reprWidth fr + 63) `div` 64+       sourceTopBits = let r = reprWidth fr `mod` 64 in if r == 0 then 64 else r++-- | Import and export native long doubles without binary64 intermediates.+-- Work on numeric significands, not ABI-dependent object layouts (in particular+-- x87 padding and its explicit integer bit). Unsupported non-IEEE-like formats+-- are rejected by the target compiler. All reconstruction operations are exact+-- after LibBF has rounded once to the target precision and exponent range.+longDoubleBridgeRuntime :: [String]+longDoubleBridgeRuntime =+  [ "#include <float.h>"+  , "#if FLT_RADIX == 2 && LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 && LDBL_MIN_EXP == -1021"+  , "#define SBV_LDBL_EXP_BITS 11"+  , "#elif FLT_RADIX == 2 && (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381"+  , "#define SBV_LDBL_EXP_BITS 15"+  , "#else"+  , "#error SBV C long-double conversions require binary64, x87 extended, or binary128 long double"+  , "#endif"+  , "#if BF_EXP_BITS_MAX < SBV_LDBL_EXP_BITS"+  , "#error SBV C long-double conversions exceed the LibBF exponent range"+  , "#endif"+  , ""+  , "static bf_flags_t sbv_bf_long_double_flags(bf_rnd_t rnd)"+  , "{"+  , "  return BF_FLAG_SUBNORMAL | bf_set_exp_bits(SBV_LDBL_EXP_BITS) | (bf_flags_t) rnd;"+  , "}"+  , ""+  , "static void sbv_bf_set_long_double(bf_t *result, long double value)"+  , "{"+  , "  int exponent, shift = 0, status = 0; bf_t chunk;"+  , "  if (isnan(value)) { bf_set_nan(result); return; }"+  , "  if (isinf(value)) { bf_set_inf(result, signbit(value) != 0); return; }"+  , "  if (value == 0) { bf_set_zero(result, signbit(value) != 0); return; }"+  , "  long double fraction = frexpl(fabsl(value), &exponent);"+  , "  bf_init(result->ctx, &chunk); bf_set_zero(result, 0);"+  , "  while (fraction != 0) {"+  , "    fraction = ldexpl(fraction, 32);"+  , "    const uint32_t bits = (uint32_t) fraction; fraction -= (long double) bits;"+  , "    status |= bf_mul_2exp(result, 32, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+  , "    status |= bf_set_ui(&chunk, bits);"+  , "    status |= bf_add(result, result, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ); shift += 32;"+  , "  }"+  , "  status |= bf_mul_2exp(result, exponent - shift, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+  , "  bf_delete(&chunk); if (status & BF_ST_MEM_ERROR) abort();"+  , "  if (signbit(value)) bf_neg(result);"+  , "}"+  , ""+  , "static long double sbv_bf_get_long_double(bf_t *value, bf_rnd_t rnd)"+  , "{"+  , "  if (bf_round(value, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)) & BF_ST_MEM_ERROR) abort();"+  , "  if (bf_is_nan(value)) return nanl(\"\");"+  , "  if (!bf_is_finite(value)) return value->sign ? -HUGE_VALL : HUGE_VALL;"+  , "  if (bf_is_zero(value)) return value->sign ? -0.0L : 0.0L;"+  , "  long double significand = 0;"+  , "  const slimb_t base = (slimb_t) value->len * LIMB_BITS;"+  , "  for (int i = 0; i < LDBL_MANT_DIG; ++i) {"+  , "    const slimb_t bit = base - 1 - i;"+  , "    const unsigned digit = bit < 0 ? 0 : (unsigned) ((value->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1);"+  , "    significand = significand * 2 + digit;"+  , "  }"+  , "  const long double result = ldexpl(significand, (int) value->expn - LDBL_MANT_DIG);"+  , "  return value->sign ? -result : result;"+  , "}"+  , ""+  ]++-- | Emit conversion primitives shared by LibBF/GMP value casts.+exactBridgeRuntime :: [String]+exactBridgeRuntime =+  ["static void sbv_bf_set_mpz(bf_t *result, bf_t *chunk, mpz_srcptr value)"+  , "{"+  , "  const size_t count = (mpz_sizeinbase(value, 2) + 63) / 64; size_t written = 0, i;"+  , "  uint64_t *words; bf_set_ui(result, 0);"+  , "  if (mpz_sgn(value) == 0) return;"+  , "  words = (uint64_t *) calloc(count, sizeof(*words)); if (words == NULL) abort();"+  , "  mpz_export(words, &written, -1, sizeof(*words), 0, 0, value);"+  , "  for (i = written; i-- > 0;) {"+  , "    bf_mul_2exp(result, 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+  , "    bf_set_ui(chunk, words[i]); bf_add(result, result, chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+  , "  }"+  , "  free(words); if (mpz_sgn(value) < 0) bf_neg(result);"+  , "}"+  , ""+  , "static void sbv_bf_get_mpz(mpz_ptr result, const bf_t *value)"+  , "{"+  , "  slimb_t shift; mpz_set_ui(result, 0);"+  , "  if (!bf_is_finite(value) || bf_is_zero(value)) return;"+  , "  mpz_import(result, value->len, -1, sizeof(*value->tab), 0, 0, value->tab);"+  , "  shift = value->expn - (slimb_t) value->len * LIMB_BITS;"+  , "  if (shift >= 0) mpz_mul_2exp(result, result, (mp_bitcnt_t) shift);"+  , "  else mpz_tdiv_q_2exp(result, result, (mp_bitcnt_t) -shift);"+  , "  if (value->sign) mpz_neg(result, result);"+  , "}"+  , ""+  , "static void sbv_bf_get_mpq(mpq_ptr result, const bf_t *value)"+  , "{"+  , "  slimb_t shift; mpq_set_ui(result, 0, 1);"+  , "  if (!bf_is_finite(value) || bf_is_zero(value)) return;"+  , "  mpz_import(mpq_numref(result), value->len, -1, sizeof(*value->tab), 0, 0, value->tab);"+  , "  shift = value->expn - (slimb_t) value->len * LIMB_BITS;"+  , "  if (shift >= 0) mpz_mul_2exp(mpq_numref(result), mpq_numref(result), (mp_bitcnt_t) shift);"+  , "  else mpz_mul_2exp(mpq_denref(result), mpq_denref(result), (mp_bitcnt_t) -shift);"+  , "  if (value->sign) mpz_neg(mpq_numref(result), mpq_numref(result)); mpq_canonicalize(result);"+  , "}"+  , ""]++-- | Construct the collision-free name of a floating-point value conversion.+castName :: Kind -> Kind -> String+castName fr to = "sbv_fp_cast_" ++ castTag fr ++ "_" ++ castTag to++-- | Return the generated tag used in a floating-point value conversion.+castTag :: Kind -> String+castTag k@KFP{}    = reprTag k+castTag KFloat     = "float"+castTag KDouble    = "double"+castTag KUnbounded = "integer"+castTag KReal      = "real"+castTag k          = reprTag k++-- | Return the significand width of an arbitrary floating-point kind.+significandBits :: Kind -> Int+significandBits (KFP _ sb) = sb+significandBits KFloat     = 24+significandBits KDouble    = 53+significandBits k          = error $ "SBV->C: Expected a floating-point kind, received " ++ show k++-- | Render modular negation of a raw bit-vector representation.+negateRepr :: Kind -> String -> String+negateRepr k value+  | isWideBV k  = bvPrefix k ++ "_neg(" ++ value ++ ")"+  | isBounded k = "(" ++ reprCType k ++ ") (~(uint64_t) " ++ value ++ " + UINT64_C(1))"+  | otherwise   = error $ "SBV->C: Cannot negate " ++ show k++-- | Return the mask for the high limb of a raw bit-vector representation.+reprTopMask :: Kind -> Integer+reprTopMask k+  | r == 0    = (1 `shiftL` 64) - 1+  | otherwise = (1 `shiftL` r) - 1+ where r = reprWidth k `mod` 64++-- | Return the bit width of a raw floating-point or bit-vector representation.+reprWidth :: Kind -> Int+reprWidth k+  | isFP k || isBounded k = intSizeOf k+  | otherwise             = error $ "SBV->C: Expected a raw floating-point or bit-vector representation, received " ++ show k++-- | Return the C type used by a raw floating-point or bit-vector representation.+reprCType :: Kind -> String+reprCType k@KFP{}            = arbitraryFPCType k+reprCType (KBounded False 1) = "SBool"+reprCType (KBounded False w) = "SWord" ++ show w+reprCType (KBounded True  w) = "SInt" ++ show w+reprCType k                  = error $ "SBV->C: Expected a raw floating-point or bit-vector representation, received " ++ show k++-- | Return the generated tag for a raw representation.+reprTag :: Kind -> String+reprTag (KFP eb sb)          = "f" ++ show eb ++ "_" ++ show sb+reprTag (KBounded False w)   = "u" ++ show w+reprTag (KBounded True  w)   = "s" ++ show w+reprTag k                    = error $ "SBV->C: Expected a raw floating-point or bit-vector representation, received " ++ show k++-- | Render a bit read from a raw representation.+reprGetBit :: Kind -> String -> String -> String+reprGetBit k@KFP{} value bit = prefix k ++ "_get(" ++ value ++ ", " ++ bit ++ ")"+reprGetBit k value bit+  | isWideBV k  = bvPrefix k ++ "_get(" ++ value ++ ", " ++ bit ++ ")"+  | isBounded k = "((((uint64_t) " ++ value ++ ") >> (" ++ bit ++ ")) & UINT64_C(1)) != 0"+  | otherwise   = error $ "SBV->C: Cannot read bits from " ++ show k++-- | Render a bit update to a raw representation.+reprSetBit :: Kind -> String -> String -> String -> String+reprSetBit k@KFP{} value bit bitValue = prefix k ++ "_set(&" ++ value ++ ", " ++ bit ++ ", " ++ bitValue ++ ");"+reprSetBit k value bit bitValue+  | isWideBV k  = bvPrefix k ++ "_set(&" ++ value ++ ", " ++ bit ++ ", " ++ bitValue ++ ");"+  | isBounded k = value ++ " = (" ++ reprCType k ++ ") ((uint64_t) " ++ value ++ " | ((uint64_t) (" ++ bitValue ++ ") << (" ++ bit ++ ")));"+  | otherwise   = error $ "SBV->C: Cannot update bits in " ++ show k++-- | Render the zero value for a raw representation.+reprZero :: Kind -> String+reprZero k@KFP{} = prefix k ++ "_zero()"+reprZero k+  | isWideBV k  = bvPrefix k ++ "_zero()"+  | isBounded k = "(" ++ reprCType k ++ ") 0"+  | otherwise   = error $ "SBV->C: Cannot construct a zero of " ++ show k++-- | Render canonicalization for a raw representation.+reprNormalize :: Kind -> String -> String+reprNormalize k@KFP{} value = prefix k ++ "_norm(" ++ value ++ ")"+reprNormalize k value+  | isWideBV k  = bvPrefix k ++ "_norm(" ++ value ++ ")"+  | isBounded k = value+  | otherwise   = error $ "SBV->C: Cannot normalize " ++ show k++-- | Return the generated namespace prefix for an exact-width bit-vector.+bvPrefix :: Kind -> String+bvPrefix (KBounded False w) = "sbv_bv_u" ++ show w+bvPrefix (KBounded True  w) = "sbv_bv_s" ++ show w+bvPrefix k                  = error $ "SBV->C: Expected a bit-vector kind, received " ++ show k++-- | Emit all helpers associated with a single floating-point format.+formatRuntime :: Kind -> [String]+formatRuntime k@(KFP eb sb) =+  ["#if BF_EXP_BITS_MAX < " ++ show eb+  , "#error \"The selected LibBF build cannot represent " ++ arbitraryFPCType k ++ "\""+  , "#endif"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_zero(void)"+  , "{"+  , "  " ++ ty ++ " r = {{0}};"+  , "  return r;"+  , "}"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_norm(" ++ ty ++ " a)"+  , "{"+  , "  a.limb[" ++ show (n - 1) ++ "] &= " ++ u64 mask ++ ";"+  , "  return a;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_get(" ++ ty ++ " a, limb_t bit)"+  , "{"+  , "  return bit < " ++ show width ++ " && ((a.limb[bit / 64] >> (bit % 64)) & UINT64_C(1)) != 0;"+  , "}"+  , ""+  , "static inline void " ++ p ++ "_set(" ++ ty ++ " *a, limb_t bit, bool value)"+  , "{"+  , "  const uint64_t m = UINT64_C(1) << (bit % 64);"+  , "  if (value) { a->limb[bit / 64] |= m; } else { a->limb[bit / 64] &= ~m; }"+  , "}"+  , ""+  , "static inline uint64_t " ++ p ++ "_slice(" ++ ty ++ " a, limb_t offset, limb_t count)"+  , "{"+  , "  uint64_t r = 0; limb_t i;"+  , "  for (i = 0; i < count; ++i) if (" ++ p ++ "_get(a, offset + i)) r |= UINT64_C(1) << i;"+  , "  return r;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_raw_eq(" ++ ty ++ " a, " ++ ty ++ " b)"+  , "{"+  , "  uint64_t r = 0; size_t i;"+  , "  for (i = 0; i < " ++ show n ++ "; ++i) r |= a.limb[i] ^ b.limb[i];"+  , "  return r == 0;"+  , "}"+  , ""+  , "static inline uint64_t " ++ p ++ "_exponent(" ++ ty ++ " a)"+  , "{"+  , "  return " ++ p ++ "_slice(a, " ++ show fracBits ++ ", " ++ show eb ++ ");"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_fraction_is_zero(" ++ ty ++ " a)"+  , "{"+  , "  limb_t i;"+  , "  for (i = 0; i < " ++ show fracBits ++ "; ++i) if (" ++ p ++ "_get(a, i)) return false;"+  , "  return true;"+  , "}"+  , ""+  , "static inline bool " ++ p ++ "_is_nan(" ++ ty ++ " a)"+  , "{ return " ++ p ++ "_exponent(a) == " ++ show expMask ++ " && !" ++ p ++ "_fraction_is_zero(a); }"+  , ""+  , "static inline bool " ++ p ++ "_is_infinite(" ++ ty ++ " a)"+  , "{ return " ++ p ++ "_exponent(a) == " ++ show expMask ++ " && " ++ p ++ "_fraction_is_zero(a); }"+  , ""+  , "static inline bool " ++ p ++ "_is_zero(" ++ ty ++ " a)"+  , "{ return " ++ p ++ "_exponent(a) == 0 && " ++ p ++ "_fraction_is_zero(a); }"+  , ""+  , "static inline bool " ++ p ++ "_is_subnormal(" ++ ty ++ " a)"+  , "{ return " ++ p ++ "_exponent(a) == 0 && !" ++ p ++ "_fraction_is_zero(a); }"+  , ""+  , "static inline bool " ++ p ++ "_is_normal(" ++ ty ++ " a)"+  , "{ const uint64_t e = " ++ p ++ "_exponent(a); return e != 0 && e != " ++ show expMask ++ "; }"+  , ""+  , "static inline bool " ++ p ++ "_is_negative(" ++ ty ++ " a)"+  , "{ return !" ++ p ++ "_is_nan(a) && " ++ p ++ "_get(a, " ++ show (width - 1) ++ "); }"+  , ""+  , "static inline bool " ++ p ++ "_is_positive(" ++ ty ++ " a)"+  , "{ return !" ++ p ++ "_is_nan(a) && !" ++ p ++ "_get(a, " ++ show (width - 1) ++ "); }"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_neg(" ++ ty ++ " a)"+  , "{ a.limb[" ++ show ((width - 1) `div` 64) ++ "] ^= UINT64_C(1) << " ++ show ((width - 1) `mod` 64) ++ "; return a; }"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_abs(" ++ ty ++ " a)"+  , "{ a.limb[" ++ show ((width - 1) `div` 64) ++ "] &= ~(UINT64_C(1) << " ++ show ((width - 1) `mod` 64) ++ "); return a; }"+  , ""+  , "static inline bool " ++ p ++ "_obj_eq(" ++ ty ++ " a, " ++ ty ++ " b)"+  , "{ return (" ++ p ++ "_is_nan(a) && " ++ p ++ "_is_nan(b)) || " ++ p ++ "_raw_eq(a, b); }"+  , ""+  , "static inline void " ++ p ++ "_decode(bf_context_t *ctx, bf_t *r, " ++ ty ++ " raw)"+  , "{"+  , "  const uint64_t e = " ++ p ++ "_exponent(raw);"+  , "  const bool sign = " ++ p ++ "_get(raw, " ++ show (width - 1) ++ ");"+  , "  bf_t chunk;"+  , "  bf_init(ctx, r); bf_init(ctx, &chunk);"+  , "  if (e == " ++ show expMask ++ ") {"+  , "    if (" ++ p ++ "_fraction_is_zero(raw)) bf_set_inf(r, sign); else bf_set_nan(r);"+  , "  } else if (e == 0 && " ++ p ++ "_fraction_is_zero(raw)) {"+  , "    bf_set_zero(r, sign);"+  , "  } else {"+  , "    bf_set_ui(r, e == 0 ? 0 : 1);"+  ]+  ++ concatMap decodeChunk chunks+  ++ ["    bf_mul_2exp(r, (slimb_t) e - " ++ show bias ++ " - " ++ show fracBits ++ " + (e == 0 ? 1 : 0), BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+     , "    if (sign) bf_neg(r);"+     , "  }"+     , "  bf_delete(&chunk);"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_encode(const bf_t *a)"+     , "{"+     , "  " ++ ty ++ " raw = " ++ p ++ "_zero(); limb_t i;"+     , "  if (bf_is_nan(a)) {"+     , "    for (i = 0; i < " ++ show eb ++ "; ++i) " ++ p ++ "_set(&raw, " ++ show fracBits ++ " + i, true);"+     , "    " ++ p ++ "_set(&raw, " ++ show (fracBits - 1) ++ ", true);"+     , "    return raw;"+     , "  }"+     , "  if (a->sign) " ++ p ++ "_set(&raw, " ++ show (width - 1) ++ ", true);"+     , "  if (a->expn == BF_EXP_INF) {"+     , "    for (i = 0; i < " ++ show eb ++ "; ++i) " ++ p ++ "_set(&raw, " ++ show fracBits ++ " + i, true);"+     , "    return raw;"+     , "  }"+     , "  if (a->expn != BF_EXP_ZERO) {"+     , "    const slimb_t biased = a->expn + " ++ show bias ++ " - 1;"+     , "    const bool normal = biased > 0;"+     , "    const uint64_t e = normal ? (uint64_t) biased : UINT64_C(0);"+     , "    const slimb_t base = (slimb_t) a->len * LIMB_BITS;"+     , "    for (i = 0; i < " ++ show eb ++ "; ++i) " ++ p ++ "_set(&raw, " ++ show fracBits ++ " + i, ((e >> i) & UINT64_C(1)) != 0);"+     , "    for (i = 0; i < " ++ show fracBits ++ "; ++i) {"+     , "      const slimb_t bit = normal ? base + (slimb_t) i - " ++ show sb+                                  ++ " : base + (slimb_t) i + 2 - " ++ show bias ++ " - " ++ show sb ++ " - a->expn;"+     , "      if (bit >= 0 && bit < base) " ++ p ++ "_set(&raw, i, ((a->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0);"+     , "    }"+     , "  }"+     , "  return raw;"+     , "}"+     , ""+     ]+  ++ arithmeticRuntime k+ where ty       = arbitraryFPCType k+       p        = prefix k+       width    = eb + sb+       fracBits = sb - 1+       n        = limbs k+       mask     = topMask k+       expMask  = (1 `shiftL` eb) - 1 :: Integer+       bias     = expMask `shiftR` 1+       chunks   = reverse [(offset, min 64 (fracBits - offset)) | offset <- [0, 64 .. fracBits - 1]]++       decodeChunk (offset, count) =+         ["    bf_mul_2exp(r, " ++ show count ++ ", BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+         , "    bf_set_ui(&chunk, " ++ p ++ "_slice(raw, " ++ show offset ++ ", " ++ show count ++ "));"+         , "    bf_add(r, r, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);"+         ]+formatRuntime k = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | Emit arithmetic and comparison adapters for one floating-point format.+arithmeticRuntime :: Kind -> [String]+arithmeticRuntime k@(KFP eb sb) =+  ["static inline bf_flags_t " ++ p ++ "_flags(bf_rnd_t rnd)"+  , "{ return (bf_flags_t) rnd | BF_FLAG_SUBNORMAL | bf_set_exp_bits(" ++ show eb ++ "); }"+  , ""+  , "static inline " ++ ty ++ " " ++ p ++ "_binary(" ++ ty ++ " a, " ++ ty ++ " b, bf_rnd_t rnd, int op)"+  , "{"+  , "  bf_context_t ctx; bf_t x, y, r; " ++ ty ++ " raw;"+  , "  bf_context_init(&ctx, sbv_bf_realloc, NULL);"+  , "  " ++ p ++ "_decode(&ctx, &x, a); " ++ p ++ "_decode(&ctx, &y, b); bf_init(&ctx, &r);"+  , "  if (op == 0) bf_add(&r, &x, &y, " ++ show sb ++ ", " ++ p ++ "_flags(rnd));"+  , "  else if (op == 1) bf_sub(&r, &x, &y, " ++ show sb ++ ", " ++ p ++ "_flags(rnd));"+  , "  else if (op == 2) bf_mul(&r, &x, &y, " ++ show sb ++ ", " ++ p ++ "_flags(rnd));"+  , "  else if (op == 3) bf_div(&r, &x, &y, " ++ show sb ++ ", " ++ p ++ "_flags(rnd));"+  , "  else bf_rem(&r, &x, &y, " ++ show sb ++ ", " ++ p ++ "_flags(BF_RNDN), BF_RNDN);"+  , "  raw = " ++ p ++ "_encode(&r);"+  , "  bf_delete(&r); bf_delete(&y); bf_delete(&x); bf_context_end(&ctx);"+  , "  return raw;"+  , "}"+  , ""+  ]+  ++ concatMap binaryWrapper [("add", 0), ("sub", 1), ("mul", 2), ("div", 3)]+  ++ ["static inline " ++ ty ++ " " ++ p ++ "_rem(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{ return " ++ p ++ "_binary(a, b, BF_RNDN, 4); }"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_sqrt(" ++ ty ++ " a, bf_rnd_t rnd)"+     , "{"+     , "  bf_context_t ctx; bf_t x, r; " ++ ty ++ " raw;"+     , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ p ++ "_decode(&ctx, &x, a); bf_init(&ctx, &r);"+     , "  bf_sqrt(&r, &x, " ++ show sb ++ ", " ++ p ++ "_flags(rnd)); raw = " ++ p ++ "_encode(&r);"+     , "  bf_delete(&r); bf_delete(&x); bf_context_end(&ctx); return raw;"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_round(" ++ ty ++ " a, bf_rnd_t rnd)"+     , "{"+     , "  bf_context_t ctx; bf_t x; " ++ ty ++ " raw;"+     , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ p ++ "_decode(&ctx, &x, a);"+     , "  bf_rint(&x, rnd); raw = " ++ p ++ "_encode(&x);"+     , "  bf_delete(&x); bf_context_end(&ctx); return raw;"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_fma(" ++ ty ++ " a, " ++ ty ++ " b, " ++ ty ++ " c, bf_rnd_t rnd)"+     , "{"+     , "  bf_context_t ctx; bf_t x, y, z, r; " ++ ty ++ " raw;"+     , "  bf_context_init(&ctx, sbv_bf_realloc, NULL);"+     , "  " ++ p ++ "_decode(&ctx, &x, a); " ++ p ++ "_decode(&ctx, &y, b); " ++ p ++ "_decode(&ctx, &z, c); bf_init(&ctx, &r);"+     , "  bf_mul(&r, &x, &y, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDN); bf_add(&r, &r, &z, " ++ show sb ++ ", " ++ p ++ "_flags(rnd));"+     , "  raw = " ++ p ++ "_encode(&r);"+     , "  bf_delete(&r); bf_delete(&z); bf_delete(&y); bf_delete(&x); bf_context_end(&ctx); return raw;"+     , "}"+     , ""+     , "static inline int " ++ p ++ "_compare(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  bf_context_t ctx; bf_t x, y; int result;"+     , "  bf_context_init(&ctx, sbv_bf_realloc, NULL); " ++ p ++ "_decode(&ctx, &x, a); " ++ p ++ "_decode(&ctx, &y, b);"+     , "  result = bf_cmp(&x, &y); bf_delete(&y); bf_delete(&x); bf_context_end(&ctx); return result;"+     , "}"+     , ""+     , "static inline bool " ++ p ++ "_eq(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{ return " ++ p ++ "_compare(a, b) == 0; }"+     , ""+     , "static inline bool " ++ p ++ "_lt(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{ return " ++ p ++ "_compare(a, b) < 0; }"+     , ""+     , "static inline bool " ++ p ++ "_le(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{ return " ++ p ++ "_compare(a, b) <= 0; }"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_min(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  if (" ++ p ++ "_is_nan(a)) return b; if (" ++ p ++ "_is_nan(b)) return a;"+     , "  if (" ++ p ++ "_is_zero(a) && " ++ p ++ "_is_zero(b)) return " ++ p ++ "_is_negative(a) ? a : b;"+     , "  return " ++ p ++ "_lt(a, b) ? a : b;"+     , "}"+     , ""+     , "static inline " ++ ty ++ " " ++ p ++ "_max(" ++ ty ++ " a, " ++ ty ++ " b)"+     , "{"+     , "  if (" ++ p ++ "_is_nan(a)) return b; if (" ++ p ++ "_is_nan(b)) return a;"+     , "  if (" ++ p ++ "_is_zero(a) && " ++ p ++ "_is_zero(b)) return " ++ p ++ "_is_negative(a) ? b : a;"+     , "  return " ++ p ++ "_lt(b, a) ? a : b;"+     , "}"+     , ""+     ]+ where ty = arbitraryFPCType k+       p  = prefix k++       binaryWrapper :: (String, Int) -> [String]+       binaryWrapper (nm, op) =+         ["static inline " ++ ty ++ " " ++ p ++ "_" ++ nm ++ "(" ++ ty ++ " a, " ++ ty ++ " b, bf_rnd_t rnd)"+         , "{ return " ++ p ++ "_binary(a, b, rnd, " ++ show op ++ "); }"+         , ""]+arithmeticRuntime k = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | Render the LibBF rounding mode corresponding to an SBV value.+bfRoundingMode :: [(SV, CV)] -> SV -> Doc+bfRoundingMode consts sv = case sv `lookup` consts of+  Just (CV k (CADT (rmName, [])))+    | isRoundingMode k -> maybe bad (text . snd) (lookup rmName roundingModeNames)+  Nothing+    | isRoundingMode sv -> namedCall "sbv_bf_rounding_mode" [text (show sv)]+  _                     -> bad+ where bad = error $ "SBV->C: Expected a rounding mode, received " ++ show sv++-- | Mapping from SBV constructor names to public C and LibBF constants.+roundingModeNames :: [(String, (String, String))]+roundingModeNames =+  [ ("RoundNearestTiesToEven", ("SBV_RM_RNE", "BF_RNDN"))+  , ("RoundNearestTiesToAway", ("SBV_RM_RNA", "BF_RNDNA"))+  , ("RoundTowardPositive",    ("SBV_RM_RTP", "BF_RNDU"))+  , ("RoundTowardNegative",    ("SBV_RM_RTN", "BF_RNDD"))+  , ("RoundTowardZero",        ("SBV_RM_RTZ", "BF_RNDZ"))+  ]++-- | Render a C function call.+namedCall :: String -> [Doc] -> Doc+namedCall nm args = text nm P.<> parens (fsep (punctuate comma args))++-- | Return the number of raw 64-bit limbs occupied by an arbitrary float.+limbs :: Kind -> Int+limbs k = (intSizeOf k + 63) `div` 64++-- | Return the mask for the high raw limb of an arbitrary float.+topMask :: Kind -> Integer+topMask k+  | r == 0    = (1 `shiftL` 64) - 1+  | otherwise = (1 `shiftL` r) - 1+ where r = intSizeOf k `mod` 64++-- | Return the generated namespace prefix for a floating-point format.+prefix :: Kind -> String+prefix (KFP eb sb) = "sbv_fp_e" ++ show eb ++ "_s" ++ show sb+prefix k           = error $ "SBV->C: Expected an arbitrary floating-point kind, received " ++ show k++-- | Render raw interchange bits as a C compound literal.+rawLiteral :: Kind -> Integer -> String+rawLiteral k bits = "(" ++ arbitraryFPCType k ++ "){{" ++ intercalate ", " words64 ++ "}}"+ where words64 = [u64 ((bits `shiftR` (64 * i)) .&. ((1 `shiftL` 64) - 1)) | i <- [0 .. limbs k - 1]]++-- | Render an integer as a padded, portable C @uint64_t@ literal.+u64 :: Integer -> String+u64 i = "UINT64_C(0x" ++ pad 16 (showHex i "") ++ ")"+ where pad n s = replicate (n - length s) '0' ++ s
+ Data/SBV/Compilers/C/Finite.hs view
@@ -0,0 +1,40 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Finite+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Finite SMT-object domains shared by C collection lowering.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Finite (finiteDomainSize) where++import qualified Data.Set as Set++import Data.SBV.Core.Data++-- | Count distinct SMT objects without imposing a machine-integer limit.+-- All NaN encodings denote one object; signed zeros remain distinct. The+-- constructor callback resolves ADT references without a module dependency+-- cycle. Recursive and unbounded domains return 'Nothing'.+finiteDomainSize :: (Kind -> [[Kind]]) -> Kind -> Maybe Integer+finiteDomainSize constructorsOf = count Set.empty+ where count _ KBool                 = Just 2+       count _ (KBounded _ width)     = Just (2 ^ width)+       count _ KFloat                = Just (2 ^ (32 :: Int) - 2 ^ (24 :: Int) + 3)+       count _ KDouble               = Just (2 ^ (64 :: Int) - 2 ^ (53 :: Int) + 3)+       count _ KChar                 = Just 0x30000+       count _ (KFP eb sb)            = Just (2 ^ (eb + sb) - 2 ^ sb + 3)+       count seen (KTuple fields)     = product <$> mapM (count seen) fields+       count seen kind+         | isRoundingMode kind = Just 5+         | concrete kind, kind `Set.notMember` seen+         = sum <$> mapM (fmap product . mapM (count (Set.insert kind seen))) (constructorsOf kind)+         | True = Nothing++       concrete KApp{} = True+       concrete kind   = isADT kind && not (isUninterpreted kind)
+ Data/SBV/Compilers/C/GMP.hs view
@@ -0,0 +1,801 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.GMP+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Exact GMP-backed lowering of unbounded integers, reals, and rationals to C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.GMP+  ( isExactGMPKind+  , gmpEqual+  , gmpTypeDecls+  , gmpRuntime+  , gmpConst+  , gmpExpr+  , gmpPrint+  , gmpSet+  , gmpFunctionName+  , gmpNewName+  , gmpInitializeCopy+  , gmpDriverAssign+  , gmpOutputType+  , gmpArrayType+  , gmpDriverInitialize+  , gmpDriverInit+  , gmpDriverClear+  , gmpContextStart+  , gmpContextEnd+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.Bits                       (shiftL)+import Data.List                       (nub, stripPrefix, tails)+import Data.Ratio                      (denominator, numerator)+import qualified Data.Set as Set+import qualified Data.Text as T+import Numeric                         (showHex)++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.BV         (isWideBV, mappedIntegerKind)+import Data.SBV.Compilers.C.Lowering   (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.CodeGen      (CgConfig(..))+import Data.SBV.Core.Data+import Data.SBV.Core.Symbolic          (NROp(..))++-- | Test whether a kind uses the exact GMP representation under this+-- configuration. Supplying 'Data.SBV.Tools.CodeGen.cgIntegerSize' or+-- 'Data.SBV.Tools.CodeGen.cgSRealType' selects the+-- historical lossy representation for 'KUnbounded' or 'KReal'; 'KRational'+-- is always exact.+isExactGMPKind :: CgConfig -> Kind -> Bool+isExactGMPKind cfg KUnbounded = case cgInteger cfg of+                                  Nothing -> True+                                  Just{}  -> False+isExactGMPKind cfg KReal      = case cgReal cfg of+                                  Nothing -> True+                                  Just{}  -> False+isExactGMPKind _   KRational  = True+isExactGMPKind _   _          = False++-- | Compare two exact GMP-backed values for equality.+gmpEqual :: Kind -> Doc -> Doc -> Doc+gmpEqual kind left right = parens $ namedCall (kindPrefix kind ++ "cmp") [left, right] <+> text "==" <+> text "0"++-- | Declare the GMP-backed public C types required by the supplied kinds.+-- Inputs are borrowed read-only pointers. Outputs and exact return parameters+-- are caller-initialized mutable GMP pointers.+gmpTypeDecls :: CgConfig -> Set.Set Kind -> Doc+gmpTypeDecls cfg kinds+  | not needsExactInteger && not needsExactQuotient = empty+  | True                                            = text . unlines $+      ["/* Exact integers, reals, and rationals. Inputs are borrowed; scalar outputs are caller-initialized. */"+      , "/* Initialize each scalar/group output with mpz_init or mpq_init; clear it after its last use. */"+      , "/* Aggregate outputs instead receive fresh owned values, including any embedded GMP fields. */"+      , "#include <gmp.h>"+      , cUnusedAttribute]+   ++ integerDecls+   ++ realDecls+   ++ rationalDecls+   ++ [""]+ where needsExactInteger  = isExactGMPKind cfg KUnbounded && KUnbounded `Set.member` kinds+       needsExactReal     = isExactGMPKind cfg KReal      && KReal      `Set.member` kinds+       needsRational      = KRational `Set.member` kinds+       needsExactQuotient = needsExactReal || needsRational++       integerDecls+         | needsExactInteger = [ "#ifndef SBV_GMP_INTEGER_DEFINED"+                               , "#define SBV_GMP_INTEGER_DEFINED"+                               , "typedef mpz_srcptr SInteger;"+                               , "#endif"+                               ]+         | True              = []++       realDecls+         | needsExactReal = [ "#ifndef SBV_GMP_REAL_DEFINED"+                            , "#define SBV_GMP_REAL_DEFINED"+                            , "typedef mpq_srcptr SReal;"+                            , "#endif"+                            ]+         | True           = []++       rationalDecls+         | needsRational = [ "#ifndef SBV_GMP_RATIONAL_DEFINED"+                           , "#define SBV_GMP_RATIONAL_DEFINED"+                           , "typedef mpq_srcptr SRational;"+                           , "#endif"+                           ]+         | True          = []++-- | Emit the per-call arena and the exact numeric helpers required by a+-- program. Every temporary GMP value is released together at function exit.+gmpRuntime :: CgConfig -> Set.Set Kind -> [(SV, SBVExpr)] -> Doc+gmpRuntime cfg kinds assignments+  | not needsExactInteger && not needsExactQuotient = empty+  | True                                            = text . unlines . map markUnused $+      commonRuntime+   ++ [""]+   ++ concat [integerRuntime needsIntegerShifts | needsExactInteger]+   ++ concat [realRuntime     | needsExactQuotient]+   ++ concat [rationalRuntime cfg | needsRational]+   ++ concat [crossRuntime    | needsExactInteger && needsExactQuotient]+   ++ concatMap nativeGMPResultRuntime (nativeGMPResultKinds cfg assignments)+   ++ concat [concatMap wideIntegerRuntime conversions | needsExactInteger]+   ++ concat [concatMap wideQuotientRuntime quotientConversions | needsExactQuotient]+ where needsExactInteger   = isExactGMPKind cfg KUnbounded && KUnbounded `Set.member` kinds+       needsExactReal      = isExactGMPKind cfg KReal      && KReal      `Set.member` kinds+       needsRational       = KRational `Set.member` kinds+       needsExactQuotient  = needsExactReal || needsRational+       conversions         = nub (concatMap wideIntegerConversions assignments)+       quotientConversions = nub (concatMap wideQuotientConversions assignments)+       needsIntegerShifts = any integerShift assignments+       integerShift (result, SBVApp operation _)+         | kindOf result == KUnbounded = case operation of+             Shl   -> True+             Shr   -> True+             Rol{} -> True+             Ror{} -> True+             _     -> False+         | True = False++       markUnused line = case stripPrefix "static " line of+                           Just rest -> "static SBV_CGEN_UNUSED " ++ rest+                           Nothing   -> line++-- | Render an exact integer, real, or rational constant as an arena allocation.+gmpConst :: CgConfig -> CV -> Maybe Doc+gmpConst cfg (CV KUnbounded (CInteger i))+  | isExactGMPKind cfg KUnbounded+  = Just $ namedCall "sbv_gmp_integer_const" [text "&sbv_local_gmp_ctx", doubleQuotes (integer i)]+gmpConst cfg (CV KReal (CAlgReal (AlgRational _ r)))+  | isExactGMPKind cfg KReal+  = Just $ namedCall "sbv_gmp_real_const" [text "&sbv_local_gmp_ctx", doubleQuotes (text value)]+  where value = show (numerator r) ++ "/" ++ show (denominator r)+gmpConst cfg (CV KReal (CAlgReal r))+  | isExactGMPKind cfg KReal+  = error $ "SBV->C: GMP-backed SReal constants must be rational, received " ++ show r+gmpConst _ (CV KRational (CRational r))+  = Just $ namedCall "sbv_gmp_real_const" [text "&sbv_local_gmp_ctx", doubleQuotes (text value)]+  where value = show (numerator r) ++ "/" ++ show (denominator r)+gmpConst _ _ = Nothing++-- | Lower an operation involving an exact GMP value. A 'Nothing' result+-- delegates the operation to another C lowering module.+gmpExpr :: CgConfig -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+gmpExpr cfg op svs resultKind args+  | not (isExactGMPKind cfg resultKind || any (isExactGMPKind cfg . kindOf) svs)+  = Nothing+  | IEEEFP{} <- op+  = Nothing+  | KindCast fr to <- op+  , Just{} <- cgReal cfg+  , KReal `elem` [fr, to]+  = Nothing+  | LkUp{} <- op+  = Nothing+  | Uninterpreted functionName <- op+  , T.unpack functionName /= "sbv.rat.numerator"+  , T.unpack functionName /= "sbv.rat.denominator"+  = Nothing+  | True+  = case (op, args, svs) of+      (Label _              , [a]      , _)   -> lower a+      (Plus                 , [a, b]   , x:_) -> lower $ valueCall x "add" [a, b]+      (Minus                , [a, b]   , x:_) -> lower $ valueCall x "sub" [a, b]+      (Times                , [a, b]   , x:_) -> lower $ valueCall x "mul" [a, b]+      (NonLinear NR_IntPow  , [a, b]   , x:_) -> lower $ valueCall x "pow" [a, b]+      (UNeg                 , [a]      , x:_) -> lower $ valueCall x "neg" [a]+      (Abs                  , [a]      , x:_) -> lower $ valueCall x "abs" [a]+      (Quot                 , [a, b]   , x:_) -> lower $ valueCall x "quot" [a, b]+      (RationalConstructor  , [n, d]   , _)   -> lower $ namedCall "sbv_gmp_rational_construct" [text "&sbv_local_gmp_ctx", n, d]+      (Uninterpreted funName, [a]      , _)+        | T.unpack funName == "sbv.rat.numerator"   -> lower $ namedCall "sbv_gmp_rational_numerator" [a]+        | T.unpack funName == "sbv.rat.denominator" -> lower $ namedCall "sbv_gmp_rational_denominator" [a]+      (Rem                  , [a, b]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "rem" [a, b]+      (And                  , [a, b]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "and" [a, b]+      (Or                   , [a, b]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "or" [a, b]+      (XOr                  , [a, b]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "xor" [a, b]+      (Not                  , [a]      , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "com" [a]+      (Shl                  , [a, n]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "shl" [a, n]+      (Shr                  , [a, n]   , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "shr" [a, n]+      (Rol n                , [a]      , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "shl" [a, integerValue n]+      (Ror n                , [a]      , x:_)+        | kindOf x == KUnbounded                   -> lower $ valueCall x "shr" [a, integerValue n]+      (Equal _              , [a, b]   , x:_) -> lower $ comparison x "==" a b+      (NotEqual             , as       , x:_) -> lower $ distinctExpr x as+      (LessThan             , [a, b]   , x:_) -> lower $ comparison x "<"  a b+      (GreaterThan          , [a, b]   , x:_) -> lower $ comparison x ">"  a b+      (LessEq               , [a, b]   , x:_) -> lower $ comparison x "<=" a b+      (GreaterEq            , [a, b]   , x:_) -> lower $ comparison x ">=" a b+      (Divides n            , [a]      , x:_)+        | kindOf x == KUnbounded                   -> lower $ namedCall "sbv_gmp_integer_divides"+                                                               [namedCall "sbv_gmp_integer_const" [text "&sbv_local_gmp_ctx", doubleQuotes (integer n)], a]+      (KindCast fr to       , [a]      , _)   -> gmpCast fr to a+      _ -> unsupported+ where lower = lowerWith [CRequiresGMP]++       lowerWith requirements = Just . expressionLowering requirements++       valueCall sv suffix = namedCall (kindPrefix (kindOf sv) ++ suffix) . (text "&sbv_local_gmp_ctx" :)++       comparison sv relation a b = parens $ namedCall (kindPrefix (kindOf sv) ++ "cmp") [a, b] <+> text relation <+> text "0"++       integerValue value = namedCall "sbv_gmp_integer_const" [text "&sbv_local_gmp_ctx", doubleQuotes (integer (fromIntegral value))]++       distinctExpr sv as = fsep $ punctuate (text " &&")+                                  [parens (namedCall (kindPrefix (kindOf sv) ++ "cmp") [a, b] <+> text "!= 0")+                                  | (a:rest) <- tails as, b <- rest]++       gmpCast fr to a+         | fr == to = lower a+         | fr == KUnbounded && to `elem` [KReal, KRational]+         = if isExactGMPKind cfg KUnbounded+           then lower $ namedCall "sbv_gmp_real_from_integer" [text "&sbv_local_gmp_ctx", a]+           else lower $ namedCall "sbv_gmp_real_from_s64"+                                  [text "&sbv_local_gmp_ctx", parens (text "int64_t") <+> a]+         | fr == KReal && to == KUnbounded+         = if isExactGMPKind cfg to+           then lower $ namedCall "sbv_gmp_integer_from_real" [text "&sbv_local_gmp_ctx", a]+           else lower $ nativeResult to (namedCall "sbv_gmp_real_low_u64" [a])+         | isWideBV fr && to `elem` [KReal, KRational]+         = lowerWith [CRequiresGMP, CRequiresWideBV] $ namedCall (quotientFromWideName fr) [text "&sbv_local_gmp_ctx", a]+         | isWideBV fr && to == KUnbounded+         = lowerWith [CRequiresGMP, CRequiresWideBV] $ namedCall (integerFromWideName fr) [text "&sbv_local_gmp_ctx", a]+         | fr == KUnbounded && isWideBV to+         = lowerWith [CRequiresGMP, CRequiresWideBV] $ namedCall (integerToWideName to) [a]+         | isBounded fr && intSizeOf fr <= 64 && to == KUnbounded+         = lower $ namedCall (if hasSign fr then "sbv_gmp_integer_from_s64" else "sbv_gmp_integer_from_u64")+                             [text "&sbv_local_gmp_ctx", parens (text (if hasSign fr then "int64_t" else "uint64_t")) <+> a]+         | fr == KUnbounded && isBounded to && not (isWideBV to)+         = lower $ nativeResult to (namedCall "sbv_gmp_integer_low_u64" [a])+         | isBounded fr && intSizeOf fr <= 64 && to `elem` [KReal, KRational]+         = lower $ namedCall (if hasSign fr then "sbv_gmp_real_from_s64" else "sbv_gmp_real_from_u64")+                             [text "&sbv_local_gmp_ctx", parens (text (if hasSign fr then "int64_t" else "uint64_t")) <+> a]+         | fr == KReal && isBounded to && not (isWideBV to)+         = lower $ nativeResult to (namedCall "sbv_gmp_real_low_u64" [a])+         | otherwise+         = unsupportedCast fr to++       nativeResult to value = namedCall (nativeGMPResultName (mappedIntegerKind (cgInteger cfg) to)) [value]++       unsupported = error $ "SBV->C: exact GMP lowering does not yet support " ++ show op+                          ++ " with argument kinds " ++ show (map kindOf svs)+                          ++ " and result kind " ++ show resultKind++       unsupportedCast fr to = error $ "SBV->C: exact GMP lowering does not yet support a cast from " ++ show fr ++ " to " ++ show to++-- | Discover native result representations for exact GMP casts. Explicitly+-- mapped integers use the same low-bit conversion as signed bit-vectors.+nativeGMPResultKinds :: CgConfig -> [(SV, SBVExpr)] -> [Kind]+nativeGMPResultKinds cfg = nub . concatMap resultKind+ where resultKind (_, SBVApp (KindCast fr to) _)+         | isExactGMPKind cfg fr+         , let target = mappedIntegerKind (cgInteger cfg) to+         , isBounded target+         , not (isWideBV target) = [target]+       resultKind _ = []++-- | Name a helper that interprets low integer bits in a native representation.+nativeGMPResultName :: Kind -> String+nativeGMPResultName kind = "sbv_gmp_low_bits_" ++ boundedTag kind++-- | Convert reduced unsigned bits without implementation-defined signed+-- narrowing or C's nonzero-to-Boolean conversion. A one-bit vector uses bit 0.+nativeGMPResultRuntime :: Kind -> [String]+nativeGMPResultRuntime kind =+  [ "static " ++ boundedCType kind ++ " " ++ nativeGMPResultName kind ++ "(uint64_t value)"+  , "{"+  ]+  ++ result+  ++ ["}", ""]+ where result+         | kind == KBounded False 1+         = ["  return (value & UINT64_C(1)) != 0;"]+         | hasSign kind+         = [ "  const SWord" ++ show (intSizeOf kind) ++ " bits = (SWord" ++ show (intSizeOf kind) ++ ") value;"+           , "  " ++ boundedCType kind ++ " result; memcpy(&result, &bits, sizeof result); return result;"+           ]+         | True+         = ["  return (" ++ boundedCType kind ++ ") value;"]++-- | A generated conversion between a limb-backed bit-vector and an exact GMP+-- integer.+data WideIntegerConversion = IntegerFromWide Kind+                           | IntegerToWide Kind+                           deriving Eq++-- | Discover wide bit-vector and exact-integer casts in one symbolic+-- assignment.+wideIntegerConversions :: (SV, SBVExpr) -> [WideIntegerConversion]+wideIntegerConversions (_, SBVApp (KindCast fr to) _)+  | isWideBV fr && to == KUnbounded = [IntegerFromWide fr]+  | fr == KUnbounded && isWideBV to = [IntegerToWide to]+wideIntegerConversions _ = []++-- | A generated conversion from a limb-backed bit-vector to an exact GMP+-- real or rational.+newtype WideQuotientConversion = QuotientFromWide Kind+                              deriving Eq++-- | Discover limb-backed bit-vector to exact real or rational casts in one+-- symbolic assignment.+wideQuotientConversions :: (SV, SBVExpr) -> [WideQuotientConversion]+wideQuotientConversions (_, SBVApp (KindCast fr to) _)+  | isWideBV fr+  , to `elem` [KReal, KRational] = [QuotientFromWide fr]+wideQuotientConversions _ = []++-- | Emit an exact conversion helper for one wide bit-vector kind.+wideIntegerRuntime :: WideIntegerConversion -> [String]+wideIntegerRuntime (IntegerFromWide k) =+  [ "static SInteger " ++ integerFromWideName k ++ "(sbv_gmp_ctx *ctx, " ++ boundedCType k ++ " a)"+  , "{"+  , "  mpz_ptr r = sbv_gmp_new_integer(ctx);"+  , "  mpz_import(r, " ++ show limbCount ++ ", -1, sizeof(a.limb[0]), 0, 0, a.limb);"+  ]+  ++ signedAdjustment+  ++ [ "  return r;"+     , "}"+     , ""+     ]+ where limbCount = (intSizeOf k + 63) `div` 64+       signedAdjustment+         | hasSign k =+             [ "  if ((a.limb[" ++ show topLimb ++ "] & " ++ u64 signMask ++ ") != 0) {"+             , "    mpz_t modulus; mpz_init_set_ui(modulus, 1); mpz_mul_2exp(modulus, modulus, " ++ show width ++ ");"+             , "    mpz_sub(r, r, modulus); mpz_clear(modulus);"+             , "  }"+             ]+         | True = []+       width    = intSizeOf k+       topLimb  = (width - 1) `div` 64+       signMask = 1 `shiftL` ((width - 1) `mod` 64)+wideIntegerRuntime (IntegerToWide k) =+  [ "static " ++ boundedCType k ++ " " ++ integerToWideName k ++ "(SInteger a)"+  , "{"+  , "  " ++ boundedCType k ++ " r = {{0}}; size_t count = 0; mpz_t reduced;"+  , "  mpz_init(reduced); mpz_fdiv_r_2exp(reduced, a, " ++ show (intSizeOf k) ++ ");"+  , "  mpz_export(r.limb, &count, -1, sizeof(r.limb[0]), 0, 0, reduced); mpz_clear(reduced);"+  , "  r.limb[" ++ show (limbCount - 1) ++ "] &= " ++ u64 topMask ++ ";"+  , "  return r;"+  , "}"+  , ""+  ]+ where limbCount = (intSizeOf k + 63) `div` 64+       remainder = intSizeOf k `mod` 64+       topMask+         | remainder == 0 = (1 `shiftL` 64) - 1+         | True           = (1 `shiftL` remainder) - 1++-- | Emit an exact real-or-rational conversion helper for one wide bit-vector+-- kind.+wideQuotientRuntime :: WideQuotientConversion -> [String]+wideQuotientRuntime (QuotientFromWide k) =+  [ "static mpq_srcptr " ++ quotientFromWideName k ++ "(sbv_gmp_ctx *ctx, " ++ boundedCType k ++ " a)"+  , "{"+  , "  mpq_ptr r = sbv_gmp_new_real(ctx);"+  , "  mpz_import(mpq_numref(r), " ++ show limbCount ++ ", -1, sizeof(a.limb[0]), 0, 0, a.limb);"+  ]+  ++ signedAdjustment+  ++ [ "  return r;"+     , "}"+     , ""+     ]+ where limbCount = (intSizeOf k + 63) `div` 64+       signedAdjustment+         | hasSign k =+             [ "  if ((a.limb[" ++ show topLimb ++ "] & " ++ u64 signMask ++ ") != 0) {"+             , "    mpz_t modulus; mpz_init_set_ui(modulus, 1); mpz_mul_2exp(modulus, modulus, " ++ show width ++ ");"+             , "    mpz_sub(mpq_numref(r), mpq_numref(r), modulus); mpz_clear(modulus);"+             , "  }"+             ]+         | True = []+       width    = intSizeOf k+       topLimb  = (width - 1) `div` 64+       signMask = 1 `shiftL` ((width - 1) `mod` 64)++-- | Construct the helper name for a wide bit-vector to exact-integer cast.+integerFromWideName :: Kind -> String+integerFromWideName k = "sbv_gmp_integer_from_" ++ boundedTag k++-- | Construct the helper name for an exact-integer to wide bit-vector cast.+integerToWideName :: Kind -> String+integerToWideName k = "sbv_gmp_integer_to_" ++ boundedTag k++-- | Construct the helper name for a wide bit-vector to an exact GMP quotient.+quotientFromWideName :: Kind -> String+quotientFromWideName k = "sbv_gmp_real_from_" ++ boundedTag k++-- | Return the C type used for a bounded SBV kind.+boundedCType :: Kind -> String+boundedCType (KBounded False 1) = "SBool"+boundedCType (KBounded False w) = "SWord" ++ show w+boundedCType (KBounded True  w) = "SInt"  ++ show w+boundedCType k                  = error $ "SBV->C: Expected a bounded kind, received " ++ show k++-- | Return the signedness-and-width suffix used in a conversion helper name.+boundedTag :: Kind -> String+boundedTag k+  | isBounded k = (if hasSign k then "s" else "u") ++ show (intSizeOf k)+  | True        = error $ "SBV->C: Expected a bounded kind, received " ++ show k++-- | Render a padded, portable C @uint64_t@ literal.+u64 :: Integer -> String+u64 value = "UINT64_C(0x" ++ replicate (16 - length rendered) '0' ++ rendered ++ ")"+ where rendered = showHex value ""++-- | Print an exact GMP value in canonical decimal notation.+gmpPrint :: Kind -> Doc -> Doc+gmpPrint KUnbounded value = namedCall "gmp_printf" [doubleQuotes (text "%Zd"), value]+gmpPrint KReal      value = namedCall "gmp_printf" [doubleQuotes (text "%Qd"), value]+gmpPrint KRational  value = namedCall "gmp_printf" [doubleQuotes (text "%Qd"), value]+gmpPrint k          _     = error $ "SBV->C: Expected an exact GMP kind, received " ++ show k++-- | Copy an internal immutable exact value into caller-owned GMP storage.+gmpSet :: Kind -> Doc -> Doc -> Doc+gmpSet kind target value = namedCall (gmpFunctionName kind "set") [target, value]++-- | Select a public GMP operation for storage already known to use the exact+-- representation. Callers must check 'isExactGMPKind' before using this for a+-- configurable integer or real kind.+gmpFunctionName :: Kind -> String -> String+gmpFunctionName kind suffix = gmpPrefix kind ++ suffix++-- | Public GMP namespace for a kind whose storage has already been selected+-- as exact. Representation selection belongs to 'isExactGMPKind'; this helper+-- supplies the common prefix of both function and type names.+gmpPrefix :: Kind -> String+gmpPrefix KUnbounded = "mpz_"+gmpPrefix KReal      = "mpq_"+gmpPrefix KRational  = "mpq_"+gmpPrefix kind       = error $ "SBV->C: Expected an exact GMP kind, received " ++ show kind++-- | Name the arena allocator for an exact value. It returns initialized,+-- mutable GMP storage owned by the supplied arena.+gmpNewName :: Kind -> String+gmpNewName KUnbounded = "sbv_gmp_new_integer"+gmpNewName KReal      = "sbv_gmp_new_real"+gmpNewName KRational  = "sbv_gmp_new_real"+gmpNewName kind       = error $ "SBV->C: Expected an exact GMP kind, received " ++ show kind++-- | Initialize uninitialized exact storage with a copy. GMP provides a+-- combined operation for integers, but rationals require two calls.+gmpInitializeCopy :: Kind -> Doc -> Doc -> Doc+gmpInitializeCopy KUnbounded target value = namedCall "mpz_init_set" [target, value] P.<> semi+gmpInitializeCopy kind       target value = namedCall (gmpFunctionName kind "init") [target] P.<> semi+                                        $$ gmpSet kind target value P.<> semi++-- | Assign an integer-valued decimal driver sample to an initialized field.+-- The field may have the immutable public pointer type, so cast back to its+-- owned mutable storage. Rational values are canonicalized after parsing.+gmpDriverAssign :: Kind -> Doc -> Doc -> [Doc]+gmpDriverAssign kind access value+  = ( text "if" <+> parens (namedCall (gmpFunctionName kind "set_str") [target, doubleQuotes value, text "10"] <+> text "!= 0")+                <+> namedCall "abort" [] P.<> semi+    )+  : [namedCall (gmpFunctionName kind "canonicalize") [target] P.<> semi | kind /= KUnbounded]+ where target = parens (text (gmpOutputType kind)) <+> access++-- | Return the mutable GMP pointer type used for an output parameter.+gmpOutputType :: Kind -> String+gmpOutputType kind = gmpPrefix kind ++ "ptr"++-- | Return the mutable GMP storage type used for one element of a generated+-- fixed-size array.+gmpArrayType :: Kind -> String+gmpArrayType kind = gmpPrefix kind ++ "t"++-- | Initialize already-declared caller-owned GMP storage from an+-- integer-valued driver sample.+gmpDriverInitialize :: Kind -> Doc -> Doc -> Doc+gmpDriverInitialize KUnbounded storage value = namedCall "mpz_init_set_str" [storage, doubleQuotes value, text "10"] P.<> semi+gmpDriverInitialize KReal      storage value = namedCall "mpq_init" [storage] P.<> semi+                                             $$ namedCall "mpq_set_str" [storage, doubleQuotes value, text "10"] P.<> semi+                                             $$ namedCall "mpq_canonicalize" [storage] P.<> semi+gmpDriverInitialize KRational  storage value = namedCall "mpq_init" [storage] P.<> semi+                                             $$ namedCall "mpq_set_str" [storage, doubleQuotes value, text "10"] P.<> semi+                                             $$ namedCall "mpq_canonicalize" [storage] P.<> semi+gmpDriverInitialize kind       _       _     = error $ "SBV->C: Expected an exact GMP kind, received " ++ show kind++-- | Declare and initialize a caller-owned GMP value from an integer-valued+-- driver sample.+gmpDriverInit :: Kind -> Doc -> Doc -> Doc+gmpDriverInit kind storage value = text (gmpArrayType kind) <+> storage P.<> semi+                                $$ gmpDriverInitialize kind storage value++-- | Clear caller-owned GMP storage in a generated driver.+gmpDriverClear :: Kind -> Doc -> Doc+gmpDriverClear kind storage = namedCall (gmpFunctionName kind "clear") [storage] P.<> semi++-- | Initialize the arena used by exact temporaries in a generated function.+gmpContextStart :: Doc+gmpContextStart = text "sbv_gmp_ctx sbv_local_gmp_ctx = {NULL};"++-- | Release all exact temporaries allocated by a generated function.+gmpContextEnd :: Doc+gmpContextEnd = namedCall "sbv_gmp_ctx_end" [text "&sbv_local_gmp_ctx"] P.<> semi++-- | Return the generated helper namespace for an exact numeric kind.+kindPrefix :: Kind -> String+kindPrefix KUnbounded = "sbv_gmp_integer_"+kindPrefix KReal      = "sbv_gmp_real_"+kindPrefix KRational  = "sbv_gmp_real_"+kindPrefix k          = error $ "SBV->C: Expected an exact GMP kind, received " ++ show k++-- | Render a C function call.+namedCall :: String -> [Doc] -> Doc+namedCall nm args = text nm P.<> parens (fsep (punctuate comma args))++-- | Runtime shared by exact integers, reals, and rationals.+commonRuntime :: [String]+commonRuntime =+  ["/* Per-call ownership arena for exact GMP temporaries. */"+  , "typedef struct sbv_gmp_node {"+  , "  struct sbv_gmp_node *next;"+  , "  bool is_real;"+  , "  union { mpz_t integer; mpq_t real; } value;"+  , "} sbv_gmp_node;"+  , ""+  , "typedef struct { sbv_gmp_node *head; } sbv_gmp_ctx;"+  , ""+  , "static mpz_ptr sbv_gmp_new_integer(sbv_gmp_ctx *ctx)"+  , "{"+  , "  sbv_gmp_node *node = (sbv_gmp_node *) malloc(sizeof(*node));"+  , "  if (node == NULL) abort();"+  , "  node->next = ctx->head; node->is_real = false; ctx->head = node;"+  , "  mpz_init(node->value.integer);"+  , "  return node->value.integer;"+  , "}"+  , ""+  , "static mpq_ptr sbv_gmp_new_real(sbv_gmp_ctx *ctx)"+  , "{"+  , "  sbv_gmp_node *node = (sbv_gmp_node *) malloc(sizeof(*node));"+  , "  if (node == NULL) abort();"+  , "  node->next = ctx->head; node->is_real = true; ctx->head = node;"+  , "  mpq_init(node->value.real);"+  , "  return node->value.real;"+  , "}"+  , ""+  , "static void sbv_gmp_ctx_end(sbv_gmp_ctx *ctx)"+  , "{"+  , "  while (ctx->head != NULL) {"+  , "    sbv_gmp_node *node = ctx->head; ctx->head = node->next;"+  , "    if (node->is_real) mpq_clear(node->value.real); else mpz_clear(node->value.integer);"+  , "    free(node);"+  , "  }"+  , "}"+  , ""+  , "static void sbv_gmp_ctx_release_owned(const void *context)"+  , "{"+  , "  sbv_gmp_ctx *owned = (sbv_gmp_ctx *) context;"+  , "  sbv_gmp_ctx_end(owned);"+  , "  free(owned);"+  , "}"+  ]++-- | Runtime helpers for exact unbounded integers. Raw low-level shift nodes+-- need additional helpers; ordinary SBV integer programs do not emit them.+integerRuntime :: Bool -> [String]+integerRuntime includeShifts =+  ["static SInteger sbv_gmp_integer_const(sbv_gmp_ctx *ctx, const char *value)"+  , "{ mpz_ptr r = sbv_gmp_new_integer(ctx); if (mpz_set_str(r, value, 10) != 0) abort(); return r; }"+  , ""+  , "static SInteger sbv_gmp_integer_from_u64(sbv_gmp_ctx *ctx, uint64_t value)"+  , "{ mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_import(r, 1, -1, sizeof(value), 0, 0, &value); return r; }"+  , ""+  , "static SInteger sbv_gmp_integer_from_s64(sbv_gmp_ctx *ctx, int64_t value)"+  , "{"+  , "  const uint64_t magnitude = value < 0 ? UINT64_C(0) - (uint64_t) value : (uint64_t) value;"+  , "  mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_import(r, 1, -1, sizeof(magnitude), 0, 0, &magnitude);"+  , "  if (value < 0) mpz_neg(r, r); return r;"+  , "}"+  , ""+  , "static uint64_t sbv_gmp_integer_low_u64(SInteger value)"+  , "{"+  , "  uint64_t result = 0; size_t count; mpz_t reduced;"+  , "  mpz_init(reduced); mpz_fdiv_r_2exp(reduced, value, 64);"+  , "  mpz_export(&result, &count, -1, sizeof(result), 0, 0, reduced); mpz_clear(reduced); return result;"+  , "}"+  , ""+  ]+  ++ concatMap integerUnary [("neg", "mpz_neg"), ("abs", "mpz_abs"), ("com", "mpz_com")]+  ++ concatMap integerBinary [("add", "mpz_add"), ("sub", "mpz_sub"), ("mul", "mpz_mul"), ("and", "mpz_and"), ("or", "mpz_ior"), ("xor", "mpz_xor")]+  ++ ["static SInteger sbv_gmp_integer_quot(sbv_gmp_ctx *ctx, SInteger a, SInteger b)"+     , "{"+     , "  mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_t divisor;"+     , "  if (mpz_sgn(b) == 0) { mpz_set(r, a); return r; }"+     , "  mpz_init(divisor); mpz_abs(divisor, b); mpz_fdiv_q(r, a, divisor);"+     , "  if (mpz_sgn(b) < 0) mpz_neg(r, r); mpz_clear(divisor); return r;"+     , "}"+     , ""+     , "static SInteger sbv_gmp_integer_rem(sbv_gmp_ctx *ctx, SInteger a, SInteger b)"+     , "{"+     , "  mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_t divisor;"+     , "  if (mpz_sgn(b) == 0) { mpz_set(r, a); return r; }"+     , "  mpz_init(divisor); mpz_abs(divisor, b); mpz_fdiv_r(r, a, divisor); mpz_clear(divisor); return r;"+     , "}"+     , ""+     , "static int sbv_gmp_integer_cmp(SInteger a, SInteger b) { return mpz_cmp(a, b); }"+     , ""+     , "static bool sbv_gmp_integer_divides(SInteger divisor, SInteger value)"+     , "{ return mpz_sgn(divisor) != 0 && mpz_divisible_p(value, divisor) != 0; }"+     , ""+     , "static SInteger sbv_gmp_integer_pow(sbv_gmp_ctx *ctx, SInteger base, SInteger exponent)"+     , "{"+     , "  mpz_ptr result = sbv_gmp_new_integer(ctx); mpz_t factor, power;"+     , "  if (mpz_sgn(exponent) < 0) {"+     , "    if (mpz_cmp_si(base, 1) == 0) mpz_set_ui(result, 1);"+     , "    else if (mpz_cmp_si(base, -1) == 0) mpz_set_si(result, mpz_odd_p(exponent) ? -1 : 1);"+     , "    else mpz_set_ui(result, 0);"+     , "    return result;"+     , "  }"+     , "  mpz_set_ui(result, 1); mpz_init_set(factor, base); mpz_init_set(power, exponent);"+     , "  while (mpz_sgn(power) != 0) {"+     , "    if (mpz_odd_p(power)) mpz_mul(result, result, factor);"+     , "    mpz_fdiv_q_2exp(power, power, 1);"+     , "    if (mpz_sgn(power) != 0) mpz_mul(factor, factor, factor);"+     , "  }"+     , "  mpz_clear(power); mpz_clear(factor); return result;"+     , "}"+     , ""+     ]+  ++ [line | includeShifts, line <-+     [ "static SInteger sbv_gmp_integer_shift(sbv_gmp_ctx *ctx, SInteger a, SInteger amount, bool left)"+     , "{"+     , "  mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_t magnitude; bool effective_left = left;"+     , "  mpz_init(magnitude); mpz_abs(magnitude, amount);"+     , "  if (mpz_sgn(amount) < 0) effective_left = !effective_left;"+     , "  if (!mpz_fits_ulong_p(magnitude)) {"+     , "    if (effective_left) abort();"+     , "    mpz_set_si(r, mpz_sgn(a) < 0 ? -1 : 0);"+     , "  } else if (effective_left) {"+     , "    mpz_mul_2exp(r, a, mpz_get_ui(magnitude));"+     , "  } else {"+     , "    mpz_fdiv_q_2exp(r, a, mpz_get_ui(magnitude));"+     , "  }"+     , "  mpz_clear(magnitude); return r;"+     , "}"+     , ""+     , "static SInteger sbv_gmp_integer_shl(sbv_gmp_ctx *ctx, SInteger a, SInteger amount)"+     , "{ return sbv_gmp_integer_shift(ctx, a, amount, true); }"+     , ""+     , "static SInteger sbv_gmp_integer_shr(sbv_gmp_ctx *ctx, SInteger a, SInteger amount)"+     , "{ return sbv_gmp_integer_shift(ctx, a, amount, false); }"+     , ""+     ]+     ]+ where integerUnary (suffix, operation) =+         ["static SInteger sbv_gmp_integer_" ++ suffix ++ "(sbv_gmp_ctx *ctx, SInteger a)"+         , "{ mpz_ptr r = sbv_gmp_new_integer(ctx); " ++ operation ++ "(r, a); return r; }"+         , ""]++       integerBinary (suffix, operation) =+         ["static SInteger sbv_gmp_integer_" ++ suffix ++ "(sbv_gmp_ctx *ctx, SInteger a, SInteger b)"+         , "{ mpz_ptr r = sbv_gmp_new_integer(ctx); " ++ operation ++ "(r, a, b); return r; }"+         , ""]++-- | Runtime helpers shared by exact reals and symbolic rationals.+realRuntime :: [String]+realRuntime =+  ["static mpq_srcptr sbv_gmp_real_const(sbv_gmp_ctx *ctx, const char *value)"+  , "{ mpq_ptr r = sbv_gmp_new_real(ctx); if (mpq_set_str(r, value, 10) != 0) abort(); mpq_canonicalize(r); return r; }"+  , ""+  , "static mpq_srcptr sbv_gmp_real_from_u64(sbv_gmp_ctx *ctx, uint64_t value)"+  , "{ mpq_ptr r = sbv_gmp_new_real(ctx); mpz_import(mpq_numref(r), 1, -1, sizeof(value), 0, 0, &value); return r; }"+  , ""+  , "static mpq_srcptr sbv_gmp_real_from_s64(sbv_gmp_ctx *ctx, int64_t value)"+  , "{"+  , "  const uint64_t magnitude = value < 0 ? UINT64_C(0) - (uint64_t) value : (uint64_t) value;"+  , "  mpq_ptr r = sbv_gmp_new_real(ctx); mpz_import(mpq_numref(r), 1, -1, sizeof(magnitude), 0, 0, &magnitude);"+  , "  if (value < 0) mpz_neg(mpq_numref(r), mpq_numref(r)); return r;"+  , "}"+  , ""+  , "static uint64_t sbv_gmp_real_low_u64(mpq_srcptr value)"+  , "{"+  , "  uint64_t result = 0; size_t count; mpz_t rounded, reduced;"+  , "  mpz_init(rounded); mpz_init(reduced); mpz_fdiv_q(rounded, mpq_numref(value), mpq_denref(value));"+  , "  mpz_fdiv_r_2exp(reduced, rounded, 64); mpz_export(&result, &count, -1, sizeof(result), 0, 0, reduced);"+  , "  mpz_clear(reduced); mpz_clear(rounded); return result;"+  , "}"+  , ""+  ]+  ++ concatMap realUnary [("neg", "mpq_neg"), ("abs", "mpq_abs")]+  ++ concatMap realBinary [("add", "mpq_add"), ("sub", "mpq_sub"), ("mul", "mpq_mul")]+  ++ ["static mpq_srcptr sbv_gmp_real_quot(sbv_gmp_ctx *ctx, mpq_srcptr a, mpq_srcptr b)"+     , "{ mpq_ptr r = sbv_gmp_new_real(ctx); if (mpq_sgn(b) == 0) mpq_set_ui(r, 0, 1); else mpq_div(r, a, b); return r; }"+     , ""+     , "static int sbv_gmp_real_cmp(mpq_srcptr a, mpq_srcptr b) { return mpq_cmp(a, b); }"+     , ""+     ]+ where realUnary (suffix, operation) =+         ["static mpq_srcptr sbv_gmp_real_" ++ suffix ++ "(sbv_gmp_ctx *ctx, mpq_srcptr a)"+         , "{ mpq_ptr r = sbv_gmp_new_real(ctx); " ++ operation ++ "(r, a); return r; }"+         , ""]++       realBinary (suffix, operation) =+         ["static mpq_srcptr sbv_gmp_real_" ++ suffix ++ "(sbv_gmp_ctx *ctx, mpq_srcptr a, mpq_srcptr b)"+         , "{ mpq_ptr r = sbv_gmp_new_real(ctx); " ++ operation ++ "(r, a, b); return r; }"+         , ""]++-- | Runtime helpers for the symbolic-rational constructor and internal+-- numerator/denominator accessors.+rationalRuntime :: CgConfig -> [String]+rationalRuntime cfg+  | isExactGMPKind cfg KUnbounded = exactRuntime+  | Just width <- cgInteger cfg   = mappedRuntime width+  | True                          = error "SBV->C: Cannot determine the SInteger representation used by SRational."+ where exactRuntime =+        ["static SRational sbv_gmp_rational_construct(sbv_gmp_ctx *ctx, mpz_srcptr numerator, mpz_srcptr denominator)"+        , "{"+        , "  mpq_ptr r = sbv_gmp_new_real(ctx);"+        , "  if (mpz_sgn(denominator) == 0) { mpq_set_ui(r, 0, 1); return r; }"+        , "  mpz_set(mpq_numref(r), numerator); mpz_set(mpq_denref(r), denominator);"+        , "  if (mpz_sgn(mpq_denref(r)) < 0) { mpz_neg(mpq_numref(r), mpq_numref(r)); mpz_neg(mpq_denref(r), mpq_denref(r)); }"+        , "  mpq_canonicalize(r); return r;"+        , "}"+        , ""+        , "static mpz_srcptr sbv_gmp_rational_numerator(SRational value) { return mpq_numref(value); }"+        , ""+        , "static mpz_srcptr sbv_gmp_rational_denominator(SRational value) { return mpq_denref(value); }"+        , ""+        ]++       mappedRuntime width =+        ["static void sbv_gmp_rational_set_s64(mpz_ptr target, int64_t value)"+        , "{"+        , "  const uint64_t magnitude = value < 0 ? UINT64_C(0) - (uint64_t) value : (uint64_t) value;"+        , "  mpz_import(target, 1, -1, sizeof(magnitude), 0, 0, &magnitude);"+        , "  if (value < 0) mpz_neg(target, target);"+        , "}"+        , ""+        , "static SInteger sbv_gmp_rational_part(mpz_srcptr value)"+        , "{"+        , "  " ++ unsignedType width ++ " bits = 0; size_t count; mpz_t reduced; SInteger result;"+        , "  mpz_init(reduced); mpz_fdiv_r_2exp(reduced, value, " ++ show width ++ ");"+        , "  mpz_export(&bits, &count, -1, sizeof(bits), 0, 0, reduced); mpz_clear(reduced);"+        , "  memcpy(&result, &bits, sizeof result); return result;"+        , "}"+        , ""+        , "static SRational sbv_gmp_rational_construct(sbv_gmp_ctx *ctx, SInteger numerator, SInteger denominator)"+        , "{"+        , "  mpq_ptr r = sbv_gmp_new_real(ctx);"+        , "  if (denominator == 0) { mpq_set_ui(r, 0, 1); return r; }"+        , "  sbv_gmp_rational_set_s64(mpq_numref(r), (int64_t) numerator);"+        , "  sbv_gmp_rational_set_s64(mpq_denref(r), (int64_t) denominator);"+        , "  if (mpz_sgn(mpq_denref(r)) < 0) { mpz_neg(mpq_numref(r), mpq_numref(r)); mpz_neg(mpq_denref(r), mpq_denref(r)); }"+        , "  mpq_canonicalize(r); return r;"+        , "}"+        , ""+        , "static SInteger sbv_gmp_rational_numerator(SRational value) { return sbv_gmp_rational_part(mpq_numref(value)); }"+        , ""+        , "static SInteger sbv_gmp_rational_denominator(SRational value) { return sbv_gmp_rational_part(mpq_denref(value)); }"+        , ""+        ]++       unsignedType width = "SWord" ++ show width++-- | Runtime helpers that convert between exact integers and GMP quotients.+crossRuntime :: [String]+crossRuntime =+  ["static SInteger sbv_gmp_integer_from_real(sbv_gmp_ctx *ctx, mpq_srcptr a)"+  , "{ mpz_ptr r = sbv_gmp_new_integer(ctx); mpz_fdiv_q(r, mpq_numref(a), mpq_denref(a)); return r; }"+  , ""+  , "static mpq_srcptr sbv_gmp_real_from_integer(sbv_gmp_ctx *ctx, SInteger a)"+  , "{ mpq_ptr r = sbv_gmp_new_real(ctx); mpq_set_z(r, a); return r; }"+  , ""+  ]
+ Data/SBV/Compilers/C/Legacy.hs view
@@ -0,0 +1,21 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Legacy+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Compatibility facade for the original SBV-to-C compiler.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Legacy+  ( compileToC+  , compileToCLib+  , compileToC'+  , compileToCLib'+  ) where++import Data.SBV.Compilers.C.Legacy.Internal (compileToC, compileToC', compileToCLib, compileToCLib')
+ Data/SBV/Compilers/C/Legacy/Internal.hs view
@@ -0,0 +1,1095 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Legacy.Internal+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Frozen compatibility implementation of the original SBV-to-C compiler.+-- Based on the implementation before comprehensive backend work began,+-- at SBV commit @8c161542945382014976a3cb1f9c17dc6e51b270@. The initial copy+-- added Haddocks and formatting; subsequent changes are compatibility fixes,+-- not a verbatim snapshot of today's master.+-----------------------------------------------------------------------------++{-# LANGUAGE TupleSections #-}++{-# OPTIONS_GHC -Wall -Werror -Wno-incomplete-uni-patterns #-}++module Data.SBV.Compilers.C.Legacy.Internal(compileToC, compileToCLib, compileToC', compileToCLib') where++import Control.DeepSeq                (rnf)+import Data.Char                      (isSpace)+import Data.List                      (nub, intercalate)+import Data.Maybe                     (isJust, isNothing, fromJust)+import qualified Data.Foldable as F   (toList)+import qualified Data.Set      as Set (member, union, unions, empty, toList, singleton, fromList)+import qualified Data.Text     as T+import System.FilePath                (takeBaseName, replaceExtension)+import System.Random++import Data.SBV.Core.Symbolic (ResultInp(..), ProgInfo(..))++-- Work around the fact that GHC 8.4.1 started exporting <>.. Hmm..+import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Core.Data+import Data.SBV.Core.Kind (kRoundingMode)+import Data.SBV.Compilers.C.PseudoBoolean (assignPseudoBoolean)+import Data.SBV.Compilers.C.Real (mappedRealFloorWidth, mappedRealFloorCall, mappedRealFloorRuntime)+import Data.SBV.Compilers.C.Syntax (cCommentText, cStringLiteral)+import Data.SBV.Compilers.CodeGen++import Data.SBV.Utils.PrettyNum   (chex, showCFloat, showCDouble)++import GHC.Stack++---------------------------------------------------------------------------+-- * API+---------------------------------------------------------------------------++-- | Given a symbolic computation, render it as an equivalent collection of files+-- that make up a C program:+--+--   * The first argument is the directory name under which the files will be saved. To save+--     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.+--+--   * The second argument is the name of the C function to generate.+--+--   * The final argument is the function to be compiled.+--+-- Compilation will also generate a @Makefile@,  a header file, and a driver (test) program, etc. As a+-- result, we return whatever the code-gen function returns. Most uses should simply have @()@ as+-- the return type here, but the value can be useful if you want to chain the result of+-- one compilation act to the next.+compileToC :: Maybe FilePath -> String -> SBVCodeGen a -> IO a+compileToC mbDirName nm f = do (retVal, cfg, bundle) <- compileToC' nm f+                               renderCgPgmBundle mbDirName (cfg, bundle)+                               pure retVal++-- | Lower level version of 'compileToC', producing a t'CgPgmBundle'+compileToC' :: String -> SBVCodeGen a -> IO (a, CgConfig, CgPgmBundle)+compileToC' nm f = do rands <- randoms <$> newStdGen+                      codeGen SBVToC (defaultCgConfig { cgDriverVals = rands }) nm f++-- | Create code to generate a library archive (.a) from given symbolic functions. Useful when generating code+-- from multiple functions that work together as a library.+--+--   * The first argument is the directory name under which the files will be saved. To save+--     files in the current directory pass @'Just' \".\"@. Use 'Nothing' for printing to stdout.+--+--   * The second argument is the name of the archive to generate.+--+--   * The third argument is the list of functions to include, in the form of function-name/code pairs, similar+--     to the second and third arguments of 'compileToC', except in a list.+compileToCLib :: Maybe FilePath -> String -> [(String, SBVCodeGen a)] -> IO [a]+compileToCLib mbDirName libName comps = do (retVal, cfg, pgm) <- compileToCLib' libName comps+                                           renderCgPgmBundle mbDirName (cfg, pgm)+                                           pure retVal++-- | Lower level version of 'compileToCLib', producing a t'CgPgmBundle'+compileToCLib' :: String -> [(String, SBVCodeGen a)] -> IO ([a], CgConfig, CgPgmBundle)+compileToCLib' libName comps = do resCfgBundles <- mapM (uncurry compileToC') comps+                                  let (finalCfg, finalPgm) = mergeToLib libName [(c, b) | (_, c, b) <- resCfgBundles]+                                  pure ([r | (r, _, _) <- resCfgBundles], finalCfg, finalPgm)++---------------------------------------------------------------------------+-- * Implementation+---------------------------------------------------------------------------++-- | Target-language marker for the legacy C compiler.+data SBVToC = SBVToC++-- | Connect the legacy C compiler to the shared code-generation framework.+instance CgTarget SBVToC where+  targetName _ = "C"+  translate  _ = cgen++-- | Report an unexpected input to the legacy compiler.+die :: String -> a+die msg = error $ "SBV->C: Unexpected: " ++ msg++-- | Report a feature unsupported by the legacy compiler.+tbd :: String -> a+tbd msg = error $ "SBV->C: Not yet supported: " ++ msg++-- | Translate a symbolic result with the legacy C implementation.+cgen :: CgConfig -> String -> CgState -> Result -> CgPgmBundle+cgen cfg nm st sbvProg+   -- we rnf the main pg and the sig to make sure any exceptions in type conversion pop-out early enough+   -- this is purely cosmetic, of course..+   = rnf (render sig) `seq` rnf (render (vcat body)) `seq` result+  where result = CgPgmBundle bundleKind+                        $ filt [ ("Makefile",  (CgMakefile flags, [genMake (cgGenDriver cfg) nm nmd flags]))+                               , (nm  ++ ".h", (CgHeader [sig],   [genHeader bundleKind nm [sig] extProtos]))+                               , (nmd ++ ".c", (CgDriver,         genDriver cfg randVals nm ins outs mbRet))+                               , (nm  ++ ".c", (CgSource,         body))+                               ]++        (body, flagsNeeded) = genCProg cfg nm sig sbvProg ins outs mbRet extDecls++        bundleKind = (cgInteger cfg, cgReal cfg)++        randVals = cgDriverVals cfg++        filt xs  = [c | c@(_, (k, _)) <- xs, need k]+          where need k | isCgDriver   k = cgGenDriver cfg+                       | isCgMakefile k = cgGenMakefile cfg+                       | True           = True++        nmd      = nm ++ "_driver"+        sig      = pprCFunHeader nm ins outs mbRet+        ins      = cgInputs st+        outs     = cgOutputs st+        mbRet    = case cgReturns st of+                     []           -> Nothing+                     [CgAtomic o] -> Just o+                     [CgArray _]  -> tbd "Non-atomic return values"+                     _            -> tbd "Multiple return values"+        extProtos = case cgPrototypes st of+                     [] -> empty+                     xs -> vcat $ text "/* User given prototypes: */" : map text xs+        extDecls  = case cgDecls st of+                     [] -> empty+                     xs -> vcat $ text "/* User given declarations: */" : map text xs+        flags    = flagsNeeded ++ cgLDFlags st++-- | Pretty print a functions type. If there is only one output, we compile it+-- as a function that returns that value. Otherwise, we compile it as a void function+-- that takes return values as pointers to be updated.+pprCFunHeader :: String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> Doc+pprCFunHeader fn ins outs mbRet = retType <+> text fn P.<> parens (fsep (punctuate comma (map mkParam ins ++ map mkPParam outs)))+  where retType = case mbRet of+                   Nothing -> text "void"+                   Just sv -> pprCWord False sv++-- | Render legacy C input and output parameters, respectively.+mkParam, mkPParam :: (String, CgVal) -> Doc+mkParam  (n, CgAtomic sv)     = pprCWord True  sv <+> text n+mkParam  (_, CgArray  [])     = die "mkParam: CgArray with no elements!"+mkParam  (n, CgArray  (sv:_)) = pprCWord True  sv <+> text "*" P.<> text n+mkPParam (n, CgAtomic sv)     = pprCWord False sv <+> text "*" P.<> text n+mkPParam (_, CgArray  [])     = die "mPkParam: CgArray with no elements!"+mkPParam (n, CgArray  (sv:_)) = pprCWord False sv <+> text "*" P.<> text n++-- | Renders as "const SWord8 s0", etc. the first parameter is the width of the typefield+declSV :: Int -> SV -> Doc+declSV w sv = text "const" <+> pad (showCType sv) <+> text (show sv)+  where pad s = text $ s ++ replicate (w - length s) ' '++-- | Return the proper declaration and the result as a pair. No consts+declSVNoConst :: Int -> SV -> (Doc, Doc)+declSVNoConst w sv = (text "     " <+> pad (showCType sv), text (show sv))+  where pad s = text $ s ++ replicate (w - length s) ' '++-- | Renders as "s0", etc, or the corresponding constant+showSV :: CgConfig -> [(SV, CV)] -> SV -> Doc+showSV cfg consts sv+  | sv == falseSV                 = text "false"+  | sv == trueSV                  = text "true"+  | Just cv <- sv `lookup` consts = mkConst cfg cv+  | True                          = text $ show sv++-- | Words as it would map to a C word+pprCWord :: HasKind a => Bool -> a -> Doc+pprCWord cnst v = (if cnst then text "const" else empty) <+> text (showCType v)++-- | Almost a "show", but map "SWord1" to "SBool"+-- which is used for extracting one-bit words. This is OK since C's bool type+-- handles arithmetic fine, and maps nicely to our `SWord 1`. (Same isn't true for `SInt 1`, which+-- doesn't have an easy counter-part on the C side.+showCType :: HasKind a => a -> String+showCType i = case kindOf i of+                KBounded False 1 -> "SBool"+                k                -> show k++-- | The printf specifier for the type+specifier :: CgConfig -> SV -> Doc+specifier cfg sv = case kindOf sv of+                     KVar{}        -> die $ "variable sort: " ++ show (kindOf sv)+                     KBool         -> spec (False, 1)+                     KBounded b i  -> spec (b, i)+                     KUnbounded    -> spec (True, fromJust (cgInteger cfg))+                     KReal         -> specF (fromJust (cgReal cfg))+                     KFloat        -> specF CgFloat+                     KDouble       -> specF CgDouble+                     KString       -> text "%s"+                     KChar         -> text "%c"+                     KRational     -> die   "rational sort"+                     KFP{}         -> die   "arbitrary float sort"+                     KList k       -> die $ "list sort: "   ++ show k+                     KSet  k       -> die $ "set sort: "    ++ show k+                     KApp s _      -> die $ "ADT app: "     ++ s+                     KADT s _ _    -> die $ "ADT: "         ++ s+                     KTuple k      -> die $ "tuple sort: "  ++ show k+                     KArray  k1 k2 -> die $ "array sort: "  ++ show (k1, k2)+  where u8InHex = cgShowU8InHex cfg++        spec :: (Bool, Int) -> Doc+        spec (False,  1) = text "%d"+        spec (False,  8)+          | u8InHex      = text "0x%02\"PRIx8\""+          | True         = text "%\"PRIu8\""+        spec (True,   8) = text "%\"PRId8\""+        spec (False, 16) = text "0x%04\"PRIx16\"U"+        spec (True,  16) = text "%\"PRId16\""+        spec (False, 32) = text "0x%08\"PRIx32\"UL"+        spec (True,  32) = text "%\"PRId32\"L"+        spec (False, 64) = text "0x%016\"PRIx64\"ULL"+        spec (True,  64) = text "%\"PRId64\"LL"+        spec (s, sz)     = die $ "Format specifier at type " ++ (if s then "SInt" else "SWord") ++ show sz++        specF :: CgSRealType -> Doc+        specF CgFloat      = text "%a"+        specF CgDouble     = text "%a"+        specF CgLongDouble = text "%Lf"++-- | Make a constant value of the given type. We don't check for out of bounds here, as it should not be needed.+--   There are many options here, using binary, decimal, etc. We simply use decimal for values 8-bits or less,+--   and hex otherwise.+mkConst :: CgConfig -> CV -> Doc+mkConst cfg  (CV KReal (CAlgReal (AlgRational _ r))) = double (fromRational r :: Double) P.<> sRealSuffix (fromJust (cgReal cfg))+  where sRealSuffix CgFloat      = text "F"+        sRealSuffix CgDouble     = empty+        sRealSuffix CgLongDouble = text "L"+mkConst cfg (CV KUnbounded       (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (True, fromJust (cgInteger cfg))+mkConst cfg (CV (KBounded sg sz) (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (sg,   sz)+mkConst cfg (CV KBool            (CInteger i)) = showSizedConst (cgShowU8InHex cfg) i (False, 1)+mkConst _   (CV KFloat           (CFloat f))   = text $ showCFloat f+mkConst _   (CV KDouble          (CDouble d))  = text $ showCDouble d+mkConst _   (CV KString          (CString s))  = text $ show s+mkConst _   (CV KChar            (CChar c))    = text $ show c+mkConst _   cv                                 = die $ "mkConst: " ++ show cv++-- | Render an integral constant using one of the legacy native C widths.+showSizedConst :: Bool -> Integer -> (Bool, Int) -> Doc+showSizedConst _   i   (False,  1) = text (if i == 0 then "false" else "true")+showSizedConst u8h i t@(False,  8)+  | u8h                            = text $ T.unpack (chex False True t i)+  | True                           = integer i+showSizedConst _   i   (True,   8) = integer i+showSizedConst _   i t@(False, 16) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  16) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(False, 32) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  32) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(False, 64) = text $ T.unpack $ chex False True t i+showSizedConst _   i t@(True,  64) = text $ T.unpack $ chex False True t i+showSizedConst _   i   (s, sz)     = die $ "Constant " ++ show i ++ " at type " ++ (if s then "SInt" else "SWord") ++ show sz++-- | Generate a makefile. The first argument is True if we have a driver.+genMake :: Bool -> String -> String -> [String] -> Doc+genMake ifdr fn dn ldFlags = foldr1 ($$) [l | (True, l) <- lns]+ where ifld = not (null ldFlags)+       ld | ifld = text "${LDFLAGS}"+          | True = empty+       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")+             , (True, text "")+             , (True, text "# include any user-defined .mk file in the current directory.")+             , (True, text "-include *.mk")+             , (True, text "")+             , (True, text "CC?=gcc")+             , (True, text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")+             , (ifld, text "LDFLAGS?=" P.<> text (unwords ldFlags))+             , (True, text "")+             , (ifdr, text "all:" <+> nmd)+             , (ifdr, text "")+             , (True, nmo P.<> text (": " ++ ppSameLine (hsep [nmc, nmh])))+             , (True, text "\t${CC} ${CCFLAGS}" <+> text "-c $< -o $@")+             , (True, text "")+             , (ifdr, nmdo P.<> text (": " ++ ppSameLine (hsep [nmdc, nmh])))+             , (ifdr, text "\t${CC} ${CCFLAGS}" <+> text "-c $< -o $@")+             , (ifdr, text "")+             , (ifdr, nmd P.<> text (": " ++ ppSameLine (hsep [nmo, nmdo])))+             , (ifdr, text "\t${CC} ${CCFLAGS}" <+> text "$^ -o $@" <+> ld)+             , (ifdr, text "")+             , (True, text "clean:")+             , (True, text "\trm -f *.o")+             , (True, text "")+             , (ifdr, text "veryclean: clean")+             , (ifdr, text "\trm -f" <+> nmd)+             , (ifdr, text "")+             ]+       nm   = text fn+       nmd  = text dn+       nmh  = nm P.<> text ".h"+       nmc  = nm P.<> text ".c"+       nmo  = nm P.<> text ".o"+       nmdc = nmd P.<> text ".c"+       nmdo = nmd P.<> text ".o"++-- | Generate the header+genHeader :: (Maybe Int, Maybe CgSRealType) -> String -> [Doc] -> Doc -> Doc+genHeader (ik, rk) fn sigs protos =+     text "/* Header file for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit! */"+  $$ text ""+  $$ text "#ifndef" <+> tag+  $$ text "#define" <+> tag+  $$ text ""+  $$ text "#include <stdio.h>"+  $$ text "#include <stdlib.h>"+  $$ text "#include <inttypes.h>"+  $$ text "#include <stdint.h>"+  $$ text "#include <stdbool.h>"+  $$ text "#include <string.h>"+  $$ text "#include <math.h>"+  $$ text ""+  $$ text "/* The boolean type */"+  $$ text "typedef bool SBool;"+  $$ text ""+  $$ text "/* The float type */"+  $$ text "typedef float SFloat;"+  $$ text ""+  $$ text "/* The double type */"+  $$ text "typedef double SDouble;"+  $$ text ""+  $$ text "/* Unsigned bit-vectors */"+  $$ text "typedef uint8_t  SWord8;"+  $$ text "typedef uint16_t SWord16;"+  $$ text "typedef uint32_t SWord32;"+  $$ text "typedef uint64_t SWord64;"+  $$ text ""+  $$ text "/* Signed bit-vectors */"+  $$ text "typedef int8_t  SInt8;"+  $$ text "typedef int16_t SInt16;"+  $$ text "typedef int32_t SInt32;"+  $$ text "typedef int64_t SInt64;"+  $$ text ""+  $$ imapping+  $$ rmapping+  $$ text ("/* Entry point prototype" ++ plu ++ ": */")+  $$ vcat (map (P.<> semi) sigs)+  $$ text ""+  $$ protos+  $$ text "#endif /*" <+> tag <+> text "*/"+  $$ text ""+ where nm  = text fn+       tag = text "__" P.<> nm P.<> text "__HEADER_INCLUDED__"+       plu = if length sigs /= 1 then "s" else ""+       imapping = case ik of+                    Nothing -> empty+                    Just i  ->    text "/* User requested mapping for SInteger.                                 */"+                               $$ text "/* NB. Loss of precision: Target type is subject to modular arithmetic. */"+                               $$ text ("typedef SInt" ++ show i ++ " SInteger;")+                               $$ text ""+       rmapping = case rk of+                    Nothing -> empty+                    Just t  ->    text "/* User requested mapping for SReal.                          */"+                               $$ text "/* NB. Loss of precision: Target type is subject to rounding. */"+                               $$ text ("typedef " ++ show t ++ " SReal;")+                               $$ text ""++-- | Emit a blank separator line when requested.+sepIf :: Bool -> Doc+sepIf b = if b then text "" else empty++-- | Generate an example driver program+genDriver :: CgConfig -> [Integer] -> String -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> [Doc]+genDriver cfg randVals fn inps outs mbRet = [pre, header, body, post]+ where pre    =  text "/* Example driver program for" <+> nm P.<> text ". */"+              $$ text "/* Automatically generated by SBV. Edit as you see fit! */"+              $$ text ""+              $$ text "#include <stdio.h>"+       header =  text "#include" <+> doubleQuotes (nm P.<> text ".h")+              $$ text ""+              $$ text "int main(void)"+              $$ text "{"+       body   =  text ""+              $$ nest 2 (   vcat (map mkInp pairedInputs)+                      $$ vcat (map mkOut outs)+                      $$ sepIf (not (null [() | (_, _, CgArray{}) <- pairedInputs]) || not (null outs))+                      $$ call+                      $$ text ""+                      $$ (case mbRet of+                              Just sv -> text "printf" P.<> parens (printQuotes (fcall <+> text "=" <+> specifier cfg sv P.<> text "\\n")+                                                                              P.<> comma <+> resultVar) P.<> semi+                              Nothing -> text "printf" P.<> parens (printQuotes (fcall <+> text "->\\n")) P.<> semi)+                      $$ vcat (map display outs)+                      )+       post   =   text ""+              $+$ nest 2 (text "return 0" P.<> semi)+              $$  text "}"+              $$  text ""+       nm = text fn+       pairedInputs = matchRands randVals inps+       matchRands _      []                                 = []+       matchRands []     _                                  = die "Run out of driver values!"+       matchRands (r:rs) ((n, CgAtomic sv)            : cs) = ([mkRVal sv r], n, CgAtomic sv) : matchRands rs cs+       matchRands _      ((n, CgArray [])             : _ ) = die $ "Unsupported empty array input " ++ show n+       matchRands rs     ((n, a@(CgArray sws@(sv:_))) : cs)+          | length frs /= l                                 = die "Run out of driver values!"+          | True                                            = (map (mkRVal sv) frs, n, a) : matchRands srs cs+          where l          = length sws+                (frs, srs) = splitAt l rs+       mkRVal sv r = mkConst cfg $ mkConstCV (kindOf sv) r+       mkInp (_,  _, CgAtomic{})         = empty  -- constant, no need to declare+       mkInp (_,  n, CgArray [])         = die $ "Unsupported empty array value for " ++ show n+       mkInp (vs, n, CgArray sws@(sv:_)) =  pprCWord True sv <+> text n P.<> brackets (int (length sws)) <+> text "= {"+                                                      $$ nest 4 (fsep (punctuate comma (align vs)))+                                                      $$ text "};"+                                         $$ text ""+                                         $$ text "printf" P.<> parens (printQuotes (text "Contents of input array" <+> text n P.<> text ":\\n")) P.<> semi+                                         $$ display (n, CgArray sws)+                                         $$ text ""+       mkOut (v, CgAtomic sv)            = pprCWord False sv <+> text v P.<> semi+       mkOut (v, CgArray [])             = die $ "Unsupported empty array value for " ++ show v+       mkOut (v, CgArray sws@(sv:_))     = pprCWord False sv <+> text v P.<> brackets (int (length sws)) P.<> semi+       resultVar = text "__result"+       call = case mbRet of+                Nothing -> fcall P.<> semi+                Just sv -> pprCWord True sv <+> resultVar <+> text "=" <+> fcall P.<> semi+       fcall = nm P.<> parens (fsep (punctuate comma (map mkCVal pairedInputs ++ map mkOVal outs)))+       mkCVal ([v], _, CgAtomic{}) = v+       mkCVal (vs,  n, CgAtomic{}) = die $ "Unexpected driver value computed for " ++ show n ++ render (hcat vs)+       mkCVal (_,   n, CgArray{})  = text n+       mkOVal (n, CgAtomic{})      = text "&" P.<> text n+       mkOVal (n, CgArray{})       = text n+       display (n, CgAtomic sv)         = text "printf" P.<> parens (printQuotes (text " " <+> text n <+> text "=" <+> specifier cfg sv+                                                                                P.<> text "\\n") P.<> comma <+> text n) P.<> semi+       display (n, CgArray [])         =  die $ "Unsupported empty array value for " ++ show n+       display (n, CgArray sws@(sv:_)) =   text "int" <+> nctr P.<> semi+                                        $$ text "for(" P.<> nctr <+> text "= 0;" <+> nctr <+> text "<" <+> int len <+> text "; ++" P.<> nctr P.<> text ")"+                                        $$ nest 2 (text "printf" P.<> parens (printQuotes (text " " <+> entrySpec <+> text "=" <+> spec P.<> text "\\n")+                                                                 P.<> comma <+> nctr <+> comma P.<> entry) P.<> semi)+                  where nctr      = text n P.<> text "_ctr"+                        entry     = text n P.<> text "[" P.<> nctr P.<> text "]"+                        entrySpec = text n P.<> text "[%" P.<> int tab P.<> text "d]"+                        spec      = specifier cfg sv+                        len       = length sws+                        tab       = length $ show (len - 1)++-- | Generate the C program+genCProg :: CgConfig -> String -> Doc -> Result -> [(String, CgVal)] -> [(String, CgVal)] -> Maybe SV -> Doc -> ([Doc], [String])+genCProg cfg fn proto (Result pinfo kindInfo _tvals _ovals cgs topInps (_, preConsts) tbls _uis axioms (SBVPgm asgns) cstrs origAsserts _) inVars outVars mbRet extDecls+  | isNothing (cgInteger cfg) && KUnbounded `Set.member` kindInfo+  = error $ "SBV->C: Unbounded integers are not supported by the C compiler."+          ++ "\nUse 'cgIntegerSize' to specify a fixed size for SInteger representation."+  | KString `Set.member` kindInfo+  = notyet "Strings"+  | KChar `Set.member` kindInfo+  = notyet "Characters"+  | any isSet kindInfo+  = notyet "Sets (SSet)"+  | any isList kindInfo+  = notyet "Lists (SList)"+  | any isTuple kindInfo+  = notyet "Tuples (STupleN)"+  | isNothing (cgReal cfg) && KReal `Set.member` kindInfo+  = error $ "SBV->C: SReal values are not supported by the C compiler."+          ++ "\nUse 'cgSRealType' to specify a custom type for SReal representation."+  | not (null unsupportedBVs)+  = error $ "SBV->C: Unsupported bit-vector type(s): " ++ intercalate ", " (map show unsupportedBVs)+  | not (null usorts)+  = error $ "SBV->C: Cannot compile functions with uninterpreted sorts: " ++ intercalate ", " usorts+  | hasQuants pinfo+  = error "SBV->C: Cannot compile in the presence of quantified variables."+  | not $ null (progSpecialRels pinfo)+  = error "SBV->C: Cannot compile in the presence of special relations."+  | not (null axioms)+  = error "SBV->C: Cannot compile in the presence of 'smtFunction' definitions, use 'compileToCLib' instead."+  | not (null cstrs)+  = tbd "Explicit constraints"+  | True+  = ([pre, header, post], flagsNeeded)+ where notyet m = error $ "SBV->C: " ++ m ++ " are currently not supported by the C compiler. Please get in touch if you'd like support for this feature!"++       asserts | cgIgnoreAsserts cfg = []+               | True                = origAsserts++       usorts = [s | k@(KADT s _ _) <- Set.toList kindInfo, isADT k && not (isRoundingMode k)] -- No support for any sorts other than RoundingMode!++       pre    =  text "/* File:" <+> doubleQuotes (nm P.<> text ".c") P.<> text ". Automatically generated by SBV. Do not edit! */"+              $$ text ""++       header = text "#include" <+> doubleQuotes (nm P.<> text ".h")++       unsupportedBVs = [k | k@(KBounded sg sz) <- Set.toList kindInfo, (not . supported) (sg, sz)]+         where supported (False, sz) = sz `elem` [1, 8, 16, 32, 64]+               supported (True,  sz) = sz `elem` [   8, 16, 32, 64]++       post   = text ""+             $$ vcat (map codeSeg cgs)+             $$ extDecls+             $$ mappedRealFloorRuntime cfg assignments+             $$ proto+             $$ text "{"+             $$ text ""+             $$ nest 2 (   vcat (concatMap (genIO True . (\v -> (isAlive v, v))) inVars)+                        $$ vcat (merge (map genTbl tbls) (map genAsgn assignments) (map genAssert asserts))+                        $$ sepIf (not (null assignments) || not (null tbls))+                        $$ vcat (concatMap (genIO False . (True,)) outVars)+                        $$ maybe empty mkRet mbRet+                       )+             $$ text "}"+             $$ text ""++       nm = text fn++       assignments = F.toList asgns++       -- Do we need any linker flags for C?+       flagsNeeded = nub $ concatMap (getLDFlag . opRes) assignments+          where opRes (sv, SBVApp o _) = (o, kindOf sv)++       codeSeg (fnm, ls) =  text "/* User specified custom code for" <+> doubleQuotes (text fnm) <+> text "*/"+                         $$ vcat (map text ls)+                         $$ text ""++       ins = case topInps of+               ResultTopInps (is, []) -> is+               ResultTopInps is       -> die $ "Unexpected trackers: " ++ show is+               ResultLamInps is       -> die $ "Unexpected inputs  : " ++ show is++       typeWidth = getMax 0 $ [len (kindOf s) | (s, _) <- assignments] ++ [len (kindOf s) | NamedSymVar s _ <- ins]+                where len (KVar s)           = die $ "Variable: " ++ s+                      len KReal{}            = 5+                      len KFloat{}           = 6 -- SFloat+                      len KDouble{}          = 7 -- SDouble+                      len KString{}          = 7 -- SString+                      len KChar{}            = 5 -- SChar+                      len KUnbounded{}       = 8+                      len KBool              = 5 -- SBool+                      len (KBounded False n) = 5 + length (show n) -- SWordN+                      len (KBounded True  n) = 4 + length (show n) -- SIntN+                      len KRational{}        = die   "Rational."+                      len KFP{}              = die   "Arbitrary float."+                      len (KList s)          = die $ "List sort: "   ++ show s+                      len (KSet  s)          = die $ "Set sort: "    ++ show s+                      len (KTuple s)         = die $ "Tuple sort: "  ++ show s+                      len (KArray  k1 k2)    = die $ "Array sort:  " ++ show (k1, k2)+                      len (KApp s _)         = die $ "Uninterpreted ADT app: " ++ s+                      len (KADT s _ _)       = die $ "Uninterpreted ADT: "     ++ s++                      getMax 8 _      = 8  -- 8 is the max we can get with SInteger, so don't bother looking any further+                      getMax m []     = m+                      getMax m (x:xs) = getMax (m `max` x) xs++       consts = (falseSV, falseCV) : (trueSV, trueCV) : preConsts++       isConst s = isJust (lookup s consts)++       -- TODO: The following is brittle. We should really have a function elsewhere+       -- that walks the SBVExprs and collects the SWs together.+       usedVariables = Set.unions (retSWs : map usedCgVal outVars ++ map usedAsgn assignments)+         where retSWs = maybe Set.empty Set.singleton mbRet++               usedCgVal (_, CgAtomic s)  = Set.singleton s+               usedCgVal (_, CgArray ss)  = Set.fromList ss+               usedAsgn  (_, SBVApp o ss) = Set.union (opSWs o) (Set.fromList ss)++               opSWs (LkUp _ a b)             = Set.fromList [a, b]+               opSWs (IEEEFP (FP_Cast _ _ s)) = Set.singleton s+               opSWs _                        = Set.empty++       isAlive :: (String, CgVal) -> Bool+       isAlive (_, CgAtomic sv) = sv `Set.member` usedVariables+       isAlive (_, _)           = True++       genIO :: Bool -> (Bool, (String, CgVal)) -> [Doc]+       genIO True  (alive, (cNm, CgAtomic sv)) = [declSV typeWidth sv  <+> text "=" <+> text cNm P.<> semi               | alive]+       genIO False (alive, (cNm, CgAtomic sv)) = [text "*" P.<> text cNm <+> text "=" <+> showSV cfg consts sv P.<> semi | alive]+       genIO isInp (_,     (cNm, CgArray sws)) = zipWith genElt sws [(0::Int)..]+         where genElt sv i+                 | isInp = declSV typeWidth sv <+> text "=" <+> text entry       P.<> semi+                 | True  = text entry          <+> text "=" <+> showSV cfg consts sv P.<> semi+                 where entry = cNm ++ "[" ++ show i ++ "]"++       mkRet sv = text "return" <+> showSV cfg consts sv P.<> semi++       genTbl :: ((Int, Kind, Kind), [SV]) -> (Int, Doc)+       genTbl ((i, _, k), elts) =  (location, static <+> text "const" <+> text (show k) <+> text ("table" ++ show i) P.<> text "[] = {"+                                              $$ nest 4 (fsep (punctuate comma (align (map (showSV cfg consts) elts))))+                                              $$ text "};")+         where static   = if location == -1 then text "static" else empty+               location = maximum (-1 : map getNodeId elts)++       getNodeId s@(SV _ (NodeId (_, _, n))) | isConst s = -1+                                             | True      = n++       genAsgn :: (SV, SBVExpr) -> (Int, Doc)+       genAsgn (sv, n) = (getNodeId sv, ppExpr cfg consts n (declSV typeWidth sv) (declSVNoConst typeWidth sv) P.<> semi)++       -- merge tables intermixed with assignments and assertions, paying attention to putting tables as+       -- early as possible and tables right after.. Note that the assignment list (second argument) is sorted on its order+       merge :: [(Int, Doc)] -> [(Int, Doc)] -> [(Int, Doc)] -> [Doc]+       merge tables asgnments asrts = map snd $ merge2 asrts (merge2 tables asgnments)+         where merge2 []               as                  = as+               merge2 ts               []                  = ts+               merge2 ts@((i, t):trest) as@((i', a):arest)+                 | i < i'                                 = (i,  t)  : merge2 trest as+                 | True                                   = (i', a) : merge2 ts arest++       genAssert (msg, cs, sv) = (getNodeId sv, doc)+         where doc =     text "/* ASSERTION:" <+> cCommentText msg+                     $$  maybe empty (vcat . map cCommentText) (locInfo (getCallStack <$> cs))+                     $$  text " */"+                     $$  text "if" P.<> parens (showSV cfg consts sv)+                     $$  text "{"+                     $+$ nest 2 (vcat [errOut, text "exit(-1);"])+                     $$  text "}"+                     $$  text ""+               errOut = text "fprintf(stderr, \"%s:%d:ASSERTION FAILED: %s\\n\", __FILE__, __LINE__,"+                    <+> cStringLiteral msg P.<> text ");"+               locInfo (Just ps) = let loc (f, sl) = concat [srcLocFile sl, ":", show (srcLocStartLine sl), ":", show (srcLocStartCol sl), ":", f ]+                                   in case map loc ps of+                                         []     -> Nothing+                                         (f:rs) -> Just $ (" * SOURCE   : " ++ f) : map (" *            " ++)  rs+               locInfo _         = Nothing++-- | Render a native floating-point operation with the legacy lowering.+handleIEEE :: FPOp -> [(SV, CV)] -> [(SV, Doc)] -> Doc -> Doc+handleIEEE w consts as var = cvt w+  where same f                   = (f, f)+        named fnm dnm f          = (f fnm, f dnm)++        cvt (FP_Cast from to m)     = case checkRM (m `lookup` consts) of+                                        Nothing          -> cast $ \[a] -> parens (text (show to)) <+> rnd a+                                        Just (Left  msg) -> die msg+                                        Just (Right msg) -> tbd msg+                                      where -- if we're converting from float to some integral like; first use rint/rintf to do the internal conversion and then cast.+                                            rnd a+                                             | (isFloat from || isDouble from) && (isBounded to || isUnbounded to)+                                             = let f = if isFloat from then "rintf" else "rint"+                                               in text f P.<> parens a+                                             | True+                                             = a++        cvt (FP_Reinterpret f t) = case (f, t) of+                                     (KBounded False 32, KFloat)  -> cast $ cpy "sizeof(SFloat)"+                                     (KBounded False 64, KDouble) -> cast $ cpy "sizeof(SDouble)"+                                     (KFloat,  KBounded False 32) -> cast $ cpy "sizeof(SWord32)"+                                     (KDouble, KBounded False 64) -> cast $ cpy "sizeof(SWord64)"+                                     _                            -> die $ "Reinterpretation from : " ++ show f ++ " to " ++ show t+                                    where cpy sz = \[a] -> let alhs = text "&" P.<> var+                                                               arhs = text "&" P.<> a+                                                           in text "memcpy" P.<> parens (fsep (punctuate comma [alhs, arhs, text sz]))+        cvt FP_Abs               = dispatch $ named "fabsf" "fabs" $ \nm _ [a] -> text nm P.<> parens a+        cvt FP_Neg               = dispatch $ same $ \_ [a] -> text "-" P.<> a+        cvt FP_Add               = dispatch $ same $ \_ [a, b] -> a <+> text "+" <+> b+        cvt FP_Sub               = dispatch $ same $ \_ [a, b] -> a <+> text "-" <+> b+        cvt FP_Mul               = dispatch $ same $ \_ [a, b] -> a <+> text "*" <+> b+        cvt FP_Div               = dispatch $ same $ \_ [a, b] -> a <+> text "/" <+> b+        cvt FP_FMA               = dispatch $ named "fmaf"  "fma"  $ \nm _ [a, b, c] -> text nm P.<> parens (fsep (punctuate comma [a, b, c]))+        cvt FP_Sqrt              = dispatch $ named "sqrtf" "sqrt" $ \nm _ [a]       -> text nm P.<> parens a+        cvt FP_Rem               = dispatch $ named "fmodf" "fmod" $ \nm _ [a, b]    -> text nm P.<> parens (fsep (punctuate comma [a, b]))+        cvt FP_RoundToIntegral   = dispatch $ named "rintf" "rint" $ \nm _ [a]       -> text nm P.<> parens a+        cvt FP_Min               = dispatch $ named "fminf" "fmin" $ \nm k [a, b]    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))+        cvt FP_Max               = dispatch $ named "fmaxf" "fmax" $ \nm k [a, b]    -> wrapMinMax k a b (text nm P.<> parens (fsep (punctuate comma [a, b])))+        cvt FP_ObjEqual          = let mkIte   x y z = x <+> text "?" <+> y <+> text ":" <+> z+                                       chkNaN  x     = text "isnan"   P.<> parens x+                                       signbit x     = text "signbit" P.<> parens x+                                       eq      x y   = parens (x <+> text "==" <+> y)+                                       eqZero  x     = eq x (text "0")+                                       negZero x     = parens (signbit x <+> text "&&" <+> eqZero x)+                                   in dispatch $ same $ \_ [a, b] -> mkIte (chkNaN a) (chkNaN b) (mkIte (negZero a) (negZero b) (mkIte (negZero b) (negZero a) (eq a b)))+        cvt FP_IsNormal          = dispatch $ same $ \_ [a] -> text "isnormal" P.<> parens a+        cvt FP_IsSubnormal       = dispatch $ same $ \_ [a] -> text "FP_SUBNORMAL == fpclassify" P.<> parens a+        cvt FP_IsZero            = dispatch $ same $ \_ [a] -> text "FP_ZERO == fpclassify" P.<> parens a+        cvt FP_IsInfinite        = dispatch $ same $ \_ [a] -> text "isinf" P.<> parens a+        cvt FP_IsNaN             = dispatch $ same $ \_ [a] -> text "isnan" P.<> parens a+        cvt FP_IsNegative        = dispatch $ same $ \_ [a] -> text "!isnan" P.<> parens a <+> text "&&" <+> text "signbit"  P.<> parens a+        cvt FP_IsPositive        = dispatch $ same $ \_ [a] -> text "!isnan" P.<> parens a <+> text "&&" <+> text "!signbit" P.<> parens a++        -- grab the rounding-mode, if present, and make sure it's RoundNearestTiesToEven. Otherwise skip.+        fpArgs = case as of+                   []            -> []+                   ((m, _):args)+                     | isRoundingMode m -> case checkRM (m `lookup` consts) of+                                             Nothing          -> args+                                             Just (Left  msg) -> die msg+                                             Just (Right msg) -> tbd msg+                     | True              -> as++        -- Check that the RM is RoundNearestTiesToEven.+        -- If we start supporting other rounding-modes, this would be the point where we'd insert the rounding-mode set/reset code+        -- instead of merely returning OK or not+        checkRM (Just cv@(CV k v))+          | k == kRoundingMode = case v of+                                   CADT ("RoundNearestTiesToEven", []) -> Nothing+                                   CADT (s,                        []) -> Just (Right $ "handleIEEE: Unsupported rounding-mode: " ++ show s ++ " for: " ++ show w)+                                   _                                   -> Just (Left  $ "handleIEEE: Unexpected value for rounding-mode: " ++ show cv ++ " for: " ++ show w)+        checkRM (Just cv) = Just (Left  $ "handleIEEE: Expected rounding-mode, but got: " ++ show cv ++ " for: " ++ show w)+        checkRM Nothing   = Just (Right $ "handleIEEE: Non-constant rounding-mode for: " ++ show w)++        pickOp _          []             = die $ "Cannot determine float/double kind for op: " ++ show w+        pickOp (fOp, dOp) args@((a,_):_) = case kindOf a of+                                             KFloat  -> fOp KFloat  (map snd args)+                                             KDouble -> dOp KDouble (map snd args)+                                             k       -> die $ "handleIEEE: Expected double/float args, but got: " ++ show k ++ " for: " ++ show w++        dispatch (fOp, dOp) = pickOp (fOp, dOp) fpArgs+        cast f              = f (map snd fpArgs)++        -- In SMT-Lib, fpMin/fpMax is underspecified when given +0/-0 as the two arguments. (In any order.)+        -- In C, the second argument is returned. (I think, might depend on the architecture, optimizations etc.).+        -- We'll translate it so that we deterministically return +0.+        -- There's really no good choice here.+        wrapMinMax k a b s = parens cond <+> text "?" <+> fzero <+> text ":" <+> s+          where fzero = text $ if k == KFloat then showCFloat 0 else showCDouble 0+                cond  =                   parens (text "FP_ZERO == fpclassify" P.<> parens a)                                  -- a is zero+                        <+> text "&&" <+> parens (text "FP_ZERO == fpclassify" P.<> parens b)                                  -- b is zero+                        <+> text "&&" <+> parens (text "signbit" P.<> parens a <+> text "!=" <+> text "signbit" P.<> parens b) -- a and b differ in sign++-- | Render one symbolic assignment with the legacy operation dispatcher.+ppExpr :: CgConfig -> [(SV, CV)] -> SBVExpr -> Doc -> (Doc, Doc) -> Doc+ppExpr cfg consts (SBVApp op opArgs) lhs (typ, var)+  | doNotAssign op+  = typ <+> var P.<> semi <+> rhs+  | True+  = lhs <+> text "=" <+> rhs+  where doNotAssign (IEEEFP FP_Reinterpret{}) = True   -- generates a memcpy instead; no simple assignment+        doNotAssign PseudoBoolean{}            = True   -- assigns through an overflow-safe reduction+        doNotAssign _                          = False  -- generates simple assignment++        rhs = p op (map (showSV cfg consts) opArgs)++        rtc = cgRTC cfg++        cBinOps = [ (Plus, "+"), (Times, "*"), (Minus, "-")+                  , (Equal False, "==")  -- no strong equality!+                  , (NotEqual, "!="), (LessThan, "<"), (GreaterThan, ">"), (LessEq, "<="), (GreaterEq, ">=")+                  , (And, "&"), (Or, "|"), (XOr, "^")+                  ]++        -- see if we can find a constant shift; makes the output way more readable+        getShiftAmnt def [_, sv] = case sv `lookup` consts of+                                    Just (CV _  (CInteger i)) -> integer i+                                    _                         -> def+        getShiftAmnt def _       = def++        hd _ (h:_) = h+        hd w []    = error $ "Data.SBV.C.ppExpr: Impossible happened: " ++ w ++ ", received empty list!"++        p :: Op -> [Doc] -> Doc+        p ReadArray{}       _  = tbd "User specified arrays (ReadArray)"+        p WriteArray{}      _  = tbd "User specified arrays (WriteArray)"+        p (Label s)        [a] = a <+> text "/*" <+> cCommentText s <+> text "*/"+        p (IEEEFP w)         as = handleIEEE w  consts (zip opArgs as) var+        p (PseudoBoolean pb) as = assignPseudoBoolean pb as var+        p (OverflowOp o) _      = tbd $ "Overflow operations" ++ show o+        p castOp@KindCast{} [a]+          | Just width <- mappedRealFloorWidth cfg castOp+          = mappedRealFloorCall width a+        p (KindCast _ to)   [a] = parens (text (show to)) <+> a+        p (Uninterpreted s) [] = text "/* Uninterpreted constant */" <+> text (T.unpack s)+        p (Uninterpreted s) as = text "/* Uninterpreted function */" <+> text (T.unpack s) P.<> parens (fsep (punctuate comma as))+        p (Extract i j) [a]    = extract i j (hd "Extract" opArgs) a+        p Join [a, b]          = join (let (s1 : s2 : _) = opArgs in (s1, s2, a, b))+        p (Rol i) [a]          = rotate True  i a (hd "Rol" opArgs)+        p (Ror i) [a]          = rotate False i a (hd "Ror" opArgs)+        p Shl     [a, i]       = shift  True  (getShiftAmnt i opArgs) a -- The order of i/a being reversed here is+        p Shr     [a, i]       = shift  False (getShiftAmnt i opArgs) a -- intentional and historical (from the days when Shl/Shr had a constant parameter.)+        p Not [a]              = case kindOf (hd "Not" opArgs) of+                                   -- be careful about booleans, bitwise complement is not correct for them!+                                   KBool -> text "!" P.<> a+                                   _     -> text "~" P.<> a+        p Ite [a, b, c] = a <+> text "?" <+> b <+> text ":" <+> c+        p (LkUp (t, k, _, len) ind def) []+          | not rtc                    = lkUp -- ignore run-time-checks per user request+          | needsCheckL && needsCheckR = cndLkUp checkBoth+          | needsCheckL                = cndLkUp checkLeft+          | needsCheckR                = cndLkUp checkRight+          | True                       = lkUp+          where [index, defVal] = map (showSV cfg consts) [ind, def]++                lkUp = text "table" P.<> int t P.<> brackets (showSV cfg consts ind)+                cndLkUp cnd = cnd <+> text "?" <+> defVal <+> text ":" <+> lkUp++                checkLeft  = index <+> text "< 0"+                checkRight = index <+> text ">=" <+> int len+                checkBoth  = parens (checkLeft <+> text "||" <+> checkRight)++                canOverflow True  sz = (2::Integer)^(sz-1)-1 >= fromIntegral len+                canOverflow False sz = (2::Integer)^sz    -1 >= fromIntegral len++                (needsCheckL, needsCheckR) = case k of+                                               KVar{}          -> die $ "array index with variable: " ++ show k+                                               KBool           -> (False, canOverflow False (1::Int))+                                               KBounded sg sz  -> (sg, canOverflow sg sz)+                                               KReal           -> die "array index with real value"+                                               KFloat          -> die "array index with float value"+                                               KDouble         -> die "array index with double value"+                                               KFP{}           -> die "array index with arbitrary float value"+                                               KRational       -> die "array index with rational value"+                                               KString         -> die "array index with string value"+                                               KChar           -> die "array index with character value"+                                               KUnbounded      -> case cgInteger cfg of+                                                                    Nothing -> (True, True) -- won't matter, it'll be rejected later+                                                                    Just i  -> (True, canOverflow True i)+                                               KList     s     -> die $ "List sort "   ++ show s+                                               KSet      s     -> die $ "Set sort "    ++ show s+                                               KTuple    s     -> die $ "Tuple sort "  ++ show s+                                               KArray    k1 k2 -> die $ "Array  sort " ++ show (k1, k2)+                                               KApp      s _   -> die $ "ADT app: " ++ s+                                               KADT      s _ _ -> die $ "ADT: "     ++ s++        -- Div/Rem should be careful on 0, in the SBV world x `div` 0 is 0, x `rem` 0 is x+        -- NB: Quot is supposed to truncate toward 0; Not clear to me if C guarantees this behavior.+        -- Brief googling suggests C99 does indeed truncate toward 0, but other C compilers might differ.+        p Quot [a, b] = let k = kindOf (hd "Quot" opArgs)+                            z = mkConst cfg $ mkConstCV k (0::Integer)+                        in protectDiv0 k "/" z a b+        p Rem  [a, b] = protectDiv0 (kindOf (hd "Rem" opArgs)) "%" a a b+        p UNeg [a]    = parens (text "-" <+> a)+        p Abs  [a]    = let f KFloat             = text "fabsf" P.<> parens a+                            f KDouble            = text "fabs"  P.<> parens a+                            f (KBounded False _) = text "/* unsigned, skipping call to abs */" <+> a+                            f (KBounded True 32) = text "labs"  P.<> parens a+                            f (KBounded True 64) = text "llabs" P.<> parens a+                            f KUnbounded         = case cgInteger cfg of+                                                     Nothing -> f $ KBounded True 32 -- won't matter, it'll be rejected later+                                                     Just i  -> f $ KBounded True i+                            f KReal              = case cgReal cfg of+                                                     Nothing           -> f KDouble -- won't matter, it'll be rejected later+                                                     Just CgFloat      -> f KFloat+                                                     Just CgDouble     -> f KDouble+                                                     Just CgLongDouble -> text "fabsl" P.<> parens a+                            f _                  = text "abs" P.<> parens a+                        in f (kindOf (hd "Abs" opArgs))+        -- for And/Or, translate to boolean versions if on boolean kind+        p And [a, b] | kindOf (hd "And" opArgs) == KBool = a <+> text "&&" <+> b+        p Or  [a, b] | kindOf (hd "Or"  opArgs) == KBool = a <+> text "||" <+> b+        p o [a, b]+          | Just co <- lookup o cBinOps+          = a <+> text co <+> b++        p Implies [a, b] | kindOf (hd "Implies" opArgs) == KBool = parens (text "!" P.<> a <+> text "||" <+> b)++        p NotEqual xs = mkDistinct xs+        p o args = die $ "Received operator " ++ show o ++ " applied to " ++ show args++        -- generate a pairwise inequality check+        mkDistinct args = fsep $ andAll $ walk args+          where walk []     = []+                walk (e:es) = map (pair e) es ++ walk es++                pair e1 e2  = parens (e1 <+> text "!=" <+> e2)++                -- like punctuate, but more spacing+                andAll []     = []+                andAll (d:ds) = go d ds+                     where go d' [] = [d']+                           go d' (e:es) = (d' <+> text "&&") : go e es++        -- Div0 needs to protect, but only when the arguments are not float/double. (Div by 0 for those are well defined to be Inf/NaN etc.)+        protectDiv0 k divOp def a b = case k of+                                        KFloat  -> res+                                        KDouble -> res+                                        _       -> wrap+           where res  = a <+> text divOp <+> b+                 wrap = parens (b <+> text "== 0") <+> text "?" <+> def <+> text ":" <+> parens res++        shift toLeft i a = a <+> text cop <+> i+          where cop | toLeft = "<<"+                    | True   = ">>"++        rotate toLeft i a s+          | i < 0   = rotate (not toLeft) (-i) a s+          | i == 0  = a+          | True    = case kindOf s of+                        KBounded True _             -> tbd $ "Rotation of signed quantities: " ++ show (toLeft, i, s)+                        KBounded False sz | i >= sz -> rotate toLeft (i `mod` sz) a s+                        KBounded False sz           ->     parens (a <+> text cop  <+> int i)+                                                      <+> text "|"+                                                      <+> parens (a <+> text cop' <+> int (sz - i))+                        KUnbounded                  -> shift toLeft (int i) a -- For SInteger, rotate is the same as shift in Haskell+                        _                           -> tbd $ "Rotation for unbounded quantity: " ++ show (toLeft, i, s)+          where (cop, cop') | toLeft = ("<<", ">>")+                            | True   = (">>", "<<")++        -- TBD: below we only support the values for extract that are "easy" to implement. These should cover+        -- almost all instances actually generated by SBV, however.+        extract hi lo i a  -- Isolate the bit-extraction case+          | hi == lo, KBounded _ sz <- kindOf i, hi < sz, hi >= 0+          = if hi == 0+            then text "(SBool)" <+> parens (a <+> text "& 1")+            else text "(SBool)" <+> parens (parens (a <+> text ">>" <+> int hi) <+> text "& 1")+        extract hi lo i a+          | srcSize `notElem` [64, 32, 16]+          = bad "Unsupported source size"+          | (hi + 1) `mod` 8 /= 0 || lo `mod` 8 /= 0+          = bad "Unsupported non-byte-aligned extraction"+          | tgtSize < 8 || tgtSize `mod` 8 /= 0+          = bad "Unsupported target size"+          | True+          = text cast <+> shifted+          where bad why    = tbd $ "extract with " ++ show (hi, lo, k, i) ++ " (Reason: " ++ why ++ ".)"++                k          = kindOf i+                srcSize    = intSizeOf k+                tgtSize    = hi - lo + 1+                signChange = srcSize == tgtSize++                cast+                  | signChange && hasSign k = "(SWord" ++ show srcSize ++ ")"+                  | signChange              = "(SInt"  ++ show srcSize ++ ")"+                  | True                    = "(SWord" ++ show tgtSize ++ ")"++                shifted+                  | lo == 0 = a+                  | True    = parens (a <+> text ">>" <+> int lo)++        -- TBD: ditto here for join, just like extract above+        join (i, j, a, b) = case (kindOf i, kindOf j) of+                              (KBounded False  8, KBounded False  8) -> parens (parens (text "(SWord16)" <+> a) <+> text "<< 8")  <+> text "|" <+> parens (text "(SWord16)" <+> b)+                              (KBounded False 16, KBounded False 16) -> parens (parens (text "(SWord32)" <+> a) <+> text "<< 16") <+> text "|" <+> parens (text "(SWord32)" <+> b)+                              (KBounded False 32, KBounded False 32) -> parens (parens (text "(SWord64)" <+> a) <+> text "<< 32") <+> text "|" <+> parens (text "(SWord64)" <+> b)+                              (k1,                k2)                -> tbd $ "join with " ++ show ((k1, i), (k2, j))++-- | Quote a document after replacing its line breaks with spaces.+-- Otherwise breaks the generated code.. sigh+printQuotes :: Doc -> Doc+printQuotes d = text $ '"' : ppSameLine d ++ "\""++-- | Replace document line breaks with spaces for single-line output.+ppSameLine :: Doc -> String+ppSameLine = trim . render+ where trim ""        = ""+       trim ('\n':cs) = ' ' : trim (dropWhile isSpace cs)+       trim (c:cs)    = c   : trim cs++-- | Align documents by padding their left sides to the same width.+-- this is ugly and inefficient, but easy to code..+align :: [Doc] -> [Doc]+align ds = map (text . pad) ss+  where ss    = map render ds+        l     = maximum (0 : map length ss)+        pad s = replicate (l - length s) ' ' ++ s++-- | Merge a bunch of bundles to generate code for a library. For the final+-- config, we simply return the first config we receive, or the default if none.+mergeToLib :: String -> [(CgConfig, CgPgmBundle)] -> (CgConfig, CgPgmBundle)+mergeToLib libName cfgBundles+  | length nubKinds /= 1+  = error $  "Cannot merge programs with differing SInteger/SReal mappings. Received the following kinds:\n"+          ++ unlines (map show nubKinds)+  | True+  = (finalCfg, CgPgmBundle bundleKind $ sources ++ libHeader : [libDriver | anyDriver] ++ [libMake | anyMake])+  where bundles     = map snd cfgBundles+        kinds       = [k | CgPgmBundle k _ <- bundles]+        nubKinds    = nub kinds+        bundleKind  = case nubKinds of+                        bk:_ -> bk+                        []   -> error "Data.SBV.C: Impossible happened: mergeLibs: kinds ended up being empty!"+        files       = concat [fs | CgPgmBundle _ fs <- bundles]+        sigs        = concat [ss | (_, (CgHeader ss, _)) <- files]+        anyMake     = not (null [() | (_, (CgMakefile{}, _)) <- files])+        drivers     = [ds | (_, (CgDriver, ds)) <- files]+        anyDriver   = not (null drivers)+        mkFlags     = nub (concat [xs | (_, (CgMakefile xs, _)) <- files])+        sources     = [(f, (CgSource, [pre, libHInclude, post])) | (f, (CgSource, [pre, _, post])) <- files]+        sourceNms   = map fst sources+        libHeader   = (libName ++ ".h", (CgHeader sigs, [genHeader bundleKind libName sigs empty]))+        libHInclude = text "#include" <+> text (show (libName ++ ".h"))+        libMake     = ("Makefile", (CgMakefile mkFlags, [genLibMake anyDriver libName sourceNms mkFlags]))+        libDriver   = (libName ++ "_driver.c", (CgDriver, mergeDrivers libName libHInclude (zip (map takeBaseName sourceNms) drivers)))+        finalCfg    = case cfgBundles of+                        []         -> defaultCgConfig+                        ((c, _):_) -> c++-- | Create a Makefile for the library+genLibMake :: Bool -> String -> [String] -> [String] -> Doc+genLibMake ifdr libName fs ldFlags = foldr1 ($$) [l | (True, l) <- lns]+ where ifld = not (null ldFlags)+       ld | ifld = text "${LDFLAGS}"+          | True = empty+       lns = [ (True, text "# Makefile for" <+> nm P.<> text ". Automatically generated by SBV. Do not edit!")+             , (True,  text "")+             , (True,  text "# include any user-defined .mk file in the current directory.")+             , (True,  text "-include *.mk")+             , (True,  text "")+             , (True,  text "CC?=gcc")+             , (True,  text "CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer")+             , (ifld,  text "LDFLAGS?=" P.<> text (unwords ldFlags))+             , (True,  text "AR?=ar")+             , (True,  text "ARFLAGS?=cr")+             , (True,  text "")+             , (not ifdr,  text ("all: " ++ liba))+             , (ifdr,      text ("all: " ++ unwords [liba, libd]))+             , (True,  text "")+             , (True,  text liba P.<> text (": " ++ unwords os))+             , (True,  text "\trm -f $@.tmp")+             , (True,  text "\t${AR} ${ARFLAGS} $@.tmp $^")+             , (True,  text "\tmv -f $@.tmp $@")+             , (True,  text "")+             , (ifdr,  text libd P.<> text (": " ++ unwords [libd ++ ".c", libh, liba]))+             , (ifdr,  text ("\t${CC} ${CCFLAGS} $< -o $@ " ++ liba) <+> ld)+             , (ifdr,  text "")+             , (True,  vcat (zipWith mkObj os fs))+             , (True,  text "clean:")+             , (True,  text "\trm -f *.o")+             , (True,  text "")+             , (True,  text "veryclean: clean")+             , (not ifdr,  text "\trm -f" <+> text (unwords [liba, liba ++ ".tmp"]))+             , (ifdr,      text "\trm -f" <+> text (unwords [liba, libd, liba ++ ".tmp"]))+             , (True,  text "")+             ]+       nm = text libName+       liba = libName ++ ".a"+       libh = libName ++ ".h"+       libd = libName ++ "_driver"+       os   = map (`replaceExtension` ".o") fs+       mkObj o f =  text o P.<> text (": " ++ unwords [f, libh])+                 $$ text "\t${CC} ${CCFLAGS} -c $< -o $@"+                 $$ text ""++-- | Create a driver for a library+mergeDrivers :: String -> Doc -> [(FilePath, [Doc])] -> [Doc]+mergeDrivers libName inc ds = pre : concatMap mkDFun ds ++ [callDrivers (map fst ds)]+  where pre =  text "/* Example driver program for" <+> text libName P.<> text ". */"+            $$ text "/* Automatically generated by SBV. Edit as you see fit! */"+            $$ text ""+            $$ text "#include <stdio.h>"+            $$ inc+        mkDFun (f, [_pre, _header, body, _post]) = [header, body, post]+           where header =  text ""+                        $$ text ("void " ++ f ++ "_driver(void)")+                        $$ text "{"+                 post   =  text "}"+        mkDFun (f, _) = die $ "mergeDrivers: non-conforming driver program for " ++ show f+        callDrivers fs =   text ""+                       $$  text "int main(void)"+                       $$  text "{"+                       $+$ nest 2 (vcat (map call fs))+                       $$  nest 2 (text "return 0;")+                       $$  text "}"+        call f =  text psep+               $$ text ptag+               $$ text psep+               $$ text (f ++ "_driver();")+               $$ text ""+           where tag  = "** Driver run for " ++ f ++ ":"+                 ptag = "printf(\"" ++ tag ++ "\\n\");"+                 lsep = replicate (length tag) '='+                 psep = "printf(\"" ++ lsep ++ "\\n\");"++-- | Return the linker flags required by a legacy scalar operation.+getLDFlag :: (Op, Kind) -> [String]+getLDFlag (o, k) = flag o+  where math = ["-lm"]++        flag (IEEEFP FP_Cast{})                                     = math+        flag (KindCast KReal KUnbounded)                            = math+        flag (IEEEFP fop)       | fop `elem` requiresMath           = math+        flag Abs                | k `elem` [KFloat, KDouble, KReal] = math+        flag _                                                      = []++        requiresMath = [ FP_Abs+                       , FP_FMA+                       , FP_Sqrt+                       , FP_Rem+                       , FP_Min+                       , FP_Max+                       , FP_RoundToIntegral+                       , FP_ObjEqual+                       , FP_IsSubnormal+                       , FP_IsInfinite+                       , FP_IsNaN+                       , FP_IsNegative+                       , FP_IsPositive+                       , FP_IsNormal+                       , FP_IsZero+                       ]++{- HLint ignore module "Redundant lambda" -}
+ Data/SBV/Compilers/C/List.hs view
@@ -0,0 +1,605 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.List+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Typed symbolic-list lowering for generated C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.List+  ( listKinds+  , listSupported+  , listUsesExact+  , listNeedsDriverInit+  , listCType+  , listForwardTypeDecls+  , listTypeDecls+  , listOwnershipTypeDecls+  , listRuntimeDecls+  , listRuntime+  , listConst+  , listExpr+  , listEqual+  , listClone+  , listRelease+  , listDriverValue+  , listDriverInit+  , listDriverClear+  , listPrint+  , listContextStart+  , listContextEnd+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.List                       (nub, sortOn, stripPrefix, tails)+import qualified Data.Set as Set++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Arena      (CArena(..), arenaRuntime)+import Data.SBV.Compilers.C.Array      (arrayStoredLoad, arrayStoredValue)+import Data.SBV.Compilers.C.GMP        (gmpFunctionName, gmpInitializeCopy, gmpOutputType, isExactGMPKind)+import Data.SBV.Compilers.C.Lowering   (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Types      (isConcreteADT, constElementCType, elementCType, kindTag, listCloneName, listReleaseName, listHelperName)+import Data.SBV.Compilers.C.Value      ( byValueEqual+                                       , managedValueClone+                                       , managedValueRelease+                                       , valueDriverClear+                                       , valueDriverInit+                                       , valueDriverNeedsInitialization+                                       , valueNeedsOwnership+                                       )+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data+import Data.SBV.Core.Kind              (expandKinds)++-- | Return all distinct symbolic-list kinds in dependency order.+listKinds :: Set.Set Kind -> [Kind]+listKinds = sortOn listDepth . nub . concatMap (filter isList . expandKinds) . Set.toAscList+ where listDepth :: Kind -> Int+       listDepth (KList elementKind) = 1 + listDepth elementKind+       listDepth _                   = 0++-- | Test whether a list element kind has a supported C representation. Array+-- elements support structural movement and indexing, but operations requiring+-- extensional element equality are rejected by 'listExpr'.+listSupported :: CgConfig -> Kind -> Bool+listSupported _ (KList elementKind) = supportedElement elementKind+ where supportedElement KBool                          = True+       supportedElement KBounded{}                     = True+       supportedElement KFloat                         = True+       supportedElement KDouble                        = True+       supportedElement KChar                          = True+       supportedElement KString                        = True+       supportedElement KFP{}                          = True+       supportedElement KUnbounded                     = True+       supportedElement KReal                          = True+       supportedElement KRational                      = True+       supportedElement (KList kind)                   = supportedElement kind+       supportedElement (KSet kind)                    = supportedElement kind+       supportedElement (KArray keyKind valueKind)     = supportedElement keyKind && supportedElement valueKind+       supportedElement (KTuple kinds)                 = all supportedElement kinds+       supportedElement kind+         | isConcreteADT kind = True+         | True               = isRoundingMode kind+listSupported _ _ = False++-- | Test whether a list stores exact GMP-backed elements.+listUsesExact :: CgConfig -> Kind -> Bool+listUsesExact cfg (KList elementKind) = isExactGMPKind cfg elementKind+listUsesExact _   _                   = False++-- | Test whether an example-driver list requires statement-based element+-- initialization instead of a single compound literal.+listNeedsDriverInit :: CgConfig -> Kind -> Bool+listNeedsDriverInit cfg (KList elementKind) = valueDriverNeedsInitialization cfg elementKind+listNeedsDriverInit _   _                   = False++-- | Return the public C descriptor type for a symbolic-list kind.+listCType :: Kind -> String+listCType kind@KList{} = elementCType kind+listCType kind         = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Emit guarded forward declarations for symbolic-list descriptor types.+-- These declarations allow list and set descriptors to contain pointers to+-- each other before either family has emitted its complete layouts.+listForwardTypeDecls :: [Kind] -> Doc+listForwardTypeDecls []    = empty+listForwardTypeDecls kinds = text . unlines $ concatMap declaration kinds+ where declaration kind@KList{} =+         [ "#ifndef " ++ listForwardGuard kind+         , "#define " ++ listForwardGuard kind+         , "typedef struct " ++ listCType kind ++ " " ++ listCType kind ++ ";"+         , "#endif"+         , ""+         ]+       declaration kind = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Emit typed borrowed-list descriptors and ownership-helper prototypes.+-- The element type may remain incomplete here because descriptors only carry+-- pointers; definitions that inspect elements are emitted later by+-- 'listOwnershipTypeDecls'.+listTypeDecls :: CgConfig -> [Kind] -> Doc+listTypeDecls cfg kinds+  | null kinds = empty+  | True       = listForwardTypeDecls kinds $$ text (unlines $+      ["/* Typed symbolic lists. Inputs borrow their elements; outputs and returns own them. */"+      , cUnusedAttribute+      ]+      ++ concatMap declaration kinds+      )+ where declaration kind@(KList elementKind)+         | listSupported cfg kind+         = let cType       = listCType kind+               cloneName    = listCloneName kind+               releaseName  = listReleaseName kind+           in [ "#ifndef " ++ listGuard kind+              , "#define " ++ listGuard kind+              , "struct " ++ cType ++ " { " ++ constElementCType elementKind ++ " *data; size_t length; };"+              , "static inline SBV_CGEN_UNUSED " ++ cType ++ " " ++ cloneName ++ "(" ++ cType ++ " value);"+              , "static inline SBV_CGEN_UNUSED void " ++ releaseName ++ "(" ++ cType ++ " *value);"+              , "#endif"+              , ""+              ]+         | True+         = error $ "SBV->C: Unsupported list element kind: " ++ show elementKind+       declaration kind = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Emit list clone and release definitions after aggregate element layouts+-- are complete. Inputs borrow their element arrays; output and return values+-- own a cloned array and must be released with the matching helper.+listOwnershipTypeDecls :: CgConfig -> [Kind] -> Doc+listOwnershipTypeDecls cfg kinds+  | null kinds = empty+  | True       = text . unlines $ concatMap declaration kinds+ where declaration kind@(KList elementKind)+         | listSupported cfg kind+         = let cType       = listCType kind+               elementType = listElementCType elementKind+               cloneName    = listCloneName kind+               releaseName  = listReleaseName kind+           in [ "#ifndef " ++ listOwnershipGuard kind+              , "#define " ++ listOwnershipGuard kind+              , "static inline SBV_CGEN_UNUSED " ++ cType ++ " " ++ cloneName ++ "(" ++ cType ++ " value)"+              , "{"+              , "  " ++ elementType ++ " *copy = NULL;"+              , "  if (value.length != 0) {"+              , "    if (value.length > SIZE_MAX / sizeof(*copy)) abort();"+              , "    copy = (" ++ elementType ++ " *) malloc(value.length * sizeof(*copy));"+              , "    if (copy == NULL) abort();"+              ]+              ++ cloneElements elementKind+              ++ [ "  }"+              , "  return (" ++ cType ++ ") {copy, value.length};"+              , "}"+              , "static inline SBV_CGEN_UNUSED void " ++ releaseName ++ "(" ++ cType ++ " *value)"+              , "{"+              , "  if (value == NULL) return;"+              ]+              ++ releaseElements elementKind+              ++ [ "  *value = (" ++ cType ++ ") {NULL, 0};"+              , "}"+              , "#endif"+              , ""+              ]+         | True+         = error $ "SBV->C: Unsupported list element kind: " ++ show elementKind+       declaration kind = error $ "SBV->C: Expected a list kind, received " ++ show kind++       cloneElements elementKind+         | isExactGMPKind cfg elementKind+         =  [ "    for (size_t i = 0; i < value.length; ++i) {"+            , "      " ++ gmpOutputType elementKind ++ " element = (" ++ gmpOutputType elementKind ++ ") malloc(sizeof(*element));"+            , "      if (element == NULL) abort();"+            ]+         ++ map ("      " ++) (lines (render (gmpInitializeCopy elementKind (text "element") (text "value.data[i]"))))+         ++ [ "      copy[i] = element;"+            , "    }"+            ]+         | isConcreteADT elementKind || valueNeedsOwnership cfg elementKind+         = [ "    for (size_t i = 0; i < value.length; ++i)"+           , "      copy[i] = " ++ render (managedValueClone elementKind (text "value.data[i]")) ++ ";"+           ]+         | True+         = ["    memcpy(copy, value.data, value.length * sizeof(*copy));"]++       releaseElements elementKind+         | isExactGMPKind cfg elementKind+         = [ "  " ++ listElementCType elementKind ++ " *data = (" ++ listElementCType elementKind ++ " *) value->data;"+           , "  for (size_t i = 0; i < value->length; ++i) {"+           , "    " ++ gmpOutputType elementKind ++ " element = (" ++ gmpOutputType elementKind ++ ") data[i];"+           , "    if (element != NULL) { " ++ gmpFunctionName elementKind "clear" ++ "(element); free(element); }"+           , "  }"+           , "  free(data);"+           ]+         | isConcreteADT elementKind || valueNeedsOwnership cfg elementKind+         = [ "  " ++ listElementCType elementKind ++ " *data = (" ++ listElementCType elementKind ++ " *) value->data;"+           , "  for (size_t i = 0; i < value->length; ++i)"+           , "    " ++ render (managedValueRelease elementKind (text "&data[i]"))+           , "  free(data);"+           ]+         | True+         = ["  free((void *) value->data);"]++-- | Emit forward declarations for list equality helpers referenced by nested+-- aggregate element comparisons.+listRuntimeDecls :: CgConfig -> [Kind] -> Doc+listRuntimeDecls cfg kinds = text . unlines $+  [ "static SBV_CGEN_UNUSED bool " ++ helperName kind "equal" ++ "(" ++ listCType kind ++ " left, " ++ listCType kind ++ " right);"+  | kind <- kinds+  , listSupported cfg kind+  ]++-- | Emit the shared list arena and specialized sequence operations for every+-- list kind used by the generated program.+listRuntime :: CgConfig -> Bool -> [Kind] -> Doc+listRuntime cfg usesExactInteger kinds = text . unlines . map markUnused $+     commonRuntime+  ++ (if usesExactInteger then exactIndexRuntime else [])+  ++ concatMap specializedRuntime kinds+ where markUnused line = case stripPrefix "static " line of+                           Just rest -> "static SBV_CGEN_UNUSED " ++ rest+                           Nothing   -> line++       specializedRuntime kind+         | listSupported cfg kind = listKindRuntime cfg usesExactInteger kind+         | True                   = error $ "SBV->C: Unsupported list kind: " ++ show kind++-- | Render a list constant with a caller-supplied renderer for its elements.+listConst :: (CV -> Doc) -> CV -> Maybe Doc+listConst renderElement (CV kind@(KList elementKind) (CList values))+  = Just $ text "((" P.<> text (listCType kind) P.<> text ") {"+       P.<> elements+       P.<> text ", "+       P.<> int (length values)+       P.<> text "})"+ where elements+         | null values = text "NULL"+         | True        = text "(" P.<> text (constElementCType elementKind) P.<> text "[]) {"+                      P.<> fsep (punctuate comma (map (arrayStoredValue elementKind . renderElement . CV elementKind) values))+                      P.<> text "}"+listConst _ _ = Nothing++-- | Lower the core symbolic sequence operations for non-character lists.+listExpr :: CgConfig -> Op -> [SV] -> SV -> [Doc] -> Maybe CLowering+listExpr cfg op svs resultSV args+  | not touchesList = Nothing+  | True            = case (op, args) of+      (ADTOp{}                   , _        )                    -> Nothing+      (TupleConstructor{}        , _        )                    -> Nothing+      (TupleAccess{}             , _        )                    -> Nothing+      (Uninterpreted{}           , _        )                    -> Nothing+      (Label _                   , [a]      )                    -> lower a+      (Equal _                   , [a, b]   )                    -> lower $ call (helper "equal") [a, b]+      (NotEqual                  , as       )                    -> lower $ distinctLists as+      (SeqOp (SeqLen kind)       , [a]      ) | kind /= KChar   -> lowerInteger False $ call (helperFor kind "length") [a]+      (SeqOp (SeqConcat _)       , as       )+        | KList elementKind <- resultKind                       -> lower $ foldLists elementKind as+      (SeqOp (SeqNth kind)       , [a, i]   ) | kind /= KChar   -> loadArray $ indexed kind "nth" [a] i+      (SeqOp (SeqUnit kind)      , [a]      ) | kind /= KChar   -> lower $ call (helperFor kind "unit") [text "&sbv_local_list_ctx", arrayStoredValue kind a]+      (SeqOp (SeqSubseq kind)    , [a, i, n]) | kind /= KChar   -> lower $ indexed2 kind "substring" a i n+      (SeqOp (SeqIndexOf kind)   , [a, b, i]) | kind /= KChar   -> lowerInteger True $ indexed kind "index_of" [a, b] i+      (SeqOp (SeqContains kind)  , [a, b]   ) | kind /= KChar   -> lower $ call (helperFor kind "contains") [a, b]+      (SeqOp (SeqPrefixOf kind)  , [a, b]   ) | kind /= KChar   -> lower $ call (helperFor kind "prefix_of") [a, b]+      (SeqOp (SeqSuffixOf kind)  , [a, b]   ) | kind /= KChar   -> lower $ call (helperFor kind "suffix_of") [a, b]+      (SeqOp (SeqReplace kind)   , [a, b, c]) | kind /= KChar   -> lower $ call (helperFor kind "replace") [text "&sbv_local_list_ctx", a, b, c]+      _ -> unsupported+ where resultKind = kindOf resultSV++       touchesList = isList resultKind || any (isList . kindOf) svs || isListOp op++       listKind = case [kind | value <- resultKind : map kindOf svs, kind@(KList _) <- [value]] of+                    kind:_ -> kind+                    []     -> error $ "SBV->C: Cannot determine list kind for " ++ show op++       lower expression = Just $ expressionLowering requirements expression++       loadArray expression+         | isArray resultKind = Just (arrayStoredLoad resultSV expression)+         | True               = lower expression++       lowerInteger signed expression+         | isExactGMPKind cfg resultKind+         = Just $ expressionLowering [CRequiresLists, CRequiresGMP]+                $ call (if signed then "sbv_gmp_integer_from_s64" else "sbv_gmp_integer_from_u64")+                       [text "&sbv_local_gmp_ctx", expression]+         | True+         = lower $ parens (text "SInteger") <+> expression++       requirements = CRequiresLists : [CRequiresGMP | any (isExactGMPKind cfg) touchedKinds]++       touchedKinds = concatMap expandKinds (resultKind : map kindOf svs)++       helper = helperName listKind++       helperFor elementKind = helperName (KList elementKind)++       distinctLists rendered = fsep $ punctuate (text " &&")+                                      [parens (text "!" P.<> call (helper "equal") [left, right])+                                      | (left:rest) <- tails rendered, right <- rest]++       foldLists _           []           = text "((" P.<> text (listCType listKind) P.<> text ") {NULL, 0})"+       foldLists _           [value]      = value+       foldLists elementKind (value:rest) = foldl combine value rest+         where combine left right = call (helperFor elementKind "concat") [text "&sbv_local_list_ctx", left, right]++       indexed elementKind suffix prefix index+        | exactIndex = call (helperFor elementKind (suffix ++ "_mpz")) (context ++ prefix ++ [index])+        | True       = call (helperFor elementKind suffix) (context ++ prefix ++ [parens (text "int64_t") <+> index])+        where context+                | suffix == "nth" && isExactGMPKind cfg elementKind = [text "&sbv_local_gmp_ctx"]+                | True                                               = []++       indexed2 elementKind suffix value offset count+         | exactIndex = call (helperFor elementKind (suffix ++ "_mpz")) [text "&sbv_local_list_ctx", value, offset, count]+         | True       = call (helperFor elementKind suffix)+                             [text "&sbv_local_list_ctx", value, parens (text "int64_t") <+> offset, parens (text "int64_t") <+> count]++       exactIndex = any (isExactGMPKind cfg . kindOf) svs++       requiresElementEquality Equal{}                 = True+       requiresElementEquality NotEqual                = True+       requiresElementEquality (SeqOp SeqIndexOf{})    = True+       requiresElementEquality (SeqOp SeqContains{})   = True+       requiresElementEquality (SeqOp SeqPrefixOf{})   = True+       requiresElementEquality (SeqOp SeqSuffixOf{})   = True+       requiresElementEquality (SeqOp SeqReplace{})    = True+       requiresElementEquality _                       = False++       unsupported+         | requiresElementEquality op+         , any isArray (expandKinds (listElementKind listKind))+         = error $ "SBV->C: List operation " ++ show op+                ++ " requires unsupported extensional equality for array-valued elements."+         | True+         = error $ "SBV->C: List lowering does not support " ++ show op+                ++ " with argument kinds " ++ show (map kindOf svs)+                ++ " and result kind " ++ show resultKind++-- | Compare two list descriptors using symbolic sequence equality.+listEqual :: Kind -> Doc -> Doc -> Doc+listEqual kind left right = call (helperName kind "equal") [left, right]++-- | Deep-copy a list across the generated function's ownership boundary.+listClone :: Kind -> Doc -> Doc+listClone kind value = call (listCloneName kind) [value]++-- | Release an owned list in a generated driver.+listRelease :: Kind -> Doc -> Doc+listRelease kind value = call (listReleaseName kind) [text "&" P.<> value] P.<> semi++-- | Produce a deterministic three-element list value for an example driver.+listDriverValue :: (Kind -> Integer -> Doc) -> Kind -> Integer -> Doc+listDriverValue renderValue kind@(KList elementKind) seed+  = text "((" P.<> text (listCType kind) P.<> text ") {"+       P.<> text "(" P.<> text (constElementCType elementKind) P.<> text "[]) {"+       P.<> fsep (punctuate comma [renderValue elementKind seed, renderValue elementKind (seed + 1), renderValue elementKind (seed + 2)])+       P.<> text "}, 3})"+listDriverValue _ kind _ = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Initialize a generated-driver list whose elements require statement-based+-- setup. The descriptor borrows three independently initialized elements;+-- release their storage with 'listDriverClear' after the call completes. The+-- supplied statement renderer handles retained array and ADT elements.+listDriverInit :: CgConfig -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> String -> Integer -> Doc+listDriverInit cfg renderValue initializeValue kind@KList{} externalName seed = valueDriverInit cfg renderValue initializeValue kind externalName seed+listDriverInit _   _           _               kind         _            _    = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Clear managed element storage initialized by 'listDriverInit'.+listDriverClear :: CgConfig -> Kind -> String -> Doc+listDriverClear cfg kind@KList{} externalName = valueDriverClear cfg kind externalName+listDriverClear _   kind         _            = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Print a list value using the supplied element printer.+listPrint :: (Kind -> Doc -> Doc) -> Kind -> Doc -> Doc+listPrint printElement (KList elementKind) value+  = text "printf(\"[\");"+ $$ text "for (size_t" <+> index <+> text "= 0;" <+> index <+> text "<" <+> value P.<> text ".length; ++" P.<> index P.<> text ")"+ $$ text "{"+ $$ nest 2 (   text "if" <+> parens (index <+> text "!= 0") <+> text "printf(\", \");"+            $$ printElement elementKind (value P.<> text ".data[" P.<> index P.<> text "]")+           )+ $$ text "}"+ $$ text "printf(\"]\");"+ where index = text ("sbv_local_list_print_index_" ++ kindTag elementKind)+listPrint _ kind _ = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Initialize the arena used by list temporaries in a generated function.+listContextStart :: Doc+listContextStart = text "sbv_list_ctx sbv_local_list_ctx = {NULL};"++-- | Release all list temporaries allocated by a generated function.+listContextEnd :: Doc+listContextEnd = call "sbv_list_ctx_end" [text "&sbv_local_list_ctx"] P.<> semi++-- | Test whether an operation belongs to the non-character sequence family.+isListOp :: Op -> Bool+isListOp (SeqOp (SeqLen kind))      = kind /= KChar+isListOp (SeqOp (SeqConcat kind))   = kind /= KChar+isListOp (SeqOp (SeqNth kind))      = kind /= KChar+isListOp (SeqOp (SeqUnit kind))     = kind /= KChar+isListOp (SeqOp (SeqSubseq kind))   = kind /= KChar+isListOp (SeqOp (SeqIndexOf kind))  = kind /= KChar+isListOp (SeqOp (SeqContains kind)) = kind /= KChar+isListOp (SeqOp (SeqPrefixOf kind)) = kind /= KChar+isListOp (SeqOp (SeqSuffixOf kind)) = kind /= KChar+isListOp (SeqOp (SeqReplace kind))  = kind /= KChar+isListOp _                          = False++-- | Return the C type used to store one supported list element.+listElementCType :: Kind -> String+listElementCType KChar = "SChar"+listElementCType kind  = elementCType kind++-- | Return the preprocessor guard for one list forward declaration.+listForwardGuard :: Kind -> String+listForwardGuard kind = "SBV_LIST_" ++ kindTag (listElementKind kind) ++ "_FORWARD_DEFINED"++-- | Return the preprocessor guard for one list descriptor.+listGuard :: Kind -> String+listGuard kind = "SBV_LIST_" ++ kindTag (listElementKind kind) ++ "_DEFINED"++-- | Return the preprocessor guard for one list ownership-helper definition.+listOwnershipGuard :: Kind -> String+listOwnershipGuard kind = "SBV_LIST_" ++ kindTag (listElementKind kind) ++ "_OWNERSHIP_DEFINED"++-- | Return the element kind of a symbolic-list kind.+listElementKind :: Kind -> Kind+listElementKind (KList elementKind) = elementKind+listElementKind kind                = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Return one specialized list-operation helper name.+helperName :: Kind -> String -> String+helperName = listHelperName++-- | Render a C helper call.+call :: String -> [Doc] -> Doc+call functionName args = text functionName P.<> parens (fsep (punctuate comma args))++-- | Shared per-call allocation arena used by every list specialization.+commonRuntime :: [String]+commonRuntime = arenaRuntime ListArena++-- | Exact-GMP index conversion shared by specialized list operations.+exactIndexRuntime :: [String]+exactIndexRuntime =+  ["static bool sbv_list_mpz_to_size(SInteger value, size_t *result)"+  , "{"+  , "  if (mpz_sgn(value) < 0 || mpz_sizeinbase(value, 2) > sizeof(size_t) * CHAR_BIT) return false;"+  , "  size_t written = 0; *result = 0;"+  , "  (void) mpz_export(result, &written, -1, sizeof(*result), 0, 0, value);"+  , "  return true;"+  , "}"+  ]++-- | Emit all sequence helpers for one supported list element kind.+listKindRuntime :: CgConfig -> Bool -> Kind -> [String]+listKindRuntime cfg usesExactInteger kind@(KList elementKind) =+  [ ""+  , "static bool " ++ equalElement ++ "(" ++ elementType ++ " left, " ++ elementType ++ " right)"+  , "{ return " ++ elementEqual ++ "; }"+  , "static bool " ++ equalList ++ "(" ++ listType ++ " left, " ++ listType ++ " right)"+  , "{"+  , "  if (left.length != right.length) return false;"+  , "  for (size_t i = 0; i < left.length; ++i) if (!" ++ equalElement ++ "(left.data[i], right.data[i])) return false;"+  , "  return true;"+  , "}"+  , "static uint64_t " ++ helper "length" ++ "(" ++ listType ++ " value) { return (uint64_t) value.length; }"+  , "static " ++ listType ++ " " ++ helper "concat" ++ "(sbv_list_ctx *ctx, " ++ listType ++ " left, " ++ listType ++ " right)"+  , "{"+  , "  if (right.length > SIZE_MAX - left.length) abort();"+  , "  if (left.length == 0) return right;"+  , "  if (right.length == 0) return left;"+  , "  const size_t length = left.length + right.length;"+  , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_list_alloc(ctx, length, sizeof(*data));"+  , "  memcpy(data, left.data, left.length * sizeof(*data));"+  , "  memcpy(data + left.length, right.data, right.length * sizeof(*data));"+  , "  return (" ++ listType ++ ") {data, length};"+  , "}"+  , "static " ++ listType ++ " " ++ helper "unit" ++ "(sbv_list_ctx *ctx, " ++ elementType ++ " value)"+  , "{"+  , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_list_alloc(ctx, 1, sizeof(*data));"+  , "  data[0] = value; return (" ++ listType ++ ") {data, 1};"+  , "}"+  , "static " ++ elementType ++ " " ++ helper "nth_size" ++ "(" ++ exactContextParam ++ listType ++ " value, size_t index)"+  , "{ return index < value.length ? value.data[index] : " ++ defaultElement ++ "; }"+  , "static " ++ elementType ++ " " ++ helper "nth" ++ "(" ++ exactContextParam ++ listType ++ " value, int64_t index)"+  , "{ return index < 0 ? " ++ defaultElement ++ " : " ++ helper "nth_size" ++ "(" ++ exactContextArg ++ "value, (size_t) index); }"+  , "static " ++ listType ++ " " ++ helper "substring_size" ++ "(sbv_list_ctx *ctx, " ++ listType ++ " value, size_t offset, size_t count)"+  , "{"+  , "  if (offset >= value.length || count == 0) return (" ++ listType ++ ") {NULL, 0};"+  , "  if (count > value.length - offset) count = value.length - offset;"+  , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_list_alloc(ctx, count, sizeof(*data));"+  , "  memcpy(data, value.data + offset, count * sizeof(*data)); return (" ++ listType ++ ") {data, count};"+  , "}"+  , "static " ++ listType ++ " " ++ helper "substring" ++ "(sbv_list_ctx *ctx, " ++ listType ++ " value, int64_t offset, int64_t count)"+  , "{"+  , "  if (offset < 0 || count <= 0) return (" ++ listType ++ ") {NULL, 0};"+  , "  return " ++ helper "substring_size" ++ "(ctx, value, (size_t) offset, (size_t) count);"+  , "}"+  ]+  ++ matchRuntime+  ++ [ "static bool " ++ helper "prefix_of" ++ "(" ++ listType ++ " prefix, " ++ listType ++ " value)"+     , "{ return prefix.length <= value.length && " ++ helper "match_at" ++ "(value, prefix, 0); }"+     , "static bool " ++ helper "suffix_of" ++ "(" ++ listType ++ " suffix, " ++ listType ++ " value)"+     , "{ return suffix.length <= value.length && " ++ helper "match_at" ++ "(value, suffix, value.length - suffix.length); }"+     , "static bool " ++ helper "contains" ++ "(" ++ listType ++ " value, " ++ listType ++ " part)"+     , "{ return " ++ helper "index_of_size" ++ "(value, part, 0) >= 0; }"+     , "static int64_t " ++ helper "index_of" ++ "(" ++ listType ++ " value, " ++ listType ++ " part, int64_t start)"+     , "{ return start < 0 ? -1 : " ++ helper "index_of_size" ++ "(value, part, (size_t) start); }"+     , "static " ++ listType ++ " " ++ helper "replace" ++ "(sbv_list_ctx *ctx, " ++ listType ++ " value, " ++ listType ++ " source, " ++ listType ++ " replacement)"+     , "{"+     , "  const int64_t index = " ++ helper "index_of_size" ++ "(value, source, 0);"+     , "  if (index < 0) return value;"+     , "  const size_t retained = value.length - source.length;"+     , "  if (replacement.length > SIZE_MAX - retained) abort();"+     , "  const size_t length = retained + replacement.length;"+     , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_list_alloc(ctx, length, sizeof(*data));"+     , "  const size_t first = (size_t) index; const size_t after = first + source.length;"+     , "  if (first != 0) memcpy(data, value.data, first * sizeof(*data));"+     , "  if (replacement.length != 0) memcpy(data + first, replacement.data, replacement.length * sizeof(*data));"+     , "  if (after != value.length) memcpy(data + first + replacement.length, value.data + after, (value.length - after) * sizeof(*data));"+     , "  return (" ++ listType ++ ") {data, length};"+     , "}"+     ]+  ++ exactRuntime+ where listType     = listCType kind+       elementType  = listElementCType elementKind+       helper       = helperName kind+       equalElement = helper "element_equal"+       equalList    = helper "equal"+       elementEqual = render $ byValueEqual cfg True elementKind (text "left") (text "right")++       exactContextParam+         | isExactGMPKind cfg elementKind = "sbv_gmp_ctx *exact_ctx, "+         | True                           = ""++       exactContextArg+         | isExactGMPKind cfg elementKind = "exact_ctx, "+         | True                           = ""++       defaultElement+         | isExactGMPKind cfg elementKind+         , elementKind == KUnbounded      = "sbv_gmp_integer_const(exact_ctx, \"0\")"+         | isExactGMPKind cfg elementKind = "sbv_gmp_real_const(exact_ctx, \"0\")"+         | True                           = "(" ++ elementType ++ ") {0}"++       matchRuntime =+         [ "static bool " ++ helper "match_at" ++ "(" ++ listType ++ " value, " ++ listType ++ " part, size_t offset)"+         , "{"+         , "  if (offset > value.length || part.length > value.length - offset) return false;"+         , "  for (size_t i = 0; i < part.length; ++i) if (!" ++ equalElement ++ "(value.data[offset + i], part.data[i])) return false;"+         , "  return true;"+         , "}"+         , "static int64_t " ++ helper "index_of_size" ++ "(" ++ listType ++ " value, " ++ listType ++ " part, size_t start)"+         , "{"+         , "  if (start > value.length) return -1;"+         , "  for (size_t i = start; i <= value.length; ++i) {"+         , "    if (" ++ helper "match_at" ++ "(value, part, i)) return i <= INT64_MAX ? (int64_t) i : -1;"+         , "    if (i == value.length) break;"+         , "  }"+         , "  return -1;"+         , "}"+         ]++       exactRuntime+         | usesExactInteger =+             [ "static " ++ elementType ++ " " ++ helper "nth_mpz" ++ "(" ++ exactContextParam ++ listType ++ " value, SInteger index)"+             , "{ size_t converted; return sbv_list_mpz_to_size(index, &converted) ? " ++ helper "nth_size" ++ "(" ++ exactContextArg ++ "value, converted) : " ++ defaultElement ++ "; }"+             , "static " ++ listType ++ " " ++ helper "substring_mpz" ++ "(sbv_list_ctx *ctx, " ++ listType ++ " value, SInteger offset, SInteger count)"+             , "{"+             , "  size_t converted_offset, converted_count;"+             , "  if (!sbv_list_mpz_to_size(offset, &converted_offset) || !sbv_list_mpz_to_size(count, &converted_count)) return (" ++ listType ++ ") {NULL, 0};"+             , "  return " ++ helper "substring_size" ++ "(ctx, value, converted_offset, converted_count);"+             , "}"+             , "static int64_t " ++ helper "index_of_mpz" ++ "(" ++ listType ++ " value, " ++ listType ++ " part, SInteger start)"+             , "{ size_t converted; return sbv_list_mpz_to_size(start, &converted) ? " ++ helper "index_of_size" ++ "(value, part, converted) : -1; }"+             ]+         | True = []+listKindRuntime _ _ kind = error $ "SBV->C: Expected a list kind, received " ++ show kind
+ Data/SBV/Compilers/C/Lowering.hs view
@@ -0,0 +1,63 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Lowering+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Structured results shared by the individual C lowering backends.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Lowering+  ( CLowering(..)+  , CRequirement(..)+  , expressionLowering+  , chooseLowering+  ) where++import Data.Maybe                     (catMaybes, listToMaybe)+import qualified Data.Set as Set++import Text.PrettyPrint.HughesPJ      (Doc)++-- | Facilities required by a lowered C fragment. The program-level+-- collector will ultimately turn these capabilities into includes, runtime+-- helpers, compiler options, and linker options.+data CRequirement = CRequiresGMP              -- ^ GMP-backed exact-number support.+                  | CRequiresLibBF            -- ^ LibBF-backed arbitrary floating-point support.+                  | CRequiresLibM             -- ^ The platform C mathematics library.+                  | CRequiresNativeFPRounding -- ^ LibBF adapters for explicitly rounded native floating-point operations.+                  | CRequiresWideBV           -- ^ Exact-width limb-backed bit-vector support.+                  | CRequiresArrays           -- ^ Persistent functional-array support.+                  | CRequiresText             -- ^ Length-aware character and string support.+                  | CRequiresLists            -- ^ Typed symbolic-list support.+                  | CRequiresSets             -- ^ Finite/cofinite symbolic-set support.+                  | CRequiresFunctionResults  -- ^ Stable private storage for owned aggregate function results.+                  | CRequiresIntegerPower     -- ^ Modular exponentiation for mapped unbounded integers.+                  deriving (Eq, Ord, Show)++-- | A C expression together with statements and capabilities needed around+-- its evaluation. Declarations may be hoisted for function-wide backing+-- storage, but setup statements execute in order only when the value is demanded.+data CLowering = CLowering+  { loweringExpression   :: Doc                     -- ^ Expression producing the lowered result.+  , loweringDeclarations :: [Doc]                   -- ^ Declarations that may be hoisted above guarded control flow.+  , loweringSetup        :: [Doc]                   -- ^ Statements required before evaluation.+  , loweringRequirements :: Set.Set CRequirement    -- ^ Runtime and external capabilities used.+  }++-- | Construct a statement-free expression lowering.+expressionLowering :: [CRequirement] -> Doc -> CLowering+expressionLowering requirements expression = CLowering+  { loweringExpression   = expression+  , loweringDeclarations = []+  , loweringSetup        = []+  , loweringRequirements = Set.fromList requirements+  }++-- | Select the first backend that accepts an operation.+chooseLowering :: [Maybe CLowering] -> Maybe CLowering+chooseLowering = listToMaybe . catMaybes
+ Data/SBV/Compilers/C/NonLinear.hs view
@@ -0,0 +1,119 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.NonLinear+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Lowering of transcendental real operations and mapped integer powers.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.NonLinear+  ( nonLinearExpr+  , mappedIntegerPowerRuntime+  ) where++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Lowering (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.CodeGen    (CgConfig(..), CgSRealType(..))+import Data.SBV.Core.Data+import Data.SBV.Core.Symbolic        (NROp(..))++-- | Lower mapped-real transcendental operations and mapped integer+-- exponentiation. Exact integer exponentiation delegates to the GMP lowering+-- stage, while transcendental operations over exact rational reals receive an+-- actionable diagnostic.+nonLinearExpr :: CgConfig -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+nonLinearExpr cfg (NonLinear nonLinearOp) svs resultKind args+  | nonLinearOp == NR_IntPow+  = integerPower+  | resultKind == KReal && all ((== KReal) . kindOf) svs+  = realOperation+  | True+  = unsupported+ where integerPower+         | resultKind == KUnbounded+         , map kindOf svs == [KUnbounded, KUnbounded]+         , [base, powerValue] <- args+         = case cgInteger cfg of+             Nothing    -> Nothing+             Just width -> Just $ expressionLowering [CRequiresIntegerPower]+                                $ namedCall ("sbv_integer_pow_s" ++ show width) [base, powerValue]+         | True+         = unsupported++       realOperation = case cgReal cfg of+         Nothing       -> error $ "SBV->C: The exact GMP-rational SReal representation cannot represent "+                                ++ nonLinearName nonLinearOp+                                ++ ". Select a native approximation with cgSRealType to compile this operation."+         Just realType -> Just $ expressionLowering [CRequiresLibM] (renderReal realType)++       renderReal realType = case (nonLinearOp, args) of+         (NR_Pow   , [left, right]) -> namedCall (realFunction realType "pow") [left, right]+         (NR_IntPow, _            ) -> unsupportedDoc+         (_        , [value]       ) -> namedCall (realFunction realType (nonLinearName nonLinearOp)) [value]+         _                         -> unsupportedDoc++       unsupportedDoc = error unsupportedMessage+       unsupported    = error unsupportedMessage++       unsupportedMessage = "SBV->C: Cannot lower " ++ nonLinearName nonLinearOp+                         ++ " with argument kinds " ++ show (map kindOf svs)+                         ++ " and result kind " ++ show resultKind++       namedCall functionName callArgs = text functionName P.<> parens (fsep (punctuate comma callArgs))++       realFunction CgFloat      baseName = baseName ++ "f"+       realFunction CgDouble     baseName = baseName+       realFunction CgLongDouble baseName = baseName ++ "l"++       nonLinearName NR_Sin    = "sin"+       nonLinearName NR_Cos    = "cos"+       nonLinearName NR_Tan    = "tan"+       nonLinearName NR_ASin   = "asin"+       nonLinearName NR_ACos   = "acos"+       nonLinearName NR_ATan   = "atan"+       nonLinearName NR_Sqrt   = "sqrt"+       nonLinearName NR_Sinh   = "sinh"+       nonLinearName NR_Cosh   = "cosh"+       nonLinearName NR_Tanh   = "tanh"+       nonLinearName NR_Exp    = "exp"+       nonLinearName NR_Log    = "log"+       nonLinearName NR_Pow    = "pow"+       nonLinearName NR_IntPow = "integer exponentiation"+nonLinearExpr _ _ _ _ _ = Nothing++-- | Emit modular exponentiation for an explicitly bounded C representation+-- of 'SInteger'. Negative exponents follow SMT-LIB integer-power semantics;+-- nonnegative results wrap through the selected two's-complement width.+mappedIntegerPowerRuntime :: CgConfig -> Doc+mappedIntegerPowerRuntime cfg = case cgInteger cfg of+  Nothing    -> error "SBV->C: Mapped integer-power runtime requested for exact SInteger"+  Just width -> text . unlines $+    [ "static " ++ signedType ++ " " ++ helperName ++ "(" ++ signedType ++ " base, " ++ signedType ++ " exponent)"+    , "{"+    , "  " ++ unsignedType ++ " result_bits = (" ++ unsignedType ++ ") 1, factor_bits, power;"+    , "  " ++ signedType ++ " result;"+    , "  if (exponent < 0) {"+    , "    if (base == 1) return (" ++ signedType ++ ") 1;"+    , "    if (base == -1) return ((" ++ unsignedType ++ ") exponent & (" ++ unsignedType ++ ") 1) != 0 ? (" ++ signedType ++ ") -1 : (" ++ signedType ++ ") 1;"+    , "    return (" ++ signedType ++ ") 0;"+    , "  }"+    , "  memcpy(&factor_bits, &base, sizeof factor_bits); power = (" ++ unsignedType ++ ") exponent;"+    , "  while (power != 0) {"+    , "    if ((power & (" ++ unsignedType ++ ") 1) != 0) result_bits = (" ++ unsignedType ++ ") ((uint64_t) result_bits * (uint64_t) factor_bits);"+    , "    power = (" ++ unsignedType ++ ") (power >> 1);"+    , "    if (power != 0) factor_bits = (" ++ unsignedType ++ ") ((uint64_t) factor_bits * (uint64_t) factor_bits);"+    , "  }"+    , "  memcpy(&result, &result_bits, sizeof result); return result;"+    , "}"+    , ""+    ]+    where signedType   = "SInt"  ++ show width+          unsignedType = "SWord" ++ show width+          helperName   = "sbv_integer_pow_s" ++ show width
+ Data/SBV/Compilers/C/PseudoBoolean.hs view
@@ -0,0 +1,58 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.PseudoBoolean+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Overflow-safe pseudo-Boolean comparisons shared by the C backends.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.PseudoBoolean (assignPseudoBoolean) where++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Core.Data (PBOp(..))++-- | Assign a pseudo-Boolean comparison to an already declared Boolean result.+-- Use an exact unsigned sum when the maximum possible total fits in 64 bits.+-- Otherwise stop adding after exceeding the bound: non-negative coefficients+-- cannot bring the sum back down. Both the bound and each coefficient fit in+-- a signed 64-bit integer, so every addition to a sum at most the bound fits+-- in uint64_t, even when the mathematical total would require more bits.+-- Retain zero-weight operands so their generated bindings remain referenced.+assignPseudoBoolean :: PBOp -> [Doc] -> Doc -> Doc+assignPseudoBoolean operation arguments result+  | length coefficients /= length arguments+  = error "SBV->C: Pseudo-Boolean coefficient/argument count mismatch."+  | any (\n -> n < 0 || n > 2 ^ (63 :: Int) - 1) (bound : coefficients)+  = error "SBV->C: Pseudo-Boolean coefficients and bounds must be non-negative signed 64-bit values."+  | sum coefficients <= 2 ^ (64 :: Int) - 1+  = assign (case terms of [] -> unsigned 0; _ -> parens (hsep (punctuate (text " +") terms)))+  | True+  = text "{"+ $$ nest 2 (text "uint64_t sbv_pb_sum = UINT64_C(0);"+         $$ vcat [ text "if" P.<> parens (accumulator <+> text "<=" <+> unsigned bound <+> text "&&" <+> parens argument)+                $$ nest 2 (accumulator <+> text "+=" <+> unsigned coefficient P.<> semi)+                 | (coefficient, argument) <- weighted+                 ]+         $$ assign accumulator)+ $$ text "}"+ where (coefficients, comparison, bound) = case operation of+         PB_AtMost  k -> (replicate (length arguments) 1, "<=", toInteger k)+         PB_AtLeast k -> (replicate (length arguments) 1, ">=", toInteger k)+         PB_Exactly k -> (replicate (length arguments) 1, "==", toInteger k)+         PB_Le cs   k -> (map toInteger cs,               "<=", toInteger k)+         PB_Ge cs   k -> (map toInteger cs,               ">=", toInteger k)+         PB_Eq cs   k -> (map toInteger cs,               "==", toInteger k)++       weighted      = zip coefficients arguments+       accumulator   = text "sbv_pb_sum"+       unsigned n    = text "UINT64_C" P.<> parens (integer n)+       assign sumDoc = result <+> text "=" <+> sumDoc <+> text comparison <+> unsigned bound P.<> semi+       terms = [parens (argument <+> text "?" <+> unsigned coefficient <+> text ":" <+> unsigned 0)+               | (coefficient, argument) <- weighted]
+ Data/SBV/Compilers/C/Real.hs view
@@ -0,0 +1,67 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Real+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Safe flooring of native real representations to mapped integers.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Real (mappedRealFloorWidth, mappedRealFloorCall, mappedRealFloorRuntime) where++import Data.Maybe (mapMaybe)+import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.CodeGen (CgConfig(..))+import Data.SBV.Core.Data++-- | Identify flooring from an explicitly native real to a mapped integer.+-- Exact GMP representations are handled by their own conversion paths.+mappedRealFloorWidth :: CgConfig -> Op -> Maybe Int+mappedRealFloorWidth cfg (KindCast KReal KUnbounded)+  | Just _ <- cgReal cfg = cgInteger cfg+mappedRealFloorWidth _ _ = Nothing++-- | Call the width-specific helper. Promotion to long double is exact for+-- the native float and double mappings and preserves long-double precision.+mappedRealFloorCall :: Int -> Doc -> Doc+mappedRealFloorCall width value = text (mappedRealFloorName width) P.<> parens value++-- | Emit the helper only when a program actually floors a mapped real.+-- Reduce the magnitude modulo a power of two before any integer cast. Split+-- 64-bit residues into 32-bit halves so even a binary64 long double never+-- needs to represent UINT64_MAX or a rounded signed upper bound.+-- Non-finite real representations have no mathematical floor and fail fast.+mappedRealFloorRuntime :: CgConfig -> [(SV, SBVExpr)] -> Doc+mappedRealFloorRuntime cfg assignments = case mapMaybe (\(_, SBVApp operation _) -> mappedRealFloorWidth cfg operation) assignments of+  []      -> empty+  width:_ -> text . unlines $+    [ "/* Floor native reals, then retain the mapped integer's low bits. */"+    , "static " ++ signedType ++ " " ++ mappedRealFloorName width ++ "(long double value)"+    , "{"+    , "  if (!isfinite(value)) {"+    , "    fputs(\"SBV->C: Cannot floor a non-finite mapped SReal to SInteger.\\n\", stderr);"+    , "    abort();"+    , "  }"+    , "  const long double integral = floorl(value);"+    , "  const long double residue = fmodl(fabsl(integral), 0x1p" ++ show width ++ "L);"+    , "  const uint64_t high = (uint64_t) (residue / 0x1p32L);"+    , "  const uint64_t low = (uint64_t) (residue - (long double) high * 0x1p32L);"+    , "  uint64_t bits = (high << 32) | low;"+    , "  if (signbit(integral)) bits = UINT64_C(0) - bits;"+    , "  const " ++ unsignedType ++ " raw = (" ++ unsignedType ++ ") bits;"+    , "  " ++ signedType ++ " result; memcpy(&result, &raw, sizeof result); return result;"+    , "}"+    , ""+    ]+    where signedType   = "SInt" ++ show width+          unsignedType = "SWord" ++ show width++-- | Name the private helper by its mapped integer width.+mappedRealFloorName :: Int -> String+mappedRealFloorName width = "sbv_real_floor_to_s" ++ show width
+ Data/SBV/Compilers/C/RegExp.hs view
@@ -0,0 +1,371 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.RegExp+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Bounded derivative automata for dependency-free, exact C regex operations.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.RegExp (regexExpr) where++import Control.Monad (foldM, when)+import Control.Monad.State.Strict (StateT, evalStateT, get, put, lift)+import Data.Char (ord)+import Data.List (intercalate)+import Data.Maybe (fromMaybe)+import qualified Data.Map.Strict as Map+import qualified Data.Sequence as Seq+import qualified Data.Set as Set+import Text.PrettyPrint.HughesPJ (Doc, render, text)++import Data.SBV.Compilers.CodeGen (CgConfig(..))+import Data.SBV.Compilers.C.Lowering (CLowering(..), CRequirement(..), expressionLowering)+import qualified Data.SBV.Core.Data as S+import Data.SBV.Core.Symbolic (validateRegExp)++-- | A normalized residual language, caching nullability and tree size so+-- nullable concatenation and budget checks need no uncharged recursive walks.+data Regex = Regex { nullable  :: !Bool      -- ^ Whether this residual accepts the empty string.+                   , nodeCount :: !Integer   -- ^ Nodes in its normalized expression tree.+                   , form      :: !RegexForm -- ^ Canonical constructor and children.+                   }+           deriving (Eq, Ord)++-- | Union and intersection operands are sorted and duplicate-free;+-- concatenations are flattened. Complement is relative to the SBV alphabet.+data RegexForm = Empty+               | Epsilon+               | Character Int Int+               | Concatenate [Regex]+               | Unite [Regex]+               | Intersect [Regex]+               | Complement Regex+               | Star Regex+               deriving (Eq, Ord)++-- | Per-operation budgets. Work counts visited/constructed nodes and a+-- conservative allowance for normalization and automaton-state comparisons.+data Budget = Budget { configuration :: CgConfig  -- ^ User-selected limits for this operation.+                     , remainingWork :: !Integer -- ^ Work still available before generation fails.+                     }++-- | Pure compilation with explicit, recoverable internal budget failures.+type Build = StateT Budget (Either String)++-- | The empty language.+emptyRegex :: Regex+emptyRegex = Regex False 1 Empty++-- | The language containing only the empty string.+epsilonRegex :: Regex+epsilonRegex = Regex True 1 Epsilon++-- | All strings over SBV's character domain.+allRegex :: Regex+allRegex = Regex True 2 (Complement emptyRegex)++-- | One past the largest SBV character, including numeric surrogate values.+alphabetEnd :: Int+alphabetEnd = 0x30000++-- | Turn a compiler-budget failure into the usual generation diagnostic.+runCompiler :: CgConfig -> Build a -> a+runCompiler cfg action+  | any (<= 0) [cgRegexMaxStates cfg, cgRegexMaxNodes cfg, cgRegexMaxWork cfg]+  = error "SBV->C: Regex compilation is disabled by cgRegexLimits; all three limits must be positive."+  | True+  = either (error . ("SBV->C: " ++)) id $ evalStateT action (Budget cfg (cgRegexMaxWork cfg))++-- | Fail without printing a potentially huge input or derivative expression.+exceeded :: String -> Integer -> Build a+exceeded dimension limit = lift $ Left $ "Regex generation exceeds the " ++ dimension ++ " limit (" ++ show limit+                                      ++ "). Raise cgRegexLimits explicitly to permit more generation work."++-- | Charge work before performing the associated allocation or traversal.+charge :: Integer -> Build ()+charge amount = do+  budget <- get+  when (amount > remainingWork budget) $ exceeded "work" (cgRegexMaxWork (configuration budget))+  put budget { remainingWork = remainingWork budget - amount }++-- | Check a normalized expression or bounded expansion before allocating it.+checkNodes :: Integer -> Build ()+checkNodes count = do+  budget <- get+  let limit = cgRegexMaxNodes (configuration budget)+  when (count > limit) $ exceeded "expression-node" limit++-- | Construct a bounded node. Children are shared, not copied; charge the+-- immediate traversal while retaining the full expression-size bound.+node :: Bool -> RegexForm -> [Regex] -> Build Regex+node accepts shape children = do+  let count = 1 + sum (map nodeCount children)+  checkNodes count+  charge (1 + toInteger (length children))+  pure (Regex accepts count shape)++-- | Traverse a source list without first allocating an unbounded converted+-- list. This also bounds literals and concatenations before normalization.+boundedTraverse :: (a -> Build b) -> [a] -> Build [b]+boundedTraverse convert values = reverse . snd <$> foldM step (0, []) values+ where step (count, results) value = do+         checkNodes (count + 1)+         charge 1+         result <- convert value+         pure (count + 1, result : results)++-- | Flatten an associative operation after charging its input traversal.+flatten :: (RegexForm -> Maybe [Regex]) -> [Regex] -> Build [Regex]+flatten children rs = do+  let result = concatMap (\r -> fromMaybe [r] (children (form r))) rs+  charge (1 + toInteger (length rs + length result))+  pure result++-- | Canonicalize a Boolean operation without distributing it over other+-- operators. The comparison allowance is deliberately conservative.+boolean :: Bool -> [Regex] -> Build Regex+boolean intersection rs = do+  flat <- flatten children rs+  charge (comparisonDepth (length flat) * (1 + sum (map nodeCount flat)))+  let absorbing = if intersection then emptyRegex else allRegex+      identity  = if intersection then allRegex else emptyRegex+      members   = Set.fromList (filter (/= identity) flat)+      opposite r = case form r of+                     Complement value -> value `Set.member` members+                     _                -> False+  if absorbing `Set.member` members || any opposite members+    then pure absorbing+    else case Set.toAscList members of+           []  -> pure identity+           [r] -> pure r+           xs  -> node (if intersection then all nullable xs else any nullable xs)+                       (if intersection then Intersect xs else Unite xs) xs+ where children (Intersect xs) | intersection     = Just xs+       children (Unite xs)     | not intersection = Just xs+       children _                                = Nothing++-- | Flatten concatenation, eliminate epsilon, and propagate the empty language.+concatenate :: [Regex] -> Build Regex+concatenate rs = do+  flat <- flatten children rs+  if any ((== Empty) . form) flat+    then pure emptyRegex+    else case filter ((/= Epsilon) . form) flat of+           []  -> pure epsilonRegex+           [r] -> pure r+           xs  -> node (all nullable xs) (Concatenate xs) xs+ where children (Concatenate xs) = Just xs+       children _                = Nothing++-- | Cancel double complements; no language approximation is performed.+complement :: Regex -> Build Regex+complement r = case form r of+                 Complement value -> charge 1 >> pure value+                 _                -> node (not (nullable r)) (Complement r) [r]++-- | Normalize trivial and nested stars without unrolling any repetition.+star :: Regex -> Build Regex+star r = case form r of+           Empty   -> pure epsilonRegex+           Epsilon -> pure epsilonRegex+           Star _  -> pure r+           _       -> node True (Star r) [r]++-- | Translate every SBV regex constructor. Bounded repetitions are expanded+-- only after checking their size; invalid bounds retain the frontend diagnostic.+convertRegex :: S.RegExp -> Build Regex+convertRegex regex = do+  charge 1+  result <- case regex of+    S.Literal value -> boundedTraverse character value >>= concatenate+    S.All           -> pure allRegex+    S.AllChar       -> node False (Character 0 (alphabetEnd - 1)) []+    S.None          -> pure emptyRegex+    S.Range lo hi   -> do+      a <- code lo+      b <- code hi+      if a > b then pure emptyRegex else node False (Character a b) []+    S.Conc rs       -> boundedTraverse convertRegex rs >>= concatenate+    S.Union rs      -> boundedTraverse convertRegex rs >>= boolean False+    S.Inter a b     -> pair a b >>= boolean True+    S.Diff a b      -> do+      left  <- convertRegex a+      right <- convertRegex b >>= complement+      boolean True [left, right]+    S.Comp r        -> convertRegex r >>= complement+    S.KStar r       -> convertRegex r >>= star+    S.KPlus r       -> do+      body <- convertRegex r+      rest <- star body+      concatenate [body, rest]+    S.Opt r         -> convertRegex r >>= \body -> boolean False [epsilonRegex, body]+    S.Loop lo hi r  -> validateRegExp (S.Loop lo hi (S.Literal "")) `seq` repeatRegex lo hi r+    S.Power n r     -> validateRegExp (S.Power n (S.Literal "")) `seq` repeatRegex n n r+  checkNodes (nodeCount result)+  pure result+ where code c+         | ord c < alphabetEnd = pure (ord c)+         | True                = lift $ Left "Regex character is outside SBV's domain 0..0x2ffff."++       character c = do+         value <- code c+         node False (Character value value) []++       pair a b = sequence [convertRegex a, convertRegex b]++       repeatRegex lo hi r = do+         checkNodes (1 + toInteger hi)+         charge (toInteger hi)+         body <- convertRegex r+         optional <- boolean False [epsilonRegex, body]+         checkNodes (1 + toInteger lo * nodeCount body + toInteger (hi - lo) * nodeCount optional)+         concatenate (replicate lo body ++ replicate (hi - lo) optional)++-- | Compute the left derivative by a single representative character.+-- Nullability of the result states whether the consumed input is accepted.+derivative :: Int -> Regex -> Build Regex+derivative c regex = do+  charge 1+  case form regex of+    Empty             -> pure emptyRegex+    Epsilon           -> pure emptyRegex+    Character lo hi   -> pure $ if lo <= c && c <= hi then epsilonRegex else emptyRegex+    Unite rs          -> mapM (derivative c) rs >>= boolean False+    Intersect rs      -> mapM (derivative c) rs >>= boolean True+    Complement r      -> derivative c r >>= complement+    Star r            -> derivative c r >>= \first -> concatenate [first, regex]+    Concatenate []    -> pure emptyRegex+    Concatenate (r:rs) -> do+      first <- derivative c r >>= \value -> concatenate (value : rs)+      if nullable r+        then do rest <- concatenate rs >>= derivative c+                boolean False [first, rest]+        else pure first++-- | Partition the complete character domain at every literal/range boundary.+-- Derivatives cannot introduce new boundaries, so representatives are exact.+alphabet :: [Regex] -> Build [(Int, Int)]+alphabet regexes = do+  cuts <- foldM visit (Set.fromList [0, alphabetEnd]) regexes+  let points = Set.toAscList cuts+  pure [(lo, end - 1) | (lo, end) <- zip points (drop 1 points)]+ where visit cuts r = do+         charge 1+         case form r of+           Character lo hi -> pure $ Set.insert lo (Set.insert (hi + 1) cuts)+           Concatenate rs  -> foldM visit cuts rs+           Unite rs        -> foldM visit cuts rs+           Intersect rs    -> foldM visit cuts rs+           Complement x    -> visit cuts x+           Star x          -> visit cuts x+           _               -> pure cuts++-- | A complete automaton or an early language-inequality witness. An accepting+-- state in a membership automaton is not itself an inequality witness.+data Exploration = CompleteAutomaton [(Bool, [Int])] -- ^ All reachable states and transitions.+                 | InequalityWitness                -- ^ A reachable pair differs in acceptance.++-- | Explore states breadth-first, assigning deterministic integer indices.+-- Language comparison stops at the first accepting product state (a witness+-- of inequality); membership builds all reachable rows. State limits apply+-- before insertion, including to pairs explored for language comparison.+explore :: Ord a => Bool -> (a -> Bool) -> (a -> Integer) -> (Int -> a -> Build a)+        -> [(Int, Int)] -> a -> Build Exploration+explore stop accepts size step classes initial = go (Map.singleton initial 0) (Seq.singleton initial) []+ where go known pending rows = case Seq.viewl pending of+         Seq.EmptyL -> pure (CompleteAutomaton (reverse rows))+         r Seq.:< rest -> do+           charge 1+           if stop && accepts r+             then pure InequalityWitness+             else do+               (known', pending', reversed) <- foldM (transition r) (known, rest, []) classes+               go known' pending' ((accepts r, reverse reversed) : rows)++       transition r (known, pending, indices) (c, _) = do+         next <- step c r+         charge (comparisonDepth (Map.size known) * size next)+         case Map.lookup next known of+           Just index -> pure (known, pending, index : indices)+           Nothing -> do+             budget <- get+             let index = Map.size known+                 limit = cgRegexMaxStates (configuration budget)+             when (toInteger index >= limit) $ exceeded "state" limit+             pure (Map.insert next index known, pending Seq.|> next, index : indices)++-- | Conservative logarithmic comparison allowance for balanced maps and sets.+comparisonDepth :: Int -> Integer+comparisonDepth count+  | count <= 1 = 1+  | True       = 1 + comparisonDepth (count `quot` 2)++-- | Compile exact membership into function-local static tables and a guarded+-- loop. Locally scoped names work unchanged in definitions, callbacks, and+-- library components; dead operations are never compiled by the scheduler.+regexExpr :: CgConfig -> S.Op -> S.SV -> [Doc] -> Maybe CLowering+regexExpr cfg (S.StrOp (S.StrInRe regex)) result [value] = Just $ runCompiler cfg $ do+  initial <- convertRegex regex+  classes <- alphabet [initial]+  automaton <- explore False nullable nodeCount derivative classes initial+  case automaton of+    CompleteAutomaton rows -> pure $ membership result value classes rows+    InequalityWitness      -> lift $ Left "Unexpected inequality witness during regex membership compilation."+regexExpr cfg (S.RegExOp operation) _ [] = Just $ runCompiler cfg $ do+  let (left, right, negateResult) = case operation of+        S.RegExEq  a b -> (a, b, False)+        S.RegExNEq a b -> (a, b, True)+  a <- convertRegex left+  b <- convertRegex right+  classes <- alphabet [a, b]+  comparison <- explore True (\(x, y) -> nullable x /= nullable y) (\(x, y) -> nodeCount x + nodeCount y)+                       (\c (x, y) -> (,) <$> derivative c x <*> derivative c y) classes (a, b)+  let equal = case comparison of+                CompleteAutomaton{} -> True+                InequalityWitness   -> False+  pure $ expressionLowering [] (text (if equal /= negateResult then "true" else "false"))+regexExpr _ _ _ _ = Nothing++-- | Render an allocation-free matcher over canonical SBV text, preserving+-- embedded NULs and surrogate character codes. Use compact transition entries+-- when all actual state indices fit, falling back to size_t for larger custom+-- budgets. Input size is independent of the generation budgets.+membership :: S.SV -> Doc -> [(Int, Int)] -> [(Bool, [Int])] -> CLowering+membership result value classes rows = (expressionLowering [CRequiresText] (text answer))+  { loweringDeclarations = map text+      [ "static const uint32_t " ++ bounds ++ "[] = {" ++ intercalate ", " (map (show . snd) classes) ++ "};"+      , "static const uint8_t " ++ accepting ++ "[] = {" ++ intercalate ", " [if yes then "1" else "0" | (yes, _) <- rows] ++ "};"+      , "static const " ++ transitionType ++ " " ++ transitions ++ "[][" ++ show (length classes) ++ "] = {\n"+          ++ intercalate ",\n" ["  {" ++ intercalate ", " (map show indices) ++ "}" | (_, indices) <- rows] ++ "\n};"+      , "SBool " ++ answer ++ ";"+      ]+  , loweringSetup = [text $ unlines+      [ "{"+      , "  const SString input = " ++ render value ++ ";"+      , "  size_t state = 0;"+      , "  for (size_t offset = 0; offset < input.byte_length;) {"+      , "    const SChar character = sbv_text_decode(input.data + offset);"+      , "    if (character > UINT32_C(0x2ffff)) abort();"+      , "    offset += sbv_text_width(input.data[offset]);"+      , "    size_t column = 0;"+      , "    while (column + 1 < " ++ show (length classes) ++ " && character > " ++ bounds ++ "[column]) ++column;"+      , "    state = " ++ transitions ++ "[state][column];"+      , "  }"+      , "  " ++ answer ++ " = " ++ accepting ++ "[state];"+      , "}"+      ]]+  }+ where prefix      = "sbv_regex_" ++ show result+       transitionType | stateCount <= 65536      = "uint16_t"+                      | stateCount <= 4294967296 = "uint32_t"+                      | True                     = "size_t"+       stateCount  = toInteger (length rows)+       answer      = prefix ++ "_result"+       bounds      = prefix ++ "_bounds"+       accepting   = prefix ++ "_accept"+       transitions = prefix ++ "_step"
+ Data/SBV/Compilers/C/Set.hs view
@@ -0,0 +1,584 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Set+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Finite and cofinite symbolic-set lowering for generated C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Set+  ( setKinds+  , setSupported+  , setUsesExact+  , setNeedsDriverInit+  , setCType+  , setForwardTypeDecls+  , setTypeDecls+  , setOwnershipTypeDecls+  , setRuntimeDecls+  , setRuntime+  , setConst+  , setExpr+  , setEqual+  , setNormalize+  , setClone+  , setRelease+  , setDriverValue+  , setDriverInit+  , setDriverClear+  , setPrint+  , setContextStart+  , setContextEnd+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.List                       (nub, stripPrefix, tails)+import qualified Data.Set as Set++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Arena      (CArena(..), arenaRuntime)+import Data.SBV.Compilers.C.Finite     (finiteDomainSize)+import Data.SBV.Compilers.C.GMP        (gmpFunctionName, gmpInitializeCopy, gmpOutputType, isExactGMPKind)+import Data.SBV.Compilers.C.Lowering   (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Types      (isConcreteADT, elementCType, kindTag, setCloneName, setReleaseName, setHelperName)+import Data.SBV.Compilers.C.Value      ( byValueEqual+                                       , managedValueClone+                                       , managedValueRelease+                                       , valueDriverClear+                                       , valueDriverInit+                                       , valueDriverNeedsInitialization+                                       , valueNeedsOwnership+                                       )+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data+import Data.SBV.Core.Kind              (expandKinds)+import Data.SBV.Core.Symbolic          (SetOp(..))++-- | Return all distinct symbolic-set kinds used by a program.+setKinds :: Set.Set Kind -> [Kind]+setKinds = nub . concatMap (filter isSet . expandKinds) . Set.toAscList++-- | Test whether a set element kind has a supported C representation.+setSupported :: CgConfig -> Kind -> Bool+setSupported _ (KSet elementKind) = supportedElement elementKind+ where supportedElement KBool          = True+       supportedElement KBounded{}     = True+       supportedElement KFloat         = True+       supportedElement KDouble        = True+       supportedElement KChar          = True+       supportedElement KString        = True+       supportedElement KFP{}          = True+       supportedElement KUnbounded     = True+       supportedElement KReal          = True+       supportedElement KRational      = True+       supportedElement (KList kind)   = supportedElement kind+       supportedElement (KTuple kinds) = all supportedElement kinds+       supportedElement kind+         | isConcreteADT kind = True+         | True               = isRoundingMode kind+setSupported _ _ = False++-- | Test whether a set stores exact GMP-backed elements.+setUsesExact :: CgConfig -> Kind -> Bool+setUsesExact cfg (KSet elementKind) = isExactGMPKind cfg elementKind+setUsesExact _   _                  = False++-- | Test whether an example-driver set requires statement-based element+-- initialization instead of a single compound literal.+setNeedsDriverInit :: CgConfig -> Kind -> Bool+setNeedsDriverInit cfg (KSet elementKind) = valueDriverNeedsInitialization cfg elementKind+setNeedsDriverInit _   _                  = False++-- | Return the public C descriptor type for a symbolic-set kind.+setCType :: Kind -> String+setCType kind@KSet{} = elementCType kind+setCType kind        = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Emit guarded forward declarations for symbolic-set descriptor types.+-- These declarations allow set and list descriptors to contain pointers to+-- each other before either family has emitted its complete layouts.+setForwardTypeDecls :: [Kind] -> Doc+setForwardTypeDecls []    = empty+setForwardTypeDecls kinds = text . unlines $ concatMap declaration kinds+ where declaration kind@KSet{} =+         [ "#ifndef " ++ setForwardGuard kind+         , "#define " ++ setForwardGuard kind+         , "typedef struct " ++ setCType kind ++ " " ++ setCType kind ++ ";"+         , "#endif"+         , ""+         ]+       declaration kind = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Emit finite/cofinite set descriptors and ownership-helper prototypes.+-- Aggregate element layouts may remain incomplete here; helper definitions+-- are emitted later by 'setOwnershipTypeDecls'.+setTypeDecls :: CgConfig -> [Kind] -> Doc+setTypeDecls cfg kinds+  | null kinds = empty+  | True       = setForwardTypeDecls kinds $$ text (unlines $+      ["/* Finite/cofinite symbolic sets. Inputs borrow elements; outputs and returns own them. */"+      , cUnusedAttribute+      ]+      ++ concatMap declaration kinds+      )+ where declaration kind@(KSet elementKind)+         | setSupported cfg kind+         = let cType       = setCType kind+               elementType = setElementCType elementKind+               cloneName    = setCloneName kind+               releaseName  = setReleaseName kind+           in [ "#ifndef " ++ setGuard kind+              , "#define " ++ setGuard kind+              , "struct " ++ cType ++ " { const " ++ elementType ++ " *data; size_t length; bool is_complement; };"+              , "static inline SBV_CGEN_UNUSED " ++ cType ++ " " ++ cloneName ++ "(" ++ cType ++ " value);"+              , "static inline SBV_CGEN_UNUSED void " ++ releaseName ++ "(" ++ cType ++ " *value);"+              , "#endif"+              , ""+              ]+         | True+         = error $ "SBV->C: Unsupported set element kind: " ++ show elementKind+       declaration kind = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Emit set clone and release definitions after aggregate element layouts+-- are complete. Inputs borrow arrays that may contain duplicates; outputs and+-- returns own their cloned arrays.+setOwnershipTypeDecls :: CgConfig -> [Kind] -> Doc+setOwnershipTypeDecls cfg kinds+  | null kinds = empty+  | True       = text . unlines $ concatMap declaration kinds+ where declaration kind@(KSet elementKind)+         | setSupported cfg kind+         = let cType       = setCType kind+               elementType = setElementCType elementKind+               cloneName    = setCloneName kind+               releaseName  = setReleaseName kind+           in [ "#ifndef " ++ setOwnershipGuard kind+              , "#define " ++ setOwnershipGuard kind+              , "static inline SBV_CGEN_UNUSED " ++ cType ++ " " ++ cloneName ++ "(" ++ cType ++ " value)"+              , "{"+              , "  " ++ elementType ++ " *copy = NULL;"+              , "  if (value.length != 0) {"+              , "    if (value.length > SIZE_MAX / sizeof(*copy)) abort();"+              , "    copy = (" ++ elementType ++ " *) malloc(value.length * sizeof(*copy));"+              , "    if (copy == NULL) abort();"+              ]+              ++ cloneElements elementKind+              ++ [ "  }"+              , "  return (" ++ cType ++ ") {copy, value.length, value.is_complement};"+              , "}"+              , "static inline SBV_CGEN_UNUSED void " ++ releaseName ++ "(" ++ cType ++ " *value)"+              , "{"+              , "  if (value == NULL) return;"+              ]+              ++ releaseElements elementKind+              ++ [ "  *value = (" ++ cType ++ ") {NULL, 0, false};"+              , "}"+              , "#endif"+              , ""+              ]+         | True+         = error $ "SBV->C: Unsupported set element kind: " ++ show elementKind+       declaration kind = error $ "SBV->C: Expected a set kind, received " ++ show kind++       cloneElements elementKind+         | isExactGMPKind cfg elementKind+         =  [ "    for (size_t i = 0; i < value.length; ++i) {"+            , "      " ++ gmpOutputType elementKind ++ " element = (" ++ gmpOutputType elementKind ++ ") malloc(sizeof(*element));"+            , "      if (element == NULL) abort();"+            ]+         ++ map ("      " ++) (lines (render (gmpInitializeCopy elementKind (text "element") (text "value.data[i]"))))+         ++ [ "      copy[i] = element;"+            , "    }"+            ]+         | isConcreteADT elementKind || valueNeedsOwnership cfg elementKind+         = [ "    for (size_t i = 0; i < value.length; ++i)"+           , "      copy[i] = " ++ render (managedValueClone elementKind (text "value.data[i]")) ++ ";"+           ]+         | True+         = ["    memcpy(copy, value.data, value.length * sizeof(*copy));"]++       releaseElements elementKind+         | isExactGMPKind cfg elementKind+         = [ "  " ++ setElementCType elementKind ++ " *data = (" ++ setElementCType elementKind ++ " *) value->data;"+           , "  for (size_t i = 0; i < value->length; ++i) {"+           , "    " ++ gmpOutputType elementKind ++ " element = (" ++ gmpOutputType elementKind ++ ") data[i];"+           , "    if (element != NULL) { " ++ gmpFunctionName elementKind "clear" ++ "(element); free(element); }"+           , "  }"+           , "  free(data);"+           ]+         | isConcreteADT elementKind || valueNeedsOwnership cfg elementKind+         = [ "  " ++ setElementCType elementKind ++ " *data = (" ++ setElementCType elementKind ++ " *) value->data;"+           , "  for (size_t i = 0; i < value->length; ++i)"+           , "    " ++ render (managedValueRelease elementKind (text "&data[i]"))+           , "  free(data);"+           ]+         | True+         = ["  free((void *) value->data);"]++-- | Emit forward declarations for set equality helpers referenced by nested+-- aggregate element comparisons.+setRuntimeDecls :: CgConfig -> [Kind] -> Doc+setRuntimeDecls cfg kinds = text . unlines $+  [ "static SBV_CGEN_UNUSED bool " ++ helperName kind "equal" ++ "(" ++ setCType kind ++ " left, " ++ setCType kind ++ " right);"+  | kind <- kinds+  , setSupported cfg kind+  ]++-- | Emit the shared set arena and one operation family per element kind.+setRuntime :: CgConfig -> (Kind -> [[Kind]]) -> [Kind] -> Doc+setRuntime cfg constructorsOf kinds = text . unlines . map markUnused $ commonRuntime ++ concatMap specializedRuntime kinds+ where markUnused line = case stripPrefix "static " line of+                           Just rest -> "static SBV_CGEN_UNUSED " ++ rest+                           Nothing   -> line++       specializedRuntime kind+         | setSupported cfg kind = setKindRuntime cfg constructorsOf kind+         | True                  = error $ "SBV->C: Unsupported set kind: " ++ show kind++-- | Render a regular or complemented set constant.+setConst :: (CV -> Doc) -> CV -> Maybe Doc+setConst renderElement (CV kind@(KSet elementKind) (CSet value))+  = Just $ text "((" P.<> text (setCType kind) P.<> text ") {"+       P.<> elements+       P.<> text ", "+       P.<> int (length values)+       P.<> text ", "+       P.<> text (if isComplement then "true" else "false")+       P.<> text "})"+ where (isComplement, stored) = case value of+                                  RegularSet entries    -> (False, entries)+                                  ComplementSet entries -> (True,  entries)+       values = Set.toAscList stored+       elements+         | null values = text "NULL"+         | True        = text "(const" <+> text (setElementCType elementKind) P.<> text "[]) {"+                      P.<> fsep (punctuate comma (map (renderElement . CV elementKind) values))+                      P.<> text "}"+setConst _ _ = Nothing++-- | Lower symbolic set construction, membership, comparison, and algebra.+setExpr :: CgConfig -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+setExpr cfg op svs resultKind args+  | not touchesSet = Nothing+  | True           = case (op, args) of+      (ADTOp{}                       , _        ) -> Nothing+      (TupleConstructor{}            , _        ) -> Nothing+      (TupleAccess{}                 , _        ) -> Nothing+      (Uninterpreted{}               , _        ) -> Nothing+      (Label _                       , [a]      ) -> lower a+      (Equal _                       , [a, b]   ) -> lower $ call (helper "equal") [a, b]+      (NotEqual                      , as       ) -> lower $ distinctSets as+      (SetOp SetEqual                , [a, b]   ) -> lower $ call (helper "equal") [a, b]+      (SetOp SetMember               , [e, s]   ) -> lower $ call (helper "member") [e, s]+      (SetOp SetInsert               , [e, s]   ) -> lower $ arenaCall "insert" [e, s]+      (SetOp SetDelete               , [e, s]   ) -> lower $ arenaCall "delete" [e, s]+      (SetOp SetIntersect            , [a, b]   ) -> lower $ arenaCall "intersection" [a, b]+      (SetOp SetUnion                , [a, b]   ) -> lower $ arenaCall "union" [a, b]+      (SetOp SetSubset               , [a, b]   ) -> lower $ call (helper "subset") [a, b]+      (SetOp SetDifference           , [a, b]   ) -> lower $ arenaCall "difference" [a, b]+      (SetOp SetComplement           , [a]      ) -> lower $ call (helper "complement") [a]+      _ -> unsupported+ where touchesSet = isSet resultKind || any (isSet . kindOf) svs || isSetOp op++       setKind = case [kind | value <- resultKind : map kindOf svs, kind@(KSet _) <- [value]] of+                   kind : _ -> kind+                   []       -> error $ "SBV->C: Cannot determine set kind for " ++ show op++       lower expression = Just $ expressionLowering requirements expression++       requirements = CRequiresSets : [CRequiresGMP | any (isExactGMPKind cfg) touchedKinds]++       touchedKinds = concatMap expandKinds (resultKind : map kindOf svs)++       helper = helperName setKind++       arenaCall suffix rendered = call (helper suffix) (text "&sbv_local_set_ctx" : rendered)++       distinctSets rendered = fsep $ punctuate (text " &&")+                                     [parens (text "!" P.<> call (helper "equal") [left, right])+                                     | left : rest <- tails rendered, right <- rest]++       unsupported = error $ "SBV->C: Set lowering does not support " ++ show op+                          ++ " with argument kinds " ++ show (map kindOf svs)+                          ++ " and result kind " ++ show resultKind++-- | Compare two set descriptors using finite/cofinite symbolic-set equality.+setEqual :: Kind -> Doc -> Doc -> Doc+setEqual kind left right = call (helperName kind "equal") [left, right]++-- | Normalize a borrowed set descriptor into the generated function's arena.+setNormalize :: Kind -> Doc -> Doc+setNormalize kind value = call (helperName kind "normalize") [text "&sbv_local_set_ctx", value]++-- | Deep-copy a set across the generated function's ownership boundary.+setClone :: Kind -> Doc -> Doc+setClone kind value = call (setCloneName kind) [value]++-- | Release an owned set in a generated driver.+setRelease :: Kind -> Doc -> Doc+setRelease kind value = call (setReleaseName kind) [text "&" P.<> value] P.<> semi++-- | Produce a deterministic three-element finite or cofinite driver value.+setDriverValue :: (Kind -> Integer -> Doc) -> Kind -> Integer -> Doc+setDriverValue renderValue kind@(KSet elementKind) seed+  = text "((" P.<> text (setCType kind) P.<> text ") {"+       P.<> text "(const" <+> text (setElementCType elementKind) P.<> text "[]) {"+       P.<> fsep (punctuate comma [renderValue elementKind seed, renderValue elementKind (seed + 1), renderValue elementKind (seed + 2)])+       P.<> text "}, 3, "+       P.<> text (if odd seed then "true" else "false")+       P.<> text "})"+setDriverValue _ kind _ = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Initialize a generated-driver set whose elements require statement-based+-- setup. The descriptor borrows three independently initialized elements and+-- uses the sample seed's parity to choose a finite or cofinite representation.+-- The supplied statement renderer handles retained aggregate elements.+setDriverInit :: CgConfig -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> String -> Integer -> Doc+setDriverInit cfg renderValue initializeValue kind@KSet{} externalName seed = valueDriverInit cfg renderValue initializeValue kind externalName seed+setDriverInit _   _           _               kind        _            _    = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Clear managed element storage initialized by 'setDriverInit'.+setDriverClear :: CgConfig -> Kind -> String -> Doc+setDriverClear cfg kind@KSet{} externalName = valueDriverClear cfg kind externalName+setDriverClear _   kind        _            = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Print a finite set as @{...}@ and a cofinite set as @U - {...}@.+setPrint :: (Kind -> Doc -> Doc) -> Kind -> Doc -> Doc+setPrint printElement (KSet elementKind) value+  = text "if" P.<> parens (value P.<> text ".is_complement") <+> text "printf(\"U\");"+ $$ text "if" P.<> parens (text "!" P.<> value P.<> text ".is_complement ||" <+> value P.<> text ".length != 0")+ $$ text "{"+ $$ nest 2 (   text "if" P.<> parens (value P.<> text ".is_complement") <+> text "printf(\" - \");"+            $$ text "printf(\"{\");"+            $$ text "for (size_t" <+> index <+> text "= 0;" <+> index <+> text "<" <+> value P.<> text ".length; ++" P.<> index P.<> text ")"+            $$ text "{"+            $$ nest 2 (   text "if" <+> parens (index <+> text "!= 0") <+> text "printf(\", \");"+                       $$ printElement elementKind (value P.<> text ".data[" P.<> index P.<> text "]")+                      )+            $$ text "}"+            $$ text "printf(\"}\");"+           )+ $$ text "}"+ where index = text ("sbv_local_set_print_index_" ++ kindTag elementKind)+setPrint _ kind _ = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Initialize the arena used by set temporaries in a generated function.+setContextStart :: Doc+setContextStart = text "sbv_set_ctx sbv_local_set_ctx = {NULL};"++-- | Release all set temporaries allocated by a generated function.+setContextEnd :: Doc+setContextEnd = call "sbv_set_ctx_end" [text "&sbv_local_set_ctx"] P.<> semi++-- | Test whether an operation belongs to the symbolic-set family.+isSetOp :: Op -> Bool+isSetOp SetOp{} = True+isSetOp _       = False++-- | Return the element kind of a symbolic-set kind.+setElementKind :: Kind -> Kind+setElementKind (KSet elementKind) = elementKind+setElementKind kind               = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Return the public C type used for one supported set element.+setElementCType :: Kind -> String+setElementCType KChar = "SChar"+setElementCType kind  = elementCType kind++-- | Return the preprocessor guard for one set forward declaration.+setForwardGuard :: Kind -> String+setForwardGuard kind = "SBV_SET_" ++ kindTag (setElementKind kind) ++ "_FORWARD_DEFINED"++-- | Return the preprocessor guard for one set descriptor.+setGuard :: Kind -> String+setGuard kind = "SBV_SET_" ++ kindTag (setElementKind kind) ++ "_DEFINED"++-- | Return the preprocessor guard for one set ownership-helper definition.+setOwnershipGuard :: Kind -> String+setOwnershipGuard kind = "SBV_SET_" ++ kindTag (setElementKind kind) ++ "_OWNERSHIP_DEFINED"++-- | Return one specialized set-operation helper name.+helperName :: Kind -> String -> String+helperName = setHelperName++-- | Render a C helper call.+call :: String -> [Doc] -> Doc+call functionName args = text functionName P.<> parens (fsep (punctuate comma args))++-- | Shared per-call allocation arena used by every set specialization.+commonRuntime :: [String]+commonRuntime = arenaRuntime SetArena++-- | Emit all set helpers for one supported element kind.+setKindRuntime :: CgConfig -> (Kind -> [[Kind]]) -> Kind -> [String]+setKindRuntime cfg constructorsOf kind@(KSet elementKind) =+  [ ""+  , "static bool " ++ equalElement ++ "(" ++ elementType ++ " left, " ++ elementType ++ " right)"+  , "{ return " ++ elementEqual ++ "; }"+  , "static bool " ++ helper "stored_contains" ++ "(" ++ setType ++ " value, " ++ elementType ++ " element)"+  , "{"+  , "  for (size_t i = 0; i < value.length; ++i) if (" ++ equalElement ++ "(value.data[i], element)) return true;"+  , "  return false;"+  , "}"+  , "static " ++ setType ++ " " ++ helper "normalize" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " value)"+  , "{"+  , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, value.length, sizeof(*data));"+  , "  " ++ setType ++ " result = (" ++ setType ++ ") {data, 0, value.is_complement};"+  , "  for (size_t i = 0; i < value.length; ++i) if (!" ++ helper "stored_contains" ++ "(result, value.data[i])) data[result.length++] = value.data[i];"+  , "  return result;"+  , "}"+  , "static bool " ++ helper "stored_subset" ++ "(" ++ setType ++ " left, " ++ setType ++ " right)"+  , "{"+  , "  for (size_t i = 0; i < left.length; ++i) if (!" ++ helper "stored_contains" ++ "(right, left.data[i])) return false;"+  , "  return true;"+  , "}"+  , "static bool " ++ helper "stored_disjoint" ++ "(" ++ setType ++ " left, " ++ setType ++ " right)"+  , "{"+  , "  for (size_t i = 0; i < left.length; ++i) if (" ++ helper "stored_contains" ++ "(right, left.data[i])) return false;"+  , "  return true;"+  , "}"+  ]+  ++ storedRuntime+  ++ domainRuntime+  ++ [ "static bool " ++ helper "equal" ++ "(" ++ setType ++ " left, " ++ setType ++ " right)"+     , "{"+     , "  if (left.is_complement == right.is_complement) return " ++ helper "stored_subset" ++ "(left, right) && " ++ helper "stored_subset" ++ "(right, left);"+     , "  return " ++ helper "stored_disjoint" ++ "(left, right) && " ++ helper "domain_covered" ++ "(left, right);"+     , "}"+     , "static bool " ++ helper "member" ++ "(" ++ elementType ++ " element, " ++ setType ++ " value)"+     , "{ return value.is_complement != " ++ helper "stored_contains" ++ "(value, element); }"+     , "static " ++ setType ++ " " ++ helper "insert" ++ "(sbv_set_ctx *ctx, " ++ elementType ++ " element, " ++ setType ++ " value)"+     , "{"+     , "  const bool stored = " ++ helper "stored_contains" ++ "(value, element);"+     , "  if ((!value.is_complement && stored) || (value.is_complement && !stored)) return value;"+     , "  if (value.is_complement) return " ++ helper "stored_remove" ++ "(ctx, value, element, true);"+     , "  return " ++ helper "stored_add" ++ "(ctx, value, element, false);"+     , "}"+     , "static " ++ setType ++ " " ++ helper "delete" ++ "(sbv_set_ctx *ctx, " ++ elementType ++ " element, " ++ setType ++ " value)"+     , "{"+     , "  const bool stored = " ++ helper "stored_contains" ++ "(value, element);"+     , "  if ((!value.is_complement && !stored) || (value.is_complement && stored)) return value;"+     , "  if (value.is_complement) return " ++ helper "stored_add" ++ "(ctx, value, element, true);"+     , "  return " ++ helper "stored_remove" ++ "(ctx, value, element, false);"+     , "}"+     , "static " ++ setType ++ " " ++ helper "union" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right)"+     , "{"+     , "  if (!left.is_complement && !right.is_complement) return " ++ helper "stored_union" ++ "(ctx, left, right, false);"+     , "  if (!left.is_complement &&  right.is_complement) return " ++ helper "stored_difference" ++ "(ctx, right, left, true);"+     , "  if ( left.is_complement && !right.is_complement) return " ++ helper "stored_difference" ++ "(ctx, left, right, true);"+     , "  return " ++ helper "stored_intersection" ++ "(ctx, left, right, true);"+     , "}"+     , "static " ++ setType ++ " " ++ helper "intersection" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right)"+     , "{"+     , "  if (!left.is_complement && !right.is_complement) return " ++ helper "stored_intersection" ++ "(ctx, left, right, false);"+     , "  if (!left.is_complement &&  right.is_complement) return " ++ helper "stored_difference" ++ "(ctx, left, right, false);"+     , "  if ( left.is_complement && !right.is_complement) return " ++ helper "stored_difference" ++ "(ctx, right, left, false);"+     , "  return " ++ helper "stored_union" ++ "(ctx, left, right, true);"+     , "}"+     , "static " ++ setType ++ " " ++ helper "difference" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right)"+     , "{"+     , "  if (!left.is_complement && !right.is_complement) return " ++ helper "stored_difference" ++ "(ctx, left, right, false);"+     , "  if (!left.is_complement &&  right.is_complement) return " ++ helper "stored_intersection" ++ "(ctx, left, right, false);"+     , "  if ( left.is_complement && !right.is_complement) return " ++ helper "stored_union" ++ "(ctx, left, right, true);"+     , "  return " ++ helper "stored_difference" ++ "(ctx, right, left, false);"+     , "}"+     , "static " ++ setType ++ " " ++ helper "complement" ++ "(" ++ setType ++ " value)"+     , "{ value.is_complement = !value.is_complement; return value; }"+     , "static bool " ++ helper "subset" ++ "(" ++ setType ++ " left, " ++ setType ++ " right)"+     , "{"+     , "  if (!left.is_complement && !right.is_complement) return " ++ helper "stored_subset" ++ "(left, right);"+     , "  if (!left.is_complement &&  right.is_complement) return " ++ helper "stored_disjoint" ++ "(left, right);"+     , "  if ( left.is_complement && !right.is_complement) return " ++ helper "domain_covered" ++ "(left, right);"+     , "  return " ++ helper "stored_subset" ++ "(right, left);"+     , "}"+     ]+ where setType      = setCType kind+       elementType  = setElementCType elementKind+       helper       = helperName kind+       equalElement = helper "element_equal"++       elementEqual = render $ byValueEqual cfg True elementKind (text "left") (text "right")++       domainRuntime =+         [ "static bool " ++ helper "domain_covered" ++ "(" ++ setType ++ " left, " ++ setType ++ " right)"+         , "{"+         ]+         ++ case elementDomainSize constructorsOf elementKind of+              Nothing -> [ "  (void) left; (void) right; return false;" ]+              Just domainSize ->+                [ "  const uint64_t domain_size = UINT64_C(" ++ show domainSize ++ ");"+                , "  if (domain_size > (uint64_t) SIZE_MAX) return false;"+                , "  size_t covered = 0;"+                , "  for (size_t i = 0; i < left.length; ++i) {"+                , "    bool duplicate = false;"+                , "    for (size_t j = 0; j < i; ++j) if (" ++ equalElement ++ "(left.data[i], left.data[j])) { duplicate = true; break; }"+                , "    if (!duplicate) ++covered;"+                , "  }"+                , "  for (size_t i = 0; i < right.length; ++i) {"+                , "    bool duplicate = " ++ helper "stored_contains" ++ "(left, right.data[i]);"+                , "    for (size_t j = 0; !duplicate && j < i; ++j) duplicate = " ++ equalElement ++ "(right.data[i], right.data[j]);"+                , "    if (!duplicate) ++covered;"+                , "  }"+                , "  return (uint64_t) covered == domain_size;"+                ]+         ++ [ "}" ]++       storedRuntime =+         [ "static " ++ setType ++ " " ++ helper "stored_add" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " value, " ++ elementType ++ " element, bool is_complement)"+         , "{"+         , "  if (value.length == SIZE_MAX) abort();"+         , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, value.length + 1, sizeof(*data));"+         , "  if (value.length != 0) memcpy(data, value.data, value.length * sizeof(*data));"+         , "  data[value.length] = element; return (" ++ setType ++ ") {data, value.length + 1, is_complement};"+         , "}"+         , "static " ++ setType ++ " " ++ helper "stored_remove" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " value, " ++ elementType ++ " element, bool is_complement)"+         , "{"+         , "  size_t length = 0;"+         , "  for (size_t i = 0; i < value.length; ++i) if (!" ++ equalElement ++ "(value.data[i], element)) ++length;"+         , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, length, sizeof(*data));"+         , "  size_t output = 0;"+         , "  for (size_t i = 0; i < value.length; ++i) if (!" ++ equalElement ++ "(value.data[i], element)) data[output++] = value.data[i];"+         , "  return (" ++ setType ++ ") {data, length, is_complement};"+         , "}"+         , "static " ++ setType ++ " " ++ helper "stored_union" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right, bool is_complement)"+         , "{"+         , "  if (right.length > SIZE_MAX - left.length) abort();"+         , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, left.length + right.length, sizeof(*data));"+         , "  " ++ setType ++ " result = (" ++ setType ++ ") {data, 0, is_complement};"+         , "  for (size_t i = 0; i < left.length; ++i) data[result.length++] = left.data[i];"+         , "  for (size_t i = 0; i < right.length; ++i) if (!" ++ helper "stored_contains" ++ "(result, right.data[i])) data[result.length++] = right.data[i];"+         , "  return result;"+         , "}"+         , "static " ++ setType ++ " " ++ helper "stored_intersection" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right, bool is_complement)"+         , "{"+         , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, left.length, sizeof(*data));"+         , "  " ++ setType ++ " result = (" ++ setType ++ ") {data, 0, is_complement};"+         , "  for (size_t i = 0; i < left.length; ++i) if (" ++ helper "stored_contains" ++ "(right, left.data[i])) data[result.length++] = left.data[i];"+         , "  return result;"+         , "}"+         , "static " ++ setType ++ " " ++ helper "stored_difference" ++ "(sbv_set_ctx *ctx, " ++ setType ++ " left, " ++ setType ++ " right, bool is_complement)"+         , "{"+         , "  " ++ elementType ++ " *data = (" ++ elementType ++ " *) sbv_set_alloc(ctx, left.length, sizeof(*data));"+         , "  " ++ setType ++ " result = (" ++ setType ++ ") {data, 0, is_complement};"+         , "  for (size_t i = 0; i < left.length; ++i) if (!" ++ helper "stored_contains" ++ "(right, left.data[i])) data[result.length++] = left.data[i];"+         , "  return result;"+         , "}"+         ]+setKindRuntime _ _ kind = error $ "SBV->C: Expected a set kind, received " ++ show kind+++-- | Return the number of distinct SMT objects when the domain cardinality fits+-- in a C @uint64_t@. The callback supplies resolved ADT constructor fields,+-- allowing finite sums of products without importing the ADT lowering module.+-- Recursive domains and domains too large for a descriptor return 'Nothing'.+elementDomainSize :: (Kind -> [[Kind]]) -> Kind -> Maybe Integer+elementDomainSize constructorsOf kind = do+  total <- finiteDomainSize constructorsOf kind+  if total <= 2 ^ (64 :: Int) - 1 then Just total else Nothing
+ Data/SBV/Compilers/C/Syntax.hs view
@@ -0,0 +1,63 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Syntax+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Safe rendering of diagnostic text in generated C source.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Syntax (cCommentText, cStringLiteral, cUnusedAttribute) where++import qualified Data.ByteString as BS+import Data.Char (chr, isControl, ord)+import Data.List (intercalate)+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+import Numeric (showOct)+import Text.PrettyPrint.HughesPJ (Doc, doubleQuotes, text)++-- | Shared portability preamble for helpers unused by a particular program.+cUnusedAttribute :: String+cUnusedAttribute = intercalate "\n"+  [ "#ifndef SBV_CGEN_UNUSED"+  , "#if defined(__GNUC__) || defined(__clang__)"+  , "#define SBV_CGEN_UNUSED __attribute__((unused))"+  , "#else"+  , "#define SBV_CGEN_UNUSED"+  , "#endif"+  , "#endif"+  ]++-- | Render comment contents without allowing comment delimiters, line splices,+-- trigraphs, or embedded control characters to affect the surrounding C source.+-- Octal spellings here are readable text, not escapes interpreted by C comments.+cCommentText :: String -> Doc+cCommentText = text . protect+ where protect []             = []+       protect ('*':'/':rest) = "\\052/" ++ protect rest+       protect ('/':'*':rest) = "/\\052" ++ protect rest+       protect ('?':'?':rest) = "\\077" ++ protect ('?' : rest)+       protect (c:rest)       = escape c ++ protect rest+       escape '\\' = "\\134"+       escape '\n' = "\n"+       escape '\t' = "\t"+       escape c+         | isControl c = '\\' : showOct (ord c) ""+         | True        = [c]++-- | Render arbitrary text as a UTF-8 C string literal, using fixed-width+-- octal escapes where a byte cannot safely appear verbatim.+cStringLiteral :: String -> Doc+cStringLiteral = doubleQuotes . text . concatMap escapeByte . BS.unpack . TE.encodeUtf8 . T.pack+ where escapeByte byte+         | byte == 34              = "\\\""+         | byte == 63              = "\\?"+         | byte == 92              = "\\\\"+         | 32 <= byte, byte <= 126 = [chr (fromIntegral byte)]+         | True                    = '\\' : replicate (3 - length octal) '0' ++ octal+         where octal = showOct byte ""
+ Data/SBV/Compilers/C/Table.hs view
@@ -0,0 +1,135 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Table+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Lowering of finite SBV lookup tables to C arrays.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Table+  ( tableExpr+  , tableIndexAndBounds+  , tableMustBeLocal+  , tableNeedsBounds+  ) where++import Data.SBV.Compilers.C.Types (isConcreteADT)+import qualified Data.Set as Set++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Array    (arrayStoredLoad, arrayStoredValue)+import Data.SBV.Compilers.C.BV       (isWideBV, wideBVLookupIndex, wideBVLookupInRange)+import Data.SBV.Compilers.C.GMP      (isExactGMPKind)+import Data.SBV.Compilers.C.Lowering (CLowering(..), CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Value    (valueNeedsOwnership)+import Data.SBV.Compilers.CodeGen    (CgConfig(..))+import Data.SBV.Core.Data+import Data.SBV.Core.Kind             (expandKinds)++-- | Lower a finite SBV table lookup. Bounds are checked when requested by the+-- code-generation configuration (always before wide/exact index narrowing),+-- and the default value is returned for every checked out-of-range index.+-- Only the integral index kinds accepted by SBV's+-- 'Data.SBV.select' operation can reach this function.+tableExpr :: CgConfig -> (SV -> Doc) -> Op -> SV -> Maybe CLowering+tableExpr cfg renderSV (LkUp (tableId, indexKind, _, tableLength) index defaultValue) resultSV+  | isArray resultKind+  = let lowering = arrayStoredLoad resultSV selectedValue+    in Just lowering {loweringRequirements = Set.fromList requirements}+  | True+  = Just $ expressionLowering requirements selectedValue+ where renderedIndex   = renderSV index+       renderedDefault = arrayStoredValue resultKind (renderSV defaultValue)+       lookupValue     = text "table" P.<> int tableId P.<> brackets nativeIndex+       selectedValue   = case outOfRange of+                           Just check | tableNeedsBounds cfg indexKind -> check <+> text "?" <+> renderedDefault <+> text ":" <+> lookupValue+                           _                      -> lookupValue++       resultKind = kindOf resultSV++       requirements =  [CRequiresGMP    | any (isExactGMPKind cfg) touchedKinds]+                    ++ [CRequiresWideBV | any isWideBV touchedKinds]+                    ++ [CRequiresLibBF  | any isFP touchedKinds]+                    ++ [CRequiresLibM   | any isFP touchedKinds]+                    ++ [CRequiresText   | any (`elem` [KChar, KString]) touchedKinds]+                    ++ [CRequiresLists  | any isList touchedKinds]+                    ++ [CRequiresSets   | any isSet touchedKinds]+                    ++ [CRequiresArrays | any isArray touchedKinds]++       touchedKinds = concatMap expandKinds [indexKind, resultKind]++       (nativeIndex, outOfRange) = tableIndexAndBounds cfg indexKind tableLength renderedIndex+tableExpr _ _ _ _ = Nothing++-- | Representation-changing index conversions must preserve out-of-range+-- values even when optional native-index checks are disabled.+tableNeedsBounds :: CgConfig -> Kind -> Bool+tableNeedsBounds cfg kind = cgRTC cfg || isWideBV kind || isExactGMPKind cfg kind++-- | Render a machine index together with its exact out-of-range predicate.+-- Check the original value before narrowing a wide bit-vector or GMP integer;+-- otherwise a large index could alias an in-range table entry.+tableIndexAndBounds :: CgConfig -> Kind -> Int -> Doc -> (Doc, Maybe Doc)+tableIndexAndBounds cfg indexKind tableLength renderedIndex = (nativeIndex, outOfRange)+ where nativeIndex+         | isWideBV indexKind              = wideBVLookupIndex indexKind renderedIndex+         | isExactGMPKind cfg indexKind     = namedCall "mpz_get_ui" [renderedIndex]+         | True                             = renderedIndex++       outOfRange+         | isWideBV indexKind+         = Just $ text "!" P.<> parens (wideBVLookupInRange indexKind tableLength renderedIndex)+         | isExactGMPKind cfg indexKind+         = Just $ text "!" P.<> parens (   namedCall "mpz_sgn" [renderedIndex] <+> text ">= 0"+                                        <+> text "&&"+                                        <+> namedCall "mpz_cmp_ui" [renderedIndex, int tableLength] <+> text "< 0"+                                      )+         | KBool <- indexKind+         = if maximumIndex indexKind >= fromIntegral tableLength+           then Just $ renderedIndex <+> text ">=" <+> int tableLength+           else Nothing+         | isBounded indexKind+         = case (hasSign indexKind, maximumIndex indexKind >= fromIntegral tableLength) of+             (True,  True)  -> Just . parens $ renderedIndex <+> text "< 0"+                                             <+> text "||"+                                             <+> renderedIndex <+> text ">=" <+> int tableLength+             (True,  False) -> Just $ renderedIndex <+> text "< 0"+             (False, True)  -> Just $ renderedIndex <+> text ">=" <+> int tableLength+             (False, False) -> Nothing+         | KUnbounded <- indexKind+         = case cgInteger cfg of+             Nothing    -> error "SBV->C: Internal error: exact SInteger table index escaped GMP lowering."+             Just width -> case maximumSignedIndex width >= fromIntegral tableLength of+                             True  -> Just . parens $ renderedIndex <+> text "< 0"+                                                     <+> text "||"+                                                     <+> renderedIndex <+> text ">=" <+> int tableLength+                             False -> Just $ renderedIndex <+> text "< 0"+         | True+         = error $ "SBV->C: Unsupported table index kind: " ++ show indexKind++       maximumIndex :: Kind -> Integer+       maximumIndex KBool = 1+       maximumIndex kind+         | hasSign kind = maximumSignedIndex (intSizeOf kind)+         | True         = 2 ^ intSizeOf kind - 1++       maximumSignedIndex :: Int -> Integer+       maximumSignedIndex width = 2 ^ (width - 1) - 1++       namedCall functionName args = text functionName P.<> parens (fsep (punctuate comma args))++-- | Test whether a table declaration must be emitted inside the generated+-- function. Exact GMP values use the function's ownership arena, while+-- managed descriptors point at compound-literal backing storage that is not+-- a portable static C initializer. ADTs are conservatively local because+-- their concrete ownership graph is resolved by the ADT lowering phase.+tableMustBeLocal :: CgConfig -> Kind -> Bool+tableMustBeLocal cfg = any mustBeLocal . expandKinds+ where mustBeLocal kind = isExactGMPKind cfg kind || valueNeedsOwnership cfg kind || isConcreteADT kind
+ Data/SBV/Compilers/C/Text.hs view
@@ -0,0 +1,580 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Text+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Length-aware character and string lowering for generated C.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Text+  ( textTypeDecls+  , textRuntime+  , textConst+  , textExpr+  , textPrint+  , textClone+  , textRelease+  , textDriverValue+  , textContextStart+  , textContextEnd+  ) where++import Data.SBV.Compilers.C.Syntax (cUnusedAttribute)+import Data.Bits                       ((.&.), (.|.), shiftR)+import Data.Char                       (chr, ord)+import Data.List                       (intercalate, stripPrefix, tails)+import qualified Data.Set as Set+import Numeric                         (showHex)++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Arena      (CArena(..), arenaRuntime)+import Data.SBV.Compilers.C.GMP        (isExactGMPKind)+import Data.SBV.Compilers.C.Lowering   (CLowering, CRequirement(..), expressionLowering)+import Data.SBV.Compilers.C.Types      (textCloneName, textReleaseName, textCompareName)+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data++-- | Declare the public character and string C types. String inputs borrow+-- their bytes for the duration of a generated call; returned and output+-- strings own their bytes and must be released with @sbv_string_release@.+textTypeDecls :: Set.Set Kind -> Doc+textTypeDecls kinds+  | not usesText = empty+  | True         = text . unlines $+      ["/* Characters and length-aware UTF-8-compatible strings. */"+      , "/* SString inputs borrow their bytes for the duration of a generated call. */"+      , "/* SString outputs and returns own their bytes; release them with sbv_string_release. */"+      , "/* sbv_string_borrow preserves embedded NULs; sbv_string_borrow_utf8 is for NUL-terminated input. */"+      , "/* Borrowed text must use the canonical encoding below and character codes must be at most 0x2ffff. */"+      , "#ifndef SBV_TEXT_TYPES_DEFINED"+      , "#define SBV_TEXT_TYPES_DEFINED"+      , "#include <limits.h>"+      , cUnusedAttribute+      , "typedef uint32_t SChar;"+      , "typedef struct {"+      , "  const uint8_t *data;"+      , "  size_t byte_length;"+      , "  size_t length;"+      , "} SString;"+      , ""+      , "static inline SString sbv_string_borrow(const uint8_t *data, size_t byte_length, size_t length)"+      , "{"+      , "  const SString result = {data, byte_length, length};"+      , "  return result;"+      , "}"+      , ""+      , "static inline SString sbv_string_borrow_utf8(const char *value)"+      , "{"+      , "  const size_t byte_length = value == NULL ? 0 : strlen(value);"+      , "  size_t length = 0;"+      , "  for (size_t i = 0; i < byte_length; ++i)"+      , "    if ((((const uint8_t *) value)[i] & UINT8_C(0xc0)) != UINT8_C(0x80)) ++length;"+      , "  return sbv_string_borrow((const uint8_t *) value, byte_length, length);"+      , "}"+      , ""+      , "static inline SString " ++ textCloneName ++ "(SString value)"+      , "{"+      , "  uint8_t *copy = NULL;"+      , "  if (value.byte_length != 0) {"+      , "    copy = (uint8_t *) malloc(value.byte_length);"+      , "    if (copy == NULL) abort();"+      , "    memcpy(copy, value.data, value.byte_length);"+      , "  }"+      , "  return sbv_string_borrow(copy, value.byte_length, value.length);"+      , "}"+      , ""+      , "static inline void " ++ textReleaseName ++ "(SString *value)"+      , "{"+      , "  if (value == NULL) return;"+      , "  free((void *) value->data);"+      , "  *value = sbv_string_borrow(NULL, 0, 0);"+      , "}"+      , ""+      , "static inline void sbv_string_fprint(FILE *stream, SString value)"+      , "{"+      , "  if (value.byte_length != 0) (void) fwrite(value.data, 1, value.byte_length, stream);"+      , "}"+      , ""+      , "static inline size_t sbv_char_encode(SChar value, uint8_t bytes[4])"+      , "{"+      , "  if (value > UINT32_C(0x2ffff)) abort();"+      , "  if (value <= UINT32_C(0x7f)) { bytes[0] = (uint8_t) value; return 1; }"+      , "  if (value <= UINT32_C(0x7ff)) {"+      , "    bytes[0] = (uint8_t) (UINT32_C(0xc0) | (value >> 6));"+      , "    bytes[1] = (uint8_t) (UINT32_C(0x80) | (value & UINT32_C(0x3f)));"+      , "    return 2;"+      , "  }"+      , "  if (value <= UINT32_C(0xffff)) {"+      , "    bytes[0] = (uint8_t) (UINT32_C(0xe0) | (value >> 12));"+      , "    bytes[1] = (uint8_t) (UINT32_C(0x80) | ((value >> 6) & UINT32_C(0x3f)));"+      , "    bytes[2] = (uint8_t) (UINT32_C(0x80) | (value & UINT32_C(0x3f)));"+      , "    return 3;"+      , "  }"+      , "  bytes[0] = (uint8_t) (UINT32_C(0xf0) | (value >> 18));"+      , "  bytes[1] = (uint8_t) (UINT32_C(0x80) | ((value >> 12) & UINT32_C(0x3f)));"+      , "  bytes[2] = (uint8_t) (UINT32_C(0x80) | ((value >> 6) & UINT32_C(0x3f)));"+      , "  bytes[3] = (uint8_t) (UINT32_C(0x80) | (value & UINT32_C(0x3f)));"+      , "  return 4;"+      , "}"+      , ""+      , "static inline void sbv_char_fprint(FILE *stream, SChar value)"+      , "{"+      , "  uint8_t bytes[4];"+      , "  const size_t count = sbv_char_encode(value, bytes);"+      , "  (void) fwrite(bytes, 1, count, stream);"+      , "}"+      , "#endif"+      , ""+      ]+ where usesText = KString `Set.member` kinds || KChar `Set.member` kinds++-- | Emit the per-call text arena and the helpers used by string operations.+textRuntime :: CgConfig -> Bool -> Doc+textRuntime cfg usesExactInteger = text . unlines . map markUnused $+     commonRuntime+  ++ nativeIntegerRuntime+  ++ if usesExactInteger then exactIntegerRuntime else []+ where markUnused line = case stripPrefix "static " line of+                           Just rest -> "static SBV_CGEN_UNUSED " ++ rest+                           Nothing   -> line++       nativeIntegerRuntime+         | isExactGMPKind cfg KUnbounded = []+         | True                          = nativeIntegerHelpers++-- | Render a character or string constant without relying on C string+-- escaping, so embedded NULs and arbitrary character codes are preserved.+textConst :: CV -> Maybe Doc+textConst (CV KChar (CChar value))+  | ord value > 0x2ffff = error $ "SBV->C: Character literal exceeds the SMT-LIB maximum: " ++ show value+  | True                = Just $ text (charLiteral value)+textConst (CV KString (CString value))+  | any ((> 0x2ffff) . ord) value = error "SBV->C: String literal contains a character exceeding the SMT-LIB maximum"+  | True                          = Just $ text "((SString) {"+       P.<> dataBytes+       P.<> text ", "+       P.<> integer (fromIntegral (length bytes))+       P.<> text ", "+       P.<> integer (fromIntegral (length value))+       P.<> text "})"+ where bytes = concatMap encodeChar value+       dataBytes+         | null bytes = text "NULL"+         | True       = text "(const uint8_t[]) {" P.<> text (intercalate ", " (map byteLiteral bytes)) P.<> text "}"+textConst _ = Nothing++-- | Lower character and string operations. Sequence operations are accepted+-- here only when their element kind is 'KChar'; general sequences are handled+-- by the list runtime.+textExpr :: CgConfig -> Op -> [SV] -> Kind -> [Doc] -> Maybe CLowering+textExpr cfg op svs resultKind args+  | not touchesText = Nothing+  | True            = case (op, args) of+      (ADTOp{}                   , _        ) -> Nothing+      (Uninterpreted{}           , _        ) -> Nothing+      (Label _                   , [a]      ) -> lower a+      (Equal _                   , [a, b]   ) -> lower $ equal a b+      (NotEqual                  , as       ) -> lower $ distinctText as+      (LessThan                  , [a, b]   ) -> lower $ ordered "<"  a b+      (GreaterThan               , [a, b]   ) -> lower $ ordered ">"  a b+      (LessEq                    , [a, b]   ) -> lower $ ordered "<=" a b+      (GreaterEq                 , [a, b]   ) -> lower $ ordered ">=" a b+      (SeqOp (SeqLen KChar)      , [a]      ) -> lowerInteger False $ text "sbv_text_length" P.<> parens a+      (SeqOp (SeqConcat KChar)   , as       ) -> lower $ foldText "sbv_text_concat" as+      (SeqOp (SeqNth KChar)      , [a, i]   ) -> lower $ indexed "sbv_text_nth" [a] i+      (SeqOp (SeqUnit KChar)     , [a]      ) -> lower $ call "sbv_text_unit" [text "&sbv_local_text_ctx", a]+      (SeqOp (SeqSubseq KChar)   , [a, i, n]) -> lower $ indexed2 "sbv_text_substring" a i n+      (SeqOp (SeqIndexOf KChar)  , [a, b, i]) -> lowerInteger True $ indexed "sbv_text_index_of" [a, b] i+      (SeqOp (SeqContains KChar) , [a, b]   ) -> lower $ call "sbv_text_contains" [a, b]+      (SeqOp (SeqPrefixOf KChar) , [a, b]   ) -> lower $ call "sbv_text_prefix_of" [a, b]+      (SeqOp (SeqSuffixOf KChar) , [a, b]   ) -> lower $ call "sbv_text_suffix_of" [a, b]+      (SeqOp (SeqReplace KChar)  , [a, b, c]) -> lower $ call "sbv_text_replace" [text "&sbv_local_text_ctx", a, b, c]+      (StrOp StrToCode           , [a]      ) -> lowerInteger False a+      (StrOp StrFromCode         , [a]      ) -> lower $ fromCode a+      (StrOp StrStrToNat         , [a]      ) -> lowerNat a+      (StrOp StrNatToStr         , [a]      ) -> lower $ fromNat a+      (StrOp StrInRe{}           , _        ) -> Nothing+      (TupleConstructor{}        , _        ) -> Nothing+      (TupleAccess{}             , _        ) -> Nothing+      _                                         -> unsupported (show op)+ where touchesText = resultKind `elem` [KChar, KString]+                  || any ((`elem` [KChar, KString]) . kindOf) svs+                  || isTextOp op++       lower expression = Just $ expressionLowering [CRequiresText] expression++       lowerNat value+         | isExactGMPKind cfg resultKind+         = Just $ expressionLowering [CRequiresText, CRequiresGMP] (toNat value)+         | True+         = lower $ parens (text "SInteger") <+> toNat value++       lowerInteger signed expression+         | isExactGMPKind cfg resultKind+         = Just $ expressionLowering [CRequiresText, CRequiresGMP]+                $ call (if signed then "sbv_gmp_integer_from_s64" else "sbv_gmp_integer_from_u64")+                       [text "&sbv_local_gmp_ctx", expression]+         | True+         = lower $ parens (text "SInteger") <+> expression++       usesString = any ((== KString) . kindOf) svs++       equal a b+         | usesString = parens $ call textCompareName [a, b] <+> text "== 0"+         | True       = a <+> text "==" <+> b++       ordered relation a b+         | usesString = parens $ call textCompareName [a, b] <+> text relation <+> text "0"+         | True       = a <+> text relation <+> b++       distinctText as = fsep $ punctuate (text " &&")+                              [parens (if usesString+                                       then call textCompareName [a, b] <+> text "!= 0"+                                       else a <+> text "!=" <+> b)+                              | (a:rest) <- tails as, b <- rest]++       foldText _      []     = text "((SString) {NULL, 0, 0})"+       foldText _      [a]    = a+       foldText helper (a:as) = foldl (\left right -> call helper [text "&sbv_local_text_ctx", left, right]) a as++       indexed helper prefix index+         | exactIndex = call (helper ++ "_mpz") (prefix ++ [index])+         | True       = call helper (prefix ++ [parens (text "int64_t") <+> index])++       indexed2 helper value offset count+         | exactIndex = call (helper ++ "_mpz") [text "&sbv_local_text_ctx", value, offset, count]+         | True       = call helper [text "&sbv_local_text_ctx", value, parens (text "int64_t") <+> offset, parens (text "int64_t") <+> count]++       exactIndex = any (isExactGMPKind cfg . kindOf) svs++       fromCode value+         | exactIndex = call "sbv_text_from_code_mpz" [value]+         | True       = call "sbv_text_from_code" [parens (text "int64_t") <+> value]++       toNat value+         | isExactGMPKind cfg resultKind+         = call "sbv_text_to_nat_mpz" [text "&sbv_local_gmp_ctx", text "&sbv_local_text_ctx", value]+         | True+         = call "sbv_text_to_nat" [value]++       fromNat value+         | exactIndex = call "sbv_text_from_nat_mpz" [text "&sbv_local_text_ctx", value]+         | True       = call "sbv_text_from_nat" [text "&sbv_local_text_ctx", parens (text "int64_t") <+> value]++       unsupported what = error $ "SBV->C: text lowering does not yet support " ++ what+                               ++ " with argument kinds " ++ show (map kindOf svs)+                               ++ " and result kind " ++ show resultKind++-- | Print a generated character or string value to standard output.+textPrint :: Kind -> Doc -> Doc+textPrint KChar   value = call "sbv_char_fprint"   [text "stdout", value]+textPrint KString value = call "sbv_string_fprint" [text "stdout", value]+textPrint kind    _     = error $ "SBV->C: Expected a text kind, received " ++ show kind++-- | Deep-copy a string across the generated function's ownership boundary.+textClone :: Doc -> Doc+textClone value = call textCloneName [value]++-- | Release an owned string in a generated driver.+textRelease :: Doc -> Doc+textRelease value = call textReleaseName [text "&" P.<> value] P.<> semi++-- | Produce a deterministic printable driver value for a character or string.+textDriverValue :: Kind -> Integer -> Doc+textDriverValue KChar   seed = text $ charLiteral $ chr $ 32 + fromInteger (abs seed `mod` 95)+textDriverValue KString seed = case textConst (CV KString (CString ("sbv" ++ show (abs seed `mod` 1000)))) of+                                Just value -> value+                                Nothing    -> error "SBV->C: Impossible string driver value"+textDriverValue kind    _    = error $ "SBV->C: Expected a text kind, received " ++ show kind++-- | Initialize the arena used by string temporaries in a generated function.+textContextStart :: Doc+textContextStart = text "sbv_text_ctx sbv_local_text_ctx = {NULL};"++-- | Release all string temporaries allocated by a generated function.+textContextEnd :: Doc+textContextEnd = call "sbv_text_ctx_end" [text "&sbv_local_text_ctx"] P.<> semi++-- | Test whether an operation belongs to the string/character family even+-- when neither its result nor all of its operands have a text kind.+isTextOp :: Op -> Bool+isTextOp StrOp{}                        = True+isTextOp (SeqOp (SeqLen KChar))         = True+isTextOp (SeqOp (SeqConcat KChar))      = True+isTextOp (SeqOp (SeqNth KChar))         = True+isTextOp (SeqOp (SeqUnit KChar))        = True+isTextOp (SeqOp (SeqSubseq KChar))      = True+isTextOp (SeqOp (SeqIndexOf KChar))     = True+isTextOp (SeqOp (SeqContains KChar))    = True+isTextOp (SeqOp (SeqPrefixOf KChar))    = True+isTextOp (SeqOp (SeqSuffixOf KChar))    = True+isTextOp (SeqOp (SeqReplace KChar))     = True+isTextOp _                              = False++-- | Render a portable numeric C character literal.+charLiteral :: Char -> String+charLiteral value = "UINT32_C(0x" ++ replicate (8 - length rendered) '0' ++ rendered ++ ")"+ where rendered = showHex (ord value) ""++-- | Encode one Haskell character with the canonical one-to-four-byte scheme+-- used by the generated runtime. Numeric surrogate values are preserved.+encodeChar :: Char -> [Int]+encodeChar value+  | code <= 0x7f   = [code]+  | code <= 0x7ff  = [0xc0 .|. (code `shiftR` 6), 0x80 .|. (code .&. 0x3f)]+  | code <= 0xffff = [ 0xe0 .|. (code `shiftR` 12)+                      , 0x80 .|. ((code `shiftR` 6) .&. 0x3f)+                      , 0x80 .|. (code .&. 0x3f)+                      ]+  | True           = [ 0xf0 .|. (code `shiftR` 18)+                      , 0x80 .|. ((code `shiftR` 12) .&. 0x3f)+                      , 0x80 .|. ((code `shiftR` 6) .&. 0x3f)+                      , 0x80 .|. (code .&. 0x3f)+                      ]+ where code = ord value++-- | Render one encoded byte as a fixed-width portable C literal.+byteLiteral :: Int -> String+byteLiteral value = "UINT8_C(0x" ++ replicate (2 - length rendered) '0' ++ rendered ++ ")"+ where rendered = showHex value ""++-- | Render a C helper call.+call :: String -> [Doc] -> Doc+call functionName args = text functionName P.<> parens (fsep (punctuate comma args))++-- | Runtime helpers shared by mapped and exact integer configurations.+commonRuntime :: [String]+commonRuntime = arenaRuntime TextArena +++  [ ""+  , "static size_t sbv_text_width(uint8_t first)"+  , "{"+  , "  if (first < UINT8_C(0x80)) return 1;"+  , "  if (first < UINT8_C(0xe0)) return 2;"+  , "  if (first < UINT8_C(0xf0)) return 3;"+  , "  return 4;"+  , "}"+  , ""+  , "static size_t sbv_text_byte_offset(SString value, size_t index)"+  , "{"+  , "  size_t byte = 0;"+  , "  for (size_t character = 0; character < index && byte < value.byte_length; ++character)"+  , "    byte += sbv_text_width(value.data[byte]);"+  , "  return byte;"+  , "}"+  , ""+  , "static SChar sbv_text_decode(const uint8_t *bytes)"+  , "{"+  , "  const size_t width = sbv_text_width(bytes[0]);"+  , "  if (width == 1) return bytes[0];"+  , "  SChar result = bytes[0] & (width == 2 ? UINT8_C(0x1f) : width == 3 ? UINT8_C(0x0f) : UINT8_C(0x07));"+  , "  for (size_t i = 1; i < width; ++i) result = (result << 6) | (bytes[i] & UINT8_C(0x3f));"+  , "  return result;"+  , "}"+  , ""+  , "static uint64_t sbv_text_length(SString value) { return (uint64_t) value.length; }"+  , ""+  , "static int " ++ textCompareName ++ "(SString left, SString right)"+  , "{"+  , "  const size_t common = left.byte_length < right.byte_length ? left.byte_length : right.byte_length;"+  , "  const int prefix = common == 0 ? 0 : memcmp(left.data, right.data, common);"+  , "  if (prefix != 0) return prefix;"+  , "  return left.byte_length < right.byte_length ? -1 : left.byte_length > right.byte_length ? 1 : 0;"+  , "}"+  , ""+  , "static SString sbv_text_concat(sbv_text_ctx *ctx, SString left, SString right)"+  , "{"+  , "  if (SIZE_MAX - left.byte_length < right.byte_length || SIZE_MAX - left.length < right.length) abort();"+  , "  if (left.byte_length == 0) return right;"+  , "  if (right.byte_length == 0) return left;"+  , "  const size_t byte_length = left.byte_length + right.byte_length;"+  , "  uint8_t *data = sbv_text_alloc(ctx, byte_length);"+  , "  memcpy(data, left.data, left.byte_length);"+  , "  memcpy(data + left.byte_length, right.data, right.byte_length);"+  , "  return sbv_string_borrow(data, byte_length, left.length + right.length);"+  , "}"+  , ""+  , "static SString sbv_text_unit(sbv_text_ctx *ctx, SChar value)"+  , "{"+  , "  uint8_t encoded[4];"+  , "  const size_t count = sbv_char_encode(value, encoded);"+  , "  uint8_t *data = sbv_text_alloc(ctx, count); memcpy(data, encoded, count);"+  , "  return sbv_string_borrow(data, count, 1);"+  , "}"+  , ""+  , "static SChar sbv_text_nth(SString value, int64_t index)"+  , "{"+  , "  if (index < 0 || (uint64_t) index >= value.length) return UINT32_C(0);"+  , "  return sbv_text_decode(value.data + sbv_text_byte_offset(value, (size_t) index));"+  , "}"+  , ""+  , "static SString sbv_text_substring_size(sbv_text_ctx *ctx, SString value, size_t offset, size_t count)"+  , "{"+  , "  if (offset >= value.length || count == 0) return sbv_string_borrow(NULL, 0, 0);"+  , "  if (count > value.length - offset) count = value.length - offset;"+  , "  const size_t first = sbv_text_byte_offset(value, offset);"+  , "  const size_t last = sbv_text_byte_offset(value, offset + count);"+  , "  uint8_t *data = sbv_text_alloc(ctx, last - first); memcpy(data, value.data + first, last - first);"+  , "  return sbv_string_borrow(data, last - first, count);"+  , "}"+  , ""+  , "static SString sbv_text_substring(sbv_text_ctx *ctx, SString value, int64_t offset, int64_t count)"+  , "{"+  , "  if (offset < 0 || count <= 0) return sbv_string_borrow(NULL, 0, 0);"+  , "  return sbv_text_substring_size(ctx, value, (size_t) offset, (size_t) count);"+  , "}"+  , ""+  , "static bool sbv_text_prefix_of(SString prefix, SString value)"+  , "{"+  , "  return prefix.byte_length <= value.byte_length"+  , "      && (prefix.byte_length == 0 || memcmp(prefix.data, value.data, prefix.byte_length) == 0);"+  , "}"+  , ""+  , "static bool sbv_text_suffix_of(SString suffix, SString value)"+  , "{"+  , "  return suffix.byte_length <= value.byte_length"+  , "      && (suffix.byte_length == 0 || memcmp(suffix.data, value.data + value.byte_length - suffix.byte_length, suffix.byte_length) == 0);"+  , "}"+  , ""+  , "static bool sbv_text_contains(SString value, SString part)"+  , "{"+  , "  if (part.byte_length == 0) return true;"+  , "  if (part.byte_length > value.byte_length) return false;"+  , "  for (size_t offset = 0; offset + part.byte_length <= value.byte_length; offset += sbv_text_width(value.data[offset]))"+  , "    if (memcmp(value.data + offset, part.data, part.byte_length) == 0) return true;"+  , "  return false;"+  , "}"+  , ""+  , "static int64_t sbv_text_index_of_size(SString value, SString part, size_t start)"+  , "{"+  , "  if (start > value.length) return -1;"+  , "  if (part.byte_length == 0) return start <= INT64_MAX ? (int64_t) start : -1;"+  , "  if (part.byte_length > value.byte_length) return -1;"+  , "  size_t character = start;"+  , "  for (size_t byte = sbv_text_byte_offset(value, start); byte + part.byte_length <= value.byte_length; ++character) {"+  , "    if (memcmp(value.data + byte, part.data, part.byte_length) == 0) return character <= INT64_MAX ? (int64_t) character : -1;"+  , "    byte += sbv_text_width(value.data[byte]);"+  , "  }"+  , "  return -1;"+  , "}"+  , ""+  , "static int64_t sbv_text_index_of(SString value, SString part, int64_t start)"+  , "{"+  , "  return start < 0 ? -1 : sbv_text_index_of_size(value, part, (size_t) start);"+  , "}"+  , ""+  , "static SString sbv_text_replace(sbv_text_ctx *ctx, SString value, SString source, SString replacement)"+  , "{"+  , "  const int64_t index = sbv_text_index_of_size(value, source, 0);"+  , "  if (index < 0) return value;"+  , "  const size_t first = sbv_text_byte_offset(value, (size_t) index);"+  , "  const size_t after = first + source.byte_length;"+  , "  const size_t retained = value.byte_length - source.byte_length;"+  , "  if (replacement.byte_length > SIZE_MAX - retained) abort();"+  , "  const size_t byte_length = retained + replacement.byte_length;"+  , "  uint8_t *data = sbv_text_alloc(ctx, byte_length);"+  , "  if (first != 0) memcpy(data, value.data, first);"+  , "  if (replacement.byte_length != 0) memcpy(data + first, replacement.data, replacement.byte_length);"+  , "  if (after != value.byte_length) memcpy(data + first + replacement.byte_length, value.data + after, value.byte_length - after);"+  , "  return sbv_string_borrow(data, byte_length, value.length - source.length + replacement.length);"+  , "}"+  , ""+  , "static SChar sbv_text_from_code(int64_t value)"+  , "{"+  , "  if (value < 0 || value > INT64_C(0x2ffff)) abort();"+  , "  return (SChar) value;"+  , "}"+  ]++-- | Runtime helpers used when 'SInteger' has a native lossy mapping.+nativeIntegerHelpers :: [String]+nativeIntegerHelpers =+  [""+  , "static int64_t sbv_text_to_nat(SString value)"+  , "{"+  , "  if (value.byte_length == 0) return -1;"+  , "  uint64_t result = 0;"+  , "  for (size_t i = 0; i < value.byte_length; ++i) {"+  , "    if (value.data[i] < UINT8_C(0x30) || value.data[i] > UINT8_C(0x39)) return -1;"+  , "    result = result * UINT64_C(10) + (value.data[i] - UINT8_C(0x30));"+  , "  }"+  , "  return (int64_t) result;"+  , "}"+  , ""+  , "static SString sbv_text_from_nat(sbv_text_ctx *ctx, int64_t value)"+  , "{"+  , "  if (value < 0) return sbv_string_borrow(NULL, 0, 0);"+  , "  char buffer[32];"+  , "  const int count = snprintf(buffer, sizeof buffer, \"%\" PRIu64, (uint64_t) value);"+  , "  uint8_t *data = sbv_text_alloc(ctx, (size_t) count); memcpy(data, buffer, (size_t) count);"+  , "  return sbv_string_borrow(data, (size_t) count, (size_t) count);"+  , "}"+  ]++-- | Runtime adapters used when 'SInteger' retains its exact GMP mapping.+exactIntegerRuntime :: [String]+exactIntegerRuntime =+  [""+  , "static bool sbv_text_mpz_to_size(SInteger value, size_t *result)"+  , "{"+  , "  if (mpz_sgn(value) < 0 || mpz_sizeinbase(value, 2) > sizeof(size_t) * CHAR_BIT) return false;"+  , "  size_t written = 0; *result = 0;"+  , "  (void) mpz_export(result, &written, -1, sizeof(*result), 0, 0, value);"+  , "  return true;"+  , "}"+  , ""+  , "static SChar sbv_text_nth_mpz(SString value, SInteger index)"+  , "{"+  , "  size_t converted;"+  , "  if (!sbv_text_mpz_to_size(index, &converted) || converted >= value.length) return UINT32_C(0);"+  , "  return sbv_text_decode(value.data + sbv_text_byte_offset(value, converted));"+  , "}"+  , ""+  , "static SString sbv_text_substring_mpz(sbv_text_ctx *ctx, SString value, SInteger offset, SInteger count)"+  , "{"+  , "  size_t converted_offset, converted_count;"+  , "  if (!sbv_text_mpz_to_size(offset, &converted_offset) || !sbv_text_mpz_to_size(count, &converted_count))"+  , "    return sbv_string_borrow(NULL, 0, 0);"+  , "  return sbv_text_substring_size(ctx, value, converted_offset, converted_count);"+  , "}"+  , ""+  , "static int64_t sbv_text_index_of_mpz(SString value, SString part, SInteger start)"+  , "{"+  , "  size_t converted;"+  , "  return sbv_text_mpz_to_size(start, &converted) ? sbv_text_index_of_size(value, part, converted) : -1;"+  , "}"+  , ""+  , "static SChar sbv_text_from_code_mpz(SInteger value)"+  , "{"+  , "  if (mpz_sgn(value) < 0 || mpz_cmp_ui(value, 0x2ffffUL) > 0) abort();"+  , "  return (SChar) mpz_get_ui(value);"+  , "}"+  , ""+  , "static SInteger sbv_text_to_nat_mpz(sbv_gmp_ctx *gmp_ctx, sbv_text_ctx *text_ctx, SString value)"+  , "{"+  , "  if (value.byte_length == 0) return sbv_gmp_integer_from_s64(gmp_ctx, -1);"+  , "  if (value.byte_length == SIZE_MAX) abort();"+  , "  for (size_t i = 0; i < value.byte_length; ++i)"+  , "    if (value.data[i] < UINT8_C(0x30) || value.data[i] > UINT8_C(0x39)) return sbv_gmp_integer_from_s64(gmp_ctx, -1);"+  , "  char *digits = (char *) sbv_text_alloc(text_ctx, value.byte_length + 1);"+  , "  memcpy(digits, value.data, value.byte_length); digits[value.byte_length] = '\\0';"+  , "  return sbv_gmp_integer_const(gmp_ctx, digits);"+  , "}"+  , ""+  , "static SString sbv_text_from_nat_mpz(sbv_text_ctx *ctx, SInteger value)"+  , "{"+  , "  if (mpz_sgn(value) < 0) return sbv_string_borrow(NULL, 0, 0);"+  , "  const size_t count = mpz_sizeinbase(value, 10);"+  , "  if (count == SIZE_MAX) abort();"+  , "  uint8_t *data = sbv_text_alloc(ctx, count + 1);"+  , "  (void) mpz_get_str((char *) data, 10, value);"+  , "  const size_t length = strlen((const char *) data);"+  , "  return sbv_string_borrow(data, length, length);"+  , "}"+  ]
+ Data/SBV/Compilers/C/Tuple.hs view
@@ -0,0 +1,311 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Tuple+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Structural tuple lowering for the SBV-to-C compiler.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Tuple+  ( tupleKinds+  , tupleCType+  , tupleFieldName+  , tupleForwardTypeDecls+  , tupleTypeDecls+  , tupleOwnershipTypeDecls+  , tupleOwnedInitName+  , tupleOwnedSetName+  , tupleOwnedCloneName+  , tupleOwnedReleaseName+  , tupleDriverInit+  , tupleValue+  , tupleConst+  , tupleExpr+  , tupleUsesExact+  , tupleNeedsOwnership+  , elementCType+  , kindTag+  ) where++import Data.List                       (nub, sortOn)+import qualified Data.Set as Set++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.Array      (arrayStoredLoad, arrayStoredValue)+import Data.SBV.Compilers.C.GMP        (gmpFunctionName, gmpOutputType, isExactGMPKind)+import Data.SBV.Compilers.C.List       (listClone, listRelease)+import Data.SBV.Compilers.C.Lowering   (CLowering, expressionLowering)+import Data.SBV.Compilers.C.Set        (setClone, setRelease)+import Data.SBV.Compilers.C.Syntax     (cCommentText)+import Data.SBV.Compilers.C.Types      ( elementCType, kindTag, tupleCType, tupleFieldName+                                     , tupleOwnedInitName, tupleOwnedSetName, tupleOwnedCloneName, tupleOwnedReleaseName+                                     , textCloneName, textReleaseName+                                     )+import Data.SBV.Compilers.C.Value      (managedValueClone, managedValueRelease, valueDriverInit, valueNeedsOwnership)+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data+import Data.SBV.Core.Kind              (expandKinds)++-- | Return the distinct tuple kinds used by a program, with nested tuple+-- declarations ordered before the structures that contain them.+tupleKinds :: Set.Set Kind -> [Kind]+tupleKinds = sortOn tupleDepth . nub . concatMap (filter isTuple . expandKinds) . Set.toAscList+ where tupleDepth :: Kind -> Int+       tupleDepth (KTuple fields) = 1 + maximum (0 : map tupleDepth fields)+       tupleDepth _               = 0++-- | Emit forward declarations that permit collection descriptors to refer to+-- tuple element types before their layouts are complete.+tupleForwardTypeDecls :: [Kind] -> Doc+tupleForwardTypeDecls []     = empty+tupleForwardTypeDecls tuples = text . unlines $ "/* Forward declarations for structural tuples. */" : concatMap declaration tuples+ where declaration kind@KTuple{} =+         [ "#ifndef " ++ tupleForwardGuard kind+         , "#define " ++ tupleForwardGuard kind+         , "typedef struct " ++ tupleCType kind ++ " " ++ tupleCType kind ++ ";"+         , "#endif"+         , ""+         ]+       declaration kind = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Emit public structure definitions for all tuple kinds used by a program.+-- The unit tuple carries a private byte because ISO C does not permit empty+-- structures. Each definition also provides its own guarded forward+-- declaration so this function remains independently usable.+tupleTypeDecls :: [Kind] -> Doc+tupleTypeDecls []     = empty+tupleTypeDecls tuples = text . unlines $ "/* Structural tuple values. */" : concatMap declaration tuples+ where declaration kind@(KTuple fields) =+            [ "#ifndef " ++ tupleGuard kind+            , "#define " ++ tupleGuard kind+            , "#ifndef " ++ tupleForwardGuard kind+            , "#define " ++ tupleForwardGuard kind+            , "typedef struct " ++ tupleCType kind ++ " " ++ tupleCType kind ++ ";"+            , "#endif"+            , "struct " ++ tupleCType kind ++ " {"+            ]+         ++ (case fields of+               [] -> ["  uint8_t unit;"]+               _  -> zipWith fieldDeclaration [1 :: Int ..] fields)+         ++ [ "};"+            , "#endif"+            , ""+            ]+       declaration kind = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++       fieldDeclaration index kind = "  " ++ elementCType kind ++ " " ++ tupleFieldName index ++ ";"++-- | Emit public ownership helpers for tuples containing exact GMP-backed,+-- string, collection, retained-array, or concrete ADT fields. Inputs may+-- borrow an ordinary tuple value.+-- Cloned values own their recursively managed fields and must be released+-- with 'tupleOwnedReleaseName'.+tupleOwnershipTypeDecls :: CgConfig -> [Kind] -> Doc+tupleOwnershipTypeDecls cfg tuples+  | null owned = empty+  | True       = text . unlines $ concatMap declaration owned+ where owned = filter (tupleNeedsOwnership cfg) tuples++       declaration kind@(KTuple fields) =+          [ "#ifndef " ++ ownershipGuard+          , "#define " ++ ownershipGuard+          , "/* Recursive ownership helpers for " ++ tupleCType kind ++ ". */"+          , "/* Owned values have unique ownership; clone before copying and release every owner. */"+          , "static inline SBV_CGEN_UNUSED void " ++ tupleOwnedInitName kind ++ "(" ++ tupleCType kind ++ " *value)"+          , "{"+          , "  if (value == NULL) abort();"+          , "  memset(value, 0, sizeof *value);"+          ]+          ++ concat (zipWith initializeField [1 :: Int ..] fields)+          ++ [ "}"+          , ""+          , "static inline SBV_CGEN_UNUSED void " ++ tupleOwnedSetName kind ++ "(" ++ tupleCType kind ++ " *target, " ++ tupleCType kind ++ " source)"+          , "{"+          ]+          ++ concat (zipWith setField [1 :: Int ..] fields)+          ++ [ "}"+          , ""+          , "static inline SBV_CGEN_UNUSED " ++ tupleCType kind ++ " " ++ tupleOwnedCloneName kind ++ "(" ++ tupleCType kind ++ " source)"+          , "{"+          , "  " ++ tupleCType kind ++ " result;"+          , "  " ++ tupleOwnedInitName kind ++ "(&result);"+          , "  " ++ tupleOwnedSetName kind ++ "(&result, source);"+          , "  return result;"+          , "}"+          , ""+          , "static inline SBV_CGEN_UNUSED void " ++ tupleOwnedReleaseName kind ++ "(" ++ tupleCType kind ++ " *value)"+          , "{"+          , "  if (value == NULL) return;"+          ]+          ++ concat (zipWith releaseField [1 :: Int ..] fields)+          ++ [ "  memset(value, 0, sizeof *value);"+          , "}"+          , "#endif"+          , ""+         ]+         where ownershipGuard = tupleCType kind ++ "_OWNERSHIP_DEFINED"++               initializeField index fieldKind+                  | isExactGMPKind cfg fieldKind+                  = let access  = "value->" ++ tupleFieldName index+                        mutable = gmpOutputType fieldKind+                        local   = "field" ++ show index+                    in [ "  " ++ mutable ++ " " ++ local ++ " = (" ++ mutable ++ ") malloc(sizeof(*" ++ local ++ "));"+                       , "  if (" ++ local ++ " == NULL) abort();"+                       , "  " ++ gmpFunctionName fieldKind "init" ++ "(" ++ local ++ ");"+                       , "  " ++ access ++ " = " ++ local ++ ";"+                       ]+                  | fieldKind == KString+                  = ["  value->" ++ tupleFieldName index ++ " = (SString) {NULL, 0, 0};"]+                  | isList fieldKind+                  = ["  value->" ++ tupleFieldName index ++ " = (" ++ elementCType fieldKind ++ ") {NULL, 0};"]+                  | isSet fieldKind+                  = ["  value->" ++ tupleFieldName index ++ " = (" ++ elementCType fieldKind ++ ") {NULL, 0, false};"]+                  | isArray fieldKind+                  = ["  value->" ++ tupleFieldName index ++ " = NULL;"]+                  | isTuple fieldKind && tupleNeedsOwnership cfg fieldKind+                  = ["  " ++ tupleOwnedInitName fieldKind ++ "(&value->" ++ tupleFieldName index ++ ");"]+                  | True+                  = []++               setField index fieldKind+                  | isExactGMPKind cfg fieldKind+                  = ["  " ++ gmpFunctionName fieldKind "set" ++ "((" ++ gmpOutputType fieldKind ++ ") target->" ++ field ++ ", source." ++ field ++ ");"]+                  | fieldKind == KString+                  = [ "  const SString " ++ field ++ "_copy = " ++ textCloneName ++ "(source." ++ field ++ ");"+                    , "  " ++ textReleaseName ++ "(&target->" ++ field ++ ");"+                    , "  target->" ++ field ++ " = " ++ field ++ "_copy;"+                    ]+                  | isList fieldKind+                  = [ "  const " ++ elementCType fieldKind ++ " " ++ field ++ "_copy = " ++ render (listClone fieldKind (text ("source." ++ field))) ++ ";"+                    , "  " ++ render (listRelease fieldKind (text ("target->" ++ field)))+                    , "  target->" ++ field ++ " = " ++ field ++ "_copy;"+                    ]+                  | isSet fieldKind+                  = [ "  const " ++ elementCType fieldKind ++ " " ++ field ++ "_copy = " ++ render (setClone fieldKind (text ("source." ++ field))) ++ ";"+                    , "  " ++ render (setRelease fieldKind (text ("target->" ++ field)))+                    , "  target->" ++ field ++ " = " ++ field ++ "_copy;"+                    ]+                  | isArray fieldKind+                  = [ "  " ++ elementCType fieldKind ++ " " ++ field ++ "_copy = " ++ render (managedValueClone fieldKind (text ("source." ++ field))) ++ ";"+                    , "  " ++ render (managedValueRelease fieldKind (text ("&target->" ++ field)))+                    , "  target->" ++ field ++ " = " ++ field ++ "_copy;"+                    ]+                  | isTuple fieldKind && tupleNeedsOwnership cfg fieldKind+                  = ["  " ++ tupleOwnedSetName fieldKind ++ "(&target->" ++ field ++ ", source." ++ field ++ ");"]+                  | valueNeedsOwnership cfg fieldKind+                  = [ "  " ++ elementCType fieldKind ++ " " ++ field ++ "_copy = " ++ render (managedValueClone fieldKind (text ("source." ++ field))) ++ ";"+                    , "  " ++ render (managedValueRelease fieldKind (text ("&target->" ++ field)))+                    , "  target->" ++ field ++ " = " ++ field ++ "_copy;"+                    ]+                  | True+                  = ["  target->" ++ field ++ " = source." ++ field ++ ";"]+                  where field = tupleFieldName index++               releaseField index fieldKind+                  | isExactGMPKind cfg fieldKind+                  = [ "  if (value->" ++ field ++ " != NULL) {"+                    , "    " ++ gmpFunctionName fieldKind "clear" ++ "((" ++ gmpOutputType fieldKind ++ ") value->" ++ field ++ ");"+                    , "    free((void *) value->" ++ field ++ ");"+                    , "  }"+                    ]+                  | fieldKind == KString+                  = ["  " ++ textReleaseName ++ "(&value->" ++ field ++ ");"]+                  | isList fieldKind+                  = ["  " ++ render (listRelease fieldKind (text ("value->" ++ field)))]+                  | isSet fieldKind+                  = ["  " ++ render (setRelease fieldKind (text ("value->" ++ field)))]+                  | isArray fieldKind+                  = ["  " ++ render (managedValueRelease fieldKind (text ("&value->" ++ field)))]+                  | isTuple fieldKind && tupleNeedsOwnership cfg fieldKind+                  = ["  " ++ tupleOwnedReleaseName fieldKind ++ "(&value->" ++ field ++ ");"]+                  | valueNeedsOwnership cfg fieldKind+                  = ["  " ++ render (managedValueRelease fieldKind (text ("&value->" ++ field)))]+                  | True+                  = []+                  where field = tupleFieldName index+       declaration kind = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Initialize a generated-driver tuple and populate its fields from a seed.+-- Recursively owned fields use the public owned-tuple storage protocol; other+-- fields use the supplied scalar renderer. Array and ADT fields delegate to+-- the supplied statement initializer.+tupleDriverInit :: CgConfig -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> String -> Integer -> Doc+tupleDriverInit cfg renderValue initializeValue kind@KTuple{} externalName seed = valueDriverInit cfg renderValue initializeValue kind externalName seed+tupleDriverInit _   _           _               kind         _            _    = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Render a concrete tuple value as a C99 compound literal.+tupleConst :: (CV -> Doc) -> CV -> Maybe Doc+tupleConst renderValue (CV kind@(KTuple fieldKinds) (CTuple fieldValues))+  | length fieldKinds == length fieldValues+  = Just $ tupleValue kind (zipWith (\fieldKind fieldValue -> arrayStoredValue fieldKind (renderValue (CV fieldKind fieldValue))) fieldKinds fieldValues)+  | True+  = error $ "SBV->C: Malformed tuple constant " ++ show (CV kind (CTuple fieldValues))+tupleConst _ _ = Nothing++-- | Lower tuple construction, projection, conditionals, and labels. Other+-- operators are left to the scalar pipeline; SBV normally expands structural+-- comparisons into field operations before code generation.+tupleExpr :: Op -> [SV] -> SV -> [Doc] -> Maybe CLowering+tupleExpr op svs resultSV args+  | not (isTuple resultKind || any isTuple svs)+  = Nothing+  | True+  = case (op, svs, args) of+      (TupleConstructor arity, fields, renderedFields)+        | KTuple fieldKinds <- resultKind+        , arity == length fieldKinds+        , map kindOf fields == fieldKinds+        -> lower $ tupleValue resultKind (zipWith arrayStoredValue fieldKinds renderedFields)+      (TupleAccess fieldIndex arity, [tupleSV], [renderedTuple])+        | KTuple fieldKinds <- kindOf tupleSV+        , arity == length fieldKinds+        , fieldIndex >= 1+        , fieldIndex <= arity+        , resultKind == fieldKinds !! (fieldIndex - 1)+        -> let field = parens renderedTuple P.<> text "." P.<> text (tupleFieldName fieldIndex)+           in if isArray resultKind then Just (arrayStoredLoad resultSV field) else lower field+      (Label label, [_], [renderedTuple])+        -> lower $ renderedTuple <+> text "/*" <+> cCommentText label <+> text "*/"+      _ -> Nothing+ where resultKind = kindOf resultSV++       lower = Just . expressionLowering []++-- | Test whether a tuple contains an exact GMP-backed integer, real, or+-- rational at any nesting depth under the active code-generation configuration.+tupleUsesExact :: CgConfig -> Kind -> Bool+tupleUsesExact cfg kind@KTuple{} = any (isExactGMPKind cfg) (expandKinds kind)+tupleUsesExact _   _             = False++-- | Test whether a tuple contains a field that must be cloned when it crosses+-- the generated function's ownership boundary.+tupleNeedsOwnership :: CgConfig -> Kind -> Bool+tupleNeedsOwnership cfg kind@KTuple{} = valueNeedsOwnership cfg kind+tupleNeedsOwnership _   _             = False++-- | Render a tuple expression from its field expressions.+tupleValue :: Kind -> [Doc] -> Doc+tupleValue kind@(KTuple []) [] = parens (text (tupleCType kind)) P.<> braces (text "0")+tupleValue kind@(KTuple fieldKinds) fields+  | length fieldKinds == length fields+  = parens (text (tupleCType kind)) P.<> braces (fsep (punctuate comma designatedFields))+  | True+  = error $ "SBV->C: Tuple literal field mismatch for " ++ show kind+ where designatedFields = zipWith (\index field -> text "." P.<> text (tupleFieldName index) <+> text "=" <+> field) [1 :: Int ..] fields+tupleValue kind _ = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Return the preprocessor guard protecting one tuple definition.+tupleGuard :: Kind -> String+tupleGuard kind = tupleCType kind ++ "_DEFINED"++-- | Return the preprocessor guard protecting one tuple forward declaration.+tupleForwardGuard :: Kind -> String+tupleForwardGuard kind = tupleCType kind ++ "_FORWARD_DEFINED"
+ Data/SBV/Compilers/C/Types.hs view
@@ -0,0 +1,274 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Types+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Shared C type and helper names for structurally lowered SBV kinds.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Types+  ( tupleCType+  , adtCType+  , definedFunctionCName+  , arrayKindTag+  , arrayOutputCTypeName+  , arrayStoredCloneName+  , arrayStoredReleaseName+  , tupleFieldName+  , tupleOwnedInitName+  , tupleOwnedSetName+  , tupleOwnedCloneName+  , tupleOwnedReleaseName+  , adtOwnedInitName+  , adtOwnedSetName+  , adtOwnedCloneName+  , adtOwnedReleaseName+  , adtEqualName+  , listCloneName+  , listReleaseName+  , listHelperName+  , setCloneName+  , setReleaseName+  , setHelperName+  , textCloneName+  , textReleaseName+  , textCompareName+  , elementCType+  , constElementCType+  , kindTag+  , isConcreteADT+  , isConcreteADTReference+  ) where++import Data.Char                   (isAlphaNum, isAscii, ord)+import Numeric                     (showHex)++import Data.SBV.Compilers.C.FP         (arbitraryFPCType)+import Data.SBV.Core.Data++-- | Return the helper name that initializes caller-owned storage for a tuple+-- with recursively managed fields.+tupleOwnedInitName :: Kind -> String+tupleOwnedInitName kind = "sbv_tuple_owned_init_" ++ kindTag kind++-- | Return the helper name that assigns into initialized owned tuple storage.+tupleOwnedSetName :: Kind -> String+tupleOwnedSetName kind = "sbv_tuple_owned_set_" ++ kindTag kind++-- | Return the public helper name that deep-copies a managed-field tuple.+tupleOwnedCloneName :: Kind -> String+tupleOwnedCloneName kind = "sbv_tuple_owned_clone_" ++ kindTag kind++-- | Return the public helper name that releases an owned managed-field tuple.+tupleOwnedReleaseName :: Kind -> String+tupleOwnedReleaseName kind = "sbv_tuple_owned_release_" ++ kindTag kind++-- | Return the helper name that initializes caller-owned storage for one ADT+-- constructor.+adtOwnedInitName :: Kind -> String+adtOwnedInitName kind = "sbv_adt_owned_init_" ++ adtCType kind++-- | Return the helper name that assigns into initialized owned ADT storage.+adtOwnedSetName :: Kind -> String+adtOwnedSetName kind = "sbv_adt_owned_set_" ++ adtCType kind++-- | Return the public helper name that deep-copies an owned ADT.+adtOwnedCloneName :: Kind -> String+adtOwnedCloneName kind = "sbv_adt_owned_clone_" ++ adtCType kind++-- | Return the public helper name that releases an owned ADT.+adtOwnedReleaseName :: Kind -> String+adtOwnedReleaseName kind = "sbv_adt_owned_release_" ++ adtCType kind++-- | Return the generated structural-equality helper for a recursive ADT.+adtEqualName :: Bool -> Kind -> String+adtEqualName strong kind = "sbv_adt_" ++ (if strong then "object_" else "")+                        ++ "equal_" ++ adtCType kind++-- | Return the generated clone-helper name for a list kind.+listCloneName :: Kind -> String+listCloneName (KList elementKind) = "sbv_list_clone_" ++ kindTag elementKind+listCloneName kind                = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Return the generated release-helper name for a list kind.+listReleaseName :: Kind -> String+listReleaseName (KList elementKind) = "sbv_list_release_" ++ kindTag elementKind+listReleaseName kind                = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Return one specialized list-operation helper name.+listHelperName :: Kind -> String -> String+listHelperName (KList elementKind) suffix = "sbv_list_" ++ kindTag elementKind ++ "_" ++ suffix+listHelperName kind                _      = error $ "SBV->C: Expected a list kind, received " ++ show kind++-- | Return the generated clone-helper name for a set kind.+setCloneName :: Kind -> String+setCloneName (KSet elementKind) = "sbv_set_clone_" ++ kindTag elementKind+setCloneName kind               = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Return the generated release-helper name for a set kind.+setReleaseName :: Kind -> String+setReleaseName (KSet elementKind) = "sbv_set_release_" ++ kindTag elementKind+setReleaseName kind               = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Return one specialized set-operation helper name.+setHelperName :: Kind -> String -> String+setHelperName (KSet elementKind) suffix = "sbv_set_" ++ kindTag elementKind ++ "_" ++ suffix+setHelperName kind               _      = error $ "SBV->C: Expected a set kind, received " ++ show kind++-- | Name of the public helper that copies a string into owned storage.+textCloneName :: String+textCloneName = "sbv_string_clone"++-- | Name of the public helper that releases owned string storage.+textReleaseName :: String+textReleaseName = "sbv_string_release"++-- | Name of the lexicographic string-comparison runtime helper.+textCompareName :: String+textCompareName = "sbv_text_compare"++-- | A resolved user ADT, excluding built-in rounding modes and opaque sorts.+isConcreteADT :: Kind -> Bool+isConcreteADT kind = isADT kind && not (isRoundingMode kind) && not (isUninterpreted kind)++-- | A user ADT or a retained application awaiting ADT-reference resolution.+-- Keep this distinct from 'isConcreteADT' for dependency and ownership walks.+isConcreteADTReference :: Kind -> Bool+isConcreteADTReference KApp{} = True+isConcreteADTReference kind   = isConcreteADT kind++-- | Return the public C structure type used for a tuple kind.+tupleCType :: Kind -> String+tupleCType kind@KTuple{} = "SBVTuple_" ++ kindTag kind+tupleCType kind          = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Return the public C structure type used for a concrete ADT kind or an+-- unresolved application of a registered ADT.+adtCType :: Kind -> String+adtCType kind@(KADT typeName parameters _)+  | isADT kind && not (isRoundingMode kind) && not (isUninterpreted kind)+  = appliedType typeName (map snd parameters)+  | True+  = error $ "SBV->C: Expected a concrete ADT kind, received " ++ show kind+adtCType (KApp typeName arguments) = appliedType typeName arguments+adtCType kind = error $ "SBV->C: Expected an ADT kind, received " ++ show kind++-- | Return the private C identifier used for an SBV-defined function. Encoding+-- the complete SMT identifier keeps quoted and firstified names collision-free.+definedFunctionCName :: String -> String+definedFunctionCName functionName = "sbv_function_" ++ encodeIdentifier functionName++-- | Render the common C type spelling shared by a concrete ADT and an+-- unresolved application of that same registered ADT.+appliedType :: String -> [Kind] -> String+appliedType typeName arguments = "SBVADT_" ++ encodeIdentifier typeName ++ concatMap parameterTag arguments+ where parameterTag parameterKind = "_" ++ show (length tag) ++ "_" ++ tag+        where tag = kindTag parameterKind++-- | Return the public member name used for a one-based tuple field index.+tupleFieldName :: Int -> String+tupleFieldName index+  | index >= 1 = "field" ++ show index+  | True       = error $ "SBV->C: Tuple fields are one-based, received " ++ show index++-- | Return the public C type used for a structurally lowered field or element.+elementCType :: Kind -> String+elementCType KBool               = "SBool"+elementCType (KBounded False 1)  = "SBool"+elementCType (KBounded False w)  = "SWord" ++ show w+elementCType (KBounded True  w)  = "SInt" ++ show w+elementCType KUnbounded          = "SInteger"+elementCType KReal               = "SReal"+elementCType KRational           = "SRational"+elementCType KFloat              = "SFloat"+elementCType KDouble             = "SDouble"+elementCType KChar               = "SChar"+elementCType KString             = "SString"+elementCType kind@KFP{}          = arbitraryFPCType kind+elementCType kind@KTuple{}       = tupleCType kind+elementCType kind@KADT{}+  | isRoundingMode kind          = "RoundingMode"+  | True                         = adtCType kind+elementCType kind@KApp{}         = adtCType kind+elementCType (KList elementKind) = "SBVList_" ++ kindTag elementKind+elementCType (KSet elementKind)  = "SBVSet_" ++ kindTag elementKind+elementCType kind@KArray{}       = arrayOutputCTypeName kind ++ " *"+elementCType kind                = error $ "SBV->C: Unsupported structural kind: " ++ show kind++-- | Qualify a stored value itself. Array values are spelled as pointers, so+-- their const qualifier belongs after the pointer, not on its pointee.+constElementCType :: Kind -> String+constElementCType kind+  | isArray kind = elementCType kind ++ " const"+  | True         = "const " ++ elementCType kind++-- | Return the suffix used by a generated structural C type. Structural+-- components are length-framed and identifiers are escaped injectively.+-- Consumers must preserve case, including in preprocessor guards and tags.+-- Booleans and unsigned one-bit vectors intentionally share a representation,+-- as do a concrete ADT and its corresponding resolved application.+kindTag :: Kind -> String+kindTag KBool               = "u1"+kindTag (KBounded False w)  = "u" ++ show w+kindTag (KBounded True  w)  = "s" ++ show w+kindTag KUnbounded          = "integer"+kindTag KReal               = "real"+kindTag KRational           = "rational"+kindTag KFloat              = "float"+kindTag KDouble             = "double"+kindTag KChar               = "char"+kindTag KString             = "string"+kindTag (KFP eb sb)         = "fp_e" ++ show eb ++ "_s" ++ show sb+kindTag (KTuple fields)     = "t" ++ show (length fields) ++ concatMap (('_' :) . taggedKind . kindTag) fields+kindTag kind@KADT{}+  | isRoundingMode kind     = "rounding_mode"+  | True                    = "adt_" ++ encodeIdentifier (adtCType kind)+kindTag kind@KApp{}         = "adt_" ++ encodeIdentifier (adtCType kind)+kindTag (KList elementKind) = "list_" ++ taggedKind (kindTag elementKind)+kindTag (KSet elementKind)  = "set_"  ++ taggedKind (kindTag elementKind)+kindTag kind@KArray{}       = "array_" ++ taggedKind (arrayKindTag kind)+kindTag kind                = error $ "SBV->C: Unsupported structural kind: " ++ show kind++-- | Return the key/value suffix shared by generated names for an array kind.+-- Frame both components by length, just as for tuple fields and ADT arguments,+-- so nested tags need not be parsed to find the key/value boundary.+--+-- >>> arrayKindTag (KArray (KBounded False 8) (KBounded False 32))+-- "2_u8_3_u32"+arrayKindTag :: Kind -> String+arrayKindTag (KArray keyKind valueKind) = taggedKind (kindTag keyKind) ++ "_" ++ taggedKind (kindTag valueKind)+arrayKindTag kind                       = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Return the public owned-output descriptor name for an array kind.+arrayOutputCTypeName :: Kind -> String+arrayOutputCTypeName kind@KArray{} = "SBVArrayOutput_" ++ arrayKindTag kind+arrayOutputCTypeName kind          = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Return the helper name that clones an array descriptor stored by pointer+-- inside another generated value.+arrayStoredCloneName :: Kind -> String+arrayStoredCloneName kind@KArray{} = "sbv_array_stored_clone_" ++ arrayKindTag kind+arrayStoredCloneName kind          = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Return the helper name that releases an array descriptor stored by pointer+-- inside another generated value.+arrayStoredReleaseName :: Kind -> String+arrayStoredReleaseName kind@KArray{} = "sbv_array_stored_release_" ++ arrayKindTag kind+arrayStoredReleaseName kind          = error $ "SBV->C: Expected an array kind, received " ++ show kind++-- | Prefix a generated kind tag with its length so adjacent tags cannot+-- collide.+taggedKind :: String -> String+taggedKind value = show (length value) ++ "_" ++ value++-- | Encode an arbitrary Haskell type name as a valid C identifier component.+encodeIdentifier :: String -> String+encodeIdentifier = concatMap encode+ where encode character+         | isAscii character && isAlphaNum character = [character]+         | True                                      = "_x" ++ showHex (ord character) "" ++ "_"
+ Data/SBV/Compilers/C/Value.hs view
@@ -0,0 +1,233 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Compilers.C.Value+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Shared properties and operations for structurally lowered C values.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Compilers.C.Value+  ( valueNeedsOwnership+  , valueDriverNeedsInitialization+  , byValueEqual+  , managedValueClone+  , managedValueRelease+  , valueDriverInit+  , valueDriverClear+  ) where++import Text.PrettyPrint.HughesPJ+import qualified Text.PrettyPrint.HughesPJ as P ((<>))++import Data.SBV.Compilers.C.BV         (isWideBV, wideBVEqual)+import Data.SBV.Compilers.C.FP         (arbitraryFPEqual, arbitraryFPObjectEqual, nativeFPObjectEqual)+import Data.SBV.Compilers.C.GMP        (gmpDriverAssign, gmpDriverClear, gmpDriverInit, gmpEqual, isExactGMPKind)+import Data.SBV.Compilers.C.Types      ( isConcreteADTReference, arrayStoredCloneName, arrayStoredReleaseName+                                     , constElementCType, elementCType, tupleCType, tupleFieldName+                                     , adtEqualName, adtOwnedCloneName, adtOwnedReleaseName+                                     , tupleOwnedInitName, tupleOwnedCloneName, tupleOwnedReleaseName+                                     , listCloneName, listReleaseName, listHelperName+                                     , setCloneName, setReleaseName, setHelperName+                                     , textCloneName, textReleaseName, textCompareName+                                     )+import Data.SBV.Compilers.CodeGen      (CgConfig)+import Data.SBV.Core.Data++-- | Test whether a value requires clone-and-release ownership when it crosses+-- a generated C ABI boundary. Concrete ADTs use a uniform ownership protocol,+-- including those whose resolved fields do not themselves need deep storage.+valueNeedsOwnership :: CgConfig -> Kind -> Bool+valueNeedsOwnership cfg kind+  | isExactGMPKind cfg kind = True+valueNeedsOwnership _   KString        = True+valueNeedsOwnership _   KList{}        = True+valueNeedsOwnership _   KSet{}         = True+valueNeedsOwnership _   KArray{}       = True+valueNeedsOwnership cfg (KTuple kinds) = any (valueNeedsOwnership cfg) kinds+valueNeedsOwnership _   kind@KADT{}    = isConcreteADTReference kind+valueNeedsOwnership _   KApp{}         = True+valueNeedsOwnership _   _              = False++-- | Test whether a deterministic example-driver value needs declarations or+-- initialization statements instead of a single C compound literal.+valueDriverNeedsInitialization :: CgConfig -> Kind -> Bool+valueDriverNeedsInitialization cfg kind+  | isExactGMPKind cfg kind = True+valueDriverNeedsInitialization cfg (KTuple fields)      = any (valueNeedsOwnership cfg) fields+valueDriverNeedsInitialization cfg (KList elementKind)  = valueDriverNeedsInitialization cfg elementKind+valueDriverNeedsInitialization cfg (KSet elementKind)   = valueDriverNeedsInitialization cfg elementKind+valueDriverNeedsInitialization _   KArray{}             = True+valueDriverNeedsInitialization _   kind@KADT{}          = isConcreteADTReference kind+valueDriverNeedsInitialization _   KApp{}               = True+valueDriverNeedsInitialization _   _                    = False++-- | Render equality for a scalar or recursively nested aggregate. The Boolean+-- flag selects object equality for floating-point values. Array-valued fields+-- carry an unreachable abort sentinel: operation validation rejects consumers+-- requiring extensional equality, while unused aggregate helpers may be emitted.+byValueEqual :: CgConfig -> Bool -> Kind -> Doc -> Doc -> Doc+byValueEqual cfg strong kind left right+  | isWideBV kind                             = wideBVEqual kind left right+  | isFP kind && strong                       = arbitraryFPObjectEqual kind left right+  | isFP kind                                 = arbitraryFPEqual kind left right+  | strong && (isFloat kind || isDouble kind) = nativeFPObjectEqual left right+  | isExactGMPKind cfg kind                   = gmpEqual kind left right+  | kind == KString                           = parens $ call textCompareName [left, right] <+> text "== 0"+  | isList kind                               = call (listHelperName kind "equal") [left, right]+  | isSet kind                                = call (setHelperName kind "equal") [left, right]+  | isArray kind                              = text "(abort(), false)"+  | KTuple fields <- kind                     = tupleEquality fields+  | isConcreteADTReference kind               = call (adtEqualName strong kind) [left, right]+  | True                                      = left <+> text "==" <+> right+ where tupleEquality []     = parens . fsep . punctuate comma $ [text "(void)" <+> parens left, text "(void)" <+> parens right, text "true"]+       tupleEquality fields = parens . fsep . punctuate (text " &&") $+         zipWith equalField [1 :: Int ..] fields++       equalField index fieldKind = byValueEqual cfg strong fieldKind+         (parens left  P.<> text "." P.<> text (tupleFieldName index))+         (parens right P.<> text "." P.<> text (tupleFieldName index))++-- | Deep-copy one non-GMP managed value. Exact GMP values require initialized+-- destination storage and are therefore handled by their aggregate owner.+managedValueClone :: Kind -> Doc -> Doc+managedValueClone KString value       = call textCloneName [value]+managedValueClone kind@KList{} value  = call (listCloneName kind) [value]+managedValueClone kind@KSet{} value   = call (setCloneName kind) [value]+managedValueClone kind@KArray{} value = call (arrayStoredCloneName kind) [value]+managedValueClone kind@KTuple{} value = call (tupleOwnedCloneName kind) [value]+managedValueClone kind value+  | isConcreteADTReference kind       = call (adtOwnedCloneName kind) [value]+managedValueClone kind _              = error $ "SBV->C: Expected a non-GMP managed kind, received " ++ show kind++-- | Release one non-GMP managed value through a pointer to its owned storage.+managedValueRelease :: Kind -> Doc -> Doc+managedValueRelease KString address       = call textReleaseName [address] P.<> semi+managedValueRelease kind@KList{} address  = call (listReleaseName kind) [address] P.<> semi+managedValueRelease kind@KSet{} address   = call (setReleaseName kind) [address] P.<> semi+managedValueRelease kind@KArray{} address = call (arrayStoredReleaseName kind) [address] P.<> semi+managedValueRelease kind@KTuple{} address = call (tupleOwnedReleaseName kind) [address] P.<> semi+managedValueRelease kind address+  | isConcreteADTReference kind           = call (adtOwnedReleaseName kind) [address] P.<> semi+managedValueRelease kind _                = error $ "SBV->C: Expected a non-GMP managed kind, received " ++ show kind++-- | Declare and initialize one deterministic example-driver value. Managed+-- aggregates receive unique ownership; collection descriptors themselves+-- borrow the element variables declared alongside them. The supplied+-- statement renderer constructs retained arrays and registered ADTs without+-- creating dependency cycles between the structural lowering modules.+-- Collections whose elements need no initialization use a compound literal;+-- 'valueDriverClear' emits no element cleanup for those borrowed literals.+valueDriverInit :: CgConfig -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> String -> Integer -> Doc+valueDriverInit cfg _           _               kind                       externalName seed+  | isExactGMPKind cfg kind+  = gmpDriverInit kind (text externalName) (integer seed)+valueDriverInit cfg renderValue initializeValue kind@(KTuple fields)       externalName seed+  | valueNeedsOwnership cfg kind+  =  text (tupleCType kind) <+> text externalName P.<> semi+  $$ call (tupleOwnedInitName kind) [text "&" P.<> text externalName] P.<> semi+  $$ vcat (concat (zipWith initializeTupleField [1 :: Int ..] (zip fields [seed ..])))+ where initializeTupleField index (fieldKind, fieldSeed) = initializeAt fieldKind access fieldName fieldSeed+        where access    = text externalName P.<> text "." P.<> text (tupleFieldName index)+              fieldName = externalName ++ "_field_" ++ show index++       initializeAt fieldKind access fieldName fieldSeed+         | isExactGMPKind cfg fieldKind = exactAssignment fieldKind access fieldSeed+         | fieldKind == KString         = [access <+> text "=" <+> managedValueClone fieldKind (renderValue fieldKind fieldSeed) P.<> semi]+         | isArray fieldKind            = [ initializeValue fieldKind fieldName fieldSeed+                                          , access <+> text "=" <+> text fieldName P.<> semi+                                          ]+         | isConcreteADTReference fieldKind      = [ initializeValue fieldKind fieldName fieldSeed+                                          , access <+> text "=" <+> text fieldName P.<> semi+                                          ]+         | KList{}         <- fieldKind = collectionAssignment fieldKind access fieldName fieldSeed+         | KSet{}          <- fieldKind = collectionAssignment fieldKind access fieldName fieldSeed+         | nested@KTuple{} <- fieldKind+         , valueNeedsOwnership cfg nested+         = concat (zipWith initializeNested [1 :: Int ..] (zip (tupleFields nested) [fieldSeed ..]))+         | True                           = [access <+> text "=" <+> renderValue fieldKind fieldSeed P.<> semi]+        where initializeNested nestedIndex (nestedKind, nestedSeed) = initializeAt nestedKind nestedAccess nestedName nestedSeed+               where nestedAccess = access P.<> text "." P.<> text (tupleFieldName nestedIndex)+                     nestedName   = fieldName ++ "_field_" ++ show nestedIndex++       collectionAssignment fieldKind access fieldName fieldSeed =+         [ valueDriverInit cfg renderValue initializeValue fieldKind fieldName fieldSeed+         , access <+> text "=" <+> managedValueClone fieldKind (text fieldName) P.<> semi+         , valueDriverClear cfg fieldKind fieldName+         ]++       exactAssignment fieldKind access value = gmpDriverAssign fieldKind access (integer value)+valueDriverInit cfg renderValue initializeValue kind@(KList elementKind)   externalName seed+  | valueDriverNeedsInitialization cfg kind+  = collectionDriverInit cfg renderValue initializeValue kind elementKind externalName seed False+valueDriverInit cfg renderValue initializeValue kind@(KSet elementKind)    externalName seed+  | valueDriverNeedsInitialization cfg kind+  = collectionDriverInit cfg renderValue initializeValue kind elementKind externalName seed (odd seed)+valueDriverInit _   _           initializeValue kind@KArray{}              externalName seed+  = initializeValue kind externalName seed+valueDriverInit _   _           initializeValue kind                       externalName seed+  | isConcreteADTReference kind+  = initializeValue kind externalName seed+valueDriverInit _   renderValue _               kind                       externalName seed+  = text "const" <+> text (elementCType kind) <+> text externalName <+> text "=" <+> renderValue kind seed P.<> semi++-- | Release storage created by 'valueDriverInit'. Borrowed scalar and string+-- literals require no cleanup. Collections use the same initialization test+-- as construction, so cleanup names only separately declared element variables.+valueDriverClear :: CgConfig -> Kind -> String -> Doc+valueDriverClear cfg kind externalName+  | isExactGMPKind cfg kind+  = gmpDriverClear kind (text externalName)+valueDriverClear cfg kind@KTuple{} externalName+  | valueNeedsOwnership cfg kind+  = managedValueRelease kind (text "&" P.<> text externalName)+valueDriverClear _   kind                externalName+  | isConcreteADTReference kind+  = managedValueRelease kind (text "&" P.<> text externalName)+valueDriverClear _   kind@KArray{}       externalName+  = managedValueRelease kind (text "&" P.<> text externalName)+valueDriverClear cfg kind@(KList elementKind) externalName+  | valueDriverNeedsInitialization cfg kind+  = vcat [valueDriverClear cfg elementKind (collectionElementName externalName index) | index <- [0 :: Int .. collectionElementCount - 1]]+valueDriverClear cfg kind@(KSet elementKind) externalName+  | valueDriverNeedsInitialization cfg kind+  = vcat [valueDriverClear cfg elementKind (collectionElementName externalName index) | index <- [0 :: Int .. collectionElementCount - 1]]+valueDriverClear _   _                   _            = empty++-- | Declare a deterministic borrowed list or set descriptor and its elements.+collectionDriverInit :: CgConfig -> (Kind -> Integer -> Doc) -> (Kind -> String -> Integer -> Doc) -> Kind -> Kind -> String -> Integer -> Bool -> Doc+collectionDriverInit cfg renderValue initializeValue kind elementKind externalName seed isComplemented+  =  vcat (zipWith initializeElement elementNames [seed ..])+  $$ text (constElementCType elementKind) <+> text dataName P.<> brackets (int collectionElementCount)+       <+> text "=" <+> braces (fsep (punctuate comma (map text elementNames))) P.<> semi+  $$ text "const" <+> text (elementCType kind) <+> text externalName <+> text "="+       <+> braces (fsep (punctuate comma descriptorFields)) P.<> semi+ where elementNames     = [collectionElementName externalName index | index <- [0 :: Int .. collectionElementCount - 1]]+       dataName         = externalName ++ "_data"+       descriptorFields = [text dataName, int collectionElementCount]+                       ++ case kind of+                            KSet{} -> [text (if isComplemented then "true" else "false")]+                            _      -> []++       initializeElement = valueDriverInit cfg renderValue initializeValue elementKind++-- | Return the generated name of one deterministic collection element.+collectionElementName :: String -> Int -> String+collectionElementName externalName index = externalName ++ "_element_" ++ show index++-- | Number of elements placed in each deterministic example collection.+collectionElementCount :: Int+collectionElementCount = 3++-- | Extract the fields of a tuple kind.+tupleFields :: Kind -> [Kind]+tupleFields (KTuple fields) = fields+tupleFields kind            = error $ "SBV->C: Expected a tuple kind, received " ++ show kind++-- | Render a C helper call.+call :: String -> [Doc] -> Doc+call functionName arguments = text functionName P.<> parens (fsep (punctuate comma arguments))
Data/SBV/Compilers/CodeGen.hs view
@@ -10,6 +10,7 @@ -----------------------------------------------------------------------------  {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE PatternSynonyms           #-}  {-# OPTIONS_GHC -Wall -Werror #-} @@ -28,12 +29,14 @@         , svCgReturn, svCgReturnArr          -- * Settings-        , cgPerformRTCs, cgSetDriverValues+        , cgPerformRTCs, cgSetDriverValues, cgArrayEqualityLimit, cgRegexLimits+        , CgRegexLimits(..), defaultCgRegexLimits, cgSetRegexLimits         , cgAddPrototype, cgAddDecl, cgAddLDFlags, cgIgnoreSAssert, cgOverwriteFiles, cgShowU8UsingHex         , cgIntegerSize, cgSRealType, CgSRealType(..)          -- * Infrastructure-        , CgTarget(..), CgConfig(..), CgState(..), CgPgmBundle(..), CgPgmKind(..), CgVal(..)+        , CgTarget(..), CgConfig(..), CgState(..), CgPgmBundle(..)+        , CgPgmKind(CgMakefile, CgHeader, CgCHeader, CgSource, CgDriver), CgCHeader(..), CgVal(..)         , defaultCgConfig, initCgState, isCgDriver, isCgMakefile          -- * Generating collateral@@ -53,7 +56,7 @@ import qualified Text.PrettyPrint.HughesPJ as P (render)  import Data.SBV.Core.Data-import Data.SBV.Core.Symbolic (MonadSymbolic(..), svToSymSV, svMkSymVar, outputSVal, VarContext(..))+import Data.SBV.Core.Symbolic (MonadSymbolic(..), addNewSMTOption, imposeConstraint, newInternalVariable, outputSVal, svMkSymVar, svToSymSV, VarContext(..))  import Data.SBV.Provers.Prover(defaultSMTCfg) @@ -64,29 +67,39 @@  -- | Options for code-generation. data CgConfig = CgConfig {-          cgRTC                :: Bool               -- ^ If 'True', perform run-time-checks for index-out-of-bounds or shifting-by-large values etc.-        , cgInteger            :: Maybe Int          -- ^ Bit-size to use for representing SInteger (if any)-        , cgReal               :: Maybe CgSRealType  -- ^ Type to use for representing SReal (if any)-        , cgDriverVals         :: [Integer]          -- ^ Values to use for the driver program generated, useful for generating non-random drivers.-        , cgGenDriver          :: Bool               -- ^ If 'True', will generate a driver program-        , cgGenMakefile        :: Bool               -- ^ If 'True', will generate a makefile-        , cgIgnoreAsserts      :: Bool               -- ^ If 'True', will ignore 'Data.SBV.sAssert' calls-        , cgOverwriteGenerated :: Bool               -- ^ If 'True', will overwrite the generated files without prompting.-        , cgShowU8InHex        :: Bool               -- ^ If 'True', then 8-bit unsigned values will be shown in hex as well, otherwise decimal. (Other types always shown in hex.)+          cgRTC                  :: Bool              -- ^ If 'True', check finite table indices and select the supplied default when out of bounds.+        , cgInteger              :: Maybe Int         -- ^ Optional lossy bit-size for representing SInteger; 'Nothing' selects exact GMP integers+        , cgReal                 :: Maybe CgSRealType -- ^ Optional lossy representation for SReal; 'Nothing' selects exact GMP rationals+        , cgDriverVals           :: [Integer]         -- ^ Values to use for the driver program generated, useful for generating non-random drivers.+        , cgGenDriver            :: Bool              -- ^ If 'True', will generate a driver program+        , cgGenMakefile          :: Bool              -- ^ If 'True', will generate a makefile+        , cgIgnoreAsserts        :: Bool              -- ^ If 'True', will ignore 'Data.SBV.sAssert' calls+        , cgOverwriteGenerated   :: Bool              -- ^ If 'True', will overwrite the generated files without prompting.+        , cgShowU8InHex          :: Bool              -- ^ If 'True', then 8-bit unsigned values will be shown in hex as well, otherwise decimal. (Other types always shown in hex.)+        , cgArrayEqualityMaxKeys :: Integer           -- ^ Maximum key-domain size for exhaustive array equality in the current C backend.+        , cgRegexMaxStates       :: Integer           -- ^ Maximum states explored per regex membership or language comparison.+        , cgRegexMaxNodes        :: Integer           -- ^ Maximum nodes in a regex expression, including intermediate derivatives.+        , cgRegexMaxWork         :: Integer           -- ^ Maximum charged generation work per regex operation; not a runtime input bound.         } --- | Default options for code generation. The run-time checks are turned-off, and the driver values are completely random.+-- | Default options for code generation. Run-time checks are disabled, driver+-- values are random, and any 'SInteger' or rational 'SReal' values use exact+-- GMP representations. defaultCgConfig :: CgConfig-defaultCgConfig = CgConfig { cgRTC                = False-                           , cgInteger            = Nothing-                           , cgReal               = Nothing-                           , cgDriverVals         = []-                           , cgGenDriver          = True-                           , cgGenMakefile        = True-                           , cgIgnoreAsserts      = False-                           , cgOverwriteGenerated = False-                           , cgShowU8InHex        = False-                           }+defaultCgConfig = CgConfig { cgRTC                  = False+                          , cgInteger              = Nothing+                          , cgReal                 = Nothing+                          , cgDriverVals           = []+                          , cgGenDriver            = True+                          , cgGenMakefile          = True+                          , cgIgnoreAsserts        = False+                          , cgOverwriteGenerated   = False+                          , cgShowU8InHex          = False+                          , cgArrayEqualityMaxKeys = 256+                          , cgRegexMaxStates       = 1024+                          , cgRegexMaxNodes        = 4096+                          , cgRegexMaxWork         = 16000000+                          }  -- | Abstraction of target language values data CgVal = CgAtomic SV@@ -124,18 +137,108 @@                             , MonadFail                             ) +-- | Code-generation computations support hard symbolic constraints. Target+-- backends decide which constraint variants have executable semantics.+instance SolverContext SBVCodeGen where+  constrain                    = imposeConstraint False []             . unSBV . quantifiedBool+  softConstrain                = imposeConstraint True  []             . unSBV . quantifiedBool+  namedConstraint        nm   = imposeConstraint False [(":named", nm)] . unSBV . quantifiedBool+  constrainWithAttribute attrs = imposeConstraint False attrs          . unSBV . quantifiedBool++  contextState = symbolicEnv+  setOption    = addNewSMTOption++  internalVariable kind = do+    state <- contextState+    sv    <- liftIO $ newInternalVariable state kind+    pure $ SBV $ SVal kind $ Right $ cache $ const $ pure sv+ -- | Reach into symbolic monad from code-generation cgSym :: Symbolic a -> SBVCodeGen a cgSym = SBVCodeGen . lift --- | Sets RTC (run-time-checks) for index-out-of-bounds, shift-with-large value etc. on/off. Default: 'False'.+-- | Enable bounds checks for finite table selection. Out-of-range indices+-- select the supplied default. With checks disabled (the default), callers+-- must guarantee in-range indices. This setting does not disable assertions,+-- executable constraints, ownership checks, or exact bit-vector shift+-- semantics in the current C backend. Wide bit-vector and GMP indices always+-- retain their bounds check before conversion to a machine index. cgPerformRTCs :: Bool -> SBVCodeGen () cgPerformRTCs b = modify' (\s -> s { cgFinalConfig = (cgFinalConfig s) { cgRTC = b } }) +-- | Set the maximum number of keys enumerated by an array equality comparison+-- in the current C backend. The default is 256. Larger or infinite domains+-- are rejected during generation; equality is never approximated. Zero+-- disables exhaustive array equality. Negative limits are invalid.+--+-- For example, @cgArrayEqualityLimit 65536@ permits comparing arrays indexed+-- by 'SWord16', at the cost of up to 65,536 lookups in each array per comparison.+-- The setting also applies inside generated defined functions and array lambdas.+--+-- >>> import Data.SBV+-- >>> import Data.SBV.Internals (compileToC')+-- >>> :{+-- let compareArrays = do+--       cgArrayEqualityLimit 65536+--       left  <- cgInput "left"  :: SBVCodeGen (SArray Word16 Word8)+--       right <- cgInput "right" :: SBVCodeGen (SArray Word16 Word8)+--       cgReturn (left .== right)+-- :}+--+-- >>> (_, _, generated) <- compileToC' "compareArrays" compareArrays+-- >>> length (show generated) `seq` pure ()+cgArrayEqualityLimit :: Integer -> SBVCodeGen ()+cgArrayEqualityLimit limit+  | limit < 0 = error "SBV.cgArrayEqualityLimit: The limit must be nonnegative."+  | True      = modify' (\s -> s { cgFinalConfig = (cgFinalConfig s) { cgArrayEqualityMaxKeys = limit } })++-- | Bound dependency-free C regex compilation: maximum explored states,+-- expression nodes, and generation work, respectively. Defaults are 1024,+-- 4096, and 16000000. Exceeding a budget fails during generation, never by+-- approximating the language or limiting runtime input length. Zero disables+-- regex compilation; negative limits are invalid. Limits apply independently+-- to each operation, also inside defined functions and library components.+--+-- For example, @cgRegexLimits 4096 8192 64000000@ permits larger automata and+-- intermediate expressions, at the cost of more generation time and memory.+-- See "Data.SBV.Tools.CodeGen" for an executable generation example.+cgRegexLimits :: Integer -> Integer -> Integer -> SBVCodeGen ()+cgRegexLimits states nodes work+  | any (< 0) [states, nodes, work] = error "SBV.cgRegexLimits: Limits must be nonnegative."+  | True = modify' (\s -> s { cgFinalConfig = (cgFinalConfig s) { cgRegexMaxStates = states+                                                              , cgRegexMaxNodes  = nodes+                                                              , cgRegexMaxWork   = work+                                                              } })++-- | Named limits for dependency-free regex compilation. Work is a conservative+-- generation allowance, not a promise that every smaller automaton will fit.+data CgRegexLimits = CgRegexLimits+  { regexMaxStates :: Integer -- ^ Maximum explored automaton states.+  , regexMaxNodes  :: Integer -- ^ Maximum nodes per intermediate expression.+  , regexMaxWork   :: Integer -- ^ Maximum charged construction work.+  } deriving (Eq, Show)++-- | The default regex budgets, suitable for record updates.+defaultCgRegexLimits :: CgRegexLimits+defaultCgRegexLimits = CgRegexLimits (cgRegexMaxStates defaultCgConfig)+                                    (cgRegexMaxNodes defaultCgConfig)+                                    (cgRegexMaxWork defaultCgConfig)++-- | Configure regex budgets using named fields. The positional 'cgRegexLimits'+-- remains available for compatibility.+--+-- >>> let larger = defaultCgRegexLimits { regexMaxStates = 4096, regexMaxWork = 64000000 }+-- >>> regexMaxNodes larger == regexMaxNodes defaultCgRegexLimits+-- True+cgSetRegexLimits :: CgRegexLimits -> SBVCodeGen ()+cgSetRegexLimits limits = cgRegexLimits (regexMaxStates limits) (regexMaxNodes limits) (regexMaxWork limits)+ -- | Sets number of bits to be used for representing the 'SInteger' type in the generated C code. -- The argument must be one of @8@, @16@, @32@, or @64@. Note that this is essentially unsafe as -- the semantics of unbounded Haskell integers becomes reduced to the corresponding bit size, as--- typical in most C implementations.+-- typical in most C implementations. Without this setting, generated C uses+-- exact GMP integers in the current backend. The Legacy backend instead rejects+-- SInteger programs unless this mapping is specified. cgIntegerSize :: Int -> SBVCodeGen () cgIntegerSize i   | i `notElem` [8, 16, 32, 64]@@ -162,7 +265,9 @@ -- The setting can be one of C's @"float"@, @"double"@, or @"long double"@, types, depending -- on the precision needed. Note that this is essentially unsafe as the semantics of -- infinite precision SReal values becomes reduced to the corresponding floating point type in--- C, and hence it is subject to rounding errors.+-- C, and hence it is subject to rounding errors. Without this setting,+-- generated C uses exact GMP rationals for rational-valued computations in the+-- current backend. The Legacy backend requires an explicit mapping instead. cgSRealType :: CgSRealType -> SBVCodeGen () cgSRealType rt = modify' (\s -> s {cgFinalConfig = (cgFinalConfig s) { cgReal = Just rt }}) @@ -201,6 +306,9 @@   -- | Adds the given lines to the program file generated, useful for generating programs with uninterpreted functions.+-- External implementations must represent pure mathematical functions: their+-- results must depend only on their arguments, with no observable side effects.+-- The compiler may eliminate unused calls or share equal applications. cgAddDecl :: [String] -> SBVCodeGen () cgAddDecl ss = modify' (\s -> s { cgDecls = cgDecls s ++ ss }) @@ -305,10 +413,34 @@  -- | Different kinds of "files" we can produce. Currently this is quite "C" specific. data CgPgmKind = CgMakefile [String]  -- list of flags to pass to linker-               | CgHeader [Doc]+               | CgHeaderInternal [Doc] (Maybe CgCHeader)                | CgSource                | CgDriver +-- | Header signatures, as exposed by the original bundle interface. Matches+-- headers from both backends; construction produces a header without private+-- merge metadata. Existing four-way matches on 'CgPgmKind' remain exhaustive.+pattern CgHeader :: [Doc] -> CgPgmKind+pattern CgHeader signatures <- CgHeaderInternal signatures _+  where CgHeader signatures = CgHeaderInternal signatures Nothing++-- | Structured metadata for current-backend header merging. This is a more+-- specific view of 'CgHeader', not an additional kind of generated file.+pattern CgCHeader :: CgCHeader -> CgPgmKind+pattern CgCHeader metadata <- CgHeaderInternal _ (Just metadata)+  where CgCHeader metadata = CgHeaderInternal (cgHeaderSignatures metadata) (Just metadata)++{-# COMPLETE CgMakefile, CgHeader, CgSource, CgDriver #-}++-- | Structured C header metadata used when combining current-backend bundles.+-- 'CgHeader' provides the compatibility view for both backends.+data CgCHeader = CgCHeaderInfo+  { cgHeaderFloating   :: Bool  -- ^ Requires IEEE floating-point compilation.+  , cgHeaderTypes      :: Doc   -- ^ Runtime type declarations.+  , cgHeaderSignatures :: [Doc] -- ^ Public entry points.+  , cgHeaderPrototypes :: Doc   -- ^ User-supplied prototypes.+  }+ -- | Is this a driver program? isCgDriver :: CgPgmKind -> Bool isCgDriver CgDriver = True@@ -334,6 +466,7 @@    ((retVal, st'), res) <- runSymbolic defaultSMTCfg CodeGen $ runStateT comp initCgState { cgFinalConfig = cgConfig }    let st = st' { cgInputs  = reverse (cgInputs st')                 , cgOutputs = reverse (cgOutputs st')+                , cgReturns = reverse (cgReturns st')                 }        allNamedVars = map fst (cgInputs st ++ cgOutputs st)        dupNames = allNamedVars \\ nub allNamedVars
Data/SBV/Control/BaseIO.hs view
@@ -441,6 +441,12 @@ -- of the domain of the first list. If the result is not a value-association, then we get a string -- representation and the triple of whether it's curried, the argument list given by the user, and the s-expression as parsed -- by SBV from the SMT solver.+--+-- The function must already be declared when satisfiability is checked. If it+-- does not occur in any constraints, call 'Data.SBV.registerFunction' before+-- entering the query, then 'ensureSat' before retrieving its interpretation.+-- An unregistered function is an error; this call never changes solver state+-- or reruns the satisfiability check. getFunction :: (SymVal a, SymVal r, Trans.SMTFunction fun a r) => fun -> Query (Either (String, (Bool, Maybe [String], SExpr)) ([(a, r)], r)) getFunction = Trans.getFunction 
Data/SBV/Control/Utils.hs view
@@ -82,7 +82,7 @@                               , extractSymbolicSimulationState, MonadSymbolic(..)                               , UserInputs, getSV, NamedSymVar(..), lookupInput, getUserName, getUserName'                               , Name, CnstMap, Inputs(..), ProgInfo(..)-                              , mustIgnoreVar, newInternalVariable, Penalty(..), smtLibPgmText+                              , mustIgnoreVar, newInternalVariable, Penalty(..), smtLibPgmText, registerKind, mkNewState                               )  import Data.SBV.Core.AlgReals    (mergeAlgReals, AlgReal(..), RealPoint(..))@@ -117,6 +117,8 @@     contextState = queryState +   registerKindInContext k = inNewContext (`registerKind` k)+    internalVariable :: forall a. Kind -> QueryT m (SBV a)    internalVariable k = contextState >>= \st -> liftIO $ do        sv  <- newInternalVariable st k@@ -160,10 +162,13 @@ io = liftIO  -- | Sync-up the external solver with new context we have generated-syncUpSolver :: (MonadIO m, MonadQuery m) => ProgInfo -> IORef CnstMap -> IncState -> m ()-syncUpSolver progInfo rGlobalConsts is = do+syncUpSolver :: (MonadIO m, MonadQuery m) => State -> ProgInfo -> IORef CnstMap -> IncState -> m ()+syncUpSolver st progInfo rGlobalConsts is = do         cfg <- getConfig +        checks <- io $ readIORef (rNewMeasureChecks is)+        io $ verifyMeasureChecks cfg st checks+         -- update global consts to have the new ones         (newConsts, allConsts) <- liftIO $ do nc <- readIORef (rNewConsts is)                                               oc <- readIORef rGlobalConsts@@ -175,16 +180,34 @@                        inps        <- reverse <$> readIORef (rNewInps is)                        ks          <- readIORef (rNewKinds is)                        tbls        <- map arrange . mapToSortedList <$> readIORef (rNewTbls is)-                       uis         <- Map.toAscList <$> readIORef (rNewUIs is)+                       newUIs      <- readIORef (rNewUIs is)+                       newDefns    <- readIORef (rNewDefns is)                        as          <- readIORef (rNewAsgns is)                        constraints <- readIORef (rNewConstraints is) -                       let cnsts = mapToSortedList newConsts+                       let cnsts       = mapToSortedList newConsts+                           defineSet   = Map.keysSet newDefns+                           uis         = Map.toAscList (Map.withoutKeys newUIs defineSet)+                           definitions = Map.toAscList newDefns -                       pure $ toIncSMTLib cfg progInfo inps ks (allConsts, cnsts) tbls uis as constraints cfg+                       pure $ toIncSMTLib cfg progInfo inps ks (allConsts, cnsts) tbls uis definitions as constraints cfg          mapM_ (send True) $ mergeSExpr ls +-- | Run deferred termination and productivity checks before sending newly encountered definitions.+verifyMeasureChecks :: SMTConfig -> State -> [(String, Bool, SMTConfig -> IO ())] -> IO ()+verifyMeasureChecks cfg st checks = do+        skip <- readIORef (rSkipMeasureChecks st)+        unless (skip || null checks) $ do+          let nms = map (\(n, _, _) -> n) checks+          debug cfg ["[MEASURE] Verifying termination measures for: " <> T.pack (intercalate ", " nms)]+          mapM_ (\(nm, isProductive, check) -> do+                    debug cfg ["[MEASURE] Checking: " <> T.pack nm]+                    check cfg+                    let tag = if isProductive then "productive" else "terminating"+                    debug cfg ["[MEASURE] Passed (" <> tag <> "): " <> T.pack nm]+                ) checks+ -- | Retrieve the query context getQueryState :: (MonadIO m, MonadQuery m) => m QueryState getQueryState = do state <- queryState@@ -213,17 +236,23 @@ inNewContext act = do st@State{rconstMap, rProgInfo} <- queryState                       (is, r)  <- io $ withNewIncState st act                       progInfo <- io $ readIORef rProgInfo-                      syncUpSolver progInfo rconstMap is+                      syncUpSolver st progInfo rconstMap is                       pure r  -- | Generalization of 'Data.SBV.Control.freshVar_' freshVar_ :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => m (SBV a)-freshVar_ = inNewContext $ fmap SBV . svMkSymVar QueryVar k Nothing+freshVar_ = inNewContext $ \st -> do+              v <- SBV <$> svMkSymVar QueryVar k Nothing st+              mkSymValInit st v+              pure v   where k = kindOf (Proxy @a)  -- | Generalization of 'Data.SBV.Control.freshVar' freshVar :: forall a m. (MonadIO m, MonadQuery m, SymVal a) => String -> m (SBV a)-freshVar nm = inNewContext $ fmap SBV . svMkSymVar QueryVar k (Just nm)+freshVar nm = inNewContext $ \st -> do+                v <- SBV <$> svMkSymVar QueryVar k (Just nm) st+                mkSymValInit st v+                pure v   where k = kindOf (Proxy @a)  -- | Generalization of 'Data.SBV.Control.queryDebug'@@ -387,7 +416,7 @@   smtFunSaturate :: fun -> SBV r   smtFunType     :: fun -> SBVType   smtFunDefault  :: fun -> Maybe r-  sexprToFun     :: (MonadIO m, SolverContext m, MonadQuery m, MonadSymbolic m, SymVal r) => fun -> (String, SExpr) -> m (Either String ([(a, r)], r))+  sexprToFun     :: (MonadIO m, SolverContext m, MonadQuery m, MonadSymbolic m, SymVal r) => fun -> String -> (String, SExpr) -> m (Either String ([(a, r)], r))    {-# MINIMAL sexprToArg, smtFunSaturate, smtFunType  #-} @@ -398,17 +427,30 @@     | True     = Nothing -  -- Given the function, determine what its name is and do some sanity checks-  smtFunName f = do st@State{rUIMap} <- contextState+  -- Discover the name in an isolated state. Inspecting a model must not add+  -- declarations to the live solver, which can invalidate its current model.+  smtFunName f = do State{rUIMap, stCfg} <- contextState                     uiMap <- liftIO $ readIORef rUIMap-                    nm    <- findName st uiMap--                    -- Read the uiMap again here. Why? Because the act of finding the name might've-                    -- introduced it as an uninterpreted name!-                    newUIMap <- liftIO $ readIORef rUIMap-                    case nm `Map.lookup` newUIMap of-                      Nothing                     -> cantFind newUIMap-                      Just (isCurried, mbArgs, _) -> pure ((nm, mbArgs), isCurried)+                    probe <- mkNewState stCfg{verbose = False} (LambdaGen (Just 0))+                    nm    <- findName probe uiMap+                    case nm `Map.lookup` uiMap of+                      Nothing -> error $ unlines+                        [ ""+                        , "*** Data.SBV.getFunction: Uninterpreted function " ++ show nm ++ " is not registered in this context."+                        , "*** Use it in a constraint, or call registerFunction before entering the query."+                        , "*** Then check satisfiability before calling getFunction."+                        , "*** getFunction only inspects the current model; it does not register functions or rerun checkSat."+                        ]+                      -- SMT signatures do not distinguish curried and uncurried+                      -- Haskell functions. Keep the registered display convention.+                      Just (isCurried, mbArgs, ty)+                        | ty == smtFunType f -> pure ((nm, mbArgs), isCurried)+                        | True -> error $ unlines+                            [ ""+                            , "*** Data.SBV.getFunction: Uninterpreted function " ++ show nm ++ " used at incompatible SMT signatures."+                            , "***    Requested argument/result sorts: " ++ show (smtFunType f)+                            , "***    Declared argument/result sorts:  " ++ show ty+                            ]     where cantFind uiMap = error $ unlines $    [ ""                                                 , "*** Data.SBV.getFunction: Must be called on an uninterpreted function!"                                                 , "***"@@ -438,25 +480,25 @@                             (sv, SBVApp (Uninterpreted nm) _) | r == sv -> pure (T.unpack nm)                             _                                           -> cantFind uiMap -  sexprToFun f (s, e) = do nm    <- fst . fst <$> smtFunName f-                           si    <- contextState >>= getSInfo-                           mbRes <- case parseSExprFunction e of-                                      Just (Left nm') -> case (nm == nm', smtFunDefault f) of-                                                           (True, Just v)  -> pure $ Just ([], v)-                                                           _               -> bailOut nm-                                      Just (Right v)  -> convert si v-                                      Nothing         -> do mbPVS <- pointWiseExtract nm (smtFunType f)-                                                            case mbPVS of-                                                              Nothing  -> pure Nothing-                                                              Just pts -> convert si pts-                           pure $ maybe (Left s) Right mbRes+  sexprToFun f nm (s, e) = do+    si    <- contextState >>= getSInfo+    mbRes <- case parseSExprFunction e of+               Just (Left nm') -> case (unBar nm == unBar nm', smtFunDefault f) of+                                    (True, Just v) -> pure $ Just ([], v)+                                    _              -> bailOut+               Just (Right v)  -> convert si v+               Nothing         -> do mbPVS <- pointWiseExtract nm (smtFunType f)+                                     case mbPVS of+                                       Nothing  -> pure Nothing+                                       Just pts -> convert si pts+    pure $ maybe (Left s) Right mbRes     where convert st (vs, d) = do ps <- mapM (sexprPoint st) vs                                   pure $ (,) <$> sequenceA ps <*> sexprToVal st d            sexprPoint st (as, v) = do mbA <- sexprToArg f as                                      pure $ (,) <$> mbA <*> sexprToVal st v -          bailOut nm = error $ unlines [ ""+          bailOut = error $ unlines [ ""                                        , "*** Data.SBV.getFunction: Unable to extract an interpretation for function " ++ show nm                                        , "***"                                        , "*** Failed while trying to extract a pointwise interpretation."@@ -511,11 +553,11 @@                                then (trues,  falseSExpr)                                else (falses, trueSExpr) --- | For saturation purposes, get a proper argument. The forall quantification--- is safe here since we only use in smtFunSaturate calls, which looks at the--- kind stored inside only.+-- | Use symbolic arguments for discovery: uninterpreted sorts need not have+-- a concrete default value. These variables belong only to the probe state.+-- The forall is safe since smtFunSaturate supplies the argument's actual kind. mkSaturatingArg :: forall a. Kind -> SBV a-mkSaturatingArg k = SBV $ SVal k (Left (defaultKindedValue k))+mkSaturatingArg k = SBV $ SVal k $ Right $ cache $ \st -> newInternalVariable st k  -- | Functions of arity 1 instance ( SymVal a, HasKind a@@ -816,21 +858,6 @@                        , mkSaturatingArg (kindOf (Proxy @h))                        ) --- Turn "((F (lambda ((x!1 Int)) (+ 3 (* 2 x!1)))))"--- into something more palatable.--- If we can't do that, we simply return the input unchanged-trimFunctionResponse :: String -> String -> Bool -> Maybe [String] -> String-trimFunctionResponse resp nm isCurried mbArgs-  | Just parsed <- makeHaskellFunction resp nm isCurried mbArgs-  = parsed-  | True-  = def $ case trim resp of-            '(':'(':rest | nm `isPrefixOf` rest -> butLast2 $ trim (drop (length nm) rest)-            _                                   -> resp-  where trim     = dropWhile isSpace-        butLast2 = reverse . drop 2 . reverse-        def x = nm ++ " = fromSMTLib " ++ x- -- | Generalization of 'Data.SBV.Control.getFunction' getFunction :: (MonadIO m, MonadQuery m, SolverContext m, MonadSymbolic m, SymVal a, SymVal r, SMTFunction fun a r)             => fun -> m (Either (String, (Bool, Maybe [String], SExpr))  ([(a, r)], r))@@ -843,8 +870,8 @@                     si <- contextState >>= getSInfo -                   parse r bad $ \case EApp [EApp [ECon o, e]] | o == nm -> do-                                          mbAssocs <- sexprToFun f (trimFunctionResponse r nm isCurried args, e)+                   parse r bad $ \case EApp [EApp [ECon o, e]] | unBar o == unBar nm -> do+                                          mbAssocs <- sexprToFun f nm (formatFunctionResponse e r nm isCurried args, e)                                           case mbAssocs of                                             Right assocs -> pure $ Right assocs                                             Left  raw    -> do@@ -1229,25 +1256,25 @@       toRes = recoverKindedValue si rt        -- if we fail to parse, we'll return this answer as the string-      fallBack = trimFunctionResponse r nm isCurried mbArgs+      fallBack e = formatFunctionResponse e r nm isCurried mbArgs        -- In case we end up in the pointwise scenario, boolify the result       -- as that's the only type we support here.-      tryPointWise = do mbSExprs <- pointWiseExtract nm typ-                        case mbSExprs of-                          Nothing     -> pure $ Left fallBack-                          Just sExprs -> pure $ maybe (Left fallBack) Right (convert sExprs)--  parse r bad $ \case EApp [EApp [ECon o, e]] | o == nm -> case parseSExprFunction e of-                                                             Just (Right assocs) | Just res <- convert assocs                 -> pure (Right res)-                                                                                 | True                                       -> tryPointWise--                                                             Just (Left nm')     | nm == nm', let res = defaultKindedValue rt -> pure (Right ([], res))-                                                                                 | True                                       -> bad r Nothing--                                                             Nothing                                                          -> tryPointWise+      tryPointWise e = do mbSExprs <- pointWiseExtract nm typ+                          case mbSExprs of+                            Nothing     -> pure $ Left $ fallBack e+                            Just sExprs -> pure $ maybe (Left $ fallBack e) Right (convert sExprs) -                      _                                 -> bad r Nothing+  parse r bad $ \case+    EApp [EApp [ECon o, e]] | unBar o == unBar nm -> case parseSExprFunction e of+      Just (Right assocs)+        | Just res <- convert assocs -> pure (Right res)+        | True                       -> tryPointWise e+      Just (Left nm')+        | unBar nm == unBar nm'       -> pure (Right ([], defaultKindedValue rt))+        | True                       -> bad r Nothing+      Nothing                        -> tryPointWise e+    _ -> bad r Nothing  -- | Generalization of 'Data.SBV.Control.checkSat' checkSat :: (MonadIO m, MonadQuery m) => m CheckSatResult@@ -1301,7 +1328,7 @@ -- Generalization of 'Data.SBV.Control.getUIs'. getUIs :: forall m. (MonadIO m, MonadQuery m) => m [(String, (Bool, Maybe [String], SBVType))] getUIs = do State{rUIMap, rDefns, rIncState} <- queryState-            -- NB. no need to worry about new-defines, because we don't allow definitions once query mode starts+            -- Definitions are tracked in the UI map as well, but they are not uninterpreted.             defineSet <- Map.keysSet <$> io (readIORef rDefns)              prior <- io $ readIORef rUIMap@@ -1910,18 +1937,8 @@                   setOpts <- liftIO $ reverse <$> readIORef (rSMTOptions st)                    -- Run any registered measure checks (termination/productivity verification)-                  liftIO $ do skip <- readIORef (rSkipMeasureChecks st)-                              unless skip $ do-                                checks <- readIORef (rMeasureChecks st)-                                unless (null checks) $ do-                                  let nms = map (\(n, _, _) -> n) checks-                                  debug cfg ["[MEASURE] Verifying termination measures for: " <> T.pack (intercalate ", " nms)]-                                  mapM_ (\(nm, isProductive, check) -> do-                                            debug cfg ["[MEASURE] Checking: " <> T.pack nm]-                                            check cfg-                                            let tag = if isProductive then "productive" else "terminating"-                                            debug cfg ["[MEASURE] Passed (" <> tag <> "): " <> T.pack nm]-                                        ) checks+                  checks <- liftIO $ readIORef (rMeasureChecks st)+                  liftIO $ verifyMeasureChecks cfg st checks                    let SMTProblem{smtLibPgm} = runProofOn rm queryContext [] res                       cfg' = cfg { solverSetOptions = solverSetOptions cfg ++ setOpts }
Data/SBV/Core/Data.hs view
@@ -574,6 +574,13 @@    -- | Get the state associated with this context    contextState :: m State +   -- | Register a kind, synchronizing declarations when already in query mode.+   -- Implementation hook for 'registerType'; callers should use that public API.+   registerKindInContext :: Kind -> m ()+   default registerKindInContext :: MonadIO m => Kind -> m ()+   registerKindInContext k = do st <- contextState+                                liftIO $ registerKind st k+    -- | Get an internal-variable    internalVariable :: Kind -> m (SBV a) @@ -584,12 +591,12 @@    setLogic     = setOption . SetLogic    setInfo    k = setOption . SetInfo k --- | Register a type with the solver. Like 'Data.SBV.Core.Model.registerFunction', This is typically not necessary--- since SBV will register types as it encounters them automatically. But there are cases--- where doing this can explicitly can come handy, typically in query contexts.+-- | Register a type eagerly, either before or inside a query. SBV automatically+-- registers types on first use, so ordinary symbolic computations do not need+-- this call. It can be useful before sending custom SMT-Lib commands that refer+-- to a type without first creating a symbolic value of that type. registerType :: forall a m. (MonadIO m, SolverContext m, HasKind a) => Proxy a -> m ()-registerType _ = do st <- contextState-                    liftIO $ registerKind st (kindOf (Proxy @a))+registerType _ = registerKindInContext (kindOf (Proxy @a))  -- | Various info we use in recoverKinded value newtype SInfo = SInfo { sInfoKinds :: [Kind] }
Data/SBV/Core/Floating.hs view
@@ -171,36 +171,67 @@   fromSFloat :: SRoundingMode -> SFloat -> SBV a   fromSFloat = genericFromFloat -  -- | Convert to an IEEE-754 Single-precision float.+  -- | Convert to an IEEE-754 Single-precision float. Integral literals are+  -- rounded directly to binary32 in the requested rounding mode.+  --+  -- >>> unliteral (toSFloat sRTP (16777217 :: SInteger))+  -- Just 1.6777218e7   toSFloat :: SRoundingMode -> SBV a -> SFloat    -- default definition if we have an integral like   default toSFloat :: Integral a => SRoundingMode -> SBV a -> SFloat-  toSFloat = genericToFloat (onlyWhenRNE (Just . fromRational . fromIntegral))+  toSFloat = genericToFloat (\rm -> Just . fpToFloat rm . roundIntegralFP 8 24 rm)    -- | Convert from an IEEE74 double precision float.   fromSDouble :: SRoundingMode -> SDouble -> SBV a   fromSDouble = genericFromFloat -  -- | Convert to an IEEE-754 Double-precision float.+  -- | Convert to an IEEE-754 Double-precision float. Integral literals are+  -- rounded directly to binary64 in the requested rounding mode.+  --+  -- >>> unliteral (toSDouble sRTN (-9007199254740993 :: SInteger))+  -- Just (-9.007199254740994e15)   toSDouble :: SRoundingMode -> SBV a -> SDouble    -- default definition if we have an integral like   default toSDouble :: Integral a => SRoundingMode -> SBV a -> SDouble-  toSDouble = genericToFloat (onlyWhenRNE (Just . fromRational . fromIntegral))+  toSDouble = genericToFloat (\rm -> Just . fpToDouble rm . roundIntegralFP 11 53 rm)    -- | Convert from an arbitrary floating point.   fromSFloatingPoint :: ValidFloat eb sb => SRoundingMode -> SFloatingPoint eb sb -> SBV a   fromSFloatingPoint = genericFromFloat -  -- | Convert to an arbitrary floating point.+  -- | Convert to an arbitrary floating point. Integral literals are rounded+  -- directly to the target format in the requested rounding mode.+  --+  -- >>> unliteral (toSFloatingPoint sRTP (2049 :: SInteger) :: SFPHalf)+  -- Just 2050.0+  --+  -- >>> unliteral (toSFloatingPoint sRTN (-2049 :: SInteger) :: SFPHalf)+  -- Just -2050.0   toSFloatingPoint :: ValidFloat eb sb => SRoundingMode -> SBV a -> SFloatingPoint eb sb -  -- -- default definition if we have an integral like+  -- Default definition for integral sources.   default toSFloatingPoint :: (Integral a, ValidFloat eb sb) => SRoundingMode -> SBV a -> SFloatingPoint eb sb-  toSFloatingPoint = genericToFloat (const (Just . fromRational . fromIntegral))+  toSFloatingPoint = integralToFloatingPoint --- Run the function if the conversion is in RNE. Otherwise return Nothing.+-- | Convert an integral source without an intermediate floating-point format.+-- Concrete inputs round the exact integer once; symbolic inputs or rounding+-- modes retain the ordinary floating-point cast expression.+integralToFloatingPoint :: forall a eb sb. (Integral a, IEEEFloatConvertible a, ValidFloat eb sb)+                       => SRoundingMode -> SBV a -> SFloatingPoint eb sb+integralToFloatingPoint = genericToFloat convert+ where convert rm value = Just $ FloatingPoint $ roundIntegralFP ei si rm value+       ei = intOfProxy (Proxy @eb)+       si = intOfProxy (Proxy @sb)++-- | Round an exact integer once to the requested format. Converting the result+-- to a matching native Float or Double is exact, including directed overflow.+roundIntegralFP :: Integral a => Int -> Int -> RoundingMode -> a -> FP+roundIntegralFP ei si rm value = FP ei si+                              $ fst (bfRoundFloat (mkBFOpts ei si (roundingModeToRoundMode rm)) (bfFromInteger (toInteger value)))++-- | Run the function if the conversion is in RNE. Otherwise return Nothing. onlyWhenRNE :: (a -> Maybe b) -> RoundingMode -> a -> Maybe b onlyWhenRNE f RoundNearestTiesToEven v = f v onlyWhenRNE _ _                      _ = Nothing@@ -218,7 +249,8 @@                    xsv <- sbvToSV st f                    newExpr st kTo (SBVApp (IEEEFP (FP_Cast kFrom kTo msv)) [xsv]) --- | A generic to-float converter, which will constant-fold as necessary, but only in the sRNE mode for regular floats.+-- | A generic to-float converter. Fold concrete operands and rounding modes+-- when the supplied converter supports them; otherwise emit a symbolic cast. genericToFloat :: forall a r. (IEEEFloatConvertible a, IEEEFloating r)                => (RoundingMode -> a -> Maybe r)     -- How to convert concretely, if possible                -> SRoundingMode                      -- Rounding mode
Data/SBV/Core/Kind.hs view
@@ -14,9 +14,11 @@ {-# LANGUAGE DeriveAnyClass       #-} {-# LANGUAGE DeriveDataTypeable   #-} {-# LANGUAGE DeriveGeneric        #-}+{-# LANGUAGE DeriveLift           #-} {-# LANGUAGE FlexibleInstances    #-} {-# LANGUAGE LambdaCase           #-} {-# LANGUAGE OverloadedStrings    #-}+{-# LANGUAGE PatternSynonyms      #-} {-# LANGUAGE ScopedTypeVariables  #-} {-# LANGUAGE TypeApplications     #-} {-# LANGUAGE TypeFamilies         #-}@@ -27,7 +29,9 @@ {-# OPTIONS_GHC -Wall -Werror -Wno-orphans #-}  module Data.SBV.Core.Kind (-          Kind(..), HasKind(..), smtType, hasUninterpretedSorts+          Kind(KBool, KBounded, KUnbounded, KReal, KFloat, KDouble, KFP, KRational, KChar, KString, KVar, KApp, KADT, KList, KSet, KTuple, KArray)+        , HasKind(..), smtType, hasUninterpretedSorts+        , withADTDependencies, adtKindDependencies         , BVIsNonZero, ValidFloat, intOfProxy         , showBaseKind, needsFlattening         , eqCheckIsObjectEq, containsFloats, isSomeKindOfFloat, expandKinds@@ -35,7 +39,7 @@         , kRoundingMode         ) where -import qualified Data.Generics as G (Data(..), DataType, dataTypeName, tyconUQname)+import qualified Data.Generics as G (Data(..), DataType, Constr, Fixity(Prefix), mkConstr, mkDataType, dataTypeName, tyconUQname)  import Data.Char (isSpace) import Data.Int@@ -62,6 +66,7 @@ import Data.SBV.Utils.Numeric (RoundingMode)  import GHC.Generics+import qualified Language.Haskell.TH.Syntax as TH import qualified Data.Generics.Uniplate.Data as G  -- | Kind of symbolic value@@ -93,9 +98,10 @@           -- Algebraic datatypes           | KVar String         -- only used temporarily during ADT construction           | KApp String [Kind]  -- Application of a constructor to a bunch of types-          | KADT String+          | KADTWithDependencies String                  [(String, Kind)]   -- Parameters, applied to these args                  [(String, [Kind])] -- Constructors, and their fields+                 ADTDependencies   -- Additional declarations needed to register this type            -- Collections           | KList Kind@@ -104,7 +110,64 @@            -- Arrays           | KArray  Kind Kind-          deriving (Eq, Ord, G.Data, NFData, Generic)+          deriving (Eq, Ord, G.Data, NFData, Generic, TH.Lift)++-- | Compatibility constructor and pattern for an ADT kind. Registration+-- metadata does not change its symbolic identity or constructor fields.+pattern KADT :: String -> [(String, Kind)] -> [(String, [Kind])] -> Kind+pattern KADT typeName parameters constructors <- KADTWithDependencies typeName parameters constructors _+  where KADT typeName parameters constructors = KADTWithDependencies typeName parameters constructors (ADTDependencies [])++{-# COMPLETE KBool, KBounded, KUnbounded, KReal, KFloat, KDouble, KFP, KRational, KChar, KString, KVar, KApp, KADT, KList, KSet, KTuple, KArray #-}++-- | A finite set of independent ADT declaration templates. These are+-- registration metadata, not children of the annotated type: generic kind+-- traversal and type-variable substitution must not enter their scopes.+newtype ADTDependencies = ADTDependencies [Kind]+                       deriving (NFData, Generic, TH.Lift)++-- | Registration metadata does not participate in kind equality.+-- For a given datatype name, generated dependency schemas are fixed and+-- interchangeable; this annotation must not carry per-instantiation semantics.+instance Eq ADTDependencies where+  _ == _ = True++-- | Registration metadata does not participate in kind ordering.+-- This uses the same name-determined-schema invariant as the equality instance.+instance Ord ADTDependencies where+  compare _ _ = EQ++-- | Keep independent declaration scopes opaque to generic transformations.+-- Reconstructing the metadata's nullary generic representation yields the+-- empty annotation; ordinary traversals preserve the existing annotation.+instance G.Data ADTDependencies where+  gfoldl _ z = z+  gunfold _ z _ = z (ADTDependencies [])+  toConstr _ = adtDependenciesConstr+  dataTypeOf _ = adtDependenciesDataType++-- | Opaque generic datatype for ADT registration metadata.+adtDependenciesDataType :: G.DataType+adtDependenciesDataType = G.mkDataType "Data.SBV.Core.Kind.ADTDependencies" [adtDependenciesConstr]++-- | Nullary generic constructor for ADT registration metadata.+adtDependenciesConstr :: G.Constr+adtDependenciesConstr = G.mkConstr adtDependenciesDataType "ADTDependencies" [] G.Prefix++-- | Attach the complete dependency registry generated by 'Data.SBV.mkSymbolic'.+-- Strip annotations throughout each dependency so mutually recursive kinds+-- remain finite even when recursion passes through a datatype parameter.+withADTDependencies :: [Kind] -> Kind -> Kind+withADTDependencies dependencies (KADT typeName parameters constructors)+  = KADTWithDependencies typeName parameters constructors (ADTDependencies (map (G.transform strip) dependencies))+  where strip (KADT n ps cs) = KADT n ps cs+        strip kind          = kind+withADTDependencies _ kind = error $ "SBV: Expected an ADT kind when attaching dependencies, received " ++ show kind++-- | Return the independent declaration templates needed to register an ADT.+adtKindDependencies :: Kind -> [Kind]+adtKindDependencies (KADTWithDependencies _ _ _ (ADTDependencies dependencies)) = dependencies+adtKindDependencies _ = []  -- | Built in kind for rounding mode kRoundingMode :: Kind
Data/SBV/Core/Model.hs view
@@ -2543,7 +2543,7 @@ mapOpSVs :: (SV -> SV) -> Op -> Op mapOpSVs f (LkUp p sv1 sv2)                  = LkUp p (f sv1) (f sv2) mapOpSVs f (IEEEFP (FP_Cast fk tk sv))       = IEEEFP (FP_Cast fk tk (f sv))-mapOpSVs _ (ArrayInit (Right (SMTLambda s)))  = ArrayInit (Right (SMTLambda s))  -- Lambda strings don't contain SVs to map+mapOpSVs _ (ArrayInit (Right lambdaDef))       = ArrayInit (Right lambdaDef)  -- Lambda-local SVs must not be mapped in the enclosing DAG. mapOpSVs _ op                                 = op  -- | Compute the reaching condition for each SV: under what boolean condition@@ -4123,41 +4123,18 @@   -- You can also define higher-order functions, see 'smtHOFunction' for that purpose.   smtFunctionDef :: (Typeable a, Lambda Symbolic a) => String -> Measure a -> a -> a -  -- | Register a function. This function is typically not needed as SBV will register functions used-  -- automatically upon first use. However, there are scenarios (in particular query contexts)-  -- where the definition isn't used before query-mode starts, and SBV (for historical reasons)-  -- requires functions to be known before query-mode starts executing. In such cases, use this function-  -- to register them with the system.+  -- | Register a function eagerly. This function is typically not needed, since SBV registers functions+  -- automatically upon first use, including uses first encountered in query mode. Use it to include an+  -- otherwise unused uninterpreted function in 'Data.SBV.allSat' enumeration, or to declare one before+  -- checking satisfiability and retrieving its interpretation with 'Data.SBV.Control.getFunction'.+  -- It also lets you request definition validation and any termination or productivity checks before+  -- the function is otherwise needed. Registration does not constrain the function's result.+  -- Internally, it applies the function to fresh internal arguments to discover its definition;+  -- these argument declarations and the application can appear in SMT transcripts.   registerFunction :: a -> Symbolic ()    -- | Uninterpret a value, i.e., add this value as a completely undefined value/function that   -- the solver is free to instantiate to satisfy other constraints.-  ---  -- __Known issues__-  ---  -- Usually using an uninterpret function will register itself to the solver, but sometimes the laziness-  -- of the evaluation might render this unreliable.-  ---  -- For example, when working with quantifiers and uninterpreted functions with the following code:-  ---  -- > runSMTWith z3 $ do-  -- >   let f = uninterpret "f" :: SInteger -> SInteger-  -- >   query $ do-  -- >     constrain $ \(Forall (b :: SInteger)) -> f b .== f b-  -- >     checkSat-  ---  -- The solver will complain about the unknown constant @f (Int)@.-  ---  -- A workaround of this is to explicit register them with 'Data.SBV.Control.registerUISMTFunction':-  ---  -- > runSMTWith z3 $ do-  -- >   let f = uninterpret "f" :: SInteger -> SInteger-  -- >   registerUISMTFunction f-  -- >   query $ do-  -- >     constrain $ \(Forall (b :: SInteger)) -> f b .== f b-  -- >     checkSat-  ---  -- See https://github.com/LeventErkok/sbv/issues/711 for more info.   uninterpret :: String -> a    -- | Uninterpret a value, with named arguments in case of functions. SBV will use these@@ -4223,8 +4200,11 @@                           (def, info) <- lambdaWithInfo st TopLevel fk v                           -- Record LambdaInfo for SCC-aware mutual recursion checking                           modifyIORef' (rFuncLambdaInfos st) (Map.insert funcNm info)-                          let barFuncNm    = barify funcNm+                          let rootState    = getRootState st+                              barFuncNm    = barify funcNm                               tBarFuncNm   = T.pack barFuncNm+                              addMeasureCheck check = modifyState rootState rMeasureChecks (check :)+                                                                 $ modifyIncState rootState rNewMeasureChecks (check :)                               isSelfRec    = any (\(_, SBVApp op _) -> case op of                                                     Uninterpreted n -> n == tBarFuncNm                                                     _               -> False)@@ -4236,37 +4216,29 @@                           case msr of                             AutoMeasure -> do                               when isSelfRec $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, False, \cfg -> autoGuessOrFail cfg funcNm info) :)+                                addMeasureCheck (funcNm, False, \cfg -> autoGuessOrFail cfg funcNm info)                               when hasCrossRefs $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, False, \cfg -> checkMutualFromState cfg funcNm st Nothing) :)+                                addMeasureCheck (funcNm, False, \cfg -> checkMutualFromState cfg funcNm st Nothing)                               pure def                              HasMeasure eval helpers -> do                               when isSelfRec $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, False, \cfg -> verifyMeasure cfg funcNm info eval helpers) :)+                                addMeasureCheck (funcNm, False, \cfg -> verifyMeasure cfg funcNm info eval helpers)                               when hasCrossRefs $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, False, \cfg -> checkMutualFromState cfg funcNm st (Just eval)) :)+                                addMeasureCheck (funcNm, False, \cfg -> checkMutualFromState cfg funcNm st (Just eval))                               pure def                              HasContract eval ceval helpers -> do                               when hasCrossRefs $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, False, \cfg -> rejectMutualContractFromState cfg funcNm st) :)-                              modifyIORef' (rMeasureChecks st)-                                           ((funcNm, False, \cfg -> verifyMeasureWithContract cfg funcNm info eval ceval helpers) :)+                                addMeasureCheck (funcNm, False, \cfg -> rejectMutualContractFromState cfg funcNm st)+                              addMeasureCheck (funcNm, False, \cfg -> verifyMeasureWithContract cfg funcNm info eval ceval helpers)                               pure def                              Productive -> do                               when isSelfRec $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, True, \cfg -> verifyGuardedness cfg funcNm info) :)+                                addMeasureCheck (funcNm, True, \cfg -> verifyGuardedness cfg funcNm info)                               when hasCrossRefs $-                                modifyIORef' (rMeasureChecks st)-                                             ((funcNm, True, \cfg -> checkMutualProductiveFromState cfg funcNm st) :)+                                addMeasureCheck (funcNm, True, \cfg -> checkMutualProductiveFromState cfg funcNm st)                               pure def                              Unverified -> do modifyIORef' (rNoTermCheckFunctions st) (Set.insert nm)@@ -4437,7 +4409,8 @@                                           mapM_ forceSVArg svs                                           newExpr st ka $ SBVApp op svs -  registerFunction x = constrain $ x .== x+  registerFunction x = do st <- symbolicEnv+                          liftIO $ sbvToSV st x >>= forceSVArg    symWithKind nm = sym (nm ++ "_" ++ show (kindOf (Proxy @a))) @@ -5011,8 +4984,8 @@                    -> (a -> SBV b)         -- ^ The ho-function we're modeling                    ->  a -> SBV b          -- ^ The resulting function smtHOFunctionGen nm f measure hof arg = SBV $ SVal (kindOf (Proxy @(SBV b))) $ Right $ cache r-  where r st = do SMTLambda lam <- lambdaStr st HigherOrderArg (arrayResultKind (kindOf (Proxy @f))) f-                  let uniq = lambdaFingerprint st (T.unpack lam)+  where r st = do lambdaDef <- lambdaStr st HigherOrderArg (arrayResultKind (kindOf (Proxy @f))) f+                  let uniq = lambdaFingerprint st (T.unpack (smtLambdaText lambdaDef))                   sbvToSV st (smtFunctionDef (atProxy (Proxy @f) nm <> "_" <> uniq) measure hof arg)  -- | Chase through nested array kinds to find the final result kind. Higher-order
Data/SBV/Core/Symbolic.hs view
@@ -22,11 +22,13 @@ {-# LANGUAGE MultiParamTypeClasses      #-} {-# LANGUAGE NamedFieldPuns             #-} {-# LANGUAGE OverloadedStrings          #-}+{-# LANGUAGE PatternSynonyms            #-} {-# LANGUAGE RankNTypes                 #-} {-# LANGUAGE ScopedTypeVariables        #-} {-# LANGUAGE StandaloneDeriving         #-} {-# LANGUAGE TypeOperators              #-} {-# LANGUAGE UndecidableInstances       #-}+{-# LANGUAGE ViewPatterns               #-}  {-# OPTIONS_GHC -Wall -Werror -Wno-orphans #-} @@ -34,7 +36,8 @@   ( NodeId(..)   , SV(..), swKind, trueSV, falseSV   , Op(..), PBOp(..), OvOp(..), FPOp(..), NROp(..), StrOp(..), RegExOp(..), SeqOp(..), SetOp(..), SpecialRelOp(..), ADTOp(..)-  , RegExp(..), regExpToSMTString, SMTLambda(..)+  , RegExp(..), regExpToSMTString, validateRegExp+  , SMTLambda(SMTLambda), smtLambdaWithInfo, smtLambdaText, smtLambdaInfo   , Quantifier(..), needsExistentials, SBVContext(..), globalSBVContext, VarContext(..)   , SBVType(..), svUninterpreted, svUninterpretedNamedArgs, newUninterpreted   , SVal(..)@@ -46,7 +49,7 @@   , getUserName', getUserName   , lookupInput , getSValPathCondition, extendSValPathCondition   , getTableIndex, sObserve-  , SBVPgm(..), MonadSymbolic(..), SymbolicT, Symbolic, runSymbolic, mkNewState, runSymbolicInState, State(..), SMTDef(..), smtDefEq, conflictError, withNewIncState, IncState(..), incrementInternalCounter, incrementFreshNameCounter+  , SBVPgm(..), MonadSymbolic(..), SymbolicT, Symbolic, runSymbolic, mkNewState, runSymbolicInState, State(..), SMTDef(SMTDef), smtDefWithInfo, smtDefInfo, smtDefEq, conflictError, withNewIncState, IncState(..), incrementInternalCounter, incrementFreshNameCounter   , inSMTMode, SBVRunMode(..), IStage(..), Result(..), ResultInp(..), UICodeKind(..), UIName(..)   , registerKind, registerLabel, recordObservable   , addAssertion, addNewSMTOption, imposeConstraint, internalConstraint, newInternalVariable, lambdaVar, quantVar@@ -247,9 +250,9 @@         deriving (Eq, Ord, Generic, G.Data, NFData)  -- | ADT operations-data ADTOp = ADTConstructor T.Text Kind    -- Construct an ADT. Kind is the kind of the resulting ADT-           | ADTTester      T.Text Kind    -- Check if top-level constructor matches. Kind is the kind of the argument-           | ADTAccessor    T.Text Kind    -- Extract a field from an ADT value. Kind is the kind of the argument+data ADTOp = ADTConstructor T.Text Kind    -- Construct an ADT. Kind is the kind of the result.+           | ADTTester      T.Text Kind    -- Check if top-level constructor matches. Kind is the kind of the result.+           | ADTAccessor    T.Text Kind    -- Extract a field from an ADT value. Kind is the kind of the result.            deriving (Eq, Ord, Generic, G.Data, NFData)  -- | Special relations supported by z3@@ -415,14 +418,14 @@             | AllChar              -- ^ Accept every single character             | None                 -- ^ Accept no strings             | Range Char Char      -- ^ Accept range of characters-            | Conc  [RegExp]       -- ^ Concatenation+            | Conc  [RegExp]       -- ^ Concatenation; the empty list matches exactly the empty string             | KStar RegExp         -- ^ Kleene Star: Zero or more             | KPlus RegExp         -- ^ Kleene Plus: One or more             | Opt   RegExp         -- ^ Zero or one             | Comp  RegExp         -- ^ Complement of regular expression             | Diff  RegExp RegExp  -- ^ Difference of regular expressions-            | Loop  Int Int RegExp -- ^ From @n@ repetitions to @m@ repetitions-            | Power Int     RegExp -- ^ Exactly @n@ repetitions, i.e., nth power+            | Loop  Int Int RegExp -- ^ From @n@ repetitions to @m@ repetitions; requires @0 <= n <= m@+            | Power Int     RegExp -- ^ Exactly @n@ repetitions, i.e., nth power; requires @n >= 0@             | Union [RegExp]       -- ^ Union of regular expressions             | Inter RegExp RegExp  -- ^ Intersection of regular expressions             deriving (Eq, Ord, G.Data, Generic, NFData)@@ -460,11 +463,35 @@  -- | Convert a reg-exp to a Haskell-like string instance Show RegExp where-  show = T.unpack . regExpToText (T.pack . show)+  show r = validateRegExp r `seq` T.unpack (regExpToText (T.pack . show) r) +-- | Reject invalid repetition bounds throughout a regex, even in branches+-- that literal matching could skip. Sharing this check keeps literal matching+-- and SMT serialization consistent without constructing text during folding.+validateRegExp :: RegExp -> ()+validateRegExp (Literal _) = ()+validateRegExp All         = ()+validateRegExp AllChar     = ()+validateRegExp None        = ()+validateRegExp (Range _ _) = ()+validateRegExp (Conc rs)   = foldr (seq . validateRegExp) () rs+validateRegExp (KStar r)   = validateRegExp r+validateRegExp (KPlus r)   = validateRegExp r+validateRegExp (Opt r)     = validateRegExp r+validateRegExp (Comp r)    = validateRegExp r+validateRegExp (Diff a b)  = validateRegExp a `seq` validateRegExp b+validateRegExp (Loop lo hi r)+  | lo >= 0, hi >= lo     = validateRegExp r+  | True                 = error $ "Invalid regular-expression Loop with arguments: " ++ show (lo, hi)+validateRegExp (Power n r)+  | n >= 0               = validateRegExp r+  | True                 = error $ "Invalid regular-expression Power with arguments: " ++ show n+validateRegExp (Union rs)  = foldr (seq . validateRegExp) () rs+validateRegExp (Inter a b) = validateRegExp a `seq` validateRegExp b+ -- | Convert a reg-exp to a SMT-lib acceptable representation regExpToSMTString :: RegExp -> Text-regExpToSMTString = regExpToText (\s -> "\"" <> T.pack (stringToQFS s) <> "\"")+regExpToSMTString r = validateRegExp r `seq` regExpToText (\s -> "\"" <> T.pack (stringToQFS s) <> "\"") r  -- | Convert a RegExp to text, parameterized by how strings are converted regExpToText :: (String -> Text) -> RegExp -> Text@@ -473,7 +500,7 @@ regExpToText _  AllChar           = "re.allchar" regExpToText _  None              = "re.nostr" regExpToText fs (Range ch1 ch2)   = "(re.range " <> fs [ch1] <> " " <> fs [ch2] <> ")"-regExpToText _  (Conc [])         = "1"+regExpToText fs (Conc [])         = regExpToText fs (Literal "") regExpToText fs (Conc [x])        = regExpToText fs x regExpToText fs (Conc xs)         = "(re.++ " <> T.unwords (map (regExpToText fs) xs) <> ")" regExpToText fs (KStar r)         = "(re.* " <> regExpToText fs r <> ")"@@ -481,12 +508,8 @@ regExpToText fs (Opt   r)         = "(re.opt " <> regExpToText fs r <> ")" regExpToText fs (Comp  r)         = "(re.comp " <> regExpToText fs r <> ")" regExpToText fs (Diff  r1 r2)     = "(re.diff " <> regExpToText fs r1 <> " " <> regExpToText fs r2 <> ")"-regExpToText fs (Loop  lo hi r)-   | lo >= 0, hi >= lo = "((_ re.loop " <> showText lo <> " " <> showText hi <> ") " <> regExpToText fs r <> ")"-   | True              = error $ "Invalid regular-expression Loop with arguments: " ++ show (lo, hi)-regExpToText fs (Power n r)-   | n >= 0            = regExpToText fs (Loop n n r)-   | True              = error $ "Invalid regular-expression Power with arguments: " ++ show n+regExpToText fs (Loop lo hi r)    = "((_ re.loop " <> showText lo <> " " <> showText hi <> ") " <> regExpToText fs r <> ")"+regExpToText fs (Power n r)       = regExpToText fs (Loop n n r) regExpToText fs (Inter r1 r2)     = "(re.inter " <> regExpToText fs r1 <> " " <> regExpToText fs r2 <> ")" regExpToText _  (Union [])        = "re.nostr" regExpToText fs (Union [x])       = regExpToText fs x@@ -506,15 +529,51 @@   show (RegExEq  r1 r2) = "(= "        ++ T.unpack (regExpToSMTString r1) ++ " " ++ T.unpack (regExpToSMTString r2) ++ ")"   show (RegExNEq r1 r2) = "(distinct " ++ T.unpack (regExpToSMTString r1) ++ " " ++ T.unpack (regExpToSMTString r2) ++ ")" --- | For now, we represent lambda functions in op with their SMTLib equivalent strings.--- This might change in the future.-newtype SMTLambda = SMTLambda T.Text-                  deriving (Eq, Ord, G.Data, Generic)-                  deriving newtype NFData+-- | A lambda's canonical SMT-Lib representation, optionally accompanied by+-- the expression DAG from which it was rendered. The structured form lets+-- non-SMT backends consume lambdas without parsing SMT-Lib.+data SMTLambda = SMTLambdaValue T.Text (Maybe LambdaInfo)+               deriving (G.Data, Generic) +-- | Compatibility constructor and pattern for an SMT-text-only lambda. The+-- pattern also matches lambdas carrying retained backend metadata.+pattern SMTLambda :: T.Text -> SMTLambda+pattern SMTLambda textValue <- (smtLambdaText -> textValue)+  where SMTLambda textValue = SMTLambdaValue textValue Nothing++{-# COMPLETE SMTLambda #-}++-- | Construct a lambda with both its canonical SMT-Lib text and retained+-- expression DAG.+smtLambdaWithInfo :: T.Text -> LambdaInfo -> SMTLambda+smtLambdaWithInfo textValue lambdaInfo = SMTLambdaValue textValue (Just lambdaInfo)++-- | Compare lambdas by their canonical SMT-Lib representation. The retained+-- DAG is backend metadata and does not affect symbolic identity.+instance Eq SMTLambda where+  left == right = smtLambdaText left == smtLambdaText right++-- | Order lambdas by their canonical SMT-Lib representation. The retained+-- DAG is backend metadata and does not affect symbolic identity.+instance Ord SMTLambda where+  compare left right = compare (smtLambdaText left) (smtLambdaText right)++-- | Fully evaluate both the canonical text and any retained expression DAG.+instance NFData SMTLambda where+  rnf (SMTLambdaValue textValue lambdaInfo) = rnf textValue `seq` rnf lambdaInfo++-- | Return the canonical SMT-Lib rendering of a lambda.+smtLambdaText :: SMTLambda -> T.Text+smtLambdaText (SMTLambdaValue textValue _) = textValue++-- | Return a lambda's retained expression DAG when it was constructed by+-- SBV rather than directly from an SMT-Lib string.+smtLambdaInfo :: SMTLambda -> Maybe LambdaInfo+smtLambdaInfo (SMTLambdaValue _ lambdaInfo) = lambdaInfo+ -- | Simple show instance for SMTLambda instance Show SMTLambda where-  show (SMTLambda s) = T.unpack s+  show = T.unpack . smtLambdaText  -- | Sequence operations. Indexed by the element kind. data SeqOp = SeqLen      Kind@@ -1002,13 +1061,15 @@                                            CodeGen     -> True  -- | The state in query mode, i.e., additional context-data IncState = IncState { rNewInps        :: IORef [NamedSymVar]   -- always existential!-                         , rNewKinds       :: IORef KindSet-                         , rNewConsts      :: IORef CnstMap-                         , rNewTbls        :: IORef TableMap-                         , rNewUIs         :: IORef UIMap-                         , rNewAsgns       :: IORef SBVPgm-                         , rNewConstraints :: IORef (S.Seq (Bool, [(String, String)], SV))+data IncState = IncState { rNewInps          :: IORef [NamedSymVar]   -- always existential!+                         , rNewKinds         :: IORef KindSet+                         , rNewConsts        :: IORef CnstMap+                         , rNewTbls          :: IORef TableMap+                         , rNewUIs           :: IORef UIMap+                         , rNewDefns         :: IORef (Map.Map String (SMTDef, SBVType))+                         , rNewMeasureChecks :: IORef [(String, Bool, SMTConfig -> IO ())]+                         , rNewAsgns         :: IORef SBVPgm+                         , rNewConstraints   :: IORef (S.Seq (Bool, [(String, String)], SV))                          }  -- | Get a new IncState@@ -1019,15 +1080,19 @@         nc    <- newIORef Map.empty         tm    <- newIORef Map.empty         ui    <- newIORef Map.empty+        ds    <- newIORef Map.empty+        ms    <- newIORef []         pgm   <- newIORef (SBVPgm S.empty)         cstrs <- newIORef S.empty-        pure IncState { rNewInps        = is-                      , rNewKinds       = ks-                      , rNewConsts      = nc-                      , rNewTbls        = tm-                      , rNewUIs         = ui-                      , rNewAsgns       = pgm-                      , rNewConstraints = cstrs+        pure IncState { rNewInps          = is+                      , rNewKinds         = ks+                      , rNewConsts        = nc+                      , rNewTbls          = tm+                      , rNewUIs           = ui+                      , rNewDefns         = ds+                      , rNewMeasureChecks = ms+                      , rNewAsgns         = pgm+                      , rNewConstraints   = cstrs                       }  -- | Get a new IncState@@ -1110,16 +1175,36 @@                     -- we use the more expensive O (n) to find the index and the elem     secondLookup = S.elemIndexL sv svs >>= flip S.lookup ns --- | A defined function/value-data SMTDef = SMTDef Kind             -- ^ Final kind of the definition (resulting kind, not the params)-                     [String]         -- ^ other definitions it refers to-                     (Maybe Text)     -- ^ parameter string-                     (Int -> Text)    -- ^ Body, in SMTLib syntax, given the tab amount+-- | A defined function/value, optionally retaining its structured expression+-- DAG for consumers other than SMT-Lib.+data SMTDef = SMTDefValue Kind               -- ^ Final kind of the definition (resulting kind, not the params)+                          [String]           -- ^ other definitions it refers to+                          (Maybe Text)       -- ^ parameter string+                          (Int -> Text)      -- ^ Body, in SMTLib syntax, given the tab amount+                          (Maybe LambdaInfo) -- ^ Structured function body, when constructed by SBV             deriving G.Data +-- | Compatibility constructor and pattern for an SMT-text definition. The+-- pattern also matches definitions carrying retained backend metadata.+pattern SMTDef :: Kind -> [String] -> Maybe Text -> (Int -> Text) -> SMTDef+pattern SMTDef resultKind dependencies parameters body <- SMTDefValue resultKind dependencies parameters body _+  where SMTDef resultKind dependencies parameters body = SMTDefValue resultKind dependencies parameters body Nothing++{-# COMPLETE SMTDef #-}++-- | Attach a structured expression DAG to an SMT definition.+smtDefWithInfo :: SMTDef -> LambdaInfo -> SMTDef+smtDefWithInfo (SMTDefValue resultKind dependencies parameters body _) lambdaInfo+  = SMTDefValue resultKind dependencies parameters body (Just lambdaInfo)++-- | Return a definition's retained expression DAG, when it was constructed by+-- SBV rather than supplied only as SMT-Lib text.+smtDefInfo :: SMTDef -> Maybe LambdaInfo+smtDefInfo (SMTDefValue _ _ _ _ lambdaInfo) = lambdaInfo+ -- | For debug purposes instance Show SMTDef where-  show (SMTDef fk frees p body) = unlines [ "-- User defined function:"+  show (SMTDefValue fk frees p body _) = unlines [ "-- User defined function:"                                                       , "-- Final return type    : " ++ show fk                                                       , "-- Refers to            : " ++ intercalate ", " frees                                                       , "-- Parameters           : " ++ maybe "NONE" T.unpack p@@ -1129,12 +1214,13 @@  -- | NFData instance for SMTDef instance NFData SMTDef where-  rnf (SMTDef fk frees params body) = rnf fk `seq` rnf frees `seq` rnf params `seq` rnf body+  rnf (SMTDefValue fk frees params body lambdaInfo)+    = rnf fk `seq` rnf frees `seq` rnf params `seq` rnf body `seq` rnf lambdaInfo  -- | Compare two SMTDef values for semantic equality. -- The body is @(Int -> Text)@ where @Int@ is indentation; we compare rendered output at indent 0. smtDefEq :: SMTDef -> SMTDef -> Bool-smtDefEq (SMTDef k1 refs1 params1 body1) (SMTDef k2 refs2 params2 body2)+smtDefEq (SMTDefValue k1 refs1 params1 body1 _) (SMTDefValue k2 refs2 params2 body2 _)   = k1 == k2 && refs1 == refs2 && params1 == params2 && body1 0 == body2 0  -- | Error for conflicting smtFunction definitions with the same name.@@ -1149,14 +1235,21 @@                                    , "*** Please use a unique name for each distinct function."                                    ] --- | Information about a compiled lambda body, used for measure verification.+-- | Structured information about a compiled lambda body, used for measure+-- verification and by backends that should not parse its SMT-Lib rendering. data LambdaInfo = LambdaInfo-  { liAssignments :: S.Seq (SV, SBVExpr)  -- ^ The expression DAG-  , liParams      :: [(Quantifier, SV)]    -- ^ Formal parameters with quantifier-  , liOutput      :: SV                    -- ^ The output node-  , liConsts      :: [(SV, CV)]            -- ^ Constants used-  }+  { liAssignments :: S.Seq (SV, SBVExpr)        -- ^ The expression DAG+  , liParams      :: [(Quantifier, SV)]          -- ^ Formal parameters with quantifier+  , liOutput      :: SV                          -- ^ The output node+  , liConsts      :: [(SV, CV)]                  -- ^ Constants used+  , liTables      :: [((Int, Kind, Kind), [SV])] -- ^ Finite lookup tables used by the body+  } deriving G.Data +-- | Fully evaluate the retained pieces of a compiled lambda body.+instance NFData LambdaInfo where+  rnf LambdaInfo{liAssignments, liParams, liOutput, liConsts, liTables}+    = rnf liAssignments `seq` rnf liParams `seq` rnf liOutput `seq` rnf liConsts `seq` rnf liTables+ -- | The state of the symbolic interpreter data State  = State { sbvContext            :: SBVContext                     , pathCond              :: SVal                             -- ^ kind KBool@@ -1326,7 +1419,9 @@ newUninterpreted :: State -> UIName -> Maybe [String] -> SBVType -> UICodeKind -> IO Op newUninterpreted st uiName mbArgNames t uiCode = do -  let (adtOp, candName) = case uiName of+  let rootState = getRootState st++      (adtOp, candName) = case uiName of                             UIGiven n -> (False, n)                             UIADT   o -> case o of                                            ADTConstructor n _ -> (True, T.unpack n)@@ -1359,15 +1454,9 @@                                   Just (oldDef, _)                                     | not (smtDefEq d oldDef)                                     -> conflictError nm-                                  _ -> pure ()-                                modifyState st rDefns (Map.insert nm (d, t))-                                  $ noInteractive [ "Defined functions (smtFunction):"-                                                  , "  Name: " ++ nm ++ extraComment-                                                  , "  Type: " ++ show t-                                                  , ""-                                                  , "You should explicitly register these functions by calling"-                                                  , "the function 'registerFunction' on them before starting the query section."-                                                  ]+                                  Just{}  -> pure ()+                                  Nothing -> modifyState rootState rDefns (Map.insert nm (d, t))+                                               $ modifyIncState rootState rNewDefns (Map.insert nm (d, t))                                 pure True                  UICgC c  -> -- No need to record the code in interactive mode: CodeGen doesn't use interactive                              do modifyState st rCgMap (Map.insert nm c) (pure ())@@ -1385,8 +1474,8 @@     uiMap <- readIORef (rUIMap st)     case nm `Map.lookup` uiMap of       Just (_, _, t') -> checkType t' (pure ())-      Nothing         -> modifyState st rUIMap (Map.insert nm (isCurried, mbArgNames, t))-                           $ modifyIncState st rNewUIs+      Nothing         -> modifyState rootState rUIMap (Map.insert nm (isCurried, mbArgNames, t))+                           $ modifyIncState rootState rNewUIs                                               (\newUIs -> case nm `Map.lookup` newUIs of                                                             Just (_, _, t') -> checkType t' newUIs                                                             Nothing         -> Map.insert nm (isCurried, mbArgNames, t) newUIs)@@ -1456,9 +1545,12 @@        --     *    If it's an uninterpreted sort that's not already in the general state        --     * OR If it's a tuple-sort whose cardinality isn't already in the general state        --     * OR If it's a list that's not already in the general state (so we can send the flatten commands)+       --     * OR If rationals are first used, so we can declare their datatype and equality helpers -       existingKinds <- readIORef (rUsedKinds st)+       let rootState = getRootState st +       existingKinds <- readIORef (rUsedKinds rootState)+        -- For ADTs we need to make sure we haven't added it before        let adtNameExists s = any (\case KADT s' _ _ -> s == s'; _ -> False) existingKinds @@ -1467,7 +1559,7 @@                          _           -> False         unless adtExists $-          modifyState st rUsedKinds (Set.insert k) $ do+          modifyState rootState rUsedKinds (Set.insert k) $ do                -- Why do we discriminate here? Because the incremental context is sensitive to the               -- order: In particular, if an uninterpreted kind is already in there, we don't@@ -1475,10 +1567,11 @@               let needsAdding = case k of                                   KADT s _ _  -> not (adtNameExists s)                                   KList{}     -> k `Set.notMember` existingKinds+                                  KRational   -> k `Set.notMember` existingKinds                                   KTuple nks  -> not $ any (\case KTuple oks -> length nks == length oks; _ -> False) existingKinds                                   _           -> False -              when needsAdding $ modifyIncState st rNewKinds (Set.insert k)+              when needsAdding $ modifyIncState rootState rNewKinds (Set.insert k)         -- Don't forget to register subkinds!        case k of@@ -1495,7 +1588,7 @@          KString   {}    -> pure ()           KApp _ ks       -> mapM_ (registerKind st) ks-         KADT _ pks cks  -> mapM_ (registerKind st) (map snd pks ++ concatMap snd cks)+         KADT _ pks cks  -> mapM_ (registerKind st) (map snd pks ++ concatMap snd cks ++ adtKindDependencies k)          KList     ek    -> registerKind st ek          KSet      ek    -> registerKind st ek          KTuple    eks   -> mapM_ (registerKind st) eks@@ -1990,17 +2083,15 @@ -- | Generalization of 'Data.SBV.addNewSMTOption' addNewSMTOption :: MonadSymbolic m => SMTOption -> m () addNewSMTOption o = do st <- symbolicEnv+                       codeGeneration <- liftIO $ isCodeGenMode st+                       when codeGeneration $ error "SBV->C: SMT solver options have no executable C semantics; remove setOption from the code-generation program."                        liftIO $ modifyState st rSMTOptions (o:) (pure ())  -- | Generalization of 'Data.SBV.imposeConstraint' imposeConstraint :: MonadSymbolic m => Bool -> [(String, String)] -> SVal -> m () imposeConstraint isSoft attrs c = do st <- symbolicEnv-                                     rm <- liftIO $ readIORef (runMode st)--                                     case rm of-                                       CodeGen -> error "SBV: constraints are not allowed in code-generation"-                                       _       -> liftIO $ do mapM_ (registerLabel "Constraint" st) [nm | (":named",  nm) <- attrs]-                                                              internalConstraint st isSoft attrs c+                                     liftIO $ do mapM_ (registerLabel "Constraint" st) [nm | (":named",  nm) <- attrs]+                                                 internalConstraint st isSoft attrs c  -- | Require a boolean condition to be true in the state. Only used for internal purposes. internalConstraint :: State -> Bool -> [(String, String)] -> SVal -> IO ()@@ -2029,6 +2120,10 @@ -- | Generalization of 'Data.SBV.addSValOptGoal' addSValOptGoal :: MonadSymbolic m => Objective SVal -> m () addSValOptGoal obj = do st <- symbolicEnv+                        mode <- liftIO $ readIORef (runMode st)+                        case mode of+                          CodeGen -> error "SBV->C: Optimization objectives require a solver and cannot be compiled to executable C."+                          _       -> pure ()                          -- create the tracking variable here for the metric                         let mkGoal nm orig = liftIO $ do origSV  <- svToSV st orig
Data/SBV/Dynamic.hs view
@@ -111,7 +111,7 @@   , SBVCodeGen    -- ** Setting code-generation options-  , cgPerformRTCs, cgSetDriverValues, cgGenerateDriver, cgGenerateMakefile+  , cgPerformRTCs, cgSetDriverValues, cgArrayEqualityLimit, cgRegexLimits, cgGenerateDriver, cgGenerateMakefile    -- ** Designating inputs   , svCgInput, svCgInputArr@@ -148,7 +148,7 @@                                   , svCgInput, svCgInputArr                                   , svCgOutput, svCgOutputArr                                   , svCgReturn, svCgReturnArr-                                  , cgPerformRTCs, cgSetDriverValues, cgGenerateDriver, cgGenerateMakefile+                                  , cgPerformRTCs, cgSetDriverValues, cgArrayEqualityLimit, cgRegexLimits, cgGenerateDriver, cgGenerateMakefile                                   , cgAddPrototype, cgAddDecl, cgAddLDFlags, cgIgnoreSAssert                                   , cgIntegerSize, cgSRealType, CgSRealType(..)                                   )
Data/SBV/Internals.hs view
@@ -41,6 +41,9 @@   , genLiteral, genFromCV, CV(..), genMkSymVar, genParse, showModel, SMTModel(..), liftQRem, liftDMod, registerKind, svToSV   , ProvableM(), SatisfiableM(), UICodeKind(..) +  -- * Kind traversal and ADT registration metadata+  , expandKinds, substituteADTVars, withADTDependencies, adtKindDependencies+   -- * Compilation to C, extras   , compileToC', compileToCLib' @@ -60,6 +63,9 @@   -- $coordinateSolverInfo   , sendStringToSolver, sendRequestToSolver, retrieveResponseFromSolver +  -- * Parsing and formatting solver responses+  , SExpr(..), parseSExpr, formatFunctionResponse+   -- * Defining new metrics   , addSValOptGoal   , sFloatAsComparableSWord32,  sDoubleAsComparableSWord64,  sFloatingPointAsComparableSWord@@ -79,7 +85,7 @@  import Data.SBV.Core.Data hiding (Forall(..), Exists(..), ForallN(..), ExistsN(..), ExistsUnique(..), Skolemize(..), QNot(..)) -import Data.SBV.Core.Kind       (BVIsNonZero, ValidFloat)+import Data.SBV.Core.Kind       (BVIsNonZero, ValidFloat, expandKinds, substituteADTVars, withADTDependencies, adtKindDependencies) import Data.SBV.Core.Model      (genLiteral, genFromCV, genMkSymVar, liftQRem, liftDMod) import Data.SBV.Core.Symbolic   (IStage(..), QueryContext(..), MonadQuery, addSValOptGoal, registerKind, VarContext(..), svToSV, mkNewState, UICodeKind(..), UIName(..)) @@ -99,6 +105,7 @@  import Data.SBV.Utils.TDiff import Data.SBV.Utils.PrettyNum+import Data.SBV.Utils.SExpr (SExpr(..), parseSExpr, formatFunctionResponse)  import GHC.TypeLits 
Data/SBV/Lambda.hs view
@@ -34,7 +34,7 @@ import Data.SBV.Core.Data import Data.SBV.Core.Kind import Data.SBV.SMT.SMTLib2-import Data.SBV.Utils.Lib       (showText)+import Data.SBV.Utils.Lib       (mapToSortedList, showText) import Data.SBV.Utils.PrettyNum  import           Data.SBV.Core.Symbolic hiding   (mkNewState)@@ -154,48 +154,51 @@  -- | Generic creator for anonymous lambdas. lambdaGen :: (MonadIO m, Lambda (SymbolicT m) a) => LambdaScope -> (Defn -> b) -> State -> Kind -> a -> m b-lambdaGen scope trans inState fk f = inSubState scope inState $ \st -> handle <$> convert st fk (mkLambda st f)-  where handle d@(Defn _ frees _ _)-            | null frees-            = trans d-            | True-            = error $ unlines [ ""-                              , "*** Data.SBV.Lambda: Detected free variables passed to a lambda."-                              , "***"-                              , "***  Free vars : " ++ unwords frees-                              , "***  Definition: " ++ shift (lines (sh d))-                              , "***"-                              , "*** SBV currently does not support lambda-functions that capture variables. For"-                              , "*** instance, consider:"-                              , "***"-                              , "***     map (\\x -> map (\\y -> x + y))"-                              , "***"-                              , "*** where the inner 'map' uses 'x', bound by the outer 'map'. Instead, create"-                              , "*** a closure instead:"-                              , "***"-                              , "***     map (\\x -> map (Closure { closureEnv = x"-                              , "***                             , closureFun = \\env y -> env + y"-                              , "***                             }))"-                              , "***"-                              , "*** which will explicitly create the closure before calling 'map'. The environment can"-                              , "*** be any symbolic value: You can use a tuple to support multiple free variables."-                              , "***"-                              , "*** (SBV firstifies higher-order functions via a simple translation to make it fit with"-                              , "*** SMTLib's first-order logic. This translation does not currently support free"-                              , "*** variables. In technical terms, we would need to do closure conversion and lambda-lifting."-                              , "*** SBV isn't capable of doing the closure-conversion part, relying on the user to do so.)"-                              , "***"-                              , "*** Please rewrite your program to create a closure and use that as an argument."-                              , "*** If this solution isn't applicable, or if you'd like help doing so, please get in"-                              , "*** touch for further possible enhancements."-                              ]+lambdaGen scope trans inState fk f = inSubState scope inState $ \st -> handleLambdaDefn trans <$> convert st fk (mkLambda st f) -        sh (Defn _unints _frees Nothing       body) = T.unpack (body 0)-        sh (Defn _unints _frees (Just params) body) = "(lambda " ++ T.unpack (extractAllUniversals params) ++ "\n" ++ T.unpack (body 2) ++ ")"+-- | Apply a lambda translation after enforcing SBV's no-captured-variables+-- rule and preserving its established diagnostic.+handleLambdaDefn :: (Defn -> b) -> Defn -> b+handleLambdaDefn trans d@(Defn _ frees _ _)+  | null frees+  = trans d+  | True+  = error $ unlines [ ""+                    , "*** Data.SBV.Lambda: Detected free variables passed to a lambda."+                    , "***"+                    , "***  Free vars : " ++ unwords frees+                    , "***  Definition: " ++ shift (lines (sh d))+                    , "***"+                    , "*** SBV currently does not support lambda-functions that capture variables. For"+                    , "*** instance, consider:"+                    , "***"+                    , "***     map (\\x -> map (\\y -> x + y))"+                    , "***"+                    , "*** where the inner 'map' uses 'x', bound by the outer 'map'. Instead, create"+                    , "*** a closure instead:"+                    , "***"+                    , "***     map (\\x -> map (Closure { closureEnv = x"+                    , "***                             , closureFun = \\env y -> env + y"+                    , "***                             }))"+                    , "***"+                    , "*** which will explicitly create the closure before calling 'map'. The environment can"+                    , "*** be any symbolic value: You can use a tuple to support multiple free variables."+                    , "***"+                    , "*** (SBV firstifies higher-order functions via a simple translation to make it fit with"+                    , "*** SMTLib's first-order logic. This translation does not currently support free"+                    , "*** variables. In technical terms, we would need to do closure conversion and lambda-lifting."+                    , "*** SBV isn't capable of doing the closure-conversion part, relying on the user to do so.)"+                    , "***"+                    , "*** Please rewrite your program to create a closure and use that as an argument."+                    , "*** If this solution isn't applicable, or if you'd like help doing so, please get in"+                    , "*** touch for further possible enhancements."+                    ]+ where sh (Defn _unints _frees Nothing       body) = T.unpack (body 0)+       sh (Defn _unints _frees (Just params) body) = "(lambda " ++ T.unpack (extractAllUniversals params) ++ "\n" ++ T.unpack (body 2) ++ ")" -        shift []     = []-        shift (x:xs) = intercalate "\n" (x : map tab xs)-          where tab s = "***              " ++ s+       shift []     = []+       shift (x:xs) = intercalate "\n" (x : map tab xs)+         where tab s = "***              " ++ s  -- | Create an SMTLib lambda, in the given state. lambda :: (MonadIO m, Lambda (SymbolicT m) a) => State -> LambdaScope -> Kind -> a -> m SMTDef@@ -207,7 +210,7 @@ lambdaWithInfo inState scope fk f = inSubState scope inState $ \st -> do    defn <- handleDefn <$> convert st fk (mkLambda st f)    info <- liftIO $ extractLambdaInfo st-   pure (defn, info)+   pure (smtDefWithInfo defn info, info)    where handleDefn d@(Defn _ frees _ _)             | null frees = mkLam d             | True       = error $ unlines [ ""@@ -223,6 +226,7 @@    linps        <- readIORef (rlambdaInps st)    outs         <- readIORef (routs st)    cmap         <- readIORef (rconstMap st)+   tables       <- map arrange . mapToSortedList <$> readIORef (rtblMap st)    let params = [(q, getSV nsv) | (q, nsv) <- F.toList linps]        outSV  = case F.toList outs of                   [o] -> o@@ -231,15 +235,25 @@                    , liParams      = params                    , liOutput      = outSV                    , liConsts      = map swap $ Map.toList cmap+                   , liTables      = tables                    }-   where swap (a, b) = (b, a)+   where arrange (i, (indexKind, resultKind, elements)) = ((i, indexKind, resultKind), elements)+         swap (a, b) = (b, a)  -- | Create an anonymous lambda, rendered as n SMTLib string. The kind passed is the kind of the final result. lambdaStr :: (MonadIO m, Lambda (SymbolicT m) a) => State -> LambdaScope -> Kind -> a -> m SMTLambda-lambdaStr st scope k a = SMTLambda <$> lambdaGen scope mkLam st k a-   where mkLam (Defn _unints _frees Nothing       body) = body 0-         mkLam (Defn _unints _frees (Just params) body) = "(lambda " <> extractAllUniversals params <> "\n" <> body 2 <> ")"+lambdaStr inState HigherOrderArg fk f = SMTLambda <$> lambdaGen HigherOrderArg renderLambdaDefn inState fk f+lambdaStr inState TopLevel       fk f = inSubState TopLevel inState $ \st -> do+  defn <- convert st fk (mkLambda st f)+  let rendered = handleLambdaDefn renderLambdaDefn defn+  rendered `seq` do lambdaInfo <- liftIO $ extractLambdaInfo st+                    pure (smtLambdaWithInfo rendered lambdaInfo) +-- | Render a validated anonymous lambda in its canonical SMT-Lib form.+renderLambdaDefn :: Defn -> T.Text+renderLambdaDefn (Defn _unints _frees Nothing       body) = body 0+renderLambdaDefn (Defn _unints _frees (Just params) body) = "(lambda " <> extractAllUniversals params <> "\n" <> body 2 <> ")"+ -- | Generic constraint generator. constraintGen :: (MonadIO m, Constraint (SymbolicT m) a) => LambdaScope -> ([String] -> (Int -> T.Text) -> b) -> State -> a -> m b constraintGen scope trans inState@State{rProgInfo} f = do@@ -452,9 +466,9 @@                 rm = roundingMode cfg -               -- NB. The following is dead-code, since we ensure tbls is empty-               -- We used to support this, but there are issues, so dropping support-               -- See, for instance, https://github.com/LeventErkok/sbv/issues/664+               -- Tables are local to this lambda. Constant tables can be bound+               -- immediately, while tables containing symbolic elements must be+               -- introduced after their last element has been defined.                (tableMap, constTables, nonConstTablesUnindexed) = constructTables consts tbls                 -- Index each non-const table with the largest index of SV it needs
Data/SBV/RegExp.hs view
@@ -56,6 +56,7 @@ import qualified Data.List as L  import Data.SBV.Core.Data+import Data.SBV.Core.Symbolic (validateRegExp)  import Data.SBV.List import qualified Data.Char as C@@ -89,8 +90,27 @@ -- >>> sat $ \(s :: SString) -> s `match` phone -- Satisfiable. Model: --   s0 = "100-1000" :: String+--+-- Literal matching preserves concatenation: 'All' can consume any prefix,+-- but the rest of the expression must still match the remaining suffix.+--+-- >>> ("a" :: SString) `match` Conc [All, "b"]+-- False+--+-- Boolean operations apply to the same prefix, not to separate matches of+-- the entire concatenation:+--+-- >>> ("ab" :: SString) `match` Conc [Diff "ab" "a", Opt "b"]+-- True+-- >>> ("ab" :: SString) `match` Conc [Inter "a" "ab", All]+-- False class RegExpMatchable a where    -- | @`match` s r@ checks whether @s@ is in the language generated by @r@.+   -- Invalid 'Loop' or 'Power' bounds are rejected, including in unused branches.+   -- An empty concatenation is the identity for concatenation:+   --+   -- >>> prove $ \(s :: SString) -> match s (Conc []) .== (s .== "")+   -- Q.E.D.    match :: a -> RegExp -> SBool  -- | Matching a character simply means the singleton string matches the regex.@@ -99,11 +119,12 @@  -- | Matching symbolic strings. instance RegExpMatchable SString where-   match input regExp = lift1 (StrInRe regExp) (Just (go regExp P.null)) input-     where -- This isn't super efficient, but it gets the job done.+   match input regExp = validateRegExp regExp `seq` lift1 (StrInRe regExp) (Just (go regExp P.null)) input+     where -- Match a prefix of the input, then pass the remaining suffix to+           -- the continuation. The initial continuation requires an empty suffix.            go :: RegExp -> (String -> Bool) -> String -> Bool            go (Literal l)    k s      = l `L.isPrefixOf` s && k (P.drop (P.length l) s)-           go All            _ _      = True+           go All            k s      = P.any k (L.tails s)            go AllChar        k s      = not (P.null s) && k (P.drop 1 s)            go None           _ _      = False            go (Range _ _)    _ []     = False@@ -113,14 +134,19 @@            go (KStar r)      k s      = k s || go r (smaller (P.length s) (go (KStar r) k)) s            go (KPlus r)      k s      = go (Conc [r, KStar r]) k s            go (Opt r)        k s      = k s || go r k s-           go (Comp r)       k s      = not $ go r k s-           go (Diff r1 r2)   k s      = go r1 k s && not (go r2 k s)+           go (Comp r)       k s      = matchingPrefix (not . go r P.null) k s+           go (Diff r1 r2)   k s      = matchingPrefix (\p -> go r1 P.null p && not (go r2 P.null p)) k s            go (Loop i j r)   k s      = go (Conc (P.replicate i r P.++ P.replicate (j - i) (Opt r))) k s            go (Power n r)    k s      = go (Loop n n r) k s            go (Union [])     _ _      = False            go (Union [x])    k s      = go x k s            go (Union (x:xs)) k s      = go x k s || go (Union xs) k s-           go (Inter a b)    k s      = go a k s && go b k s+           go (Inter a b)    k s      = matchingPrefix (\p -> go a P.null p && go b P.null p) k s++           -- Boolean language operations must inspect exactly the same prefix.+           -- Only after accepting that prefix may we check the continuation.+           matchingPrefix :: (String -> Bool) -> (String -> Bool) -> String -> Bool+           matchingPrefix accepts k s = P.or [accepts p && k suffix | (p, suffix) <- P.zip (L.inits s) (L.tails s)]             -- In the KStar case, make sure the continuation is called with something            -- smaller to avoid infinite recursion!
Data/SBV/SMT/SMTLib2.hs view
@@ -36,7 +36,7 @@ import Data.SBV.SMT.Utils  import Data.SBV.Core.Symbolic ( QueryContext(..), SetOp(..), getUserName, getUserName', getSV, regExpToSMTString, NROp(..), showNROp-                              , SMTDef(..), SMTLambda(..), ResultInp(..), ProgInfo(..), SpecialRelOp(..), ADTOp(..)+                              , SMTDef(..), smtLambdaText, ResultInp(..), ProgInfo(..), SpecialRelOp(..), ADTOp(..)                               )  import Data.SBV.Utils.PrettyNum (smtRoundingMode, cvToSMTLib)@@ -444,21 +444,26 @@ -- for a list of what we include, in case something doesn't show up -- and you need it! cvtInc :: SMTLibIncConverter [Text]-cvtInc curProgInfo inps newKs (_, consts) tbls uis (SBVPgm asgnsSeq) cstrs cfg =+cvtInc curProgInfo inps newKs (_, consts) tbls uis defs (SBVPgm asgnsSeq) cstrs cfg =             -- any new settings?                settings+            -- Tuples precede ADTs that may use them, as in non-incremental output.+            -- Only declare the new sizes; old sizes persist.+            <> concatMap declTuple (findTupleArities newKs)+            -- Rationals precede ADTs that may contain rational fields.+            <> (if containsRationals newKs then declRationals else [])             -- sorts             <> declADT [(s, pks, cs) | k@(KADT s pks cs) <- newKinds, not (isRoundingMode k)]-            -- tuples. NB. Only declare the new sizes, old sizes persist.-            <> concatMap declTuple (findTupleArities newKs)             -- constants             <> concatMap (declConst cfg) consts             -- inputs             <> concatMap declInp inps-            -- uninterpreteds-            <> concatMap (declUI curProgInfo) uis             -- table declarations             <> tableDecls+            -- uninterpreteds+            <> concatMap (declUI curProgInfo) uis+            -- user defined functions+            <> concatMap T.lines (declUserFuns defs)             -- expressions             <> concatMap (declDef curProgInfo cfg tableMap) asgnsSeq             -- table setups@@ -835,10 +840,10 @@          sh (SBVApp (KindCast f t) [a]) = handleKindCast f t (cvtSV a) -        sh (SBVApp (ArrayInit (Left (f, t))) [a])        = "((as const (Array " <> smtType f <> " " <> smtType t <> ")) " <> cvtSV a <> ")"-        sh (SBVApp (ArrayInit (Right (SMTLambda s))) []) = s-        sh (SBVApp ReadArray             [a, i])         = "(select " <> cvtSV a <> " " <> cvtSV i <> ")"-        sh (SBVApp WriteArray            [a, i, e])      = "(store "  <> cvtSV a <> " " <> cvtSV i <> " " <> cvtSV e <> ")"+        sh (SBVApp (ArrayInit (Left (f, t))) [a])         = "((as const (Array " <> smtType f <> " " <> smtType t <> ")) " <> cvtSV a <> ")"+        sh (SBVApp (ArrayInit (Right lambdaDef)) [])      = smtLambdaText lambdaDef+        sh (SBVApp ReadArray                    [a, i])    = "(select " <> cvtSV a <> " " <> cvtSV i <> ")"+        sh (SBVApp WriteArray                   [a, i, e]) = "(store "  <> cvtSV a <> " " <> cvtSV i <> " " <> cvtSV e <> ")"          sh (SBVApp (Uninterpreted nm) [])   = nm         sh (SBVApp (Uninterpreted nm) args) = "(" <> nm <> " " <> T.unwords (map cvtSV args) <> ")"
Data/SBV/SMT/Utils.hs view
@@ -82,6 +82,7 @@                           -> (CnstMap, [(SV, CV)])                       -- ^ all constants sofar, and new constants                           -> [((Int, Kind, Kind), [SV])]                 -- ^ newly created tables                           -> [(String, (Bool, Maybe [String], SBVType))] -- ^ newly created uninterpreted functions/constants+                          -> [(String, (SMTDef, SBVType))]               -- ^ newly created user definitions                           -> SBVPgm                                      -- ^ assignments                           -> S.Seq (Bool, [(String, String)], SV)        -- ^ extra constraints                           -> SMTConfig                                   -- ^ configuration
Data/SBV/Tools/CodeGen.hs view
@@ -6,7 +6,9 @@ -- Maintainer: erkokl@gmail.com -- Stability : experimental ----- Code-generation from SBV programs.+-- Code-generation from SBV programs. This module selects the current C+-- backend. Import "Data.SBV.Tools.CodeGen.Legacy" instead to use the original+-- compatibility backend. -----------------------------------------------------------------------------  {-# OPTIONS_GHC -Wall -Werror #-}@@ -18,7 +20,8 @@           SBVCodeGen, cgSym          -- ** Setting code-generation options-        , cgPerformRTCs, cgSetDriverValues, cgGenerateDriver, cgGenerateMakefile, cgOverwriteFiles, cgShowU8UsingHex+        , cgPerformRTCs, cgSetDriverValues, cgArrayEqualityLimit, cgRegexLimits, cgGenerateDriver, cgGenerateMakefile, cgOverwriteFiles, cgShowU8UsingHex+        , CgRegexLimits(..), defaultCgRegexLimits, cgSetRegexLimits          -- ** Designating inputs         , cgInput, cgInputArr@@ -44,21 +47,432 @@ import Data.SBV.Compilers.CodeGen  {- $cCodeGeneration-The SBV library can generate straight-line executable code in C. (While other target languages are-certainly possible, currently only C is supported.) The generated code will perform no run-time memory-allocations,-(no calls to @malloc@), so its memory usage can be predicted ahead of time. Also, the functions will execute precisely the-same instructions in all calls, so they have predictable timing properties as well. The generated code-has no loops or jumps, and is typically quite fast. While the generated code can be large due to complete unrolling,-these characteristics make them suitable for use in hard real-time systems, as well as in traditional computing.+The SBV library can generate executable C code from symbolic programs. Total+native bit-vector arithmetic retains compact straight-line code. Programs+using arbitrary-width bit-vectors, arbitrary floating-point values, or exact+numbers can additionally contain generated runtime helpers, loops, and managed+temporary storage appropriate to those representations.++The original, native-scalar-only implementation remains available from+"Data.SBV.Tools.CodeGen.Legacy" for compatibility during the transition to the+new backend.++Migration changes: without an explicit mapping, 'Data.SBV.SInteger' and+rational-valued 'Data.SBV.SReal' now use exact GMP storage and require GMP at+C build time. Legacy rejects these types without 'cgIntegerSize' or+'cgSRealType'. Retain those settings if native, precision-losing mappings are+intentional, or use the Legacy import to retain the original backend.++== Building generated code++'compileToC' writes a function source and header, plus an example driver and+Makefile by default. 'compileToCLib' writes component sources, a shared header,+and a Makefile building @name.a@ (not @libname.a@), with an optional combined+driver. Generated C does not need the Haskell runtime or an SMT solver.++For a standalone function named @example@, a typical build is:++@+make CC=clang CCFLAGS='-std=c11 -Wall -O2'+./example_driver+@++Use 'cgGenerateDriver' to omit the example driver, and 'cgGenerateMakefile' to+integrate sources into an existing build. With the driver disabled, build+@example.o@ for a standalone function or @name.a@ for a library. Example drivers+illustrate the generated calling convention; they are not exhaustive tests.++Dependencies are selected from the operations and representations actually+used, including those inside private functions and array lambdas:++* Native and arbitrary-width bit-vectors, text, collections, arrays, and regex+  matching do not themselves require an external runtime library. Their element+  types or computations can still require one.+* Exact integers, rational reals, and rationals require the C GMP headers and+  library. Generated Makefiles obtain @GMP_CFLAGS@ and @GMP_LIBS@ from+  @pkg-config@; set both variables explicitly if GMP is installed elsewhere.+* LibBF-backed floating-point operations require @libbf.h@ and a compatible C+  LibBF library. The default link flags are @-lbf -lm@. Installing the Haskell+  @libBF@ package does not necessarily install a standalone library named+  @libbf@ on the C linker's search path.+* Native mathematical operations can require @-lm@ without GMP or LibBF.++Generated Makefiles use @CCFLAGS@, not @CFLAGS@, and include local @*.mk@ files+for overrides. Supply nonstandard include paths through @CCFLAGS@ and library+paths through @LDFLAGS@. Required dependencies and 'cgAddLDFlags' are retained+separately in @SBV_LIBS@, so inherited @LDFLAGS@ cannot discard them. Override+@SBV_LIBS@ only to replace dependency discovery; retain every required library.+For example, a LibBF-only program can use:++@+make CC=clang CCFLAGS='-std=c11 -Wall -O2 -I\/path\/to\/libbf' \\+     SBV_LIBS='\/path\/to\/libbf.a -lm'+@++An external C caller should include the generated header and link the generated+object or archive, followed by its required libraries. Static archives do not+embed their GMP or LibBF dependencies. For a dependency-free library named+@example@, for instance:++@+clang -std=c11 -O2 -ffp-contract=off caller.c example.a -o caller+@++Use the generated Makefile's link flags for libraries that need dependencies.+Custom builds must also follow the floating-point and ownership contracts below.++== Public C names++Function, library, input, and output names must be portable ASCII C identifiers.+Invalid names and C keywords are rejected, not silently renamed. Leading+underscores, @sbv_@ and @SBV@ prefixes, generated type names, and names reserved+for the runtime's C, GMP, and LibBF headers are unavailable for public names.+For example, @my-function@, @switch@, and @sbv_bv_s16_mul@ are rejected.+Ordinary library function names such as @remainder@ are allowed as parameter+names, but not as generated entry points.++Accepted names are preserved in public headers. Implementations and example+drivers use private parameter bindings, so an input named @s0@ cannot collide+with a symbolic temporary, and @values_data@ cannot collide with storage for+an input named @values@. Driver output labels retain the requested names.+Library component files must also have distinct names ignoring ASCII case,+so a bundle is safe to render on case-insensitive filesystems.++User-supplied C prototypes, declarations, and external implementations remain+the caller's responsibility; their identifiers must not conflict with the+generated runtime or entry points.++Generated ADT constructor tags and structural declaration guards preserve+case. Structural type names encode component boundaries explicitly; array+names length-prefix both the key and value tags. Use the names in the generated+header rather than deriving them from Haskell type spellings.++== Representations and execution++Generated code evaluates the symbolic computation without an SMT solver.+Standalone programs and multi-function static libraries share these mappings:++* Booleans use C @bool@. Native-width bit-vectors use fixed-width C integers;+  other widths use generated limb structures. Arithmetic, shifts, joins, and+  extractions preserve the declared bit width; 673 bits is only one example.+* 'Data.SBV.SInteger', rational-valued 'Data.SBV.SReal', and+  'Data.SBV.SRational' use GMP unless an applicable native mapping is selected.+* 'Data.SBV.SFloat' and 'Data.SBV.SDouble' use native C values. Arbitrary+  floating-point formats and explicitly directed native arithmetic rounding+  use LibBF. Numeric casts between IEEE formats, bit-vectors, and exact GMP+  numbers use LibBF too, except when a native conversion is provably exact.+  Casts honor even the default round-to-nearest mode independently of the+  caller's hardware rounding mode.+  Floating-to-bit-vector casts round first, then retain the destination's low+  bits; non-finite inputs produce zero. The latter choices give deterministic+  results where SMT leaves an out-of-range or non-finite conversion unspecified.+  Arbitrary formats are subject to LibBF's exponent-range limits: the backend+  accepts at most 61 exponent bits and checks the selected C LibBF build too.+* Strings and lists use length-aware descriptors. Sets use finite/cofinite+  descriptors. Tuples and concrete ADTs use generated structures, including+  tagged constructors and managed storage for recursive ADTs.+* Symbolic arrays use persistent descriptors supporting constant arrays,+  writes, retained lambdas, and caller-provided lookup callbacks. They are+  distinct from finite lookup tables and 'cgInputArr'/'cgOutputArr' groups.+  Reads walk the stored writes, taking time linear in their number in the+  worst case. Embedding a function-scoped array in an aggregate copies its+  stored-write chain, not its logical domain; already-owned storage can be shared.++Generated headers supply ownership helpers for managed values. Inputs borrow+their storage for the call; owned outputs must be released with the appropriate+generated helper. Escaping callback contexts additionally require retain and+release callbacks. See each generated header for its representation contract.++Entry points, defined functions, and array lambdas preserve the guards of+conditionals and short-circuit Boolean operations. An inactive branch does not+evaluate its partial ADT selectors or function calls. Total bit-vector work may+be shared outside branches; dependencies needed by both alternatives are also+shared. Explicit assertions and hard constraints remain executable checks even+when the generated function has no outputs.++Finite table selection likewise protects unselected entries and unused defaults.+Already available entries use direct C-array lookup; entries that require guarded+evaluation use a switch. Enable 'cgPerformRTCs' to select the default for an+out-of-range index. With checks disabled (the default), callers must guarantee+in-range indices; invalid unchecked indices have no defined result and may+terminate the process. Wide and exact indices are always checked before+narrowing, independently of this option, to avoid aliasing an in-range entry.++=== Floating-point calling convention++Callers must enter generated code with the hardware rounding mode set to+round-to-nearest, ties-to-even: @FE_TONEAREST@ from @<fenv.h>@. This requirement+applies to standalone generated functions and library entry points. Callbacks+and supplied C implementations must preserve this mode, or restore it before+returning to or re-entering generated code.++Generated code does not check, save, change, or restore the hardware rounding+mode. Violating this precondition is unsupported and need not produce a+diagnostic. Ordinary 'Data.SBV.SFloat' and 'Data.SBV.SDouble' RNE arithmetic+therefore stays native, without a rounding-mode guard or a LibBF fallback.+Explicit non-RNE and symbolic SBV rounding modes still use the rounding-aware+adapters; they do not require the caller to change the hardware mode. The+conversion bridges' independence from hardware rounding does not relax the+entry-point precondition.++Compile generated code with settings that preserve IEEE floating-point+semantics; this precondition does not permit fast-math transformations that+discard NaNs, signed zeros, or required rounding steps.+Generated headers reject detectable fast-math and finite-math-only compiler+modes, and floating-point programs require @FLT_EVAL_METHOD == 0@ so native+expressions do not acquire excess evaluation precision. Generated Makefiles+append @-ffp-contract=off@ after user compiler flags+when compiling and linking, so separate SBV operations cannot be silently fused.+Custom build systems must disable implicit contraction as well, including at+LTO link time; source pragmas alone are insufficient with some compiler options.+Explicit 'Data.SBV.fpFMA' remains a fused, single-rounding operation. Other+unsafe floating-point options and caller-enabled flush-to-zero modes remain+unsupported even when the compiler does not provide a detectable macro.++=== Calling and owning generated values++Input storage, including reachable aggregate fields and callback contexts, must+remain valid and unchanged throughout the call. Pointer parameters must address+valid objects; fixed-size groups require the declared number of elements.+Outputs must not overlap other outputs or storage reachable through an input.+In-place calls are not part of the supported ABI.++Fixed-size input groups follow the same per-element borrowing rules as scalar+inputs. In particular, a group of symbolic arrays accepts a C array of the+generated @SBVArrayInput_...@ callback descriptors, not private array-node+pointers. The example driver initializes and releases managed group elements+individually, including their nested exact values and callback contexts.++Scalar GMP output parameters, including each element of a GMP output group,+must be initialized with @mpz_init@ or @mpq_init@ before the call. They can be+reused across calls and must eventually be cleared by the caller. This also+applies to the extra output parameter used for a single exact-number return.++In contrast, managed string, list, set, tuple, ADT, and array output slots receive+fresh owned values. They need no initialization, even when an aggregate contains+GMP fields. Release an old owned value before reusing its slot; the generated+entry point does not release the previous contents. Each output and return is+an independent owner. Plain C assignment does not create another owner: use the+generated clone or retain helper when both copies must survive independently.+Never release borrowed input storage with an ownership helper.++Reading an owned array can return a borrowed managed value. Clone that value+before releasing the array if it must survive. Likewise, the generated+@sbv_array_output_as_input_...@ helper borrows its array owner; it does not retain+it. A callback's returned storage must remain valid while its context is alive.+Callbacks must implement a stable, immutable lookup. When a non-null context+escapes in a result, both retain and release hooks are required; retaining must+preserve the lookup's meaning and give the result an independent lifetime.++'Data.SBV.smtFunction' definitions and firstified higher-order specializations+can compile to private C functions, including recursive definitions. Explicit+closure environments remain SBV values; this is not an ABI for runtime Haskell+function values. Hard constraints become executable preconditions.++Array lambdas must be closed: their bodies may use their index, literal+constants, and local computations, but may not capture outer symbolic values.+The C backend checks every retained callback before generation, including+nested lambdas, table entries/defaults, and rounding-mode operands. Unsupported+captures are rejected explicitly, never replaced with default values or ignored.+This check is conservative even when a retained capture would not be evaluated.+Capturing array environments are deferred; SBV's existing frontend restrictions+on nested and higher-order captures remain unchanged.++== Runtime failures++Generated programs and libraries use a fail-fast contract: a detected runtime+failure terminates the calling process, using @abort@ or an unsuccessful exit.+This includes failed executable preconditions and enabled assertions, detected+invalid descriptors or missing required callback hooks, and allocation or+resource-limit failures. There is no recoverable status-returning API.++Callers must still satisfy the generated header's ABI and ownership requirements;+runtime checks cannot validate arbitrary pointers or detect every malformed+value. Outputs and cleanup are not guaranteed after failure. Intercepting+termination or using @longjmp@ is not a supported recovery mechanism.++Ordinary numerical results, including floating-point NaNs and infinities and+SBV-defined totalized operations, are not themselves runtime failures.++== Array equality++Array equality enumerates a supported finite key domain and compares values+using SMT object equality: NaNs are equal and signed floating-point zeros are+distinct. It works for constant, updated, lambda-backed, and caller-provided+arrays, stopping at the first mismatch. No backing array is materialized.+Use 'Data.SBV..===' for arrays involving floating-point types; ordinary+'Data.SBV..==' on such arrays is rejected by SBV before C generation.+Lookup callbacks must respect SMT key equality, including returning the same+value for all NaN encodings of a floating-point key.++'cgArrayEqualityLimit' controls the maximum domain size, defaulting to 256+keys per comparison. For example, setting it to 65536 permits 'Data.SBV.SWord16' keys,+at the cost of up to 65,536 lookups in each array. The setting also applies+inside defined functions and array lambdas, independently for each library+component. A zero limit disables exhaustive comparison. This is a generation+setting, not a runtime timeout; lookup and value-comparison costs are additional.+Exceeding the limit reports the required domain size and suggests raising it.+Infinite or unsupported domains and nested array equality remain unsupported+regardless of the limit. These are generation-time diagnostics, not internal+compiler errors, and library preflight rejects the whole bundle before writing+any component files.++Supported key domains are Booleans, bit-vectors, characters, rounding modes,+floating-point formats, and non-recursive tuples and ADTs built from these.+Floating-point enumeration visits bit encodings but compares only one NaN+representative. Large domains require explicit opt-in even when the generated+loop itself is compact.++For example, admit the full 16-bit domain when generating a comparator:++>>> import Data.SBV+>>> import Data.SBV.Internals (compileToC')+>>> :{+let compareArrays = do+      cgArrayEqualityLimit 65536+      left  <- cgInput "left"  :: SBVCodeGen (SArray Word16 Word8)+      right <- cgInput "right" :: SBVCodeGen (SArray Word16 Word8)+      cgReturn (left .== right)+:}++>>> (_, _, generated) <- compileToC' "compareArrays" compareArrays+>>> length (show generated) `seq` pure ()++== Regular expressions++Regex membership compiles to a bounded deterministic automaton: function-local+static tables and an allocation-free C loop. All 'Data.SBV.RegExp.RegExp'+constructors are supported, including complement, intersection, difference,+and nullable repetitions. Matching consumes the entire string, preserves+embedded NULs, and uses SBV's character domain @0..0x2ffff@, including numeric+surrogate values. The normal canonical string-encoding ABI still applies.+Regex language equality and inequality are decided during generation and+produce Boolean constants, not runtime comparisons.++There are no additional packages, generation tools, headers, or linker flags.+Non-regex programs acquire no regex runtime code. Tables are private to each+generated function and work inside defined functions and closed array lambdas.++'cgRegexLimits' bounds compilation independently per regex operation: maximum+explored automaton states (default 1024), expression nodes (4096), and charged+generation work (16000000). Language comparison counts pairs of residual states.+Expression limits also bound literal/list lengths and repetition expansion;+work accounts for traversals, construction, normalization, and state comparisons.+These are conservative implementation budgets, not time or memory guarantees.+They can reject even a regex whose minimal automaton would be small; this+initial implementation does not minimize automata or optimize large repetitions.++Exceeding a budget fails during generation with a diagnostic naming the limit.+No language approximation or fallback matcher is used. Zero in any limit+disables regex compilation; negative limits are invalid. Successful generation+supports inputs of any length, independently of these limits. Each library+component can choose its own limits. Already folded or dead operations need+no regex compilation.++For example, permit a larger automaton when generating a suffix matcher:++>>> import qualified Data.SBV.RegExp as RE+>>> :{+let suffixMatcher = do+      cgRegexLimits 4096 8192 64000000+      input <- cgInput "input" :: SBVCodeGen SString+      cgReturn (input `RE.match` RE.Conc [RE.All, RE.Literal "done"])+:}++>>> (_, _, regexCode) <- compileToC' "suffixMatcher" suffixMatcher+>>> length (show regexCode) `seq` pure ()++== Boundaries++=== Support policy++The following distinctions apply equally to standalone functions and libraries:++* /Supported representations/: arbitrary-width bit-vectors, native and+  arbitrary-format floats, GMP integers and rational-valued reals, text,+  lists, finite\/cofinite sets, tuples, concrete ADTs, and persistent arrays.+  Dependencies and ownership follow the representation descriptions above.+* /Supported with generation budgets/: exhaustive finite-domain array equality+  ('cgArrayEqualityLimit') and regex compilation ('cgRegexLimits'). Exceeding+  a budget reports the relevant setting; raising it does not enable a different+  feature or change semantics. Regex matching has no approximate fallback.+* /Unsupported types/: uninterpreted sorts, including uses nested in supported+  containers. Uninterpreted /functions/ with caller-supplied C implementations+  are a separate, supported mechanism.+* /Unsupported recursive layouts/: recursive ADT references nested inside+  composite constructor fields, such as tuples. Put recursive references in+  direct constructor fields instead; those use the supported pointer layout.+* /Unsupported equality/: nested arrays and general infinite-domain array+  equality, even for sparse constant-plus-write arrays. The same restriction+  applies to implicit element comparisons in collection operations.+* /Unsupported solver requests/: finite or infinite quantifiers, special+  relations, soft constraints, solver options, optimization objectives, and SMT-only constraint+  attributes. Ordinary hard constraints become executable checks, not searches+  for satisfying inputs.+* /Unsupported closures/: array lambdas capturing outer symbolic values.+  Closed array lambdas and firstified higher-order operations with explicit+  'Data.SBV.Closure' environments remain supported. Unsupported implicit+  higher-order captures are rejected by SBV's frontend or by C preflight when+  retained in a defined function; the backend does not add first-class runtime+  functions or general function equality.+* /Unsupported exact real values/: algebraic roots, transcendental operations+  in exact-rational mode, and inexact or interval literals that do not specify+  a single exact value. A native real mapping explicitly opts into approximate+  arithmetic; it does not choose an approximation for an algebraic literal.++These unsupported cases report an explicit diagnostic during generation,+including retained private-function and array-lambda bodies. Validation of an+entire library precedes file output: a rejected component does not leave earlier+components partially written. This is not a filesystem transaction; an I\/O+failure while writing otherwise valid output can still leave files behind.+Already constant-folded or eliminated operations do not require a lowering.+Runtime failures and caller preconditions are separate contracts, described+above; in particular, violating the RNE entry requirement is not diagnosed.++Array comparisons with infinite or unsupported key domains, or values that+themselves contain arrays, are rejected during generation. Comparing arrays+nested inside collections or aggregates is also not implemented. Quantifiers,+special solver relations, uninterpreted sorts, and soft constraints are rejected.+The comparison restriction includes list searches, prefix/suffix checks, and+replacement: these operations compare elements even when their result is not+a Boolean. Arrays may still be transported inside lists and aggregates without+comparing them. Array-containing set elements and array keys are rejected, since+their representations require element or key equality.++Exact GMP reals represent rational values, not arbitrary algebraic or+transcendental values. Select 'cgSRealType' for native approximations and+@libm@ transcendental operations when rounding is acceptable. The fixed-size+input/output/return group APIs require at least one element; symbolic lists+can be empty.++Numeric conversions honor 'cgIntegerSize' and the @CgFloat@/@CgDouble@ real+mappings. Converting a mapped real to an integer still floors; explicitly+rounded floating casts retain their requested rounding mode. @CgLongDouble@+retains native arithmetic and uses representation-aware LibBF bridges to exact+integers, bit-vectors, and native or arbitrary floating-point formats. These+bridges import the full significand and round directly to the destination,+without narrowing through binary64. The target C compiler must provide binary64,+x87 extended, or binary128 @long double@; other formats (including double-double)+receive a compile-time diagnostic when a bridge is needed. Merely selecting+@CgLongDouble@ does not itself require LibBF. Explicit native mappings remain+approximations: compound expressions, including integer numerator\/denominator+conversions in 'Data.SBV.Rational.sRationalToSReal', retain their separate rounding+steps instead of becoming a single exact-rational conversion. -}  {- $unboundedCGen-The types 'Data.SBV.SInteger' and 'Data.SBV.SReal' are unbounded quantities that have no direct counterparts in the C language. Therefore,-it is not possible to generate standard C code for SBV programs using these types, unless custom libraries are available. To-overcome this, SBV allows the user to explicitly set what the corresponding types should be for these two cases, using-the functions below. Note that while these mappings will produce valid C code, the resulting code will be subject to-overflow/underflows for 'Data.SBV.SInteger', and rounding for 'Data.SBV.SReal', so there is an implicit loss of precision.+The types 'Data.SBV.SInteger' and 'Data.SBV.SReal' are represented exactly by+GMP when no alternative mapping is selected. The functions below retain the+option of mapping them to native C types when a smaller ABI or compatibility+with historical generated code is more important than exactness. Such native+mappings are subject to overflow for 'Data.SBV.SInteger' and rounding for+'Data.SBV.SReal'. -If the user does /not/ specify these mappings, then SBV will-refuse to compile programs that involve these types.+Real-to-integer flooring preserves the mathematical floor of the represented+native real, then retains the low bits selected by 'cgIntegerSize'. This applies+to @CgFloat@, @CgDouble@, and @CgLongDouble@ without an out-of-range C integer+cast. Flooring a non-finite mapped real terminates the process with a diagnostic.++The compatibility backend in "Data.SBV.Tools.CodeGen.Legacy" retains the+original requirement that these mappings be supplied explicitly. -}
+ Data/SBV/Tools/CodeGen/Legacy.hs view
@@ -0,0 +1,36 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Data.SBV.Tools.CodeGen.Legacy+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Opt-in access to the original SBV-to-C compiler. This module exports the+-- same code-generation interface as "Data.SBV.Tools.CodeGen"; changing the+-- import is sufficient to select the compatibility backend.+--+-- @+-- import Data.SBV.Tools.CodeGen.Legacy+-- @+--+-- New code should normally import "Data.SBV.Tools.CodeGen" instead.+-- Unlike the current backend, Legacy requires explicit 'cgIntegerSize' and+-- 'cgSRealType' mappings; it never supplies the GMP fallback. Array-equality+-- and regex generation limits are not exported: Legacy cannot use them.+-- Native real-to-integer flooring uses the same overflow-safe, low-bit mapping+-- as the current backend; flooring a non-finite mapped real fails explicitly.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module Data.SBV.Tools.CodeGen.Legacy+  ( module Data.SBV.Tools.CodeGen+  , compileToC+  , compileToCLib+  , compileToC'+  , compileToCLib'+  ) where++import Data.SBV.Compilers.C.Legacy (compileToC, compileToCLib, compileToC', compileToCLib')+import Data.SBV.Tools.CodeGen hiding (compileToC, compileToCLib, cgArrayEqualityLimit, cgRegexLimits, CgRegexLimits(..), defaultCgRegexLimits, cgSetRegexLimits)
Data/SBV/Utils/SExpr.hs view
@@ -14,7 +14,7 @@ {-# OPTIONS_GHC -Wall -Werror #-}  module Data.SBV.Utils.SExpr ( SExpr(..), parenDeficit, parseSExpr-                            , parseSExprFunction, makeHaskellFunction+                            , parseSExprFunction, makeHaskellFunction, formatFunctionResponse                             , unQuote, simplifyECon                             , nameSupply                             ) where@@ -51,30 +51,36 @@  -- | Extremely simple minded tokenizer, good for our use model. tokenize :: String -> [String]-tokenize inp = go inp []+tokenize = tokenizeWith (\tok _ _ -> tok)++-- The callback receives the decoded token and the original input suffixes at+-- its start and end. Retaining these boundaries lets display code take exact+-- source slices without changing the tokens used for parsing.+tokenizeWith :: (String -> String -> String -> a) -> String -> [a]+tokenizeWith retain inp = go inp []  where go "" sofar = reverse sofar         go (c:cs) sofar           | isSpace c = go (dropWhile isSpace cs) sofar -       go ('(':cs) sofar = go cs ("(" : sofar)-       go (')':cs) sofar = go cs (")" : sofar)+       go src@('(':cs) sofar = go cs (retain "(" src cs : sofar)+       go src@(')':cs) sofar = go cs (retain ")" src cs : sofar) -       go (':':':':cs) sofar = go cs ("::" : sofar)+       go src@(':':':':cs) sofar = go cs (retain "::" src cs : sofar) -       go (':':cs) sofar = case break (`elem` stopper) cs of-                            (pre, rest) -> go rest ((':':pre) : sofar)+       go src@(':':cs) sofar = case break (`elem` stopper) cs of+                                (pre, rest) -> go rest (retain (':':pre) src rest : sofar) -       go ('|':r) sofar = let wrap s = '|' : s ++ "|"-                          in case span (/= '|') r of-                               (pre, '|':rest) -> go rest (wrap pre : sofar)-                               (pre, rest)     -> go rest (wrap pre : sofar)+       go src@('|':r) sofar = let wrap s = '|' : s ++ "|"+                              in case span (/= '|') r of+                                   (pre, '|':rest) -> go rest (retain (wrap pre) src rest : sofar)+                                   (pre, rest)     -> go rest (retain (wrap pre) src rest : sofar)         go (';':r) sofar = go (drop 1 (dropWhile (/= '\n') r)) sofar -       go ('"':r) sofar = go rest (finalStr : sofar)+       go src@('"':r) sofar = go rest (retain finalStr src rest : sofar)            where grabString []             acc = (reverse acc, [])         -- Strictly speaking, this is the unterminated string case; but let's ignore-                 grabString ('"' :'"':cs)  acc = grabString cs ('"' :acc)+                 grabString ('"' :'"':cs)  acc = grabString cs ('"' : acc)                  grabString ('"':cs)       acc = (reverse acc, cs)                  grabString (c:cs)         acc = grabString cs (c:acc) @@ -82,7 +88,7 @@                  finalStr    = '"' : str ++ "\""         go cs sofar = case span (`notElem` stopper) cs of-                       (pre, post) -> go post (pre : sofar)+                            (pre, post) -> go post (retain pre cs post : sofar)         -- characters that can stop the current token        -- it is *crucial* that this list contains every character@@ -561,8 +567,8 @@         eRank EDouble{}        = 5         eRank EApp{}           = 6 --- Turn---  "((F (lambda ((x!1 Int)) (+ 3 (* 2 x!1)))))"+-- Turn a parsed function value+--  "(lambda ((x!1 Int)) (+ 3 (* 2 x!1)))" ---  into --  "F x = 3 + 2 * x" -- if we can. We try but don't push too hard! This is only used for display purposes.@@ -570,14 +576,12 @@ -- This isn't very fool-proof; can be confused if there are binding constructs etc. -- Also, the generated text isn't necessarily fully Haskell acceptable. -- But it seems to do an OK job for most common use cases.-makeHaskellFunction :: String -> String -> Bool -> Maybe [String] -> Maybe String-makeHaskellFunction resp nm isCurried mbArgs-   = case parseSExpr resp of-       Right (EApp [EApp [ECon o, e]]) | o == nm -> do (args, bd) <- lambda e-                                                       let params | isCurried = unwords args-                                                                  | True      = '(' : intercalate ", " args ++ ")"-                                                       pure $ unBar nm ++ " " ++ params ++ " = " ++ bd-       _                                         -> Nothing+makeHaskellFunction :: SExpr -> String -> Bool -> Maybe [String] -> Maybe String+makeHaskellFunction value nm isCurried mbArgs = do+  (args, bd) <- lambda value+  let params | isCurried = unwords args+             | True      = '(' : intercalate ", " args ++ ")"+  pure $ unBar nm ++ " " ++ params ++ " = " ++ bd    where -- infinite supply of names; starting with the ones we're given         preSupply = fromMaybe [] mbArgs@@ -590,6 +594,23 @@          getArg (EApp [ECon argName, _]) = Just argName         getArg _                        = Nothing++-- | Format an already parsed function value. The caller validates the response+-- name. If lambda formatting fails, slice the original SMT-Lib value at token+-- boundaries. This preserves its exact spelling, whitespace, and comments;+-- rebuilding it from the normalized SExpr or decoded tokens would lose details.+formatFunctionResponse :: SExpr -> String -> String -> Bool -> Maybe [String] -> String+formatFunctionResponse value response nm isCurried mbArgs+  | Just formatted <- makeHaskellFunction value nm isCurried mbArgs+  = formatted+  | ("(", _, _) : ("(", _, _) : (actual, _, _) : rest <- tokenizeWith (,,) response+  , unBar actual == unBar nm+  , (")", _, _) : (")", _, _) : body@((_, _, end) : _) <- reverse rest+  , (_, start, _) : _ <- reverse body+  = raw $ take (length start - length end) start+  | True+  = raw response+  where raw s = nm ++ " = fromSMTLib " ++ s  -- | z3 prints uninterpreted values like this: T!val!4 or T_val_4. Turn that into T_4 simplifyECon :: String -> String
+ Documentation/SBV/Examples/ADT/Shapes.hs view
@@ -0,0 +1,110 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Documentation.SBV.Examples.ADT.Shapes+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Generate shapes satisfying constraints on their dimensions and area. This+-- example demonstrates symbolic pattern matching on an algebraic datatype,+-- enumerating models with 'allSatWith', and extracting concrete Haskell values+-- in query mode.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE QuasiQuotes       #-}+{-# LANGUAGE TemplateHaskell   #-}+{-# LANGUAGE TypeApplications  #-}++module Documentation.SBV.Examples.ADT.Shapes where++import Data.SBV+import Data.SBV.Control++-- | Shapes with signed 32-bit dimensions. We reserve 'Rectangle' for shapes+-- with unequal sides, so squares have their own constructor.+data Shape = Dot                                        -- ^ A point, with zero area.+           | Square    { side  :: Int32 }                -- ^ A square.+           | Rectangle { sideA :: Int32, sideB :: Int32 } -- ^ A rectangle.+           deriving Show++-- | Generate 'SShape', symbolic constructors such as 'sSquare', and the+-- support needed to pass shapes to and from the solver.+mkSymbolic [''Shape]++-- | Compute the area using 'sCase' to match a symbolic shape. Ordinary Haskell+-- pattern matching cannot inspect a shape whose constructor is not yet known.+area :: SShape -> SInt32+area s = [sCase| s of+            Dot           -> 0+            Square a      -> a * a+            Rectangle a b -> a * b+         |]++-- | Require positive dimensions below 100, and unequal sides for rectangles.+-- The bounds also ensure that area calculations cannot overflow 'Int32'.+-- A dot has no dimensions to constrain.+goodShape :: SShape -> SBool+goodShape s = [sCase| s of+                 Dot           -> sTrue+                 Square a      -> a .> 0 .&& a .< 100+                 Rectangle a b -> a .> 0 .&& a .< 100 .&& b .> 0 .&& b .< 100 .&& a ./= b+              |]++-- | Create a symbolic shape and constrain its dimensions. Creating the value+-- automatically declares the datatype to the solver.+newShape :: Symbolic SShape+newShape = do x <- free "shape"+              constrain $ goodShape x+              pure x++-- | Select non-dot shapes with area between 10 and 30, inclusive.+-- The explicit exclusion of 'Dot' is redundant with the area bound, but+-- illustrates a symbolic comparison with a datatype constructor.+interesting :: SShape -> SBool+interesting x = area x .>= 10 .&& area x .<= 30 .&& x ./= sDot++-- | Ask for five distinct models using SBV's built-in enumeration.+--+-- >>> examples+-- Solution #1:+--   shape = Rectangle 24 1 :: Shape+-- Solution #2:+--   shape = Rectangle 1 25 :: Shape+-- Solution #3:+--   shape = Rectangle 25 1 :: Shape+-- Solution #4:+--   shape = Square 5 :: Shape+-- Solution #5:+--   shape = Square 4 :: Shape+-- Found 5 different solutions.+examples :: IO AllSatResult+examples = allSatWith z3{allSatMaxModelCount = Just 5} (interesting <$> newShape)++-- | Enumerate shapes manually in query mode. After each satisfiability check,+-- 'getValue' returns a concrete 'Shape'. We exclude that value using 'literal'+-- before asking for the next model. Stop after five shapes, or earlier if+-- there are no more solutions, and return them in discovery order.+--+-- >>> extracted+-- [Square {side = 4},Rectangle {sideA = 15, sideB = 1},Square {side = 5},Rectangle {sideA = 4, sideB = 6},Rectangle {sideA = 12, sideB = 2}]+extracted :: IO [Shape]+extracted = runSMT $ do+        x <- newShape+        constrain $ interesting x++        let loop :: Int -> [Shape] -> Query [Shape]+            loop 5 sofar = pure $ reverse sofar+            loop i sofar = do cs <- checkSat+                              case cs of+                                Sat   -> do xv <- getValue x+                                            -- Exclude the entire shape, including its fields.+                                            constrain $ x ./= literal xv+                                            loop (i+1) (xv : sofar)+                                Unsat -> pure $ reverse sofar+                                _     -> error $ "Solver said: " ++ show cs++        query $ loop 0 []
Documentation/SBV/Examples/CodeGeneration/AddSub.hs view
@@ -16,7 +16,7 @@ import Data.SBV import Data.SBV.Tools.CodeGen --- | Simple function that returns add/sum of args+-- | Return the sum and difference of two unsigned 8-bit values, wrapping modulo 256. addSub :: SWord8 -> SWord8 -> (SWord8, SWord8) addSub x y = (x+y, x-y) @@ -37,11 +37,11 @@ -- addSub.o: addSub.c addSub.h -- 	${CC} ${CCFLAGS} -c $< -o $@ -- <BLANKLINE>--- addSub_driver.o: addSub_driver.c+-- addSub_driver.o: addSub_driver.c addSub.h -- 	${CC} ${CCFLAGS} -c $< -o $@ -- <BLANKLINE> -- addSub_driver: addSub.o addSub_driver.o--- 	${CC} ${CCFLAGS} $^ -o $@+-- 	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS} -- <BLANKLINE> -- clean: -- 	rm -f *.o@@ -52,9 +52,10 @@ -- == BEGIN: "addSub.h" ================ -- /* Header file for addSub. Automatically generated by SBV. Do not edit! */ -- <BLANKLINE>--- #ifndef __addSub__HEADER_INCLUDED__--- #define __addSub__HEADER_INCLUDED__+-- #ifndef SBV_GENERATED_addSub_HEADER_INCLUDED+-- #define SBV_GENERATED_addSub_HEADER_INCLUDED -- <BLANKLINE>+-- <BLANKLINE> -- #include <stdio.h> -- #include <stdlib.h> -- #include <inttypes.h>@@ -63,6 +64,13 @@ -- #include <string.h> -- #include <math.h> -- <BLANKLINE>+-- /* Floating-point calling convention:+--  * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+--  * Callbacks must preserve this mode before returning or re-entering.+--  * Generated code does not check or change the hardware rounding mode.+--  * Custom builds must disable implicit FP contraction, including at LTO link time.+--  */+-- <BLANKLINE> -- /* The boolean type */ -- typedef bool SBool; -- <BLANKLINE>@@ -88,7 +96,7 @@ -- void addSub(const SWord8 x, const SWord8 y, SWord8 *sum, --             SWord8 *dif); -- <BLANKLINE>--- #endif /* __addSub__HEADER_INCLUDED__ */+-- #endif /* SBV_GENERATED_addSub_HEADER_INCLUDED */ -- == END: "addSub.h" ================== -- == BEGIN: "addSub_driver.c" ================ -- /* Example driver program for addSub. */@@ -99,14 +107,14 @@ -- <BLANKLINE> -- int main(void) -- {---   SWord8 sum;---   SWord8 dif;+--   SWord8 sbv_driver_output_0;+--   SWord8 sbv_driver_output_1; -- <BLANKLINE>---   addSub(132, 241, &sum, &dif);+--   addSub(132, 241, &sbv_driver_output_0, &sbv_driver_output_1); -- <BLANKLINE> --   printf("addSub(132, 241, &sum, &dif) ->\n");---   printf("  sum = %"PRIu8"\n", sum);---   printf("  dif = %"PRIu8"\n", dif);+--   printf("  sum = %"PRIu8"\n", sbv_driver_output_0);+--   printf("  dif = %"PRIu8"\n", sbv_driver_output_1); -- <BLANKLINE> --   return 0; -- }@@ -116,24 +124,46 @@ -- <BLANKLINE> -- #include "addSub.h" -- <BLANKLINE>--- void addSub(const SWord8 x, const SWord8 y, SWord8 *sum,---             SWord8 *dif)+-- /* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+-- #ifndef SBV_CGEN_UNUSED+-- #if defined(__GNUC__) || defined(__clang__)+-- #define SBV_CGEN_UNUSED __attribute__((unused))+-- #else+-- #define SBV_CGEN_UNUSED+-- #endif+-- #endif+-- <BLANKLINE>+-- static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b) -- {---   const SWord8 s0 = x;---   const SWord8 s1 = y;---   const SWord8 s2 = s0 + s1;---   const SWord8 s3 = s0 - s1;+--   const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+--   return (SWord8) bits;+-- } -- <BLANKLINE>---   *sum = s2;---   *dif = s3;+-- static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_sub(SWord8 a, SWord8 b)+-- {+--   const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) - ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+--   return (SWord8) bits; -- }+-- <BLANKLINE>+-- <BLANKLINE>+-- void addSub(const SWord8 sbv_input_0, const SWord8 sbv_input_1,+--             SWord8 *sbv_output_0, SWord8 *sbv_output_1)+-- {+--   const SWord8 s0 = sbv_input_0;+--   const SWord8 s1 = sbv_input_1;+--   const SWord8 s2 = sbv_bv_u8_add(s0, s1);+--   const SWord8 s3 = sbv_bv_u8_sub(s0, s1);+-- <BLANKLINE>+--   *sbv_output_0 = s2;+--   *sbv_output_1 = s3;+-- } -- == END: "addSub.c" ================== -- genAddSub :: IO () genAddSub = compileToC outDir "addSub" $ do         x <- cgInput "x"         y <- cgInput "y"-        -- leave the cgDriverVals call out for generating a driver with random values+        -- leave the cgSetDriverValues call out for generating a driver with random values         cgSetDriverValues [132, 241]         let (s, d) = addSub x y         cgOutput "sum" s
Documentation/SBV/Examples/CodeGeneration/PopulationCount.hs view
@@ -91,7 +91,7 @@ -- generate C code to compute population-counts for us. This action will generate all the -- C files that you will need, including a driver program for test purposes. ----- Below is the generated header file for `popCountFast`:+-- Below are the generated files for `popCountFast`: -- -- >>> genPopCountInC -- == BEGIN: "Makefile" ================@@ -108,11 +108,11 @@ -- popCount.o: popCount.c popCount.h -- 	${CC} ${CCFLAGS} -c $< -o $@ -- <BLANKLINE>--- popCount_driver.o: popCount_driver.c+-- popCount_driver.o: popCount_driver.c popCount.h -- 	${CC} ${CCFLAGS} -c $< -o $@ -- <BLANKLINE> -- popCount_driver: popCount.o popCount_driver.o--- 	${CC} ${CCFLAGS} $^ -o $@+-- 	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS} -- <BLANKLINE> -- clean: -- 	rm -f *.o@@ -123,9 +123,10 @@ -- == BEGIN: "popCount.h" ================ -- /* Header file for popCount. Automatically generated by SBV. Do not edit! */ -- <BLANKLINE>--- #ifndef __popCount__HEADER_INCLUDED__--- #define __popCount__HEADER_INCLUDED__+-- #ifndef SBV_GENERATED_popCount_HEADER_INCLUDED+-- #define SBV_GENERATED_popCount_HEADER_INCLUDED -- <BLANKLINE>+-- <BLANKLINE> -- #include <stdio.h> -- #include <stdlib.h> -- #include <inttypes.h>@@ -134,6 +135,13 @@ -- #include <string.h> -- #include <math.h> -- <BLANKLINE>+-- /* Floating-point calling convention:+--  * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+--  * Callbacks must preserve this mode before returning or re-entering.+--  * Generated code does not check or change the hardware rounding mode.+--  * Custom builds must disable implicit FP contraction, including at LTO link time.+--  */+-- <BLANKLINE> -- /* The boolean type */ -- typedef bool SBool; -- <BLANKLINE>@@ -158,7 +166,7 @@ -- /* Entry point prototype: */ -- SWord8 popCount(const SWord64 x); -- <BLANKLINE>--- #endif /* __popCount__HEADER_INCLUDED__ */+-- #endif /* SBV_GENERATED_popCount_HEADER_INCLUDED */ -- == END: "popCount.h" ================== -- == BEGIN: "popCount_driver.c" ================ -- /* Example driver program for popCount. */@@ -169,9 +177,9 @@ -- <BLANKLINE> -- int main(void) -- {---   const SWord8 __result = popCount(0x1b02e143e4f0e0e5ULL);+--   const SWord8 sbv_result = popCount(0x1b02e143e4f0e0e5ULL); -- <BLANKLINE>---   printf("popCount(0x1b02e143e4f0e0e5ULL) = %"PRIu8"\n", __result);+--   printf("popCount(0x1b02e143e4f0e0e5ULL) = %"PRIu8"\n", sbv_result); -- <BLANKLINE> --   return 0; -- }@@ -181,9 +189,68 @@ -- <BLANKLINE> -- #include "popCount.h" -- <BLANKLINE>--- SWord8 popCount(const SWord64 x)+-- /* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+-- #ifndef SBV_CGEN_UNUSED+-- #if defined(__GNUC__) || defined(__clang__)+-- #define SBV_CGEN_UNUSED __attribute__((unused))+-- #else+-- #define SBV_CGEN_UNUSED+-- #endif+-- #endif+-- <BLANKLINE>+-- static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_shl(SWord64 a, SWord64 amount) -- {---   const SWord64 s0 = x;+--   const uint64_t n = (uint64_t) (SWord64) amount;+--   const SWord64 result = n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a << n);+--   return result;+-- }+-- <BLANKLINE>+-- static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_lshr(SWord64 a, SWord64 amount)+-- {+--   const uint64_t n = (uint64_t) (SWord64) amount;+--   return n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a >> n);+-- }+-- <BLANKLINE>+-- static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b)+-- {+--   const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+--   return (SWord8) bits;+-- }+-- <BLANKLINE>+-- <BLANKLINE>+-- SWord8 popCount(const SWord64 sbv_input_0)+-- {+--   const SWord64 s0 = sbv_input_0;+--   const SWord64 s11 = s0 & 0x00000000000000ffULL;+--   const SWord64 s14 = sbv_bv_u64_lshr(s0, 0x0000000000000008ULL);+--   const SWord64 s15 = 0x00000000000000ffULL & s14;+--   const SWord64 s18 = sbv_bv_u64_lshr(s14, 0x0000000000000008ULL);+--   const SWord64 s19 = 0x00000000000000ffULL & s18;+--   const SWord64 s22 = sbv_bv_u64_lshr(s18, 0x0000000000000008ULL);+--   const SWord64 s23 = 0x00000000000000ffULL & s22;+--   const SWord64 s26 = sbv_bv_u64_lshr(s22, 0x0000000000000008ULL);+--   const SWord64 s27 = 0x00000000000000ffULL & s26;+--   const SWord64 s30 = sbv_bv_u64_lshr(s26, 0x0000000000000008ULL);+--   const SWord64 s31 = 0x00000000000000ffULL & s30;+--   const SWord64 s34 = sbv_bv_u64_lshr(s30, 0x0000000000000008ULL);+--   const SWord64 s35 = 0x00000000000000ffULL & s34;+--   const SWord64 s38 = sbv_bv_u64_lshr(s34, 0x0000000000000008ULL);+--   const SWord64 s39 = 0x00000000000000ffULL & s38;+--         SWord8  s12;+--         SWord8  s16;+--         SWord8  s17;+--         SWord8  s20;+--         SWord8  s21;+--         SWord8  s24;+--         SWord8  s25;+--         SWord8  s28;+--         SWord8  s29;+--         SWord8  s32;+--         SWord8  s33;+--         SWord8  s36;+--         SWord8  s37;+--         SWord8  s40;+--         SWord8  s41; --   static const SWord8 table0[] = { --       0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, --       3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,@@ -198,36 +265,21 @@ --       5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, --       5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 --   };---   const SWord64 s11 = s0 & 0x00000000000000ffULL;---   const SWord8  s12 = table0[s11];---   const SWord64 s14 = s0 >> 8;---   const SWord64 s15 = 0x00000000000000ffULL & s14;---   const SWord8  s16 = table0[s15];---   const SWord8  s17 = s12 + s16;---   const SWord64 s18 = s14 >> 8;---   const SWord64 s19 = 0x00000000000000ffULL & s18;---   const SWord8  s20 = table0[s19];---   const SWord8  s21 = s17 + s20;---   const SWord64 s22 = s18 >> 8;---   const SWord64 s23 = 0x00000000000000ffULL & s22;---   const SWord8  s24 = table0[s23];---   const SWord8  s25 = s21 + s24;---   const SWord64 s26 = s22 >> 8;---   const SWord64 s27 = 0x00000000000000ffULL & s26;---   const SWord8  s28 = table0[s27];---   const SWord8  s29 = s25 + s28;---   const SWord64 s30 = s26 >> 8;---   const SWord64 s31 = 0x00000000000000ffULL & s30;---   const SWord8  s32 = table0[s31];---   const SWord8  s33 = s29 + s32;---   const SWord64 s34 = s30 >> 8;---   const SWord64 s35 = 0x00000000000000ffULL & s34;---   const SWord8  s36 = table0[s35];---   const SWord8  s37 = s33 + s36;---   const SWord64 s38 = s34 >> 8;---   const SWord64 s39 = 0x00000000000000ffULL & s38;---   const SWord8  s40 = table0[s39];---   const SWord8  s41 = s37 + s40;+--   s12 = table0[s11];+--   s16 = table0[s15];+--   s17 = sbv_bv_u8_add(s12, s16);+--   s20 = table0[s19];+--   s21 = sbv_bv_u8_add(s17, s20);+--   s24 = table0[s23];+--   s25 = sbv_bv_u8_add(s21, s24);+--   s28 = table0[s27];+--   s29 = sbv_bv_u8_add(s25, s28);+--   s32 = table0[s31];+--   s33 = sbv_bv_u8_add(s29, s32);+--   s36 = table0[s35];+--   s37 = sbv_bv_u8_add(s33, s36);+--   s40 = table0[s39];+--   s41 = sbv_bv_u8_add(s37, s40); -- <BLANKLINE> --   return s41; -- }
Documentation/SBV/Examples/Crypto/AES.hs view
@@ -9,16 +9,13 @@ -- An implementation of AES (Advanced Encryption Standard), using SBV. -- For details on AES, see <http://en.wikipedia.org/wiki/Advanced_Encryption_Standard>. ----- We do a T-box implementation, which leads to good C code as we can take--- advantage of look-up tables. Note that we make virtually no attempt to--- optimize our Haskell code. The concern here is not with getting Haskell running--- fast at all. The idea is to program the T-Box implementation as naturally and clearly--- as possible in Haskell, and have SBV's code-generator generate fast C code automatically.--- Therefore, we merely use ordinary Haskell lists as our data-structures, and do not--- bother with any unboxing or strictness annotations. Thus, we achieve the separation--- of concerns: Correctness via clarity and simplicity and proofs on the Haskell side,--- performance by relying on SBV's code generator. If necessary, the generated code--- can be FFI'd back into Haskell to complete the loop.+-- We choose a T-box implementation because it maps AES round operations to+-- table lookups and word-sized XORs in generated C. The Haskell code can use+-- ordinary lists and describe the tables mathematically: SBV computes their+-- entries during code generation and emits constant C arrays. This keeps+-- the algorithm readable without recomputing field arithmetic at run time.+-- The examples below generate either a standalone block encryptor or a library+-- with separate key-expansion, encryption, and decryption functions. -- -- All 3 valid key sizes (128, 192, and 256) as required by the FIPS-197 standard -- are supported.@@ -740,48 +737,40 @@ -- ${codeGenIntro} ----------------------------------------------------------------------------- {- $codeGenIntro-   We have emphasized that our T-Box implementation in Haskell was guided by clarity and correctness, not-   performance. Indeed, our implementation is hardly the fastest AES implementation in Haskell. However,-   we can use it to automatically generate straight-line C-code that can run fairly fast.--   For the purposes of illustration, we only show here how to generate code for a 128-bit AES block-encrypt-   function, that takes 8 32-bit words as an argument. The first 4 are the 128-bit input, and the final-   four are the 128-bit key. The impact of this is that the generated function would expand the key for-   each block of encryption, a needless task unless we change the key in every block. In a more serious application,-   we would instead generate code for both the 'aesKeySchedule' and the 'aesEncrypt' functions, thus reusing the-   key-schedule over many applications of the encryption call. (Unfortunately doing this is rather cumbersome right-   now, since Haskell does not support fixed-size lists.)+   The C generator emits lookup tables and an unrolled sequence of AES rounds.+   The generated block encryptor takes two input arrays of four 32-bit words+   (plaintext and key), and writes four ciphertext words to an output array.+   It expands the key on every call. To reuse an expanded key across blocks,+   use the separate key-schedule and block functions generated by 'cgAESLibrary'. -} --- | Code generation for 128-bit AES encryption.------ The following sample from the generated code-lines show how T-Boxes are rendered as C arrays:+-- | Generate and print the source, header, example driver, and Makefile for+-- 128-bit AES encryption. The driver uses the test vector from Appendix C.1+-- of the AES standard. ----- @---   static const SWord32 table1[] = {---       0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,---       0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,---       0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,---       0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,---       ...---       }--- @+-- We can inspect the same program without writing files: ----- The generated program has 5 tables (one sbox table, and 4-Tboxes), all converted to fast C arrays. Here--- is a sample of the generated straightline C-code:+-- >>> import Data.SBV.Internals (compileToC')+-- >>> import Data.List (isPrefixOf)+-- >>> (_, _, generated) <- compileToC' "aes128BlockEncrypt" aes128BlockEncrypt+-- >>> let generatedLines = lines (show generated) ----- @---   const SWord8  s1915 = (SWord8) s1912;---   const SWord8  s1916 = table0[s1915];---   const SWord16 s1917 = (((SWord16) s1914) << 8) | ((SWord16) s1916);---   const SWord32 s1918 = (((SWord32) s1911) << 16) | ((SWord32) s1917);---   const SWord32 s1919 = s1844 ^ s1918;---   const SWord32 s1920 = s1903 ^ s1919;--- @+-- The generated program has four T-box tables and one S-box table: ----- The GNU C-compiler does a fine job of optimizing this straightline code to generate a fairly efficient C implementation.+-- >>> putStr $ unlines $ filter (isPrefixOf "  static const ") generatedLines+--   static const SWord32 table1[] = {+--   static const SWord32 table2[] = {+--   static const SWord32 table3[] = {+--   static const SWord32 table4[] = {+--   static const SWord8 table0[] = { cgAES128BlockEncrypt :: IO ()-cgAES128BlockEncrypt = compileToC Nothing "aes128BlockEncrypt" $ do+cgAES128BlockEncrypt = compileToC Nothing "aes128BlockEncrypt" aes128BlockEncrypt++-- | Code-generation action shared by the standalone encryptor and the+-- generated-code examples above. Pass it to 'compileToC' with a destination+-- directory to write the files instead of printing them.+aes128BlockEncrypt :: SBVCodeGen ()+aes128BlockEncrypt = do         pt  <- cgInputArr 4 "pt"        -- plain-text as an array of 4 Word32's         key <- cgInputArr 4 "key"       -- key as an array of 4 Word32s @@ -802,6 +791,10 @@    the same expanded key (potentially using some crypto-mode), until we decide to change the key. In this    section, we show how to use SBV to instead generate a library of functions that can be used in such a scenario.    The generated library is a typical @.a@ archive, that can be linked using the C-compiler as usual.++   For example, @cgAESLibrary 128 (Just "aes128")@ writes the library sources,+   header, example driver, and Makefile to @aes128@. Run @make -C aes128@ to+   build the archive and driver. -}  -- | Components of the AES implementation that the library is generated from. For each case, we provide@@ -885,11 +878,8 @@         configure dvals code = cgSetDriverValues dvals >> code  -- | Generate a C library, containing functions for performing 128-bit enc/dec/key-expansion.--- A note on performance: In a very rough speed test, the generated code was able to do--- 6.3 million block encryptions per second on a decent MacBook Pro. On the same machine, OpenSSL--- reports 8.2 million block encryptions per second. So, the generated code is about 25% slower--- as compared to the highly optimized OpenSSL implementation. (Note that the speed test was done--- somewhat simplistically, so these numbers should be considered very rough estimates.)+-- The generated library includes a header, a Makefile, and an example driver.+-- Build the archive and driver with @make@ in the destination directory. cgAES128Library :: IO () cgAES128Library = cgAESLibrary 128 Nothing 
Documentation/SBV/Examples/Puzzles/HexPuzzle.hs view
@@ -47,8 +47,6 @@ import Data.SBV import Data.SBV.Control -import Data.Proxy- -- | Colors we're allowed data Color = Black | Blue | Green | Red @@ -83,8 +81,7 @@ -- | Iteratively search at increasing depths of button-presses to see if we can -- transform from the initial board position to a final board position. search :: [Color] -> [Color] -> IO ()-search initial final = runSMT $ do registerType (Proxy @SColor)-                                   let emptyGrid = constArray sBlack+search initial final = runSMT $ do let emptyGrid = constArray sBlack                                        initGrid  = foldr (\(i, c) a -> writeArray a (literal i) (literal c)) emptyGrid (zip [1..] initial)                                    query $ loop (0 :: Int) initGrid [] 
Documentation/SBV/Examples/TP/Reverse.hs view
@@ -108,17 +108,16 @@ --     Step: 1.3.2                         Q.E.D. --     Step: 1.3.3                         Q.E.D. --     Step: 1.3.4                         Q.E.D.---     Step: 1.3.5                         Q.E.D.---     Step: 1.3.6 (simplify head)         Q.E.D.---     Step: 1.3.7                         Q.E.D.---     Step: 1.3.8 (simplify tail)         Q.E.D.+--     Step: 1.3.5 (simplify head)         Q.E.D.+--     Step: 1.3.6                         Q.E.D.+--     Step: 1.3.7 (simplify tail)         Q.E.D.+--     Step: 1.3.8                         Q.E.D. --     Step: 1.3.9                         Q.E.D. --     Step: 1.3.10                        Q.E.D.---     Step: 1.3.11                        Q.E.D.---     Step: 1.3.12 (substitute)           Q.E.D.+--     Step: 1.3.11 (substitute)           Q.E.D.+--     Step: 1.3.12                        Q.E.D. --     Step: 1.3.13                        Q.E.D. --     Step: 1.3.14                        Q.E.D.---     Step: 1.3.15                        Q.E.D. --     Step: 1.Completeness                Q.E.D. --   Result:                               Q.E.D. -- Functions proven terminating: rev, sbv.reverse@@ -140,8 +139,7 @@                       []     -> trivial                       [_]    -> trivial                       a : as -> head (rev as) .: rev (a .: rev (tail (rev as)))-                             ?? ih `at` Inst @"xs" as-                             =: head (reverse as) .: rev (a .: rev (tail (rev as)))+                             -- Replace both occurrences of rev as together.                              ?? ih `at` Inst @"xs" as                              =: head (reverse as) .: rev (a .: rev (tail (reverse as)))                              ?? ih `at` Inst @"xs" (tail (rev as))
README.md view
@@ -116,7 +116,7 @@  **Theorem proving (TP)** — Semi-automated inductive proofs (including strong induction) with equational reasoning chains. Includes termination checking, recursive and mutually recursive definitions, productive (co-recursive) functions, and user-defined measures. -**Code generation** — Compile symbolic programs to C as straight-line programs or libraries (`compileToC`, `compileToCLib`), and generate test vectors (`genTest`).+**Code generation** — Compile symbolic programs to C functions or static libraries (`compileToC`, `compileToCLib`), including recursive functions, arbitrary-width arithmetic, structured values, and bounded regex compilation. The previous compiler remains available through `Data.SBV.Tools.CodeGen.Legacy`. Generate test vectors with `genTest`.  **SMT interaction** — Incremental mode via `runSMT`/`query` for programmatic solver interaction with a high-level typed API. Run multiple solvers simultaneously with `proveWithAny`/`proveWithAll`. 
SBVTestSuite/GoldFiles/addSub.gold view
@@ -12,11 +12,11 @@ addSub.o: addSub.c addSub.h 	${CC} ${CCFLAGS} -c $< -o $@ -addSub_driver.o: addSub_driver.c+addSub_driver.o: addSub_driver.c addSub.h 	${CC} ${CCFLAGS} -c $< -o $@  addSub_driver: addSub.o addSub_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "addSub.h" ================ /* Header file for addSub. Automatically generated by SBV. Do not edit! */ -#ifndef __addSub__HEADER_INCLUDED__-#define __addSub__HEADER_INCLUDED__+#ifndef SBV_GENERATED_addSub_HEADER_INCLUDED+#define SBV_GENERATED_addSub_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -63,7 +71,7 @@ void addSub(const SWord8 x, const SWord8 y, SWord8 *sum,             SWord8 *dif); -#endif /* __addSub__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_addSub_HEADER_INCLUDED */ == END: "addSub.h" ================== == BEGIN: "addSub_driver.c" ================ /* Example driver program for addSub. */@@ -74,14 +82,14 @@  int main(void) {-  SWord8 sum;-  SWord8 dif;+  SWord8 sbv_driver_output_0;+  SWord8 sbv_driver_output_1; -  addSub(76, 92, &sum, &dif);+  addSub(76, 92, &sbv_driver_output_0, &sbv_driver_output_1);    printf("addSub(76, 92, &sum, &dif) ->\n");-  printf("  sum = %"PRIu8"\n", sum);-  printf("  dif = %"PRIu8"\n", dif);+  printf("  sum = %"PRIu8"\n", sbv_driver_output_0);+  printf("  dif = %"PRIu8"\n", sbv_driver_output_1);    return 0; }@@ -91,15 +99,37 @@  #include "addSub.h" -void addSub(const SWord8 x, const SWord8 y, SWord8 *sum,-            SWord8 *dif)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b) {-  const SWord8 s0 = x;-  const SWord8 s1 = y;-  const SWord8 s2 = s0 + s1;-  const SWord8 s3 = s0 - s1;+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+} -  *sum = s2;-  *dif = s3;+static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_sub(SWord8 a, SWord8 b)+{+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) - ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++void addSub(const SWord8 sbv_input_0, const SWord8 sbv_input_1,+            SWord8 *sbv_output_0, SWord8 *sbv_output_1)+{+  const SWord8 s0 = sbv_input_0;+  const SWord8 s1 = sbv_input_1;+  const SWord8 s2 = sbv_bv_u8_add(s0, s1);+  const SWord8 s3 = sbv_bv_u8_sub(s0, s1);++  *sbv_output_0 = s2;+  *sbv_output_1 = s3; } == END: "addSub.c" ==================
SBVTestSuite/GoldFiles/aes128Dec.gold view
@@ -12,2426 +12,4426 @@ aes128Dec.o: aes128Dec.c aes128Dec.h 	${CC} ${CCFLAGS} -c $< -o $@ -aes128Dec_driver.o: aes128Dec_driver.c-	${CC} ${CCFLAGS} -c $< -o $@--aes128Dec_driver: aes128Dec.o aes128Dec_driver.o-	${CC} ${CCFLAGS} $^ -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f aes128Dec_driver-== END: "Makefile" ==================-== BEGIN: "aes128Dec.h" ================-/* Header file for aes128Dec. Automatically generated by SBV. Do not edit! */--#ifndef __aes128Dec__HEADER_INCLUDED__-#define __aes128Dec__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* Entry point prototype: */-void aes128Dec(const SWord32 *pt, const SWord32 *key, SWord32 *ct);--#endif /* __aes128Dec__HEADER_INCLUDED__ */-== END: "aes128Dec.h" ==================-== BEGIN: "aes128Dec_driver.c" ================-/* Example driver program for aes128Dec. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "aes128Dec.h"--int main(void)-{-  const SWord32 pt[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array pt:\n");-  int pt_ctr;-  for(pt_ctr = 0; pt_ctr < 4 ; ++pt_ctr)-    printf("  pt[%1d] = 0x%08"PRIx32"UL\n", pt_ctr ,pt[pt_ctr]);--  const SWord32 key[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array key:\n");-  int key_ctr;-  for(key_ctr = 0; key_ctr < 4 ; ++key_ctr)-    printf("  key[%1d] = 0x%08"PRIx32"UL\n", key_ctr ,key[key_ctr]);--  SWord32 ct[4];--  aes128Dec(pt, key, ct);--  printf("aes128Dec(pt, key, ct) ->\n");-  int ct_ctr;-  for(ct_ctr = 0; ct_ctr < 4 ; ++ct_ctr)-    printf("  ct[%1d] = 0x%08"PRIx32"UL\n", ct_ctr ,ct[ct_ctr]);--  return 0;-}-== END: "aes128Dec_driver.c" ==================-== BEGIN: "aes128Dec.c" ================-/* File: "aes128Dec.c". Automatically generated by SBV. Do not edit! */--#include "aes128Dec.h"--void aes128Dec(const SWord32 *pt, const SWord32 *key, SWord32 *ct)-{-  const SWord32 s0 = pt[0];-  const SWord32 s1 = pt[1];-  const SWord32 s2 = pt[2];-  const SWord32 s3 = pt[3];-  const SWord32 s4 = key[0];-  const SWord32 s5 = key[1];-  const SWord32 s6 = key[2];-  const SWord32 s7 = key[3];-  static const SWord8 table0[] = {-       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,-      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,-       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,-       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,-       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,-      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,-      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,-       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,-      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,-       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,-       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,-      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,-       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,-      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,-      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,-       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,-       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,-      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,-      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,-       38, 225, 105,  20,  99,  85,  33,  12, 125-  };-  static const SWord32 table1[] = {-      0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,-      0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,-      0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,-      0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,-      0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,-      0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,-      0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,-      0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,-      0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,-      0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,-      0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,-      0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,-      0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,-      0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,-      0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,-      0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,-      0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,-      0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,-      0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,-      0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,-      0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,-      0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,-      0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,-      0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,-      0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,-      0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,-      0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,-      0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,-      0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,-      0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,-      0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,-      0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,-      0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,-      0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,-      0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,-      0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,-      0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,-      0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,-      0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,-      0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,-      0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,-      0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,-      0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,-      0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,-      0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,-      0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,-      0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,-      0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,-      0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,-      0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,-      0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,-      0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,-      0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,-      0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,-      0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,-      0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,-      0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,-      0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,-      0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,-      0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,-      0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,-      0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,-      0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,-      0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL-  };-  static const SWord8 table2[] = {-       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,-      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,-      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,-      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,-       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,-      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,-       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,-       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,-       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,-      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,-       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,-      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,-      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,-      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,-       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,-       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,-      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,-      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,-      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,-      104,  65, 153,  45,  15, 176,  84, 187,  22-  };-  static const SWord32 table3[] = {-      0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,-      0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,-      0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,-      0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,-      0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,-      0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,-      0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,-      0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,-      0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,-      0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,-      0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,-      0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,-      0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,-      0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,-      0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,-      0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,-      0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,-      0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,-      0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,-      0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,-      0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,-      0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,-      0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,-      0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,-      0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,-      0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,-      0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,-      0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,-      0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,-      0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,-      0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,-      0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,-      0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,-      0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,-      0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,-      0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,-      0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,-      0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,-      0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,-      0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,-      0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,-      0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,-      0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,-      0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,-      0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,-      0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,-      0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,-      0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,-      0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,-      0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,-      0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,-      0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,-      0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,-      0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,-      0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,-      0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,-      0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,-      0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,-      0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,-      0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,-      0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,-      0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,-      0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,-      0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL-  };-  static const SWord32 table4[] = {-      0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,-      0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,-      0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,-      0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,-      0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,-      0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,-      0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,-      0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,-      0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,-      0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,-      0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,-      0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,-      0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,-      0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,-      0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,-      0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,-      0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,-      0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,-      0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,-      0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,-      0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,-      0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,-      0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,-      0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,-      0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,-      0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,-      0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,-      0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,-      0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,-      0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,-      0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,-      0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,-      0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,-      0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,-      0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,-      0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,-      0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,-      0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,-      0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,-      0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,-      0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,-      0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,-      0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,-      0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,-      0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,-      0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,-      0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,-      0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,-      0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,-      0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,-      0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,-      0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,-      0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,-      0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,-      0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,-      0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,-      0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,-      0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,-      0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,-      0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,-      0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,-      0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,-      0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,-      0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL-  };-  static const SWord32 table5[] = {-      0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,-      0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,-      0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,-      0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,-      0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,-      0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,-      0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,-      0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,-      0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,-      0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,-      0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,-      0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,-      0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,-      0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,-      0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,-      0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,-      0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,-      0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,-      0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,-      0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,-      0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,-      0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,-      0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,-      0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,-      0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,-      0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,-      0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,-      0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,-      0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,-      0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,-      0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,-      0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,-      0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,-      0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,-      0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,-      0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,-      0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,-      0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,-      0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,-      0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,-      0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,-      0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,-      0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,-      0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,-      0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,-      0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,-      0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,-      0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,-      0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,-      0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,-      0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,-      0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,-      0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,-      0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,-      0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,-      0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,-      0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,-      0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,-      0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,-      0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,-      0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,-      0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,-      0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,-      0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL-  };-  static const SWord8 table6[] = {-        0,  14,  28,  18,  56,  54,  36,  42, 112, 126, 108,  98,  72,-       70,  84,  90, 224, 238, 252, 242, 216, 214, 196, 202, 144, 158,-      140, 130, 168, 166, 180, 186, 219, 213, 199, 201, 227, 237, 255,-      241, 171, 165, 183, 185, 147, 157, 143, 129,  59,  53,  39,  41,-        3,  13,  31,  17,  75,  69,  87,  89, 115, 125, 111,  97, 173,-      163, 177, 191, 149, 155, 137, 135, 221, 211, 193, 207, 229, 235,-      249, 247,  77,  67,  81,  95, 117, 123, 105, 103,  61,  51,  33,-       47,   5,  11,  25,  23, 118, 120, 106, 100,  78,  64,  82,  92,-        6,   8,  26,  20,  62,  48,  34,  44, 150, 152, 138, 132, 174,-      160, 178, 188, 230, 232, 250, 244, 222, 208, 194, 204,  65,  79,-       93,  83, 121, 119, 101, 107,  49,  63,  45,  35,   9,   7,  21,-       27, 161, 175, 189, 179, 153, 151, 133, 139, 209, 223, 205, 195,-      233, 231, 245, 251, 154, 148, 134, 136, 162, 172, 190, 176, 234,-      228, 246, 248, 210, 220, 206, 192, 122, 116, 102, 104,  66,  76,-       94,  80,  10,   4,  22,  24,  50,  60,  46,  32, 236, 226, 240,-      254, 212, 218, 200, 198, 156, 146, 128, 142, 164, 170, 184, 182,-       12,   2,  16,  30,  52,  58,  40,  38, 124, 114,  96, 110,  68,-       74,  88,  86,  55,  57,  43,  37,  15,   1,  19,  29,  71,  73,-       91,  85, 127, 113,  99, 109, 215, 217, 203, 197, 239, 225, 243,-      253, 167, 169, 187, 181, 159, 145, 131, 141-  };-  static const SWord8 table7[] = {-        0,  11,  22,  29,  44,  39,  58,  49,  88,  83,  78,  69, 116,-      127,  98, 105, 176, 187, 166, 173, 156, 151, 138, 129, 232, 227,-      254, 245, 196, 207, 210, 217, 123, 112, 109, 102,  87,  92,  65,-       74,  35,  40,  53,  62,  15,   4,  25,  18, 203, 192, 221, 214,-      231, 236, 241, 250, 147, 152, 133, 142, 191, 180, 169, 162, 246,-      253, 224, 235, 218, 209, 204, 199, 174, 165, 184, 179, 130, 137,-      148, 159,  70,  77,  80,  91, 106,  97, 124, 119,  30,  21,   8,-        3,  50,  57,  36,  47, 141, 134, 155, 144, 161, 170, 183, 188,-      213, 222, 195, 200, 249, 242, 239, 228,  61,  54,  43,  32,  17,-       26,   7,  12, 101, 110, 115, 120,  73,  66,  95,  84, 247, 252,-      225, 234, 219, 208, 205, 198, 175, 164, 185, 178, 131, 136, 149,-      158,  71,  76,  81,  90, 107,  96, 125, 118,  31,  20,   9,   2,-       51,  56,  37,  46, 140, 135, 154, 145, 160, 171, 182, 189, 212,-      223, 194, 201, 248, 243, 238, 229,  60,  55,  42,  33,  16,  27,-        6,  13, 100, 111, 114, 121,  72,  67,  94,  85,   1,  10,  23,-       28,  45,  38,  59,  48,  89,  82,  79,  68, 117, 126,  99, 104,-      177, 186, 167, 172, 157, 150, 139, 128, 233, 226, 255, 244, 197,-      206, 211, 216, 122, 113, 108, 103,  86,  93,  64,  75,  34,  41,-       52,  63,  14,   5,  24,  19, 202, 193, 220, 215, 230, 237, 240,-      251, 146, 153, 132, 143, 190, 181, 168, 163-  };-  static const SWord8 table8[] = {-        0,  13,  26,  23,  52,  57,  46,  35, 104, 101, 114, 127,  92,-       81,  70,  75, 208, 221, 202, 199, 228, 233, 254, 243, 184, 181,-      162, 175, 140, 129, 150, 155, 187, 182, 161, 172, 143, 130, 149,-      152, 211, 222, 201, 196, 231, 234, 253, 240, 107, 102, 113, 124,-       95,  82,  69,  72,   3,  14,  25,  20,  55,  58,  45,  32, 109,-       96, 119, 122,  89,  84,  67,  78,   5,   8,  31,  18,  49,  60,-       43,  38, 189, 176, 167, 170, 137, 132, 147, 158, 213, 216, 207,-      194, 225, 236, 251, 246, 214, 219, 204, 193, 226, 239, 248, 245,-      190, 179, 164, 169, 138, 135, 144, 157,   6,  11,  28,  17,  50,-       63,  40,  37, 110,  99, 116, 121,  90,  87,  64,  77, 218, 215,-      192, 205, 238, 227, 244, 249, 178, 191, 168, 165, 134, 139, 156,-      145,  10,   7,  16,  29,  62,  51,  36,  41,  98, 111, 120, 117,-       86,  91,  76,  65,  97, 108, 123, 118,  85,  88,  79,  66,   9,-        4,  19,  30,  61,  48,  39,  42, 177, 188, 171, 166, 133, 136,-      159, 146, 217, 212, 195, 206, 237, 224, 247, 250, 183, 186, 173,-      160, 131, 142, 153, 148, 223, 210, 197, 200, 235, 230, 241, 252,-      103, 106, 125, 112,  83,  94,  73,  68,  15,   2,  21,  24,  59,-       54,  33,  44,  12,   1,  22,  27,  56,  53,  34,  47, 100, 105,-      126, 115,  80,  93,  74,  71, 220, 209, 198, 203, 232, 229, 242,-      255, 180, 185, 174, 163, 128, 141, 154, 151-  };-  static const SWord8 table9[] = {-        0,   9,  18,  27,  36,  45,  54,  63,  72,  65,  90,  83, 108,-      101, 126, 119, 144, 153, 130, 139, 180, 189, 166, 175, 216, 209,-      202, 195, 252, 245, 238, 231,  59,  50,  41,  32,  31,  22,  13,-        4, 115, 122,  97, 104,  87,  94,  69,  76, 171, 162, 185, 176,-      143, 134, 157, 148, 227, 234, 241, 248, 199, 206, 213, 220, 118,-      127, 100, 109,  82,  91,  64,  73,  62,  55,  44,  37,  26,  19,-        8,   1, 230, 239, 244, 253, 194, 203, 208, 217, 174, 167, 188,-      181, 138, 131, 152, 145,  77,  68,  95,  86, 105,  96, 123, 114,-        5,  12,  23,  30,  33,  40,  51,  58, 221, 212, 207, 198, 249,-      240, 235, 226, 149, 156, 135, 142, 177, 184, 163, 170, 236, 229,-      254, 247, 200, 193, 218, 211, 164, 173, 182, 191, 128, 137, 146,-      155, 124, 117, 110, 103,  88,  81,  74,  67,  52,  61,  38,  47,-       16,  25,   2,  11, 215, 222, 197, 204, 243, 250, 225, 232, 159,-      150, 141, 132, 187, 178, 169, 160,  71,  78,  85,  92,  99, 106,-      113, 120,  15,   6,  29,  20,  43,  34,  57,  48, 154, 147, 136,-      129, 190, 183, 172, 165, 210, 219, 192, 201, 246, 255, 228, 237,-       10,   3,  24,  17,  46,  39,  60,  53,  66,  75,  80,  89, 102,-      111, 116, 125, 161, 168, 179, 186, 133, 140, 151, 158, 233, 224,-      251, 242, 205, 196, 223, 214,  49,  56,  35,  42,  21,  28,   7,-       14, 121, 112, 107,  98,  93,  84,  79,  70-  };-  const SWord32 s520 = (s7 << 8) | (s7 >> 24);-  const SWord8  s521 = (SWord8) (s520 >> 24);-  const SWord8  s522 = table2[s521];-  const SWord8  s523 = 1 ^ s522;-  const SWord8  s524 = (SWord8) (s520 >> 16);-  const SWord8  s525 = table2[s524];-  const SWord16 s526 = (((SWord16) s523) << 8) | ((SWord16) s525);-  const SWord8  s527 = (SWord8) (s520 >> 8);-  const SWord8  s528 = table2[s527];-  const SWord8  s529 = (SWord8) s520;-  const SWord8  s530 = table2[s529];-  const SWord16 s531 = (((SWord16) s528) << 8) | ((SWord16) s530);-  const SWord32 s532 = (((SWord32) s526) << 16) | ((SWord32) s531);-  const SWord32 s533 = s4 ^ s532;-  const SWord32 s534 = s5 ^ s533;-  const SWord32 s535 = s6 ^ s534;-  const SWord32 s536 = s7 ^ s535;-  const SWord32 s537 = (s536 << 8) | (s536 >> 24);-  const SWord8  s538 = (SWord8) (s537 >> 24);-  const SWord8  s539 = table2[s538];-  const SWord8  s540 = 2 ^ s539;-  const SWord8  s541 = (SWord8) (s537 >> 16);-  const SWord8  s542 = table2[s541];-  const SWord16 s543 = (((SWord16) s540) << 8) | ((SWord16) s542);-  const SWord8  s544 = (SWord8) (s537 >> 8);-  const SWord8  s545 = table2[s544];-  const SWord8  s546 = (SWord8) s537;-  const SWord8  s547 = table2[s546];-  const SWord16 s548 = (((SWord16) s545) << 8) | ((SWord16) s547);-  const SWord32 s549 = (((SWord32) s543) << 16) | ((SWord32) s548);-  const SWord32 s550 = s533 ^ s549;-  const SWord32 s551 = s534 ^ s550;-  const SWord32 s552 = s535 ^ s551;-  const SWord32 s553 = s536 ^ s552;-  const SWord32 s554 = (s553 << 8) | (s553 >> 24);-  const SWord8  s555 = (SWord8) (s554 >> 24);-  const SWord8  s556 = table2[s555];-  const SWord8  s557 = 4 ^ s556;-  const SWord8  s558 = (SWord8) (s554 >> 16);-  const SWord8  s559 = table2[s558];-  const SWord16 s560 = (((SWord16) s557) << 8) | ((SWord16) s559);-  const SWord8  s561 = (SWord8) (s554 >> 8);-  const SWord8  s562 = table2[s561];-  const SWord8  s563 = (SWord8) s554;-  const SWord8  s564 = table2[s563];-  const SWord16 s565 = (((SWord16) s562) << 8) | ((SWord16) s564);-  const SWord32 s566 = (((SWord32) s560) << 16) | ((SWord32) s565);-  const SWord32 s567 = s550 ^ s566;-  const SWord32 s568 = s551 ^ s567;-  const SWord32 s569 = s552 ^ s568;-  const SWord32 s570 = s553 ^ s569;-  const SWord32 s571 = (s570 << 8) | (s570 >> 24);-  const SWord8  s572 = (SWord8) (s571 >> 24);-  const SWord8  s573 = table2[s572];-  const SWord8  s574 = 8 ^ s573;-  const SWord8  s575 = (SWord8) (s571 >> 16);-  const SWord8  s576 = table2[s575];-  const SWord16 s577 = (((SWord16) s574) << 8) | ((SWord16) s576);-  const SWord8  s578 = (SWord8) (s571 >> 8);-  const SWord8  s579 = table2[s578];-  const SWord8  s580 = (SWord8) s571;-  const SWord8  s581 = table2[s580];-  const SWord16 s582 = (((SWord16) s579) << 8) | ((SWord16) s581);-  const SWord32 s583 = (((SWord32) s577) << 16) | ((SWord32) s582);-  const SWord32 s584 = s567 ^ s583;-  const SWord32 s585 = s568 ^ s584;-  const SWord32 s586 = s569 ^ s585;-  const SWord32 s587 = s570 ^ s586;-  const SWord32 s588 = (s587 << 8) | (s587 >> 24);-  const SWord8  s589 = (SWord8) (s588 >> 24);-  const SWord8  s590 = table2[s589];-  const SWord8  s591 = 16 ^ s590;-  const SWord8  s592 = (SWord8) (s588 >> 16);-  const SWord8  s593 = table2[s592];-  const SWord16 s594 = (((SWord16) s591) << 8) | ((SWord16) s593);-  const SWord8  s595 = (SWord8) (s588 >> 8);-  const SWord8  s596 = table2[s595];-  const SWord8  s597 = (SWord8) s588;-  const SWord8  s598 = table2[s597];-  const SWord16 s599 = (((SWord16) s596) << 8) | ((SWord16) s598);-  const SWord32 s600 = (((SWord32) s594) << 16) | ((SWord32) s599);-  const SWord32 s601 = s584 ^ s600;-  const SWord32 s602 = s585 ^ s601;-  const SWord32 s603 = s586 ^ s602;-  const SWord32 s604 = s587 ^ s603;-  const SWord32 s605 = (s604 << 8) | (s604 >> 24);-  const SWord8  s606 = (SWord8) (s605 >> 24);-  const SWord8  s607 = table2[s606];-  const SWord8  s608 = 32 ^ s607;-  const SWord8  s609 = (SWord8) (s605 >> 16);-  const SWord8  s610 = table2[s609];-  const SWord16 s611 = (((SWord16) s608) << 8) | ((SWord16) s610);-  const SWord8  s612 = (SWord8) (s605 >> 8);-  const SWord8  s613 = table2[s612];-  const SWord8  s614 = (SWord8) s605;-  const SWord8  s615 = table2[s614];-  const SWord16 s616 = (((SWord16) s613) << 8) | ((SWord16) s615);-  const SWord32 s617 = (((SWord32) s611) << 16) | ((SWord32) s616);-  const SWord32 s618 = s601 ^ s617;-  const SWord32 s619 = s602 ^ s618;-  const SWord32 s620 = s603 ^ s619;-  const SWord32 s621 = s604 ^ s620;-  const SWord32 s622 = (s621 << 8) | (s621 >> 24);-  const SWord8  s623 = (SWord8) (s622 >> 24);-  const SWord8  s624 = table2[s623];-  const SWord8  s625 = 64 ^ s624;-  const SWord8  s626 = (SWord8) (s622 >> 16);-  const SWord8  s627 = table2[s626];-  const SWord16 s628 = (((SWord16) s625) << 8) | ((SWord16) s627);-  const SWord8  s629 = (SWord8) (s622 >> 8);-  const SWord8  s630 = table2[s629];-  const SWord8  s631 = (SWord8) s622;-  const SWord8  s632 = table2[s631];-  const SWord16 s633 = (((SWord16) s630) << 8) | ((SWord16) s632);-  const SWord32 s634 = (((SWord32) s628) << 16) | ((SWord32) s633);-  const SWord32 s635 = s618 ^ s634;-  const SWord32 s636 = s619 ^ s635;-  const SWord32 s637 = s620 ^ s636;-  const SWord32 s638 = s621 ^ s637;-  const SWord32 s639 = (s638 << 8) | (s638 >> 24);-  const SWord8  s640 = (SWord8) (s639 >> 24);-  const SWord8  s641 = table2[s640];-  const SWord8  s642 = 128 ^ s641;-  const SWord8  s643 = (SWord8) (s639 >> 16);-  const SWord8  s644 = table2[s643];-  const SWord16 s645 = (((SWord16) s642) << 8) | ((SWord16) s644);-  const SWord8  s646 = (SWord8) (s639 >> 8);-  const SWord8  s647 = table2[s646];-  const SWord8  s648 = (SWord8) s639;-  const SWord8  s649 = table2[s648];-  const SWord16 s650 = (((SWord16) s647) << 8) | ((SWord16) s649);-  const SWord32 s651 = (((SWord32) s645) << 16) | ((SWord32) s650);-  const SWord32 s652 = s635 ^ s651;-  const SWord32 s653 = s636 ^ s652;-  const SWord32 s654 = s637 ^ s653;-  const SWord32 s655 = s638 ^ s654;-  const SWord32 s656 = (s655 << 8) | (s655 >> 24);-  const SWord8  s657 = (SWord8) (s656 >> 24);-  const SWord8  s658 = table2[s657];-  const SWord8  s659 = 27 ^ s658;-  const SWord8  s660 = (SWord8) (s656 >> 16);-  const SWord8  s661 = table2[s660];-  const SWord16 s662 = (((SWord16) s659) << 8) | ((SWord16) s661);-  const SWord8  s663 = (SWord8) (s656 >> 8);-  const SWord8  s664 = table2[s663];-  const SWord8  s665 = (SWord8) s656;-  const SWord8  s666 = table2[s665];-  const SWord16 s667 = (((SWord16) s664) << 8) | ((SWord16) s666);-  const SWord32 s668 = (((SWord32) s662) << 16) | ((SWord32) s667);-  const SWord32 s669 = s652 ^ s668;-  const SWord32 s670 = s653 ^ s669;-  const SWord32 s671 = s654 ^ s670;-  const SWord32 s672 = s655 ^ s671;-  const SWord32 s673 = (s672 << 8) | (s672 >> 24);-  const SWord8  s674 = (SWord8) (s673 >> 24);-  const SWord8  s675 = table2[s674];-  const SWord8  s676 = 54 ^ s675;-  const SWord8  s677 = (SWord8) (s673 >> 16);-  const SWord8  s678 = table2[s677];-  const SWord16 s679 = (((SWord16) s676) << 8) | ((SWord16) s678);-  const SWord8  s680 = (SWord8) (s673 >> 8);-  const SWord8  s681 = table2[s680];-  const SWord8  s682 = (SWord8) s673;-  const SWord8  s683 = table2[s682];-  const SWord16 s684 = (((SWord16) s681) << 8) | ((SWord16) s683);-  const SWord32 s685 = (((SWord32) s679) << 16) | ((SWord32) s684);-  const SWord32 s686 = s669 ^ s685;-  const SWord32 s687 = s0 ^ s686;-  const SWord8  s688 = (SWord8) (s687 >> 24);-  const SWord32 s689 = table1[s688];-  const SWord32 s945 = s670 ^ s686;-  const SWord32 s946 = s671 ^ s945;-  const SWord32 s947 = s672 ^ s946;-  const SWord32 s948 = s3 ^ s947;-  const SWord8  s949 = (SWord8) (s948 >> 16);-  const SWord32 s950 = table3[s949];-  const SWord32 s951 = s689 ^ s950;-  const SWord32 s1207 = s2 ^ s946;-  const SWord8  s1208 = (SWord8) (s1207 >> 8);-  const SWord32 s1209 = table4[s1208];-  const SWord32 s1210 = s951 ^ s1209;-  const SWord32 s1466 = s1 ^ s945;-  const SWord8  s1467 = (SWord8) s1466;-  const SWord32 s1468 = table5[s1467];-  const SWord32 s1469 = s1210 ^ s1468;-  const SWord8  s1470 = (SWord8) (s669 >> 24);-  const SWord8  s1471 = table6[s1470];-  const SWord8  s1472 = (SWord8) (s669 >> 16);-  const SWord8  s1473 = table7[s1472];-  const SWord8  s1474 = (SWord8) (s669 >> 8);-  const SWord8  s1475 = table8[s1474];-  const SWord8  s1476 = (SWord8) s669;-  const SWord8  s1477 = table9[s1476];-  const SWord8  s1478 = s1475 ^ s1477;-  const SWord8  s1479 = s1473 ^ s1478;-  const SWord8  s1480 = s1471 ^ s1479;-  const SWord8  s1481 = table9[s1470];-  const SWord8  s1482 = table6[s1472];-  const SWord8  s1483 = table7[s1474];-  const SWord8  s1484 = table8[s1476];-  const SWord8  s1485 = s1483 ^ s1484;-  const SWord8  s1486 = s1482 ^ s1485;-  const SWord8  s1487 = s1481 ^ s1486;-  const SWord16 s1488 = (((SWord16) s1480) << 8) | ((SWord16) s1487);-  const SWord8  s1489 = table8[s1470];-  const SWord8  s1490 = table9[s1472];-  const SWord8  s1491 = table6[s1474];-  const SWord8  s1492 = table7[s1476];-  const SWord8  s1493 = s1491 ^ s1492;-  const SWord8  s1494 = s1490 ^ s1493;-  const SWord8  s1495 = s1489 ^ s1494;-  const SWord8  s1496 = table7[s1470];-  const SWord8  s1497 = table8[s1472];-  const SWord8  s1498 = table9[s1474];-  const SWord8  s1499 = table6[s1476];-  const SWord8  s1500 = s1498 ^ s1499;-  const SWord8  s1501 = s1497 ^ s1500;-  const SWord8  s1502 = s1496 ^ s1501;-  const SWord16 s1503 = (((SWord16) s1495) << 8) | ((SWord16) s1502);-  const SWord32 s1504 = (((SWord32) s1488) << 16) | ((SWord32) s1503);-  const SWord32 s1505 = s1469 ^ s1504;-  const SWord8  s1506 = (SWord8) (s1505 >> 24);-  const SWord32 s1507 = table1[s1506];-  const SWord8  s1508 = (SWord8) (s948 >> 24);-  const SWord32 s1509 = table1[s1508];-  const SWord8  s1510 = (SWord8) (s1207 >> 16);-  const SWord32 s1511 = table3[s1510];-  const SWord32 s1512 = s1509 ^ s1511;-  const SWord8  s1513 = (SWord8) (s1466 >> 8);-  const SWord32 s1514 = table4[s1513];-  const SWord32 s1515 = s1512 ^ s1514;-  const SWord8  s1516 = (SWord8) s687;-  const SWord32 s1517 = table5[s1516];-  const SWord32 s1518 = s1515 ^ s1517;-  const SWord8  s1519 = (SWord8) (s672 >> 24);-  const SWord8  s1520 = table6[s1519];-  const SWord8  s1521 = (SWord8) (s672 >> 16);-  const SWord8  s1522 = table7[s1521];-  const SWord8  s1523 = (SWord8) (s672 >> 8);-  const SWord8  s1524 = table8[s1523];-  const SWord8  s1525 = (SWord8) s672;-  const SWord8  s1526 = table9[s1525];-  const SWord8  s1527 = s1524 ^ s1526;-  const SWord8  s1528 = s1522 ^ s1527;-  const SWord8  s1529 = s1520 ^ s1528;-  const SWord8  s1530 = table9[s1519];-  const SWord8  s1531 = table6[s1521];-  const SWord8  s1532 = table7[s1523];-  const SWord8  s1533 = table8[s1525];-  const SWord8  s1534 = s1532 ^ s1533;-  const SWord8  s1535 = s1531 ^ s1534;-  const SWord8  s1536 = s1530 ^ s1535;-  const SWord16 s1537 = (((SWord16) s1529) << 8) | ((SWord16) s1536);-  const SWord8  s1538 = table8[s1519];-  const SWord8  s1539 = table9[s1521];-  const SWord8  s1540 = table6[s1523];-  const SWord8  s1541 = table7[s1525];-  const SWord8  s1542 = s1540 ^ s1541;-  const SWord8  s1543 = s1539 ^ s1542;-  const SWord8  s1544 = s1538 ^ s1543;-  const SWord8  s1545 = table7[s1519];-  const SWord8  s1546 = table8[s1521];-  const SWord8  s1547 = table9[s1523];-  const SWord8  s1548 = table6[s1525];-  const SWord8  s1549 = s1547 ^ s1548;-  const SWord8  s1550 = s1546 ^ s1549;-  const SWord8  s1551 = s1545 ^ s1550;-  const SWord16 s1552 = (((SWord16) s1544) << 8) | ((SWord16) s1551);-  const SWord32 s1553 = (((SWord32) s1537) << 16) | ((SWord32) s1552);-  const SWord32 s1554 = s1518 ^ s1553;-  const SWord8  s1555 = (SWord8) (s1554 >> 16);-  const SWord32 s1556 = table3[s1555];-  const SWord32 s1557 = s1507 ^ s1556;-  const SWord8  s1558 = (SWord8) (s1207 >> 24);-  const SWord32 s1559 = table1[s1558];-  const SWord8  s1560 = (SWord8) (s1466 >> 16);-  const SWord32 s1561 = table3[s1560];-  const SWord32 s1562 = s1559 ^ s1561;-  const SWord8  s1563 = (SWord8) (s687 >> 8);-  const SWord32 s1564 = table4[s1563];-  const SWord32 s1565 = s1562 ^ s1564;-  const SWord8  s1566 = (SWord8) s948;-  const SWord32 s1567 = table5[s1566];-  const SWord32 s1568 = s1565 ^ s1567;-  const SWord8  s1569 = (SWord8) (s671 >> 24);-  const SWord8  s1570 = table6[s1569];-  const SWord8  s1571 = (SWord8) (s671 >> 16);-  const SWord8  s1572 = table7[s1571];-  const SWord8  s1573 = (SWord8) (s671 >> 8);-  const SWord8  s1574 = table8[s1573];-  const SWord8  s1575 = (SWord8) s671;-  const SWord8  s1576 = table9[s1575];-  const SWord8  s1577 = s1574 ^ s1576;-  const SWord8  s1578 = s1572 ^ s1577;-  const SWord8  s1579 = s1570 ^ s1578;-  const SWord8  s1580 = table9[s1569];-  const SWord8  s1581 = table6[s1571];-  const SWord8  s1582 = table7[s1573];-  const SWord8  s1583 = table8[s1575];-  const SWord8  s1584 = s1582 ^ s1583;-  const SWord8  s1585 = s1581 ^ s1584;-  const SWord8  s1586 = s1580 ^ s1585;-  const SWord16 s1587 = (((SWord16) s1579) << 8) | ((SWord16) s1586);-  const SWord8  s1588 = table8[s1569];-  const SWord8  s1589 = table9[s1571];-  const SWord8  s1590 = table6[s1573];-  const SWord8  s1591 = table7[s1575];-  const SWord8  s1592 = s1590 ^ s1591;-  const SWord8  s1593 = s1589 ^ s1592;-  const SWord8  s1594 = s1588 ^ s1593;-  const SWord8  s1595 = table7[s1569];-  const SWord8  s1596 = table8[s1571];-  const SWord8  s1597 = table9[s1573];-  const SWord8  s1598 = table6[s1575];-  const SWord8  s1599 = s1597 ^ s1598;-  const SWord8  s1600 = s1596 ^ s1599;-  const SWord8  s1601 = s1595 ^ s1600;-  const SWord16 s1602 = (((SWord16) s1594) << 8) | ((SWord16) s1601);-  const SWord32 s1603 = (((SWord32) s1587) << 16) | ((SWord32) s1602);-  const SWord32 s1604 = s1568 ^ s1603;-  const SWord8  s1605 = (SWord8) (s1604 >> 8);-  const SWord32 s1606 = table4[s1605];-  const SWord32 s1607 = s1557 ^ s1606;-  const SWord8  s1608 = (SWord8) (s1466 >> 24);-  const SWord32 s1609 = table1[s1608];-  const SWord8  s1610 = (SWord8) (s687 >> 16);-  const SWord32 s1611 = table3[s1610];-  const SWord32 s1612 = s1609 ^ s1611;-  const SWord8  s1613 = (SWord8) (s948 >> 8);-  const SWord32 s1614 = table4[s1613];-  const SWord32 s1615 = s1612 ^ s1614;-  const SWord8  s1616 = (SWord8) s1207;-  const SWord32 s1617 = table5[s1616];-  const SWord32 s1618 = s1615 ^ s1617;-  const SWord8  s1619 = (SWord8) (s670 >> 24);-  const SWord8  s1620 = table6[s1619];-  const SWord8  s1621 = (SWord8) (s670 >> 16);-  const SWord8  s1622 = table7[s1621];-  const SWord8  s1623 = (SWord8) (s670 >> 8);-  const SWord8  s1624 = table8[s1623];-  const SWord8  s1625 = (SWord8) s670;-  const SWord8  s1626 = table9[s1625];-  const SWord8  s1627 = s1624 ^ s1626;-  const SWord8  s1628 = s1622 ^ s1627;-  const SWord8  s1629 = s1620 ^ s1628;-  const SWord8  s1630 = table9[s1619];-  const SWord8  s1631 = table6[s1621];-  const SWord8  s1632 = table7[s1623];-  const SWord8  s1633 = table8[s1625];-  const SWord8  s1634 = s1632 ^ s1633;-  const SWord8  s1635 = s1631 ^ s1634;-  const SWord8  s1636 = s1630 ^ s1635;-  const SWord16 s1637 = (((SWord16) s1629) << 8) | ((SWord16) s1636);-  const SWord8  s1638 = table8[s1619];-  const SWord8  s1639 = table9[s1621];-  const SWord8  s1640 = table6[s1623];-  const SWord8  s1641 = table7[s1625];-  const SWord8  s1642 = s1640 ^ s1641;-  const SWord8  s1643 = s1639 ^ s1642;-  const SWord8  s1644 = s1638 ^ s1643;-  const SWord8  s1645 = table7[s1619];-  const SWord8  s1646 = table8[s1621];-  const SWord8  s1647 = table9[s1623];-  const SWord8  s1648 = table6[s1625];-  const SWord8  s1649 = s1647 ^ s1648;-  const SWord8  s1650 = s1646 ^ s1649;-  const SWord8  s1651 = s1645 ^ s1650;-  const SWord16 s1652 = (((SWord16) s1644) << 8) | ((SWord16) s1651);-  const SWord32 s1653 = (((SWord32) s1637) << 16) | ((SWord32) s1652);-  const SWord32 s1654 = s1618 ^ s1653;-  const SWord8  s1655 = (SWord8) s1654;-  const SWord32 s1656 = table5[s1655];-  const SWord32 s1657 = s1607 ^ s1656;-  const SWord8  s1658 = (SWord8) (s652 >> 24);-  const SWord8  s1659 = table6[s1658];-  const SWord8  s1660 = (SWord8) (s652 >> 16);-  const SWord8  s1661 = table7[s1660];-  const SWord8  s1662 = (SWord8) (s652 >> 8);-  const SWord8  s1663 = table8[s1662];-  const SWord8  s1664 = (SWord8) s652;-  const SWord8  s1665 = table9[s1664];-  const SWord8  s1666 = s1663 ^ s1665;-  const SWord8  s1667 = s1661 ^ s1666;-  const SWord8  s1668 = s1659 ^ s1667;-  const SWord8  s1669 = table9[s1658];-  const SWord8  s1670 = table6[s1660];-  const SWord8  s1671 = table7[s1662];-  const SWord8  s1672 = table8[s1664];-  const SWord8  s1673 = s1671 ^ s1672;-  const SWord8  s1674 = s1670 ^ s1673;-  const SWord8  s1675 = s1669 ^ s1674;-  const SWord16 s1676 = (((SWord16) s1668) << 8) | ((SWord16) s1675);-  const SWord8  s1677 = table8[s1658];-  const SWord8  s1678 = table9[s1660];-  const SWord8  s1679 = table6[s1662];-  const SWord8  s1680 = table7[s1664];-  const SWord8  s1681 = s1679 ^ s1680;-  const SWord8  s1682 = s1678 ^ s1681;-  const SWord8  s1683 = s1677 ^ s1682;-  const SWord8  s1684 = table7[s1658];-  const SWord8  s1685 = table8[s1660];-  const SWord8  s1686 = table9[s1662];-  const SWord8  s1687 = table6[s1664];-  const SWord8  s1688 = s1686 ^ s1687;-  const SWord8  s1689 = s1685 ^ s1688;-  const SWord8  s1690 = s1684 ^ s1689;-  const SWord16 s1691 = (((SWord16) s1683) << 8) | ((SWord16) s1690);-  const SWord32 s1692 = (((SWord32) s1676) << 16) | ((SWord32) s1691);-  const SWord32 s1693 = s1657 ^ s1692;-  const SWord8  s1694 = (SWord8) (s1693 >> 24);-  const SWord32 s1695 = table1[s1694];-  const SWord8  s1696 = (SWord8) (s1554 >> 24);-  const SWord32 s1697 = table1[s1696];-  const SWord8  s1698 = (SWord8) (s1604 >> 16);-  const SWord32 s1699 = table3[s1698];-  const SWord32 s1700 = s1697 ^ s1699;-  const SWord8  s1701 = (SWord8) (s1654 >> 8);-  const SWord32 s1702 = table4[s1701];-  const SWord32 s1703 = s1700 ^ s1702;-  const SWord8  s1704 = (SWord8) s1505;-  const SWord32 s1705 = table5[s1704];-  const SWord32 s1706 = s1703 ^ s1705;-  const SWord8  s1707 = (SWord8) (s655 >> 24);-  const SWord8  s1708 = table6[s1707];-  const SWord8  s1709 = (SWord8) (s655 >> 16);-  const SWord8  s1710 = table7[s1709];-  const SWord8  s1711 = (SWord8) (s655 >> 8);-  const SWord8  s1712 = table8[s1711];-  const SWord8  s1713 = (SWord8) s655;-  const SWord8  s1714 = table9[s1713];-  const SWord8  s1715 = s1712 ^ s1714;-  const SWord8  s1716 = s1710 ^ s1715;-  const SWord8  s1717 = s1708 ^ s1716;-  const SWord8  s1718 = table9[s1707];-  const SWord8  s1719 = table6[s1709];-  const SWord8  s1720 = table7[s1711];-  const SWord8  s1721 = table8[s1713];-  const SWord8  s1722 = s1720 ^ s1721;-  const SWord8  s1723 = s1719 ^ s1722;-  const SWord8  s1724 = s1718 ^ s1723;-  const SWord16 s1725 = (((SWord16) s1717) << 8) | ((SWord16) s1724);-  const SWord8  s1726 = table8[s1707];-  const SWord8  s1727 = table9[s1709];-  const SWord8  s1728 = table6[s1711];-  const SWord8  s1729 = table7[s1713];-  const SWord8  s1730 = s1728 ^ s1729;-  const SWord8  s1731 = s1727 ^ s1730;-  const SWord8  s1732 = s1726 ^ s1731;-  const SWord8  s1733 = table7[s1707];-  const SWord8  s1734 = table8[s1709];-  const SWord8  s1735 = table9[s1711];-  const SWord8  s1736 = table6[s1713];-  const SWord8  s1737 = s1735 ^ s1736;-  const SWord8  s1738 = s1734 ^ s1737;-  const SWord8  s1739 = s1733 ^ s1738;-  const SWord16 s1740 = (((SWord16) s1732) << 8) | ((SWord16) s1739);-  const SWord32 s1741 = (((SWord32) s1725) << 16) | ((SWord32) s1740);-  const SWord32 s1742 = s1706 ^ s1741;-  const SWord8  s1743 = (SWord8) (s1742 >> 16);-  const SWord32 s1744 = table3[s1743];-  const SWord32 s1745 = s1695 ^ s1744;-  const SWord8  s1746 = (SWord8) (s1604 >> 24);-  const SWord32 s1747 = table1[s1746];-  const SWord8  s1748 = (SWord8) (s1654 >> 16);-  const SWord32 s1749 = table3[s1748];-  const SWord32 s1750 = s1747 ^ s1749;-  const SWord8  s1751 = (SWord8) (s1505 >> 8);-  const SWord32 s1752 = table4[s1751];-  const SWord32 s1753 = s1750 ^ s1752;-  const SWord8  s1754 = (SWord8) s1554;-  const SWord32 s1755 = table5[s1754];-  const SWord32 s1756 = s1753 ^ s1755;-  const SWord8  s1757 = (SWord8) (s654 >> 24);-  const SWord8  s1758 = table6[s1757];-  const SWord8  s1759 = (SWord8) (s654 >> 16);-  const SWord8  s1760 = table7[s1759];-  const SWord8  s1761 = (SWord8) (s654 >> 8);-  const SWord8  s1762 = table8[s1761];-  const SWord8  s1763 = (SWord8) s654;-  const SWord8  s1764 = table9[s1763];-  const SWord8  s1765 = s1762 ^ s1764;-  const SWord8  s1766 = s1760 ^ s1765;-  const SWord8  s1767 = s1758 ^ s1766;-  const SWord8  s1768 = table9[s1757];-  const SWord8  s1769 = table6[s1759];-  const SWord8  s1770 = table7[s1761];-  const SWord8  s1771 = table8[s1763];-  const SWord8  s1772 = s1770 ^ s1771;-  const SWord8  s1773 = s1769 ^ s1772;-  const SWord8  s1774 = s1768 ^ s1773;-  const SWord16 s1775 = (((SWord16) s1767) << 8) | ((SWord16) s1774);-  const SWord8  s1776 = table8[s1757];-  const SWord8  s1777 = table9[s1759];-  const SWord8  s1778 = table6[s1761];-  const SWord8  s1779 = table7[s1763];-  const SWord8  s1780 = s1778 ^ s1779;-  const SWord8  s1781 = s1777 ^ s1780;-  const SWord8  s1782 = s1776 ^ s1781;-  const SWord8  s1783 = table7[s1757];-  const SWord8  s1784 = table8[s1759];-  const SWord8  s1785 = table9[s1761];-  const SWord8  s1786 = table6[s1763];-  const SWord8  s1787 = s1785 ^ s1786;-  const SWord8  s1788 = s1784 ^ s1787;-  const SWord8  s1789 = s1783 ^ s1788;-  const SWord16 s1790 = (((SWord16) s1782) << 8) | ((SWord16) s1789);-  const SWord32 s1791 = (((SWord32) s1775) << 16) | ((SWord32) s1790);-  const SWord32 s1792 = s1756 ^ s1791;-  const SWord8  s1793 = (SWord8) (s1792 >> 8);-  const SWord32 s1794 = table4[s1793];-  const SWord32 s1795 = s1745 ^ s1794;-  const SWord8  s1796 = (SWord8) (s1654 >> 24);-  const SWord32 s1797 = table1[s1796];-  const SWord8  s1798 = (SWord8) (s1505 >> 16);-  const SWord32 s1799 = table3[s1798];-  const SWord32 s1800 = s1797 ^ s1799;-  const SWord8  s1801 = (SWord8) (s1554 >> 8);-  const SWord32 s1802 = table4[s1801];-  const SWord32 s1803 = s1800 ^ s1802;-  const SWord8  s1804 = (SWord8) s1604;-  const SWord32 s1805 = table5[s1804];-  const SWord32 s1806 = s1803 ^ s1805;-  const SWord8  s1807 = (SWord8) (s653 >> 24);-  const SWord8  s1808 = table6[s1807];-  const SWord8  s1809 = (SWord8) (s653 >> 16);-  const SWord8  s1810 = table7[s1809];-  const SWord8  s1811 = (SWord8) (s653 >> 8);-  const SWord8  s1812 = table8[s1811];-  const SWord8  s1813 = (SWord8) s653;-  const SWord8  s1814 = table9[s1813];-  const SWord8  s1815 = s1812 ^ s1814;-  const SWord8  s1816 = s1810 ^ s1815;-  const SWord8  s1817 = s1808 ^ s1816;-  const SWord8  s1818 = table9[s1807];-  const SWord8  s1819 = table6[s1809];-  const SWord8  s1820 = table7[s1811];-  const SWord8  s1821 = table8[s1813];-  const SWord8  s1822 = s1820 ^ s1821;-  const SWord8  s1823 = s1819 ^ s1822;-  const SWord8  s1824 = s1818 ^ s1823;-  const SWord16 s1825 = (((SWord16) s1817) << 8) | ((SWord16) s1824);-  const SWord8  s1826 = table8[s1807];-  const SWord8  s1827 = table9[s1809];-  const SWord8  s1828 = table6[s1811];-  const SWord8  s1829 = table7[s1813];-  const SWord8  s1830 = s1828 ^ s1829;-  const SWord8  s1831 = s1827 ^ s1830;-  const SWord8  s1832 = s1826 ^ s1831;-  const SWord8  s1833 = table7[s1807];-  const SWord8  s1834 = table8[s1809];-  const SWord8  s1835 = table9[s1811];-  const SWord8  s1836 = table6[s1813];-  const SWord8  s1837 = s1835 ^ s1836;-  const SWord8  s1838 = s1834 ^ s1837;-  const SWord8  s1839 = s1833 ^ s1838;-  const SWord16 s1840 = (((SWord16) s1832) << 8) | ((SWord16) s1839);-  const SWord32 s1841 = (((SWord32) s1825) << 16) | ((SWord32) s1840);-  const SWord32 s1842 = s1806 ^ s1841;-  const SWord8  s1843 = (SWord8) s1842;-  const SWord32 s1844 = table5[s1843];-  const SWord32 s1845 = s1795 ^ s1844;-  const SWord8  s1846 = (SWord8) (s635 >> 24);-  const SWord8  s1847 = table6[s1846];-  const SWord8  s1848 = (SWord8) (s635 >> 16);-  const SWord8  s1849 = table7[s1848];-  const SWord8  s1850 = (SWord8) (s635 >> 8);-  const SWord8  s1851 = table8[s1850];-  const SWord8  s1852 = (SWord8) s635;-  const SWord8  s1853 = table9[s1852];-  const SWord8  s1854 = s1851 ^ s1853;-  const SWord8  s1855 = s1849 ^ s1854;-  const SWord8  s1856 = s1847 ^ s1855;-  const SWord8  s1857 = table9[s1846];-  const SWord8  s1858 = table6[s1848];-  const SWord8  s1859 = table7[s1850];-  const SWord8  s1860 = table8[s1852];-  const SWord8  s1861 = s1859 ^ s1860;-  const SWord8  s1862 = s1858 ^ s1861;-  const SWord8  s1863 = s1857 ^ s1862;-  const SWord16 s1864 = (((SWord16) s1856) << 8) | ((SWord16) s1863);-  const SWord8  s1865 = table8[s1846];-  const SWord8  s1866 = table9[s1848];-  const SWord8  s1867 = table6[s1850];-  const SWord8  s1868 = table7[s1852];-  const SWord8  s1869 = s1867 ^ s1868;-  const SWord8  s1870 = s1866 ^ s1869;-  const SWord8  s1871 = s1865 ^ s1870;-  const SWord8  s1872 = table7[s1846];-  const SWord8  s1873 = table8[s1848];-  const SWord8  s1874 = table9[s1850];-  const SWord8  s1875 = table6[s1852];-  const SWord8  s1876 = s1874 ^ s1875;-  const SWord8  s1877 = s1873 ^ s1876;-  const SWord8  s1878 = s1872 ^ s1877;-  const SWord16 s1879 = (((SWord16) s1871) << 8) | ((SWord16) s1878);-  const SWord32 s1880 = (((SWord32) s1864) << 16) | ((SWord32) s1879);-  const SWord32 s1881 = s1845 ^ s1880;-  const SWord8  s1882 = (SWord8) (s1881 >> 24);-  const SWord32 s1883 = table1[s1882];-  const SWord8  s1884 = (SWord8) (s1742 >> 24);-  const SWord32 s1885 = table1[s1884];-  const SWord8  s1886 = (SWord8) (s1792 >> 16);-  const SWord32 s1887 = table3[s1886];-  const SWord32 s1888 = s1885 ^ s1887;-  const SWord8  s1889 = (SWord8) (s1842 >> 8);-  const SWord32 s1890 = table4[s1889];-  const SWord32 s1891 = s1888 ^ s1890;-  const SWord8  s1892 = (SWord8) s1693;-  const SWord32 s1893 = table5[s1892];-  const SWord32 s1894 = s1891 ^ s1893;-  const SWord8  s1895 = (SWord8) (s638 >> 24);-  const SWord8  s1896 = table6[s1895];-  const SWord8  s1897 = (SWord8) (s638 >> 16);-  const SWord8  s1898 = table7[s1897];-  const SWord8  s1899 = (SWord8) (s638 >> 8);-  const SWord8  s1900 = table8[s1899];-  const SWord8  s1901 = (SWord8) s638;-  const SWord8  s1902 = table9[s1901];-  const SWord8  s1903 = s1900 ^ s1902;-  const SWord8  s1904 = s1898 ^ s1903;-  const SWord8  s1905 = s1896 ^ s1904;-  const SWord8  s1906 = table9[s1895];-  const SWord8  s1907 = table6[s1897];-  const SWord8  s1908 = table7[s1899];-  const SWord8  s1909 = table8[s1901];-  const SWord8  s1910 = s1908 ^ s1909;-  const SWord8  s1911 = s1907 ^ s1910;-  const SWord8  s1912 = s1906 ^ s1911;-  const SWord16 s1913 = (((SWord16) s1905) << 8) | ((SWord16) s1912);-  const SWord8  s1914 = table8[s1895];-  const SWord8  s1915 = table9[s1897];-  const SWord8  s1916 = table6[s1899];-  const SWord8  s1917 = table7[s1901];-  const SWord8  s1918 = s1916 ^ s1917;-  const SWord8  s1919 = s1915 ^ s1918;-  const SWord8  s1920 = s1914 ^ s1919;-  const SWord8  s1921 = table7[s1895];-  const SWord8  s1922 = table8[s1897];-  const SWord8  s1923 = table9[s1899];-  const SWord8  s1924 = table6[s1901];-  const SWord8  s1925 = s1923 ^ s1924;-  const SWord8  s1926 = s1922 ^ s1925;-  const SWord8  s1927 = s1921 ^ s1926;-  const SWord16 s1928 = (((SWord16) s1920) << 8) | ((SWord16) s1927);-  const SWord32 s1929 = (((SWord32) s1913) << 16) | ((SWord32) s1928);-  const SWord32 s1930 = s1894 ^ s1929;-  const SWord8  s1931 = (SWord8) (s1930 >> 16);-  const SWord32 s1932 = table3[s1931];-  const SWord32 s1933 = s1883 ^ s1932;-  const SWord8  s1934 = (SWord8) (s1792 >> 24);-  const SWord32 s1935 = table1[s1934];-  const SWord8  s1936 = (SWord8) (s1842 >> 16);-  const SWord32 s1937 = table3[s1936];-  const SWord32 s1938 = s1935 ^ s1937;-  const SWord8  s1939 = (SWord8) (s1693 >> 8);-  const SWord32 s1940 = table4[s1939];-  const SWord32 s1941 = s1938 ^ s1940;-  const SWord8  s1942 = (SWord8) s1742;-  const SWord32 s1943 = table5[s1942];-  const SWord32 s1944 = s1941 ^ s1943;-  const SWord8  s1945 = (SWord8) (s637 >> 24);-  const SWord8  s1946 = table6[s1945];-  const SWord8  s1947 = (SWord8) (s637 >> 16);-  const SWord8  s1948 = table7[s1947];-  const SWord8  s1949 = (SWord8) (s637 >> 8);-  const SWord8  s1950 = table8[s1949];-  const SWord8  s1951 = (SWord8) s637;-  const SWord8  s1952 = table9[s1951];-  const SWord8  s1953 = s1950 ^ s1952;-  const SWord8  s1954 = s1948 ^ s1953;-  const SWord8  s1955 = s1946 ^ s1954;-  const SWord8  s1956 = table9[s1945];-  const SWord8  s1957 = table6[s1947];-  const SWord8  s1958 = table7[s1949];-  const SWord8  s1959 = table8[s1951];-  const SWord8  s1960 = s1958 ^ s1959;-  const SWord8  s1961 = s1957 ^ s1960;-  const SWord8  s1962 = s1956 ^ s1961;-  const SWord16 s1963 = (((SWord16) s1955) << 8) | ((SWord16) s1962);-  const SWord8  s1964 = table8[s1945];-  const SWord8  s1965 = table9[s1947];-  const SWord8  s1966 = table6[s1949];-  const SWord8  s1967 = table7[s1951];-  const SWord8  s1968 = s1966 ^ s1967;-  const SWord8  s1969 = s1965 ^ s1968;-  const SWord8  s1970 = s1964 ^ s1969;-  const SWord8  s1971 = table7[s1945];-  const SWord8  s1972 = table8[s1947];-  const SWord8  s1973 = table9[s1949];-  const SWord8  s1974 = table6[s1951];-  const SWord8  s1975 = s1973 ^ s1974;-  const SWord8  s1976 = s1972 ^ s1975;-  const SWord8  s1977 = s1971 ^ s1976;-  const SWord16 s1978 = (((SWord16) s1970) << 8) | ((SWord16) s1977);-  const SWord32 s1979 = (((SWord32) s1963) << 16) | ((SWord32) s1978);-  const SWord32 s1980 = s1944 ^ s1979;-  const SWord8  s1981 = (SWord8) (s1980 >> 8);-  const SWord32 s1982 = table4[s1981];-  const SWord32 s1983 = s1933 ^ s1982;-  const SWord8  s1984 = (SWord8) (s1842 >> 24);-  const SWord32 s1985 = table1[s1984];-  const SWord8  s1986 = (SWord8) (s1693 >> 16);-  const SWord32 s1987 = table3[s1986];-  const SWord32 s1988 = s1985 ^ s1987;-  const SWord8  s1989 = (SWord8) (s1742 >> 8);-  const SWord32 s1990 = table4[s1989];-  const SWord32 s1991 = s1988 ^ s1990;-  const SWord8  s1992 = (SWord8) s1792;-  const SWord32 s1993 = table5[s1992];-  const SWord32 s1994 = s1991 ^ s1993;-  const SWord8  s1995 = (SWord8) (s636 >> 24);-  const SWord8  s1996 = table6[s1995];-  const SWord8  s1997 = (SWord8) (s636 >> 16);-  const SWord8  s1998 = table7[s1997];-  const SWord8  s1999 = (SWord8) (s636 >> 8);-  const SWord8  s2000 = table8[s1999];-  const SWord8  s2001 = (SWord8) s636;-  const SWord8  s2002 = table9[s2001];-  const SWord8  s2003 = s2000 ^ s2002;-  const SWord8  s2004 = s1998 ^ s2003;-  const SWord8  s2005 = s1996 ^ s2004;-  const SWord8  s2006 = table9[s1995];-  const SWord8  s2007 = table6[s1997];-  const SWord8  s2008 = table7[s1999];-  const SWord8  s2009 = table8[s2001];-  const SWord8  s2010 = s2008 ^ s2009;-  const SWord8  s2011 = s2007 ^ s2010;-  const SWord8  s2012 = s2006 ^ s2011;-  const SWord16 s2013 = (((SWord16) s2005) << 8) | ((SWord16) s2012);-  const SWord8  s2014 = table8[s1995];-  const SWord8  s2015 = table9[s1997];-  const SWord8  s2016 = table6[s1999];-  const SWord8  s2017 = table7[s2001];-  const SWord8  s2018 = s2016 ^ s2017;-  const SWord8  s2019 = s2015 ^ s2018;-  const SWord8  s2020 = s2014 ^ s2019;-  const SWord8  s2021 = table7[s1995];-  const SWord8  s2022 = table8[s1997];-  const SWord8  s2023 = table9[s1999];-  const SWord8  s2024 = table6[s2001];-  const SWord8  s2025 = s2023 ^ s2024;-  const SWord8  s2026 = s2022 ^ s2025;-  const SWord8  s2027 = s2021 ^ s2026;-  const SWord16 s2028 = (((SWord16) s2020) << 8) | ((SWord16) s2027);-  const SWord32 s2029 = (((SWord32) s2013) << 16) | ((SWord32) s2028);-  const SWord32 s2030 = s1994 ^ s2029;-  const SWord8  s2031 = (SWord8) s2030;-  const SWord32 s2032 = table5[s2031];-  const SWord32 s2033 = s1983 ^ s2032;-  const SWord8  s2034 = (SWord8) (s618 >> 24);-  const SWord8  s2035 = table6[s2034];-  const SWord8  s2036 = (SWord8) (s618 >> 16);-  const SWord8  s2037 = table7[s2036];-  const SWord8  s2038 = (SWord8) (s618 >> 8);-  const SWord8  s2039 = table8[s2038];-  const SWord8  s2040 = (SWord8) s618;-  const SWord8  s2041 = table9[s2040];-  const SWord8  s2042 = s2039 ^ s2041;-  const SWord8  s2043 = s2037 ^ s2042;-  const SWord8  s2044 = s2035 ^ s2043;-  const SWord8  s2045 = table9[s2034];-  const SWord8  s2046 = table6[s2036];-  const SWord8  s2047 = table7[s2038];-  const SWord8  s2048 = table8[s2040];-  const SWord8  s2049 = s2047 ^ s2048;-  const SWord8  s2050 = s2046 ^ s2049;-  const SWord8  s2051 = s2045 ^ s2050;-  const SWord16 s2052 = (((SWord16) s2044) << 8) | ((SWord16) s2051);-  const SWord8  s2053 = table8[s2034];-  const SWord8  s2054 = table9[s2036];-  const SWord8  s2055 = table6[s2038];-  const SWord8  s2056 = table7[s2040];-  const SWord8  s2057 = s2055 ^ s2056;-  const SWord8  s2058 = s2054 ^ s2057;-  const SWord8  s2059 = s2053 ^ s2058;-  const SWord8  s2060 = table7[s2034];-  const SWord8  s2061 = table8[s2036];-  const SWord8  s2062 = table9[s2038];-  const SWord8  s2063 = table6[s2040];-  const SWord8  s2064 = s2062 ^ s2063;-  const SWord8  s2065 = s2061 ^ s2064;-  const SWord8  s2066 = s2060 ^ s2065;-  const SWord16 s2067 = (((SWord16) s2059) << 8) | ((SWord16) s2066);-  const SWord32 s2068 = (((SWord32) s2052) << 16) | ((SWord32) s2067);-  const SWord32 s2069 = s2033 ^ s2068;-  const SWord8  s2070 = (SWord8) (s2069 >> 24);-  const SWord32 s2071 = table1[s2070];-  const SWord8  s2072 = (SWord8) (s1930 >> 24);-  const SWord32 s2073 = table1[s2072];-  const SWord8  s2074 = (SWord8) (s1980 >> 16);-  const SWord32 s2075 = table3[s2074];-  const SWord32 s2076 = s2073 ^ s2075;-  const SWord8  s2077 = (SWord8) (s2030 >> 8);-  const SWord32 s2078 = table4[s2077];-  const SWord32 s2079 = s2076 ^ s2078;-  const SWord8  s2080 = (SWord8) s1881;-  const SWord32 s2081 = table5[s2080];-  const SWord32 s2082 = s2079 ^ s2081;-  const SWord8  s2083 = (SWord8) (s621 >> 24);-  const SWord8  s2084 = table6[s2083];-  const SWord8  s2085 = (SWord8) (s621 >> 16);-  const SWord8  s2086 = table7[s2085];-  const SWord8  s2087 = (SWord8) (s621 >> 8);-  const SWord8  s2088 = table8[s2087];-  const SWord8  s2089 = (SWord8) s621;-  const SWord8  s2090 = table9[s2089];-  const SWord8  s2091 = s2088 ^ s2090;-  const SWord8  s2092 = s2086 ^ s2091;-  const SWord8  s2093 = s2084 ^ s2092;-  const SWord8  s2094 = table9[s2083];-  const SWord8  s2095 = table6[s2085];-  const SWord8  s2096 = table7[s2087];-  const SWord8  s2097 = table8[s2089];-  const SWord8  s2098 = s2096 ^ s2097;-  const SWord8  s2099 = s2095 ^ s2098;-  const SWord8  s2100 = s2094 ^ s2099;-  const SWord16 s2101 = (((SWord16) s2093) << 8) | ((SWord16) s2100);-  const SWord8  s2102 = table8[s2083];-  const SWord8  s2103 = table9[s2085];-  const SWord8  s2104 = table6[s2087];-  const SWord8  s2105 = table7[s2089];-  const SWord8  s2106 = s2104 ^ s2105;-  const SWord8  s2107 = s2103 ^ s2106;-  const SWord8  s2108 = s2102 ^ s2107;-  const SWord8  s2109 = table7[s2083];-  const SWord8  s2110 = table8[s2085];-  const SWord8  s2111 = table9[s2087];-  const SWord8  s2112 = table6[s2089];-  const SWord8  s2113 = s2111 ^ s2112;-  const SWord8  s2114 = s2110 ^ s2113;-  const SWord8  s2115 = s2109 ^ s2114;-  const SWord16 s2116 = (((SWord16) s2108) << 8) | ((SWord16) s2115);-  const SWord32 s2117 = (((SWord32) s2101) << 16) | ((SWord32) s2116);-  const SWord32 s2118 = s2082 ^ s2117;-  const SWord8  s2119 = (SWord8) (s2118 >> 16);-  const SWord32 s2120 = table3[s2119];-  const SWord32 s2121 = s2071 ^ s2120;-  const SWord8  s2122 = (SWord8) (s1980 >> 24);-  const SWord32 s2123 = table1[s2122];-  const SWord8  s2124 = (SWord8) (s2030 >> 16);-  const SWord32 s2125 = table3[s2124];-  const SWord32 s2126 = s2123 ^ s2125;-  const SWord8  s2127 = (SWord8) (s1881 >> 8);-  const SWord32 s2128 = table4[s2127];-  const SWord32 s2129 = s2126 ^ s2128;-  const SWord8  s2130 = (SWord8) s1930;-  const SWord32 s2131 = table5[s2130];-  const SWord32 s2132 = s2129 ^ s2131;-  const SWord8  s2133 = (SWord8) (s620 >> 24);-  const SWord8  s2134 = table6[s2133];-  const SWord8  s2135 = (SWord8) (s620 >> 16);-  const SWord8  s2136 = table7[s2135];-  const SWord8  s2137 = (SWord8) (s620 >> 8);-  const SWord8  s2138 = table8[s2137];-  const SWord8  s2139 = (SWord8) s620;-  const SWord8  s2140 = table9[s2139];-  const SWord8  s2141 = s2138 ^ s2140;-  const SWord8  s2142 = s2136 ^ s2141;-  const SWord8  s2143 = s2134 ^ s2142;-  const SWord8  s2144 = table9[s2133];-  const SWord8  s2145 = table6[s2135];-  const SWord8  s2146 = table7[s2137];-  const SWord8  s2147 = table8[s2139];-  const SWord8  s2148 = s2146 ^ s2147;-  const SWord8  s2149 = s2145 ^ s2148;-  const SWord8  s2150 = s2144 ^ s2149;-  const SWord16 s2151 = (((SWord16) s2143) << 8) | ((SWord16) s2150);-  const SWord8  s2152 = table8[s2133];-  const SWord8  s2153 = table9[s2135];-  const SWord8  s2154 = table6[s2137];-  const SWord8  s2155 = table7[s2139];-  const SWord8  s2156 = s2154 ^ s2155;-  const SWord8  s2157 = s2153 ^ s2156;-  const SWord8  s2158 = s2152 ^ s2157;-  const SWord8  s2159 = table7[s2133];-  const SWord8  s2160 = table8[s2135];-  const SWord8  s2161 = table9[s2137];-  const SWord8  s2162 = table6[s2139];-  const SWord8  s2163 = s2161 ^ s2162;-  const SWord8  s2164 = s2160 ^ s2163;-  const SWord8  s2165 = s2159 ^ s2164;-  const SWord16 s2166 = (((SWord16) s2158) << 8) | ((SWord16) s2165);-  const SWord32 s2167 = (((SWord32) s2151) << 16) | ((SWord32) s2166);-  const SWord32 s2168 = s2132 ^ s2167;-  const SWord8  s2169 = (SWord8) (s2168 >> 8);-  const SWord32 s2170 = table4[s2169];-  const SWord32 s2171 = s2121 ^ s2170;-  const SWord8  s2172 = (SWord8) (s2030 >> 24);-  const SWord32 s2173 = table1[s2172];-  const SWord8  s2174 = (SWord8) (s1881 >> 16);-  const SWord32 s2175 = table3[s2174];-  const SWord32 s2176 = s2173 ^ s2175;-  const SWord8  s2177 = (SWord8) (s1930 >> 8);-  const SWord32 s2178 = table4[s2177];-  const SWord32 s2179 = s2176 ^ s2178;-  const SWord8  s2180 = (SWord8) s1980;-  const SWord32 s2181 = table5[s2180];-  const SWord32 s2182 = s2179 ^ s2181;-  const SWord8  s2183 = (SWord8) (s619 >> 24);-  const SWord8  s2184 = table6[s2183];-  const SWord8  s2185 = (SWord8) (s619 >> 16);-  const SWord8  s2186 = table7[s2185];-  const SWord8  s2187 = (SWord8) (s619 >> 8);-  const SWord8  s2188 = table8[s2187];-  const SWord8  s2189 = (SWord8) s619;-  const SWord8  s2190 = table9[s2189];-  const SWord8  s2191 = s2188 ^ s2190;-  const SWord8  s2192 = s2186 ^ s2191;-  const SWord8  s2193 = s2184 ^ s2192;-  const SWord8  s2194 = table9[s2183];-  const SWord8  s2195 = table6[s2185];-  const SWord8  s2196 = table7[s2187];-  const SWord8  s2197 = table8[s2189];-  const SWord8  s2198 = s2196 ^ s2197;-  const SWord8  s2199 = s2195 ^ s2198;-  const SWord8  s2200 = s2194 ^ s2199;-  const SWord16 s2201 = (((SWord16) s2193) << 8) | ((SWord16) s2200);-  const SWord8  s2202 = table8[s2183];-  const SWord8  s2203 = table9[s2185];-  const SWord8  s2204 = table6[s2187];-  const SWord8  s2205 = table7[s2189];-  const SWord8  s2206 = s2204 ^ s2205;-  const SWord8  s2207 = s2203 ^ s2206;-  const SWord8  s2208 = s2202 ^ s2207;-  const SWord8  s2209 = table7[s2183];-  const SWord8  s2210 = table8[s2185];-  const SWord8  s2211 = table9[s2187];-  const SWord8  s2212 = table6[s2189];-  const SWord8  s2213 = s2211 ^ s2212;-  const SWord8  s2214 = s2210 ^ s2213;-  const SWord8  s2215 = s2209 ^ s2214;-  const SWord16 s2216 = (((SWord16) s2208) << 8) | ((SWord16) s2215);-  const SWord32 s2217 = (((SWord32) s2201) << 16) | ((SWord32) s2216);-  const SWord32 s2218 = s2182 ^ s2217;-  const SWord8  s2219 = (SWord8) s2218;-  const SWord32 s2220 = table5[s2219];-  const SWord32 s2221 = s2171 ^ s2220;-  const SWord8  s2222 = (SWord8) (s601 >> 24);-  const SWord8  s2223 = table6[s2222];-  const SWord8  s2224 = (SWord8) (s601 >> 16);-  const SWord8  s2225 = table7[s2224];-  const SWord8  s2226 = (SWord8) (s601 >> 8);-  const SWord8  s2227 = table8[s2226];-  const SWord8  s2228 = (SWord8) s601;-  const SWord8  s2229 = table9[s2228];-  const SWord8  s2230 = s2227 ^ s2229;-  const SWord8  s2231 = s2225 ^ s2230;-  const SWord8  s2232 = s2223 ^ s2231;-  const SWord8  s2233 = table9[s2222];-  const SWord8  s2234 = table6[s2224];-  const SWord8  s2235 = table7[s2226];-  const SWord8  s2236 = table8[s2228];-  const SWord8  s2237 = s2235 ^ s2236;-  const SWord8  s2238 = s2234 ^ s2237;-  const SWord8  s2239 = s2233 ^ s2238;-  const SWord16 s2240 = (((SWord16) s2232) << 8) | ((SWord16) s2239);-  const SWord8  s2241 = table8[s2222];-  const SWord8  s2242 = table9[s2224];-  const SWord8  s2243 = table6[s2226];-  const SWord8  s2244 = table7[s2228];-  const SWord8  s2245 = s2243 ^ s2244;-  const SWord8  s2246 = s2242 ^ s2245;-  const SWord8  s2247 = s2241 ^ s2246;-  const SWord8  s2248 = table7[s2222];-  const SWord8  s2249 = table8[s2224];-  const SWord8  s2250 = table9[s2226];-  const SWord8  s2251 = table6[s2228];-  const SWord8  s2252 = s2250 ^ s2251;-  const SWord8  s2253 = s2249 ^ s2252;-  const SWord8  s2254 = s2248 ^ s2253;-  const SWord16 s2255 = (((SWord16) s2247) << 8) | ((SWord16) s2254);-  const SWord32 s2256 = (((SWord32) s2240) << 16) | ((SWord32) s2255);-  const SWord32 s2257 = s2221 ^ s2256;-  const SWord8  s2258 = (SWord8) (s2257 >> 24);-  const SWord32 s2259 = table1[s2258];-  const SWord8  s2260 = (SWord8) (s2118 >> 24);-  const SWord32 s2261 = table1[s2260];-  const SWord8  s2262 = (SWord8) (s2168 >> 16);-  const SWord32 s2263 = table3[s2262];-  const SWord32 s2264 = s2261 ^ s2263;-  const SWord8  s2265 = (SWord8) (s2218 >> 8);-  const SWord32 s2266 = table4[s2265];-  const SWord32 s2267 = s2264 ^ s2266;-  const SWord8  s2268 = (SWord8) s2069;-  const SWord32 s2269 = table5[s2268];-  const SWord32 s2270 = s2267 ^ s2269;-  const SWord8  s2271 = (SWord8) (s604 >> 24);-  const SWord8  s2272 = table6[s2271];-  const SWord8  s2273 = (SWord8) (s604 >> 16);-  const SWord8  s2274 = table7[s2273];-  const SWord8  s2275 = (SWord8) (s604 >> 8);-  const SWord8  s2276 = table8[s2275];-  const SWord8  s2277 = (SWord8) s604;-  const SWord8  s2278 = table9[s2277];-  const SWord8  s2279 = s2276 ^ s2278;-  const SWord8  s2280 = s2274 ^ s2279;-  const SWord8  s2281 = s2272 ^ s2280;-  const SWord8  s2282 = table9[s2271];-  const SWord8  s2283 = table6[s2273];-  const SWord8  s2284 = table7[s2275];-  const SWord8  s2285 = table8[s2277];-  const SWord8  s2286 = s2284 ^ s2285;-  const SWord8  s2287 = s2283 ^ s2286;-  const SWord8  s2288 = s2282 ^ s2287;-  const SWord16 s2289 = (((SWord16) s2281) << 8) | ((SWord16) s2288);-  const SWord8  s2290 = table8[s2271];-  const SWord8  s2291 = table9[s2273];-  const SWord8  s2292 = table6[s2275];-  const SWord8  s2293 = table7[s2277];-  const SWord8  s2294 = s2292 ^ s2293;-  const SWord8  s2295 = s2291 ^ s2294;-  const SWord8  s2296 = s2290 ^ s2295;-  const SWord8  s2297 = table7[s2271];-  const SWord8  s2298 = table8[s2273];-  const SWord8  s2299 = table9[s2275];-  const SWord8  s2300 = table6[s2277];-  const SWord8  s2301 = s2299 ^ s2300;-  const SWord8  s2302 = s2298 ^ s2301;-  const SWord8  s2303 = s2297 ^ s2302;-  const SWord16 s2304 = (((SWord16) s2296) << 8) | ((SWord16) s2303);-  const SWord32 s2305 = (((SWord32) s2289) << 16) | ((SWord32) s2304);-  const SWord32 s2306 = s2270 ^ s2305;-  const SWord8  s2307 = (SWord8) (s2306 >> 16);-  const SWord32 s2308 = table3[s2307];-  const SWord32 s2309 = s2259 ^ s2308;-  const SWord8  s2310 = (SWord8) (s2168 >> 24);-  const SWord32 s2311 = table1[s2310];-  const SWord8  s2312 = (SWord8) (s2218 >> 16);-  const SWord32 s2313 = table3[s2312];-  const SWord32 s2314 = s2311 ^ s2313;-  const SWord8  s2315 = (SWord8) (s2069 >> 8);-  const SWord32 s2316 = table4[s2315];-  const SWord32 s2317 = s2314 ^ s2316;-  const SWord8  s2318 = (SWord8) s2118;-  const SWord32 s2319 = table5[s2318];-  const SWord32 s2320 = s2317 ^ s2319;-  const SWord8  s2321 = (SWord8) (s603 >> 24);-  const SWord8  s2322 = table6[s2321];-  const SWord8  s2323 = (SWord8) (s603 >> 16);-  const SWord8  s2324 = table7[s2323];-  const SWord8  s2325 = (SWord8) (s603 >> 8);-  const SWord8  s2326 = table8[s2325];-  const SWord8  s2327 = (SWord8) s603;-  const SWord8  s2328 = table9[s2327];-  const SWord8  s2329 = s2326 ^ s2328;-  const SWord8  s2330 = s2324 ^ s2329;-  const SWord8  s2331 = s2322 ^ s2330;-  const SWord8  s2332 = table9[s2321];-  const SWord8  s2333 = table6[s2323];-  const SWord8  s2334 = table7[s2325];-  const SWord8  s2335 = table8[s2327];-  const SWord8  s2336 = s2334 ^ s2335;-  const SWord8  s2337 = s2333 ^ s2336;-  const SWord8  s2338 = s2332 ^ s2337;-  const SWord16 s2339 = (((SWord16) s2331) << 8) | ((SWord16) s2338);-  const SWord8  s2340 = table8[s2321];-  const SWord8  s2341 = table9[s2323];-  const SWord8  s2342 = table6[s2325];-  const SWord8  s2343 = table7[s2327];-  const SWord8  s2344 = s2342 ^ s2343;-  const SWord8  s2345 = s2341 ^ s2344;-  const SWord8  s2346 = s2340 ^ s2345;-  const SWord8  s2347 = table7[s2321];-  const SWord8  s2348 = table8[s2323];-  const SWord8  s2349 = table9[s2325];-  const SWord8  s2350 = table6[s2327];-  const SWord8  s2351 = s2349 ^ s2350;-  const SWord8  s2352 = s2348 ^ s2351;-  const SWord8  s2353 = s2347 ^ s2352;-  const SWord16 s2354 = (((SWord16) s2346) << 8) | ((SWord16) s2353);-  const SWord32 s2355 = (((SWord32) s2339) << 16) | ((SWord32) s2354);-  const SWord32 s2356 = s2320 ^ s2355;-  const SWord8  s2357 = (SWord8) (s2356 >> 8);-  const SWord32 s2358 = table4[s2357];-  const SWord32 s2359 = s2309 ^ s2358;-  const SWord8  s2360 = (SWord8) (s2218 >> 24);-  const SWord32 s2361 = table1[s2360];-  const SWord8  s2362 = (SWord8) (s2069 >> 16);-  const SWord32 s2363 = table3[s2362];-  const SWord32 s2364 = s2361 ^ s2363;-  const SWord8  s2365 = (SWord8) (s2118 >> 8);-  const SWord32 s2366 = table4[s2365];-  const SWord32 s2367 = s2364 ^ s2366;-  const SWord8  s2368 = (SWord8) s2168;-  const SWord32 s2369 = table5[s2368];-  const SWord32 s2370 = s2367 ^ s2369;-  const SWord8  s2371 = (SWord8) (s602 >> 24);-  const SWord8  s2372 = table6[s2371];-  const SWord8  s2373 = (SWord8) (s602 >> 16);-  const SWord8  s2374 = table7[s2373];-  const SWord8  s2375 = (SWord8) (s602 >> 8);-  const SWord8  s2376 = table8[s2375];-  const SWord8  s2377 = (SWord8) s602;-  const SWord8  s2378 = table9[s2377];-  const SWord8  s2379 = s2376 ^ s2378;-  const SWord8  s2380 = s2374 ^ s2379;-  const SWord8  s2381 = s2372 ^ s2380;-  const SWord8  s2382 = table9[s2371];-  const SWord8  s2383 = table6[s2373];-  const SWord8  s2384 = table7[s2375];-  const SWord8  s2385 = table8[s2377];-  const SWord8  s2386 = s2384 ^ s2385;-  const SWord8  s2387 = s2383 ^ s2386;-  const SWord8  s2388 = s2382 ^ s2387;-  const SWord16 s2389 = (((SWord16) s2381) << 8) | ((SWord16) s2388);-  const SWord8  s2390 = table8[s2371];-  const SWord8  s2391 = table9[s2373];-  const SWord8  s2392 = table6[s2375];-  const SWord8  s2393 = table7[s2377];-  const SWord8  s2394 = s2392 ^ s2393;-  const SWord8  s2395 = s2391 ^ s2394;-  const SWord8  s2396 = s2390 ^ s2395;-  const SWord8  s2397 = table7[s2371];-  const SWord8  s2398 = table8[s2373];-  const SWord8  s2399 = table9[s2375];-  const SWord8  s2400 = table6[s2377];-  const SWord8  s2401 = s2399 ^ s2400;-  const SWord8  s2402 = s2398 ^ s2401;-  const SWord8  s2403 = s2397 ^ s2402;-  const SWord16 s2404 = (((SWord16) s2396) << 8) | ((SWord16) s2403);-  const SWord32 s2405 = (((SWord32) s2389) << 16) | ((SWord32) s2404);-  const SWord32 s2406 = s2370 ^ s2405;-  const SWord8  s2407 = (SWord8) s2406;-  const SWord32 s2408 = table5[s2407];-  const SWord32 s2409 = s2359 ^ s2408;-  const SWord8  s2410 = (SWord8) (s584 >> 24);-  const SWord8  s2411 = table6[s2410];-  const SWord8  s2412 = (SWord8) (s584 >> 16);-  const SWord8  s2413 = table7[s2412];-  const SWord8  s2414 = (SWord8) (s584 >> 8);-  const SWord8  s2415 = table8[s2414];-  const SWord8  s2416 = (SWord8) s584;-  const SWord8  s2417 = table9[s2416];-  const SWord8  s2418 = s2415 ^ s2417;-  const SWord8  s2419 = s2413 ^ s2418;-  const SWord8  s2420 = s2411 ^ s2419;-  const SWord8  s2421 = table9[s2410];-  const SWord8  s2422 = table6[s2412];-  const SWord8  s2423 = table7[s2414];-  const SWord8  s2424 = table8[s2416];-  const SWord8  s2425 = s2423 ^ s2424;-  const SWord8  s2426 = s2422 ^ s2425;-  const SWord8  s2427 = s2421 ^ s2426;-  const SWord16 s2428 = (((SWord16) s2420) << 8) | ((SWord16) s2427);-  const SWord8  s2429 = table8[s2410];-  const SWord8  s2430 = table9[s2412];-  const SWord8  s2431 = table6[s2414];-  const SWord8  s2432 = table7[s2416];-  const SWord8  s2433 = s2431 ^ s2432;-  const SWord8  s2434 = s2430 ^ s2433;-  const SWord8  s2435 = s2429 ^ s2434;-  const SWord8  s2436 = table7[s2410];-  const SWord8  s2437 = table8[s2412];-  const SWord8  s2438 = table9[s2414];-  const SWord8  s2439 = table6[s2416];-  const SWord8  s2440 = s2438 ^ s2439;-  const SWord8  s2441 = s2437 ^ s2440;-  const SWord8  s2442 = s2436 ^ s2441;-  const SWord16 s2443 = (((SWord16) s2435) << 8) | ((SWord16) s2442);-  const SWord32 s2444 = (((SWord32) s2428) << 16) | ((SWord32) s2443);-  const SWord32 s2445 = s2409 ^ s2444;-  const SWord8  s2446 = (SWord8) (s2445 >> 24);-  const SWord32 s2447 = table1[s2446];-  const SWord8  s2448 = (SWord8) (s2306 >> 24);-  const SWord32 s2449 = table1[s2448];-  const SWord8  s2450 = (SWord8) (s2356 >> 16);-  const SWord32 s2451 = table3[s2450];-  const SWord32 s2452 = s2449 ^ s2451;-  const SWord8  s2453 = (SWord8) (s2406 >> 8);-  const SWord32 s2454 = table4[s2453];-  const SWord32 s2455 = s2452 ^ s2454;-  const SWord8  s2456 = (SWord8) s2257;-  const SWord32 s2457 = table5[s2456];-  const SWord32 s2458 = s2455 ^ s2457;-  const SWord8  s2459 = (SWord8) (s587 >> 24);-  const SWord8  s2460 = table6[s2459];-  const SWord8  s2461 = (SWord8) (s587 >> 16);-  const SWord8  s2462 = table7[s2461];-  const SWord8  s2463 = (SWord8) (s587 >> 8);-  const SWord8  s2464 = table8[s2463];-  const SWord8  s2465 = (SWord8) s587;-  const SWord8  s2466 = table9[s2465];-  const SWord8  s2467 = s2464 ^ s2466;-  const SWord8  s2468 = s2462 ^ s2467;-  const SWord8  s2469 = s2460 ^ s2468;-  const SWord8  s2470 = table9[s2459];-  const SWord8  s2471 = table6[s2461];-  const SWord8  s2472 = table7[s2463];-  const SWord8  s2473 = table8[s2465];-  const SWord8  s2474 = s2472 ^ s2473;-  const SWord8  s2475 = s2471 ^ s2474;-  const SWord8  s2476 = s2470 ^ s2475;-  const SWord16 s2477 = (((SWord16) s2469) << 8) | ((SWord16) s2476);-  const SWord8  s2478 = table8[s2459];-  const SWord8  s2479 = table9[s2461];-  const SWord8  s2480 = table6[s2463];-  const SWord8  s2481 = table7[s2465];-  const SWord8  s2482 = s2480 ^ s2481;-  const SWord8  s2483 = s2479 ^ s2482;-  const SWord8  s2484 = s2478 ^ s2483;-  const SWord8  s2485 = table7[s2459];-  const SWord8  s2486 = table8[s2461];-  const SWord8  s2487 = table9[s2463];-  const SWord8  s2488 = table6[s2465];-  const SWord8  s2489 = s2487 ^ s2488;-  const SWord8  s2490 = s2486 ^ s2489;-  const SWord8  s2491 = s2485 ^ s2490;-  const SWord16 s2492 = (((SWord16) s2484) << 8) | ((SWord16) s2491);-  const SWord32 s2493 = (((SWord32) s2477) << 16) | ((SWord32) s2492);-  const SWord32 s2494 = s2458 ^ s2493;-  const SWord8  s2495 = (SWord8) (s2494 >> 16);-  const SWord32 s2496 = table3[s2495];-  const SWord32 s2497 = s2447 ^ s2496;-  const SWord8  s2498 = (SWord8) (s2356 >> 24);-  const SWord32 s2499 = table1[s2498];-  const SWord8  s2500 = (SWord8) (s2406 >> 16);-  const SWord32 s2501 = table3[s2500];-  const SWord32 s2502 = s2499 ^ s2501;-  const SWord8  s2503 = (SWord8) (s2257 >> 8);-  const SWord32 s2504 = table4[s2503];-  const SWord32 s2505 = s2502 ^ s2504;-  const SWord8  s2506 = (SWord8) s2306;-  const SWord32 s2507 = table5[s2506];-  const SWord32 s2508 = s2505 ^ s2507;-  const SWord8  s2509 = (SWord8) (s586 >> 24);-  const SWord8  s2510 = table6[s2509];-  const SWord8  s2511 = (SWord8) (s586 >> 16);-  const SWord8  s2512 = table7[s2511];-  const SWord8  s2513 = (SWord8) (s586 >> 8);-  const SWord8  s2514 = table8[s2513];-  const SWord8  s2515 = (SWord8) s586;-  const SWord8  s2516 = table9[s2515];-  const SWord8  s2517 = s2514 ^ s2516;-  const SWord8  s2518 = s2512 ^ s2517;-  const SWord8  s2519 = s2510 ^ s2518;-  const SWord8  s2520 = table9[s2509];-  const SWord8  s2521 = table6[s2511];-  const SWord8  s2522 = table7[s2513];-  const SWord8  s2523 = table8[s2515];-  const SWord8  s2524 = s2522 ^ s2523;-  const SWord8  s2525 = s2521 ^ s2524;-  const SWord8  s2526 = s2520 ^ s2525;-  const SWord16 s2527 = (((SWord16) s2519) << 8) | ((SWord16) s2526);-  const SWord8  s2528 = table8[s2509];-  const SWord8  s2529 = table9[s2511];-  const SWord8  s2530 = table6[s2513];-  const SWord8  s2531 = table7[s2515];-  const SWord8  s2532 = s2530 ^ s2531;-  const SWord8  s2533 = s2529 ^ s2532;-  const SWord8  s2534 = s2528 ^ s2533;-  const SWord8  s2535 = table7[s2509];-  const SWord8  s2536 = table8[s2511];-  const SWord8  s2537 = table9[s2513];-  const SWord8  s2538 = table6[s2515];-  const SWord8  s2539 = s2537 ^ s2538;-  const SWord8  s2540 = s2536 ^ s2539;-  const SWord8  s2541 = s2535 ^ s2540;-  const SWord16 s2542 = (((SWord16) s2534) << 8) | ((SWord16) s2541);-  const SWord32 s2543 = (((SWord32) s2527) << 16) | ((SWord32) s2542);-  const SWord32 s2544 = s2508 ^ s2543;-  const SWord8  s2545 = (SWord8) (s2544 >> 8);-  const SWord32 s2546 = table4[s2545];-  const SWord32 s2547 = s2497 ^ s2546;-  const SWord8  s2548 = (SWord8) (s2406 >> 24);-  const SWord32 s2549 = table1[s2548];-  const SWord8  s2550 = (SWord8) (s2257 >> 16);-  const SWord32 s2551 = table3[s2550];-  const SWord32 s2552 = s2549 ^ s2551;-  const SWord8  s2553 = (SWord8) (s2306 >> 8);-  const SWord32 s2554 = table4[s2553];-  const SWord32 s2555 = s2552 ^ s2554;-  const SWord8  s2556 = (SWord8) s2356;-  const SWord32 s2557 = table5[s2556];-  const SWord32 s2558 = s2555 ^ s2557;-  const SWord8  s2559 = (SWord8) (s585 >> 24);-  const SWord8  s2560 = table6[s2559];-  const SWord8  s2561 = (SWord8) (s585 >> 16);-  const SWord8  s2562 = table7[s2561];-  const SWord8  s2563 = (SWord8) (s585 >> 8);-  const SWord8  s2564 = table8[s2563];-  const SWord8  s2565 = (SWord8) s585;-  const SWord8  s2566 = table9[s2565];-  const SWord8  s2567 = s2564 ^ s2566;-  const SWord8  s2568 = s2562 ^ s2567;-  const SWord8  s2569 = s2560 ^ s2568;-  const SWord8  s2570 = table9[s2559];-  const SWord8  s2571 = table6[s2561];-  const SWord8  s2572 = table7[s2563];-  const SWord8  s2573 = table8[s2565];-  const SWord8  s2574 = s2572 ^ s2573;-  const SWord8  s2575 = s2571 ^ s2574;-  const SWord8  s2576 = s2570 ^ s2575;-  const SWord16 s2577 = (((SWord16) s2569) << 8) | ((SWord16) s2576);-  const SWord8  s2578 = table8[s2559];-  const SWord8  s2579 = table9[s2561];-  const SWord8  s2580 = table6[s2563];-  const SWord8  s2581 = table7[s2565];-  const SWord8  s2582 = s2580 ^ s2581;-  const SWord8  s2583 = s2579 ^ s2582;-  const SWord8  s2584 = s2578 ^ s2583;-  const SWord8  s2585 = table7[s2559];-  const SWord8  s2586 = table8[s2561];-  const SWord8  s2587 = table9[s2563];-  const SWord8  s2588 = table6[s2565];-  const SWord8  s2589 = s2587 ^ s2588;-  const SWord8  s2590 = s2586 ^ s2589;-  const SWord8  s2591 = s2585 ^ s2590;-  const SWord16 s2592 = (((SWord16) s2584) << 8) | ((SWord16) s2591);-  const SWord32 s2593 = (((SWord32) s2577) << 16) | ((SWord32) s2592);-  const SWord32 s2594 = s2558 ^ s2593;-  const SWord8  s2595 = (SWord8) s2594;-  const SWord32 s2596 = table5[s2595];-  const SWord32 s2597 = s2547 ^ s2596;-  const SWord8  s2598 = (SWord8) (s567 >> 24);-  const SWord8  s2599 = table6[s2598];-  const SWord8  s2600 = (SWord8) (s567 >> 16);-  const SWord8  s2601 = table7[s2600];-  const SWord8  s2602 = (SWord8) (s567 >> 8);-  const SWord8  s2603 = table8[s2602];-  const SWord8  s2604 = (SWord8) s567;-  const SWord8  s2605 = table9[s2604];-  const SWord8  s2606 = s2603 ^ s2605;-  const SWord8  s2607 = s2601 ^ s2606;-  const SWord8  s2608 = s2599 ^ s2607;-  const SWord8  s2609 = table9[s2598];-  const SWord8  s2610 = table6[s2600];-  const SWord8  s2611 = table7[s2602];-  const SWord8  s2612 = table8[s2604];-  const SWord8  s2613 = s2611 ^ s2612;-  const SWord8  s2614 = s2610 ^ s2613;-  const SWord8  s2615 = s2609 ^ s2614;-  const SWord16 s2616 = (((SWord16) s2608) << 8) | ((SWord16) s2615);-  const SWord8  s2617 = table8[s2598];-  const SWord8  s2618 = table9[s2600];-  const SWord8  s2619 = table6[s2602];-  const SWord8  s2620 = table7[s2604];-  const SWord8  s2621 = s2619 ^ s2620;-  const SWord8  s2622 = s2618 ^ s2621;-  const SWord8  s2623 = s2617 ^ s2622;-  const SWord8  s2624 = table7[s2598];-  const SWord8  s2625 = table8[s2600];-  const SWord8  s2626 = table9[s2602];-  const SWord8  s2627 = table6[s2604];-  const SWord8  s2628 = s2626 ^ s2627;-  const SWord8  s2629 = s2625 ^ s2628;-  const SWord8  s2630 = s2624 ^ s2629;-  const SWord16 s2631 = (((SWord16) s2623) << 8) | ((SWord16) s2630);-  const SWord32 s2632 = (((SWord32) s2616) << 16) | ((SWord32) s2631);-  const SWord32 s2633 = s2597 ^ s2632;-  const SWord8  s2634 = (SWord8) (s2633 >> 24);-  const SWord32 s2635 = table1[s2634];-  const SWord8  s2636 = (SWord8) (s2494 >> 24);-  const SWord32 s2637 = table1[s2636];-  const SWord8  s2638 = (SWord8) (s2544 >> 16);-  const SWord32 s2639 = table3[s2638];-  const SWord32 s2640 = s2637 ^ s2639;-  const SWord8  s2641 = (SWord8) (s2594 >> 8);-  const SWord32 s2642 = table4[s2641];-  const SWord32 s2643 = s2640 ^ s2642;-  const SWord8  s2644 = (SWord8) s2445;-  const SWord32 s2645 = table5[s2644];-  const SWord32 s2646 = s2643 ^ s2645;-  const SWord8  s2647 = (SWord8) (s570 >> 24);-  const SWord8  s2648 = table6[s2647];-  const SWord8  s2649 = (SWord8) (s570 >> 16);-  const SWord8  s2650 = table7[s2649];-  const SWord8  s2651 = (SWord8) (s570 >> 8);-  const SWord8  s2652 = table8[s2651];-  const SWord8  s2653 = (SWord8) s570;-  const SWord8  s2654 = table9[s2653];-  const SWord8  s2655 = s2652 ^ s2654;-  const SWord8  s2656 = s2650 ^ s2655;-  const SWord8  s2657 = s2648 ^ s2656;-  const SWord8  s2658 = table9[s2647];-  const SWord8  s2659 = table6[s2649];-  const SWord8  s2660 = table7[s2651];-  const SWord8  s2661 = table8[s2653];-  const SWord8  s2662 = s2660 ^ s2661;-  const SWord8  s2663 = s2659 ^ s2662;-  const SWord8  s2664 = s2658 ^ s2663;-  const SWord16 s2665 = (((SWord16) s2657) << 8) | ((SWord16) s2664);-  const SWord8  s2666 = table8[s2647];-  const SWord8  s2667 = table9[s2649];-  const SWord8  s2668 = table6[s2651];-  const SWord8  s2669 = table7[s2653];-  const SWord8  s2670 = s2668 ^ s2669;-  const SWord8  s2671 = s2667 ^ s2670;-  const SWord8  s2672 = s2666 ^ s2671;-  const SWord8  s2673 = table7[s2647];-  const SWord8  s2674 = table8[s2649];-  const SWord8  s2675 = table9[s2651];-  const SWord8  s2676 = table6[s2653];-  const SWord8  s2677 = s2675 ^ s2676;-  const SWord8  s2678 = s2674 ^ s2677;-  const SWord8  s2679 = s2673 ^ s2678;-  const SWord16 s2680 = (((SWord16) s2672) << 8) | ((SWord16) s2679);-  const SWord32 s2681 = (((SWord32) s2665) << 16) | ((SWord32) s2680);-  const SWord32 s2682 = s2646 ^ s2681;-  const SWord8  s2683 = (SWord8) (s2682 >> 16);-  const SWord32 s2684 = table3[s2683];-  const SWord32 s2685 = s2635 ^ s2684;-  const SWord8  s2686 = (SWord8) (s2544 >> 24);-  const SWord32 s2687 = table1[s2686];-  const SWord8  s2688 = (SWord8) (s2594 >> 16);-  const SWord32 s2689 = table3[s2688];-  const SWord32 s2690 = s2687 ^ s2689;-  const SWord8  s2691 = (SWord8) (s2445 >> 8);-  const SWord32 s2692 = table4[s2691];-  const SWord32 s2693 = s2690 ^ s2692;-  const SWord8  s2694 = (SWord8) s2494;-  const SWord32 s2695 = table5[s2694];-  const SWord32 s2696 = s2693 ^ s2695;-  const SWord8  s2697 = (SWord8) (s569 >> 24);-  const SWord8  s2698 = table6[s2697];-  const SWord8  s2699 = (SWord8) (s569 >> 16);-  const SWord8  s2700 = table7[s2699];-  const SWord8  s2701 = (SWord8) (s569 >> 8);-  const SWord8  s2702 = table8[s2701];-  const SWord8  s2703 = (SWord8) s569;-  const SWord8  s2704 = table9[s2703];-  const SWord8  s2705 = s2702 ^ s2704;-  const SWord8  s2706 = s2700 ^ s2705;-  const SWord8  s2707 = s2698 ^ s2706;-  const SWord8  s2708 = table9[s2697];-  const SWord8  s2709 = table6[s2699];-  const SWord8  s2710 = table7[s2701];-  const SWord8  s2711 = table8[s2703];-  const SWord8  s2712 = s2710 ^ s2711;-  const SWord8  s2713 = s2709 ^ s2712;-  const SWord8  s2714 = s2708 ^ s2713;-  const SWord16 s2715 = (((SWord16) s2707) << 8) | ((SWord16) s2714);-  const SWord8  s2716 = table8[s2697];-  const SWord8  s2717 = table9[s2699];-  const SWord8  s2718 = table6[s2701];-  const SWord8  s2719 = table7[s2703];-  const SWord8  s2720 = s2718 ^ s2719;-  const SWord8  s2721 = s2717 ^ s2720;-  const SWord8  s2722 = s2716 ^ s2721;-  const SWord8  s2723 = table7[s2697];-  const SWord8  s2724 = table8[s2699];-  const SWord8  s2725 = table9[s2701];-  const SWord8  s2726 = table6[s2703];-  const SWord8  s2727 = s2725 ^ s2726;-  const SWord8  s2728 = s2724 ^ s2727;-  const SWord8  s2729 = s2723 ^ s2728;-  const SWord16 s2730 = (((SWord16) s2722) << 8) | ((SWord16) s2729);-  const SWord32 s2731 = (((SWord32) s2715) << 16) | ((SWord32) s2730);-  const SWord32 s2732 = s2696 ^ s2731;-  const SWord8  s2733 = (SWord8) (s2732 >> 8);-  const SWord32 s2734 = table4[s2733];-  const SWord32 s2735 = s2685 ^ s2734;-  const SWord8  s2736 = (SWord8) (s2594 >> 24);-  const SWord32 s2737 = table1[s2736];-  const SWord8  s2738 = (SWord8) (s2445 >> 16);-  const SWord32 s2739 = table3[s2738];-  const SWord32 s2740 = s2737 ^ s2739;-  const SWord8  s2741 = (SWord8) (s2494 >> 8);-  const SWord32 s2742 = table4[s2741];-  const SWord32 s2743 = s2740 ^ s2742;-  const SWord8  s2744 = (SWord8) s2544;-  const SWord32 s2745 = table5[s2744];-  const SWord32 s2746 = s2743 ^ s2745;-  const SWord8  s2747 = (SWord8) (s568 >> 24);-  const SWord8  s2748 = table6[s2747];-  const SWord8  s2749 = (SWord8) (s568 >> 16);-  const SWord8  s2750 = table7[s2749];-  const SWord8  s2751 = (SWord8) (s568 >> 8);-  const SWord8  s2752 = table8[s2751];-  const SWord8  s2753 = (SWord8) s568;-  const SWord8  s2754 = table9[s2753];-  const SWord8  s2755 = s2752 ^ s2754;-  const SWord8  s2756 = s2750 ^ s2755;-  const SWord8  s2757 = s2748 ^ s2756;-  const SWord8  s2758 = table9[s2747];-  const SWord8  s2759 = table6[s2749];-  const SWord8  s2760 = table7[s2751];-  const SWord8  s2761 = table8[s2753];-  const SWord8  s2762 = s2760 ^ s2761;-  const SWord8  s2763 = s2759 ^ s2762;-  const SWord8  s2764 = s2758 ^ s2763;-  const SWord16 s2765 = (((SWord16) s2757) << 8) | ((SWord16) s2764);-  const SWord8  s2766 = table8[s2747];-  const SWord8  s2767 = table9[s2749];-  const SWord8  s2768 = table6[s2751];-  const SWord8  s2769 = table7[s2753];-  const SWord8  s2770 = s2768 ^ s2769;-  const SWord8  s2771 = s2767 ^ s2770;-  const SWord8  s2772 = s2766 ^ s2771;-  const SWord8  s2773 = table7[s2747];-  const SWord8  s2774 = table8[s2749];-  const SWord8  s2775 = table9[s2751];-  const SWord8  s2776 = table6[s2753];-  const SWord8  s2777 = s2775 ^ s2776;-  const SWord8  s2778 = s2774 ^ s2777;-  const SWord8  s2779 = s2773 ^ s2778;-  const SWord16 s2780 = (((SWord16) s2772) << 8) | ((SWord16) s2779);-  const SWord32 s2781 = (((SWord32) s2765) << 16) | ((SWord32) s2780);-  const SWord32 s2782 = s2746 ^ s2781;-  const SWord8  s2783 = (SWord8) s2782;-  const SWord32 s2784 = table5[s2783];-  const SWord32 s2785 = s2735 ^ s2784;-  const SWord8  s2786 = (SWord8) (s550 >> 24);-  const SWord8  s2787 = table6[s2786];-  const SWord8  s2788 = (SWord8) (s550 >> 16);-  const SWord8  s2789 = table7[s2788];-  const SWord8  s2790 = (SWord8) (s550 >> 8);-  const SWord8  s2791 = table8[s2790];-  const SWord8  s2792 = (SWord8) s550;-  const SWord8  s2793 = table9[s2792];-  const SWord8  s2794 = s2791 ^ s2793;-  const SWord8  s2795 = s2789 ^ s2794;-  const SWord8  s2796 = s2787 ^ s2795;-  const SWord8  s2797 = table9[s2786];-  const SWord8  s2798 = table6[s2788];-  const SWord8  s2799 = table7[s2790];-  const SWord8  s2800 = table8[s2792];-  const SWord8  s2801 = s2799 ^ s2800;-  const SWord8  s2802 = s2798 ^ s2801;-  const SWord8  s2803 = s2797 ^ s2802;-  const SWord16 s2804 = (((SWord16) s2796) << 8) | ((SWord16) s2803);-  const SWord8  s2805 = table8[s2786];-  const SWord8  s2806 = table9[s2788];-  const SWord8  s2807 = table6[s2790];-  const SWord8  s2808 = table7[s2792];-  const SWord8  s2809 = s2807 ^ s2808;-  const SWord8  s2810 = s2806 ^ s2809;-  const SWord8  s2811 = s2805 ^ s2810;-  const SWord8  s2812 = table7[s2786];-  const SWord8  s2813 = table8[s2788];-  const SWord8  s2814 = table9[s2790];-  const SWord8  s2815 = table6[s2792];-  const SWord8  s2816 = s2814 ^ s2815;-  const SWord8  s2817 = s2813 ^ s2816;-  const SWord8  s2818 = s2812 ^ s2817;-  const SWord16 s2819 = (((SWord16) s2811) << 8) | ((SWord16) s2818);-  const SWord32 s2820 = (((SWord32) s2804) << 16) | ((SWord32) s2819);-  const SWord32 s2821 = s2785 ^ s2820;-  const SWord8  s2822 = (SWord8) (s2821 >> 24);-  const SWord32 s2823 = table1[s2822];-  const SWord8  s2824 = (SWord8) (s2682 >> 24);-  const SWord32 s2825 = table1[s2824];-  const SWord8  s2826 = (SWord8) (s2732 >> 16);-  const SWord32 s2827 = table3[s2826];-  const SWord32 s2828 = s2825 ^ s2827;-  const SWord8  s2829 = (SWord8) (s2782 >> 8);-  const SWord32 s2830 = table4[s2829];-  const SWord32 s2831 = s2828 ^ s2830;-  const SWord8  s2832 = (SWord8) s2633;-  const SWord32 s2833 = table5[s2832];-  const SWord32 s2834 = s2831 ^ s2833;-  const SWord8  s2835 = (SWord8) (s553 >> 24);-  const SWord8  s2836 = table6[s2835];-  const SWord8  s2837 = (SWord8) (s553 >> 16);-  const SWord8  s2838 = table7[s2837];-  const SWord8  s2839 = (SWord8) (s553 >> 8);-  const SWord8  s2840 = table8[s2839];-  const SWord8  s2841 = (SWord8) s553;-  const SWord8  s2842 = table9[s2841];-  const SWord8  s2843 = s2840 ^ s2842;-  const SWord8  s2844 = s2838 ^ s2843;-  const SWord8  s2845 = s2836 ^ s2844;-  const SWord8  s2846 = table9[s2835];-  const SWord8  s2847 = table6[s2837];-  const SWord8  s2848 = table7[s2839];-  const SWord8  s2849 = table8[s2841];-  const SWord8  s2850 = s2848 ^ s2849;-  const SWord8  s2851 = s2847 ^ s2850;-  const SWord8  s2852 = s2846 ^ s2851;-  const SWord16 s2853 = (((SWord16) s2845) << 8) | ((SWord16) s2852);-  const SWord8  s2854 = table8[s2835];-  const SWord8  s2855 = table9[s2837];-  const SWord8  s2856 = table6[s2839];-  const SWord8  s2857 = table7[s2841];-  const SWord8  s2858 = s2856 ^ s2857;-  const SWord8  s2859 = s2855 ^ s2858;-  const SWord8  s2860 = s2854 ^ s2859;-  const SWord8  s2861 = table7[s2835];-  const SWord8  s2862 = table8[s2837];-  const SWord8  s2863 = table9[s2839];-  const SWord8  s2864 = table6[s2841];-  const SWord8  s2865 = s2863 ^ s2864;-  const SWord8  s2866 = s2862 ^ s2865;-  const SWord8  s2867 = s2861 ^ s2866;-  const SWord16 s2868 = (((SWord16) s2860) << 8) | ((SWord16) s2867);-  const SWord32 s2869 = (((SWord32) s2853) << 16) | ((SWord32) s2868);-  const SWord32 s2870 = s2834 ^ s2869;-  const SWord8  s2871 = (SWord8) (s2870 >> 16);-  const SWord32 s2872 = table3[s2871];-  const SWord32 s2873 = s2823 ^ s2872;-  const SWord8  s2874 = (SWord8) (s2732 >> 24);-  const SWord32 s2875 = table1[s2874];-  const SWord8  s2876 = (SWord8) (s2782 >> 16);-  const SWord32 s2877 = table3[s2876];-  const SWord32 s2878 = s2875 ^ s2877;-  const SWord8  s2879 = (SWord8) (s2633 >> 8);-  const SWord32 s2880 = table4[s2879];-  const SWord32 s2881 = s2878 ^ s2880;-  const SWord8  s2882 = (SWord8) s2682;-  const SWord32 s2883 = table5[s2882];-  const SWord32 s2884 = s2881 ^ s2883;-  const SWord8  s2885 = (SWord8) (s552 >> 24);-  const SWord8  s2886 = table6[s2885];-  const SWord8  s2887 = (SWord8) (s552 >> 16);-  const SWord8  s2888 = table7[s2887];-  const SWord8  s2889 = (SWord8) (s552 >> 8);-  const SWord8  s2890 = table8[s2889];-  const SWord8  s2891 = (SWord8) s552;-  const SWord8  s2892 = table9[s2891];-  const SWord8  s2893 = s2890 ^ s2892;-  const SWord8  s2894 = s2888 ^ s2893;-  const SWord8  s2895 = s2886 ^ s2894;-  const SWord8  s2896 = table9[s2885];-  const SWord8  s2897 = table6[s2887];-  const SWord8  s2898 = table7[s2889];-  const SWord8  s2899 = table8[s2891];-  const SWord8  s2900 = s2898 ^ s2899;-  const SWord8  s2901 = s2897 ^ s2900;-  const SWord8  s2902 = s2896 ^ s2901;-  const SWord16 s2903 = (((SWord16) s2895) << 8) | ((SWord16) s2902);-  const SWord8  s2904 = table8[s2885];-  const SWord8  s2905 = table9[s2887];-  const SWord8  s2906 = table6[s2889];-  const SWord8  s2907 = table7[s2891];-  const SWord8  s2908 = s2906 ^ s2907;-  const SWord8  s2909 = s2905 ^ s2908;-  const SWord8  s2910 = s2904 ^ s2909;-  const SWord8  s2911 = table7[s2885];-  const SWord8  s2912 = table8[s2887];-  const SWord8  s2913 = table9[s2889];-  const SWord8  s2914 = table6[s2891];-  const SWord8  s2915 = s2913 ^ s2914;-  const SWord8  s2916 = s2912 ^ s2915;-  const SWord8  s2917 = s2911 ^ s2916;-  const SWord16 s2918 = (((SWord16) s2910) << 8) | ((SWord16) s2917);-  const SWord32 s2919 = (((SWord32) s2903) << 16) | ((SWord32) s2918);-  const SWord32 s2920 = s2884 ^ s2919;-  const SWord8  s2921 = (SWord8) (s2920 >> 8);-  const SWord32 s2922 = table4[s2921];-  const SWord32 s2923 = s2873 ^ s2922;-  const SWord8  s2924 = (SWord8) (s2782 >> 24);-  const SWord32 s2925 = table1[s2924];-  const SWord8  s2926 = (SWord8) (s2633 >> 16);-  const SWord32 s2927 = table3[s2926];-  const SWord32 s2928 = s2925 ^ s2927;-  const SWord8  s2929 = (SWord8) (s2682 >> 8);-  const SWord32 s2930 = table4[s2929];-  const SWord32 s2931 = s2928 ^ s2930;-  const SWord8  s2932 = (SWord8) s2732;-  const SWord32 s2933 = table5[s2932];-  const SWord32 s2934 = s2931 ^ s2933;-  const SWord8  s2935 = (SWord8) (s551 >> 24);-  const SWord8  s2936 = table6[s2935];-  const SWord8  s2937 = (SWord8) (s551 >> 16);-  const SWord8  s2938 = table7[s2937];-  const SWord8  s2939 = (SWord8) (s551 >> 8);-  const SWord8  s2940 = table8[s2939];-  const SWord8  s2941 = (SWord8) s551;-  const SWord8  s2942 = table9[s2941];-  const SWord8  s2943 = s2940 ^ s2942;-  const SWord8  s2944 = s2938 ^ s2943;-  const SWord8  s2945 = s2936 ^ s2944;-  const SWord8  s2946 = table9[s2935];-  const SWord8  s2947 = table6[s2937];-  const SWord8  s2948 = table7[s2939];-  const SWord8  s2949 = table8[s2941];-  const SWord8  s2950 = s2948 ^ s2949;-  const SWord8  s2951 = s2947 ^ s2950;-  const SWord8  s2952 = s2946 ^ s2951;-  const SWord16 s2953 = (((SWord16) s2945) << 8) | ((SWord16) s2952);-  const SWord8  s2954 = table8[s2935];-  const SWord8  s2955 = table9[s2937];-  const SWord8  s2956 = table6[s2939];-  const SWord8  s2957 = table7[s2941];-  const SWord8  s2958 = s2956 ^ s2957;-  const SWord8  s2959 = s2955 ^ s2958;-  const SWord8  s2960 = s2954 ^ s2959;-  const SWord8  s2961 = table7[s2935];-  const SWord8  s2962 = table8[s2937];-  const SWord8  s2963 = table9[s2939];-  const SWord8  s2964 = table6[s2941];-  const SWord8  s2965 = s2963 ^ s2964;-  const SWord8  s2966 = s2962 ^ s2965;-  const SWord8  s2967 = s2961 ^ s2966;-  const SWord16 s2968 = (((SWord16) s2960) << 8) | ((SWord16) s2967);-  const SWord32 s2969 = (((SWord32) s2953) << 16) | ((SWord32) s2968);-  const SWord32 s2970 = s2934 ^ s2969;-  const SWord8  s2971 = (SWord8) s2970;-  const SWord32 s2972 = table5[s2971];-  const SWord32 s2973 = s2923 ^ s2972;-  const SWord8  s2974 = (SWord8) (s533 >> 24);-  const SWord8  s2975 = table6[s2974];-  const SWord8  s2976 = (SWord8) (s533 >> 16);-  const SWord8  s2977 = table7[s2976];-  const SWord8  s2978 = (SWord8) (s533 >> 8);-  const SWord8  s2979 = table8[s2978];-  const SWord8  s2980 = (SWord8) s533;-  const SWord8  s2981 = table9[s2980];-  const SWord8  s2982 = s2979 ^ s2981;-  const SWord8  s2983 = s2977 ^ s2982;-  const SWord8  s2984 = s2975 ^ s2983;-  const SWord8  s2985 = table9[s2974];-  const SWord8  s2986 = table6[s2976];-  const SWord8  s2987 = table7[s2978];-  const SWord8  s2988 = table8[s2980];-  const SWord8  s2989 = s2987 ^ s2988;-  const SWord8  s2990 = s2986 ^ s2989;-  const SWord8  s2991 = s2985 ^ s2990;-  const SWord16 s2992 = (((SWord16) s2984) << 8) | ((SWord16) s2991);-  const SWord8  s2993 = table8[s2974];-  const SWord8  s2994 = table9[s2976];-  const SWord8  s2995 = table6[s2978];-  const SWord8  s2996 = table7[s2980];-  const SWord8  s2997 = s2995 ^ s2996;-  const SWord8  s2998 = s2994 ^ s2997;-  const SWord8  s2999 = s2993 ^ s2998;-  const SWord8  s3000 = table7[s2974];-  const SWord8  s3001 = table8[s2976];-  const SWord8  s3002 = table9[s2978];-  const SWord8  s3003 = table6[s2980];-  const SWord8  s3004 = s3002 ^ s3003;-  const SWord8  s3005 = s3001 ^ s3004;-  const SWord8  s3006 = s3000 ^ s3005;-  const SWord16 s3007 = (((SWord16) s2999) << 8) | ((SWord16) s3006);-  const SWord32 s3008 = (((SWord32) s2992) << 16) | ((SWord32) s3007);-  const SWord32 s3009 = s2973 ^ s3008;-  const SWord8  s3010 = (SWord8) (s3009 >> 24);-  const SWord8  s3011 = table0[s3010];-  const SWord8  s3012 = (SWord8) (s2870 >> 24);-  const SWord32 s3013 = table1[s3012];-  const SWord8  s3014 = (SWord8) (s2920 >> 16);-  const SWord32 s3015 = table3[s3014];-  const SWord32 s3016 = s3013 ^ s3015;-  const SWord8  s3017 = (SWord8) (s2970 >> 8);-  const SWord32 s3018 = table4[s3017];-  const SWord32 s3019 = s3016 ^ s3018;-  const SWord8  s3020 = (SWord8) s2821;-  const SWord32 s3021 = table5[s3020];-  const SWord32 s3022 = s3019 ^ s3021;-  const SWord8  s3023 = (SWord8) (s536 >> 24);-  const SWord8  s3024 = table6[s3023];-  const SWord8  s3025 = (SWord8) (s536 >> 16);-  const SWord8  s3026 = table7[s3025];-  const SWord8  s3027 = (SWord8) (s536 >> 8);-  const SWord8  s3028 = table8[s3027];-  const SWord8  s3029 = (SWord8) s536;-  const SWord8  s3030 = table9[s3029];-  const SWord8  s3031 = s3028 ^ s3030;-  const SWord8  s3032 = s3026 ^ s3031;-  const SWord8  s3033 = s3024 ^ s3032;-  const SWord8  s3034 = table9[s3023];-  const SWord8  s3035 = table6[s3025];-  const SWord8  s3036 = table7[s3027];-  const SWord8  s3037 = table8[s3029];-  const SWord8  s3038 = s3036 ^ s3037;-  const SWord8  s3039 = s3035 ^ s3038;-  const SWord8  s3040 = s3034 ^ s3039;-  const SWord16 s3041 = (((SWord16) s3033) << 8) | ((SWord16) s3040);-  const SWord8  s3042 = table8[s3023];-  const SWord8  s3043 = table9[s3025];-  const SWord8  s3044 = table6[s3027];-  const SWord8  s3045 = table7[s3029];-  const SWord8  s3046 = s3044 ^ s3045;-  const SWord8  s3047 = s3043 ^ s3046;-  const SWord8  s3048 = s3042 ^ s3047;-  const SWord8  s3049 = table7[s3023];-  const SWord8  s3050 = table8[s3025];-  const SWord8  s3051 = table9[s3027];-  const SWord8  s3052 = table6[s3029];-  const SWord8  s3053 = s3051 ^ s3052;-  const SWord8  s3054 = s3050 ^ s3053;-  const SWord8  s3055 = s3049 ^ s3054;-  const SWord16 s3056 = (((SWord16) s3048) << 8) | ((SWord16) s3055);-  const SWord32 s3057 = (((SWord32) s3041) << 16) | ((SWord32) s3056);-  const SWord32 s3058 = s3022 ^ s3057;-  const SWord8  s3059 = (SWord8) (s3058 >> 16);-  const SWord8  s3060 = table0[s3059];-  const SWord16 s3061 = (((SWord16) s3011) << 8) | ((SWord16) s3060);-  const SWord8  s3062 = (SWord8) (s2920 >> 24);-  const SWord32 s3063 = table1[s3062];-  const SWord8  s3064 = (SWord8) (s2970 >> 16);-  const SWord32 s3065 = table3[s3064];-  const SWord32 s3066 = s3063 ^ s3065;-  const SWord8  s3067 = (SWord8) (s2821 >> 8);-  const SWord32 s3068 = table4[s3067];-  const SWord32 s3069 = s3066 ^ s3068;-  const SWord8  s3070 = (SWord8) s2870;-  const SWord32 s3071 = table5[s3070];-  const SWord32 s3072 = s3069 ^ s3071;-  const SWord8  s3073 = (SWord8) (s535 >> 24);-  const SWord8  s3074 = table6[s3073];-  const SWord8  s3075 = (SWord8) (s535 >> 16);-  const SWord8  s3076 = table7[s3075];-  const SWord8  s3077 = (SWord8) (s535 >> 8);-  const SWord8  s3078 = table8[s3077];-  const SWord8  s3079 = (SWord8) s535;-  const SWord8  s3080 = table9[s3079];-  const SWord8  s3081 = s3078 ^ s3080;-  const SWord8  s3082 = s3076 ^ s3081;-  const SWord8  s3083 = s3074 ^ s3082;-  const SWord8  s3084 = table9[s3073];-  const SWord8  s3085 = table6[s3075];-  const SWord8  s3086 = table7[s3077];-  const SWord8  s3087 = table8[s3079];-  const SWord8  s3088 = s3086 ^ s3087;-  const SWord8  s3089 = s3085 ^ s3088;-  const SWord8  s3090 = s3084 ^ s3089;-  const SWord16 s3091 = (((SWord16) s3083) << 8) | ((SWord16) s3090);-  const SWord8  s3092 = table8[s3073];-  const SWord8  s3093 = table9[s3075];-  const SWord8  s3094 = table6[s3077];-  const SWord8  s3095 = table7[s3079];-  const SWord8  s3096 = s3094 ^ s3095;-  const SWord8  s3097 = s3093 ^ s3096;-  const SWord8  s3098 = s3092 ^ s3097;-  const SWord8  s3099 = table7[s3073];-  const SWord8  s3100 = table8[s3075];-  const SWord8  s3101 = table9[s3077];-  const SWord8  s3102 = table6[s3079];-  const SWord8  s3103 = s3101 ^ s3102;-  const SWord8  s3104 = s3100 ^ s3103;-  const SWord8  s3105 = s3099 ^ s3104;-  const SWord16 s3106 = (((SWord16) s3098) << 8) | ((SWord16) s3105);-  const SWord32 s3107 = (((SWord32) s3091) << 16) | ((SWord32) s3106);-  const SWord32 s3108 = s3072 ^ s3107;-  const SWord8  s3109 = (SWord8) (s3108 >> 8);-  const SWord8  s3110 = table0[s3109];-  const SWord8  s3111 = (SWord8) (s2970 >> 24);-  const SWord32 s3112 = table1[s3111];-  const SWord8  s3113 = (SWord8) (s2821 >> 16);-  const SWord32 s3114 = table3[s3113];-  const SWord32 s3115 = s3112 ^ s3114;-  const SWord8  s3116 = (SWord8) (s2870 >> 8);-  const SWord32 s3117 = table4[s3116];-  const SWord32 s3118 = s3115 ^ s3117;-  const SWord8  s3119 = (SWord8) s2920;-  const SWord32 s3120 = table5[s3119];-  const SWord32 s3121 = s3118 ^ s3120;-  const SWord8  s3122 = (SWord8) (s534 >> 24);-  const SWord8  s3123 = table6[s3122];-  const SWord8  s3124 = (SWord8) (s534 >> 16);-  const SWord8  s3125 = table7[s3124];-  const SWord8  s3126 = (SWord8) (s534 >> 8);-  const SWord8  s3127 = table8[s3126];-  const SWord8  s3128 = (SWord8) s534;-  const SWord8  s3129 = table9[s3128];-  const SWord8  s3130 = s3127 ^ s3129;-  const SWord8  s3131 = s3125 ^ s3130;-  const SWord8  s3132 = s3123 ^ s3131;-  const SWord8  s3133 = table9[s3122];-  const SWord8  s3134 = table6[s3124];-  const SWord8  s3135 = table7[s3126];-  const SWord8  s3136 = table8[s3128];-  const SWord8  s3137 = s3135 ^ s3136;-  const SWord8  s3138 = s3134 ^ s3137;-  const SWord8  s3139 = s3133 ^ s3138;-  const SWord16 s3140 = (((SWord16) s3132) << 8) | ((SWord16) s3139);-  const SWord8  s3141 = table8[s3122];-  const SWord8  s3142 = table9[s3124];-  const SWord8  s3143 = table6[s3126];-  const SWord8  s3144 = table7[s3128];-  const SWord8  s3145 = s3143 ^ s3144;-  const SWord8  s3146 = s3142 ^ s3145;-  const SWord8  s3147 = s3141 ^ s3146;-  const SWord8  s3148 = table7[s3122];-  const SWord8  s3149 = table8[s3124];-  const SWord8  s3150 = table9[s3126];-  const SWord8  s3151 = table6[s3128];-  const SWord8  s3152 = s3150 ^ s3151;-  const SWord8  s3153 = s3149 ^ s3152;-  const SWord8  s3154 = s3148 ^ s3153;-  const SWord16 s3155 = (((SWord16) s3147) << 8) | ((SWord16) s3154);-  const SWord32 s3156 = (((SWord32) s3140) << 16) | ((SWord32) s3155);-  const SWord32 s3157 = s3121 ^ s3156;-  const SWord8  s3158 = (SWord8) s3157;-  const SWord8  s3159 = table0[s3158];-  const SWord16 s3160 = (((SWord16) s3110) << 8) | ((SWord16) s3159);-  const SWord32 s3161 = (((SWord32) s3061) << 16) | ((SWord32) s3160);-  const SWord32 s3162 = s4 ^ s3161;-  const SWord8  s3163 = (SWord8) (s3157 >> 24);-  const SWord8  s3164 = table0[s3163];-  const SWord8  s3165 = (SWord8) (s3009 >> 16);-  const SWord8  s3166 = table0[s3165];-  const SWord16 s3167 = (((SWord16) s3164) << 8) | ((SWord16) s3166);-  const SWord8  s3168 = (SWord8) (s3058 >> 8);-  const SWord8  s3169 = table0[s3168];-  const SWord8  s3170 = (SWord8) s3108;-  const SWord8  s3171 = table0[s3170];-  const SWord16 s3172 = (((SWord16) s3169) << 8) | ((SWord16) s3171);-  const SWord32 s3173 = (((SWord32) s3167) << 16) | ((SWord32) s3172);-  const SWord32 s3174 = s5 ^ s3173;-  const SWord8  s3175 = (SWord8) (s3108 >> 24);-  const SWord8  s3176 = table0[s3175];-  const SWord8  s3177 = (SWord8) (s3157 >> 16);-  const SWord8  s3178 = table0[s3177];-  const SWord16 s3179 = (((SWord16) s3176) << 8) | ((SWord16) s3178);-  const SWord8  s3180 = (SWord8) (s3009 >> 8);-  const SWord8  s3181 = table0[s3180];-  const SWord8  s3182 = (SWord8) s3058;-  const SWord8  s3183 = table0[s3182];-  const SWord16 s3184 = (((SWord16) s3181) << 8) | ((SWord16) s3183);-  const SWord32 s3185 = (((SWord32) s3179) << 16) | ((SWord32) s3184);-  const SWord32 s3186 = s6 ^ s3185;-  const SWord8  s3187 = (SWord8) (s3058 >> 24);-  const SWord8  s3188 = table0[s3187];-  const SWord8  s3189 = (SWord8) (s3108 >> 16);-  const SWord8  s3190 = table0[s3189];-  const SWord16 s3191 = (((SWord16) s3188) << 8) | ((SWord16) s3190);-  const SWord8  s3192 = (SWord8) (s3157 >> 8);-  const SWord8  s3193 = table0[s3192];-  const SWord8  s3194 = (SWord8) s3009;-  const SWord8  s3195 = table0[s3194];-  const SWord16 s3196 = (((SWord16) s3193) << 8) | ((SWord16) s3195);-  const SWord32 s3197 = (((SWord32) s3191) << 16) | ((SWord32) s3196);-  const SWord32 s3198 = s7 ^ s3197;--  ct[0] = s3162;-  ct[1] = s3174;-  ct[2] = s3186;-  ct[3] = s3198;+aes128Dec_driver.o: aes128Dec_driver.c aes128Dec.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128Dec_driver: aes128Dec.o aes128Dec_driver.o+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}++clean:+	rm -f *.o++veryclean: clean+	rm -f aes128Dec_driver+== END: "Makefile" ==================+== BEGIN: "aes128Dec.h" ================+/* Header file for aes128Dec. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_aes128Dec_HEADER_INCLUDED+#define SBV_GENERATED_aes128Dec_HEADER_INCLUDED+++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* Entry point prototype: */+void aes128Dec(const SWord32 *pt, const SWord32 *key, SWord32 *ct);++#endif /* SBV_GENERATED_aes128Dec_HEADER_INCLUDED */+== END: "aes128Dec.h" ==================+== BEGIN: "aes128Dec_driver.c" ================+/* Example driver program for aes128Dec. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "aes128Dec.h"++int main(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array pt:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  pt[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord32 sbv_driver_input_1[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array key:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 4 ; ++sbv_driver_input_1_ctr)+  { printf("  key[%1d] = ", sbv_driver_input_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[4];++  aes128Dec(sbv_driver_input_0, sbv_driver_input_1,+            sbv_driver_output_0);++  printf("aes128Dec(pt, key, ct) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 4 ; ++sbv_driver_output_0_ctr)+  { printf("  ct[%1d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }++  return 0;+}+== END: "aes128Dec_driver.c" ==================+== BEGIN: "aes128Dec.c" ================+/* File: "aes128Dec.c". Automatically generated by SBV. Do not edit! */++#include "aes128Dec.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotl(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) << amount) | (((uint64_t) (SWord32) a) >> (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotr(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) >> amount) | (((uint64_t) (SWord32) a) << (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128Dec(const SWord32 *sbv_input_0,+               const SWord32 *sbv_input_1, SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s4 = sbv_input_1[0];+  const SWord32 s5 = sbv_input_1[1];+  const SWord32 s6 = sbv_input_1[2];+  const SWord32 s7 = sbv_input_1[3];+  const SWord32 s520 = sbv_bv_u32_rotl(s7, 8);+  const SWord8  s521 = sbv_bv_extract_u32_31_24_u8(s520);+  const SWord8  s524 = sbv_bv_extract_u32_23_16_u8(s520);+  const SWord8  s527 = sbv_bv_extract_u32_15_8_u8(s520);+  const SWord8  s529 = sbv_bv_extract_u32_7_0_u8(s520);+        SWord8  s522;+        SWord8  s523;+        SWord8  s525;+        SWord16 s526;+        SWord8  s528;+        SWord8  s530;+        SWord16 s531;+        SWord32 s532;+        SWord32 s533;+        SWord32 s534;+        SWord32 s535;+        SWord32 s536;+        SWord32 s537;+        SWord8  s538;+        SWord8  s539;+        SWord8  s540;+        SWord8  s541;+        SWord8  s542;+        SWord16 s543;+        SWord8  s544;+        SWord8  s545;+        SWord8  s546;+        SWord8  s547;+        SWord16 s548;+        SWord32 s549;+        SWord32 s550;+        SWord32 s551;+        SWord32 s552;+        SWord32 s553;+        SWord32 s554;+        SWord8  s555;+        SWord8  s556;+        SWord8  s557;+        SWord8  s558;+        SWord8  s559;+        SWord16 s560;+        SWord8  s561;+        SWord8  s562;+        SWord8  s563;+        SWord8  s564;+        SWord16 s565;+        SWord32 s566;+        SWord32 s567;+        SWord32 s568;+        SWord32 s569;+        SWord32 s570;+        SWord32 s571;+        SWord8  s572;+        SWord8  s573;+        SWord8  s574;+        SWord8  s575;+        SWord8  s576;+        SWord16 s577;+        SWord8  s578;+        SWord8  s579;+        SWord8  s580;+        SWord8  s581;+        SWord16 s582;+        SWord32 s583;+        SWord32 s584;+        SWord32 s585;+        SWord32 s586;+        SWord32 s587;+        SWord32 s588;+        SWord8  s589;+        SWord8  s590;+        SWord8  s591;+        SWord8  s592;+        SWord8  s593;+        SWord16 s594;+        SWord8  s595;+        SWord8  s596;+        SWord8  s597;+        SWord8  s598;+        SWord16 s599;+        SWord32 s600;+        SWord32 s601;+        SWord32 s602;+        SWord32 s603;+        SWord32 s604;+        SWord32 s605;+        SWord8  s606;+        SWord8  s607;+        SWord8  s608;+        SWord8  s609;+        SWord8  s610;+        SWord16 s611;+        SWord8  s612;+        SWord8  s613;+        SWord8  s614;+        SWord8  s615;+        SWord16 s616;+        SWord32 s617;+        SWord32 s618;+        SWord32 s619;+        SWord32 s620;+        SWord32 s621;+        SWord32 s622;+        SWord8  s623;+        SWord8  s624;+        SWord8  s625;+        SWord8  s626;+        SWord8  s627;+        SWord16 s628;+        SWord8  s629;+        SWord8  s630;+        SWord8  s631;+        SWord8  s632;+        SWord16 s633;+        SWord32 s634;+        SWord32 s635;+        SWord32 s636;+        SWord32 s637;+        SWord32 s638;+        SWord32 s639;+        SWord8  s640;+        SWord8  s641;+        SWord8  s642;+        SWord8  s643;+        SWord8  s644;+        SWord16 s645;+        SWord8  s646;+        SWord8  s647;+        SWord8  s648;+        SWord8  s649;+        SWord16 s650;+        SWord32 s651;+        SWord32 s652;+        SWord32 s653;+        SWord32 s654;+        SWord32 s655;+        SWord32 s656;+        SWord8  s657;+        SWord8  s658;+        SWord8  s659;+        SWord8  s660;+        SWord8  s661;+        SWord16 s662;+        SWord8  s663;+        SWord8  s664;+        SWord8  s665;+        SWord8  s666;+        SWord16 s667;+        SWord32 s668;+        SWord32 s669;+        SWord32 s670;+        SWord32 s671;+        SWord32 s672;+        SWord32 s673;+        SWord8  s674;+        SWord8  s675;+        SWord8  s676;+        SWord8  s677;+        SWord8  s678;+        SWord16 s679;+        SWord8  s680;+        SWord8  s681;+        SWord8  s682;+        SWord8  s683;+        SWord16 s684;+        SWord32 s685;+        SWord32 s686;+        SWord32 s687;+        SWord8  s688;+        SWord32 s689;+        SWord32 s945;+        SWord32 s946;+        SWord32 s947;+        SWord32 s948;+        SWord8  s949;+        SWord32 s950;+        SWord32 s951;+        SWord32 s1207;+        SWord8  s1208;+        SWord32 s1209;+        SWord32 s1210;+        SWord32 s1466;+        SWord8  s1467;+        SWord32 s1468;+        SWord32 s1469;+        SWord8  s1470;+        SWord8  s1471;+        SWord8  s1472;+        SWord8  s1473;+        SWord8  s1474;+        SWord8  s1475;+        SWord8  s1476;+        SWord8  s1477;+        SWord8  s1478;+        SWord8  s1479;+        SWord8  s1480;+        SWord8  s1481;+        SWord8  s1482;+        SWord8  s1483;+        SWord8  s1484;+        SWord8  s1485;+        SWord8  s1486;+        SWord8  s1487;+        SWord16 s1488;+        SWord8  s1489;+        SWord8  s1490;+        SWord8  s1491;+        SWord8  s1492;+        SWord8  s1493;+        SWord8  s1494;+        SWord8  s1495;+        SWord8  s1496;+        SWord8  s1497;+        SWord8  s1498;+        SWord8  s1499;+        SWord8  s1500;+        SWord8  s1501;+        SWord8  s1502;+        SWord16 s1503;+        SWord32 s1504;+        SWord32 s1505;+        SWord8  s1506;+        SWord32 s1507;+        SWord8  s1508;+        SWord32 s1509;+        SWord8  s1510;+        SWord32 s1511;+        SWord32 s1512;+        SWord8  s1513;+        SWord32 s1514;+        SWord32 s1515;+        SWord8  s1516;+        SWord32 s1517;+        SWord32 s1518;+        SWord8  s1519;+        SWord8  s1520;+        SWord8  s1521;+        SWord8  s1522;+        SWord8  s1523;+        SWord8  s1524;+        SWord8  s1525;+        SWord8  s1526;+        SWord8  s1527;+        SWord8  s1528;+        SWord8  s1529;+        SWord8  s1530;+        SWord8  s1531;+        SWord8  s1532;+        SWord8  s1533;+        SWord8  s1534;+        SWord8  s1535;+        SWord8  s1536;+        SWord16 s1537;+        SWord8  s1538;+        SWord8  s1539;+        SWord8  s1540;+        SWord8  s1541;+        SWord8  s1542;+        SWord8  s1543;+        SWord8  s1544;+        SWord8  s1545;+        SWord8  s1546;+        SWord8  s1547;+        SWord8  s1548;+        SWord8  s1549;+        SWord8  s1550;+        SWord8  s1551;+        SWord16 s1552;+        SWord32 s1553;+        SWord32 s1554;+        SWord8  s1555;+        SWord32 s1556;+        SWord32 s1557;+        SWord8  s1558;+        SWord32 s1559;+        SWord8  s1560;+        SWord32 s1561;+        SWord32 s1562;+        SWord8  s1563;+        SWord32 s1564;+        SWord32 s1565;+        SWord8  s1566;+        SWord32 s1567;+        SWord32 s1568;+        SWord8  s1569;+        SWord8  s1570;+        SWord8  s1571;+        SWord8  s1572;+        SWord8  s1573;+        SWord8  s1574;+        SWord8  s1575;+        SWord8  s1576;+        SWord8  s1577;+        SWord8  s1578;+        SWord8  s1579;+        SWord8  s1580;+        SWord8  s1581;+        SWord8  s1582;+        SWord8  s1583;+        SWord8  s1584;+        SWord8  s1585;+        SWord8  s1586;+        SWord16 s1587;+        SWord8  s1588;+        SWord8  s1589;+        SWord8  s1590;+        SWord8  s1591;+        SWord8  s1592;+        SWord8  s1593;+        SWord8  s1594;+        SWord8  s1595;+        SWord8  s1596;+        SWord8  s1597;+        SWord8  s1598;+        SWord8  s1599;+        SWord8  s1600;+        SWord8  s1601;+        SWord16 s1602;+        SWord32 s1603;+        SWord32 s1604;+        SWord8  s1605;+        SWord32 s1606;+        SWord32 s1607;+        SWord8  s1608;+        SWord32 s1609;+        SWord8  s1610;+        SWord32 s1611;+        SWord32 s1612;+        SWord8  s1613;+        SWord32 s1614;+        SWord32 s1615;+        SWord8  s1616;+        SWord32 s1617;+        SWord32 s1618;+        SWord8  s1619;+        SWord8  s1620;+        SWord8  s1621;+        SWord8  s1622;+        SWord8  s1623;+        SWord8  s1624;+        SWord8  s1625;+        SWord8  s1626;+        SWord8  s1627;+        SWord8  s1628;+        SWord8  s1629;+        SWord8  s1630;+        SWord8  s1631;+        SWord8  s1632;+        SWord8  s1633;+        SWord8  s1634;+        SWord8  s1635;+        SWord8  s1636;+        SWord16 s1637;+        SWord8  s1638;+        SWord8  s1639;+        SWord8  s1640;+        SWord8  s1641;+        SWord8  s1642;+        SWord8  s1643;+        SWord8  s1644;+        SWord8  s1645;+        SWord8  s1646;+        SWord8  s1647;+        SWord8  s1648;+        SWord8  s1649;+        SWord8  s1650;+        SWord8  s1651;+        SWord16 s1652;+        SWord32 s1653;+        SWord32 s1654;+        SWord8  s1655;+        SWord32 s1656;+        SWord32 s1657;+        SWord8  s1658;+        SWord8  s1659;+        SWord8  s1660;+        SWord8  s1661;+        SWord8  s1662;+        SWord8  s1663;+        SWord8  s1664;+        SWord8  s1665;+        SWord8  s1666;+        SWord8  s1667;+        SWord8  s1668;+        SWord8  s1669;+        SWord8  s1670;+        SWord8  s1671;+        SWord8  s1672;+        SWord8  s1673;+        SWord8  s1674;+        SWord8  s1675;+        SWord16 s1676;+        SWord8  s1677;+        SWord8  s1678;+        SWord8  s1679;+        SWord8  s1680;+        SWord8  s1681;+        SWord8  s1682;+        SWord8  s1683;+        SWord8  s1684;+        SWord8  s1685;+        SWord8  s1686;+        SWord8  s1687;+        SWord8  s1688;+        SWord8  s1689;+        SWord8  s1690;+        SWord16 s1691;+        SWord32 s1692;+        SWord32 s1693;+        SWord8  s1694;+        SWord32 s1695;+        SWord8  s1696;+        SWord32 s1697;+        SWord8  s1698;+        SWord32 s1699;+        SWord32 s1700;+        SWord8  s1701;+        SWord32 s1702;+        SWord32 s1703;+        SWord8  s1704;+        SWord32 s1705;+        SWord32 s1706;+        SWord8  s1707;+        SWord8  s1708;+        SWord8  s1709;+        SWord8  s1710;+        SWord8  s1711;+        SWord8  s1712;+        SWord8  s1713;+        SWord8  s1714;+        SWord8  s1715;+        SWord8  s1716;+        SWord8  s1717;+        SWord8  s1718;+        SWord8  s1719;+        SWord8  s1720;+        SWord8  s1721;+        SWord8  s1722;+        SWord8  s1723;+        SWord8  s1724;+        SWord16 s1725;+        SWord8  s1726;+        SWord8  s1727;+        SWord8  s1728;+        SWord8  s1729;+        SWord8  s1730;+        SWord8  s1731;+        SWord8  s1732;+        SWord8  s1733;+        SWord8  s1734;+        SWord8  s1735;+        SWord8  s1736;+        SWord8  s1737;+        SWord8  s1738;+        SWord8  s1739;+        SWord16 s1740;+        SWord32 s1741;+        SWord32 s1742;+        SWord8  s1743;+        SWord32 s1744;+        SWord32 s1745;+        SWord8  s1746;+        SWord32 s1747;+        SWord8  s1748;+        SWord32 s1749;+        SWord32 s1750;+        SWord8  s1751;+        SWord32 s1752;+        SWord32 s1753;+        SWord8  s1754;+        SWord32 s1755;+        SWord32 s1756;+        SWord8  s1757;+        SWord8  s1758;+        SWord8  s1759;+        SWord8  s1760;+        SWord8  s1761;+        SWord8  s1762;+        SWord8  s1763;+        SWord8  s1764;+        SWord8  s1765;+        SWord8  s1766;+        SWord8  s1767;+        SWord8  s1768;+        SWord8  s1769;+        SWord8  s1770;+        SWord8  s1771;+        SWord8  s1772;+        SWord8  s1773;+        SWord8  s1774;+        SWord16 s1775;+        SWord8  s1776;+        SWord8  s1777;+        SWord8  s1778;+        SWord8  s1779;+        SWord8  s1780;+        SWord8  s1781;+        SWord8  s1782;+        SWord8  s1783;+        SWord8  s1784;+        SWord8  s1785;+        SWord8  s1786;+        SWord8  s1787;+        SWord8  s1788;+        SWord8  s1789;+        SWord16 s1790;+        SWord32 s1791;+        SWord32 s1792;+        SWord8  s1793;+        SWord32 s1794;+        SWord32 s1795;+        SWord8  s1796;+        SWord32 s1797;+        SWord8  s1798;+        SWord32 s1799;+        SWord32 s1800;+        SWord8  s1801;+        SWord32 s1802;+        SWord32 s1803;+        SWord8  s1804;+        SWord32 s1805;+        SWord32 s1806;+        SWord8  s1807;+        SWord8  s1808;+        SWord8  s1809;+        SWord8  s1810;+        SWord8  s1811;+        SWord8  s1812;+        SWord8  s1813;+        SWord8  s1814;+        SWord8  s1815;+        SWord8  s1816;+        SWord8  s1817;+        SWord8  s1818;+        SWord8  s1819;+        SWord8  s1820;+        SWord8  s1821;+        SWord8  s1822;+        SWord8  s1823;+        SWord8  s1824;+        SWord16 s1825;+        SWord8  s1826;+        SWord8  s1827;+        SWord8  s1828;+        SWord8  s1829;+        SWord8  s1830;+        SWord8  s1831;+        SWord8  s1832;+        SWord8  s1833;+        SWord8  s1834;+        SWord8  s1835;+        SWord8  s1836;+        SWord8  s1837;+        SWord8  s1838;+        SWord8  s1839;+        SWord16 s1840;+        SWord32 s1841;+        SWord32 s1842;+        SWord8  s1843;+        SWord32 s1844;+        SWord32 s1845;+        SWord8  s1846;+        SWord8  s1847;+        SWord8  s1848;+        SWord8  s1849;+        SWord8  s1850;+        SWord8  s1851;+        SWord8  s1852;+        SWord8  s1853;+        SWord8  s1854;+        SWord8  s1855;+        SWord8  s1856;+        SWord8  s1857;+        SWord8  s1858;+        SWord8  s1859;+        SWord8  s1860;+        SWord8  s1861;+        SWord8  s1862;+        SWord8  s1863;+        SWord16 s1864;+        SWord8  s1865;+        SWord8  s1866;+        SWord8  s1867;+        SWord8  s1868;+        SWord8  s1869;+        SWord8  s1870;+        SWord8  s1871;+        SWord8  s1872;+        SWord8  s1873;+        SWord8  s1874;+        SWord8  s1875;+        SWord8  s1876;+        SWord8  s1877;+        SWord8  s1878;+        SWord16 s1879;+        SWord32 s1880;+        SWord32 s1881;+        SWord8  s1882;+        SWord32 s1883;+        SWord8  s1884;+        SWord32 s1885;+        SWord8  s1886;+        SWord32 s1887;+        SWord32 s1888;+        SWord8  s1889;+        SWord32 s1890;+        SWord32 s1891;+        SWord8  s1892;+        SWord32 s1893;+        SWord32 s1894;+        SWord8  s1895;+        SWord8  s1896;+        SWord8  s1897;+        SWord8  s1898;+        SWord8  s1899;+        SWord8  s1900;+        SWord8  s1901;+        SWord8  s1902;+        SWord8  s1903;+        SWord8  s1904;+        SWord8  s1905;+        SWord8  s1906;+        SWord8  s1907;+        SWord8  s1908;+        SWord8  s1909;+        SWord8  s1910;+        SWord8  s1911;+        SWord8  s1912;+        SWord16 s1913;+        SWord8  s1914;+        SWord8  s1915;+        SWord8  s1916;+        SWord8  s1917;+        SWord8  s1918;+        SWord8  s1919;+        SWord8  s1920;+        SWord8  s1921;+        SWord8  s1922;+        SWord8  s1923;+        SWord8  s1924;+        SWord8  s1925;+        SWord8  s1926;+        SWord8  s1927;+        SWord16 s1928;+        SWord32 s1929;+        SWord32 s1930;+        SWord8  s1931;+        SWord32 s1932;+        SWord32 s1933;+        SWord8  s1934;+        SWord32 s1935;+        SWord8  s1936;+        SWord32 s1937;+        SWord32 s1938;+        SWord8  s1939;+        SWord32 s1940;+        SWord32 s1941;+        SWord8  s1942;+        SWord32 s1943;+        SWord32 s1944;+        SWord8  s1945;+        SWord8  s1946;+        SWord8  s1947;+        SWord8  s1948;+        SWord8  s1949;+        SWord8  s1950;+        SWord8  s1951;+        SWord8  s1952;+        SWord8  s1953;+        SWord8  s1954;+        SWord8  s1955;+        SWord8  s1956;+        SWord8  s1957;+        SWord8  s1958;+        SWord8  s1959;+        SWord8  s1960;+        SWord8  s1961;+        SWord8  s1962;+        SWord16 s1963;+        SWord8  s1964;+        SWord8  s1965;+        SWord8  s1966;+        SWord8  s1967;+        SWord8  s1968;+        SWord8  s1969;+        SWord8  s1970;+        SWord8  s1971;+        SWord8  s1972;+        SWord8  s1973;+        SWord8  s1974;+        SWord8  s1975;+        SWord8  s1976;+        SWord8  s1977;+        SWord16 s1978;+        SWord32 s1979;+        SWord32 s1980;+        SWord8  s1981;+        SWord32 s1982;+        SWord32 s1983;+        SWord8  s1984;+        SWord32 s1985;+        SWord8  s1986;+        SWord32 s1987;+        SWord32 s1988;+        SWord8  s1989;+        SWord32 s1990;+        SWord32 s1991;+        SWord8  s1992;+        SWord32 s1993;+        SWord32 s1994;+        SWord8  s1995;+        SWord8  s1996;+        SWord8  s1997;+        SWord8  s1998;+        SWord8  s1999;+        SWord8  s2000;+        SWord8  s2001;+        SWord8  s2002;+        SWord8  s2003;+        SWord8  s2004;+        SWord8  s2005;+        SWord8  s2006;+        SWord8  s2007;+        SWord8  s2008;+        SWord8  s2009;+        SWord8  s2010;+        SWord8  s2011;+        SWord8  s2012;+        SWord16 s2013;+        SWord8  s2014;+        SWord8  s2015;+        SWord8  s2016;+        SWord8  s2017;+        SWord8  s2018;+        SWord8  s2019;+        SWord8  s2020;+        SWord8  s2021;+        SWord8  s2022;+        SWord8  s2023;+        SWord8  s2024;+        SWord8  s2025;+        SWord8  s2026;+        SWord8  s2027;+        SWord16 s2028;+        SWord32 s2029;+        SWord32 s2030;+        SWord8  s2031;+        SWord32 s2032;+        SWord32 s2033;+        SWord8  s2034;+        SWord8  s2035;+        SWord8  s2036;+        SWord8  s2037;+        SWord8  s2038;+        SWord8  s2039;+        SWord8  s2040;+        SWord8  s2041;+        SWord8  s2042;+        SWord8  s2043;+        SWord8  s2044;+        SWord8  s2045;+        SWord8  s2046;+        SWord8  s2047;+        SWord8  s2048;+        SWord8  s2049;+        SWord8  s2050;+        SWord8  s2051;+        SWord16 s2052;+        SWord8  s2053;+        SWord8  s2054;+        SWord8  s2055;+        SWord8  s2056;+        SWord8  s2057;+        SWord8  s2058;+        SWord8  s2059;+        SWord8  s2060;+        SWord8  s2061;+        SWord8  s2062;+        SWord8  s2063;+        SWord8  s2064;+        SWord8  s2065;+        SWord8  s2066;+        SWord16 s2067;+        SWord32 s2068;+        SWord32 s2069;+        SWord8  s2070;+        SWord32 s2071;+        SWord8  s2072;+        SWord32 s2073;+        SWord8  s2074;+        SWord32 s2075;+        SWord32 s2076;+        SWord8  s2077;+        SWord32 s2078;+        SWord32 s2079;+        SWord8  s2080;+        SWord32 s2081;+        SWord32 s2082;+        SWord8  s2083;+        SWord8  s2084;+        SWord8  s2085;+        SWord8  s2086;+        SWord8  s2087;+        SWord8  s2088;+        SWord8  s2089;+        SWord8  s2090;+        SWord8  s2091;+        SWord8  s2092;+        SWord8  s2093;+        SWord8  s2094;+        SWord8  s2095;+        SWord8  s2096;+        SWord8  s2097;+        SWord8  s2098;+        SWord8  s2099;+        SWord8  s2100;+        SWord16 s2101;+        SWord8  s2102;+        SWord8  s2103;+        SWord8  s2104;+        SWord8  s2105;+        SWord8  s2106;+        SWord8  s2107;+        SWord8  s2108;+        SWord8  s2109;+        SWord8  s2110;+        SWord8  s2111;+        SWord8  s2112;+        SWord8  s2113;+        SWord8  s2114;+        SWord8  s2115;+        SWord16 s2116;+        SWord32 s2117;+        SWord32 s2118;+        SWord8  s2119;+        SWord32 s2120;+        SWord32 s2121;+        SWord8  s2122;+        SWord32 s2123;+        SWord8  s2124;+        SWord32 s2125;+        SWord32 s2126;+        SWord8  s2127;+        SWord32 s2128;+        SWord32 s2129;+        SWord8  s2130;+        SWord32 s2131;+        SWord32 s2132;+        SWord8  s2133;+        SWord8  s2134;+        SWord8  s2135;+        SWord8  s2136;+        SWord8  s2137;+        SWord8  s2138;+        SWord8  s2139;+        SWord8  s2140;+        SWord8  s2141;+        SWord8  s2142;+        SWord8  s2143;+        SWord8  s2144;+        SWord8  s2145;+        SWord8  s2146;+        SWord8  s2147;+        SWord8  s2148;+        SWord8  s2149;+        SWord8  s2150;+        SWord16 s2151;+        SWord8  s2152;+        SWord8  s2153;+        SWord8  s2154;+        SWord8  s2155;+        SWord8  s2156;+        SWord8  s2157;+        SWord8  s2158;+        SWord8  s2159;+        SWord8  s2160;+        SWord8  s2161;+        SWord8  s2162;+        SWord8  s2163;+        SWord8  s2164;+        SWord8  s2165;+        SWord16 s2166;+        SWord32 s2167;+        SWord32 s2168;+        SWord8  s2169;+        SWord32 s2170;+        SWord32 s2171;+        SWord8  s2172;+        SWord32 s2173;+        SWord8  s2174;+        SWord32 s2175;+        SWord32 s2176;+        SWord8  s2177;+        SWord32 s2178;+        SWord32 s2179;+        SWord8  s2180;+        SWord32 s2181;+        SWord32 s2182;+        SWord8  s2183;+        SWord8  s2184;+        SWord8  s2185;+        SWord8  s2186;+        SWord8  s2187;+        SWord8  s2188;+        SWord8  s2189;+        SWord8  s2190;+        SWord8  s2191;+        SWord8  s2192;+        SWord8  s2193;+        SWord8  s2194;+        SWord8  s2195;+        SWord8  s2196;+        SWord8  s2197;+        SWord8  s2198;+        SWord8  s2199;+        SWord8  s2200;+        SWord16 s2201;+        SWord8  s2202;+        SWord8  s2203;+        SWord8  s2204;+        SWord8  s2205;+        SWord8  s2206;+        SWord8  s2207;+        SWord8  s2208;+        SWord8  s2209;+        SWord8  s2210;+        SWord8  s2211;+        SWord8  s2212;+        SWord8  s2213;+        SWord8  s2214;+        SWord8  s2215;+        SWord16 s2216;+        SWord32 s2217;+        SWord32 s2218;+        SWord8  s2219;+        SWord32 s2220;+        SWord32 s2221;+        SWord8  s2222;+        SWord8  s2223;+        SWord8  s2224;+        SWord8  s2225;+        SWord8  s2226;+        SWord8  s2227;+        SWord8  s2228;+        SWord8  s2229;+        SWord8  s2230;+        SWord8  s2231;+        SWord8  s2232;+        SWord8  s2233;+        SWord8  s2234;+        SWord8  s2235;+        SWord8  s2236;+        SWord8  s2237;+        SWord8  s2238;+        SWord8  s2239;+        SWord16 s2240;+        SWord8  s2241;+        SWord8  s2242;+        SWord8  s2243;+        SWord8  s2244;+        SWord8  s2245;+        SWord8  s2246;+        SWord8  s2247;+        SWord8  s2248;+        SWord8  s2249;+        SWord8  s2250;+        SWord8  s2251;+        SWord8  s2252;+        SWord8  s2253;+        SWord8  s2254;+        SWord16 s2255;+        SWord32 s2256;+        SWord32 s2257;+        SWord8  s2258;+        SWord32 s2259;+        SWord8  s2260;+        SWord32 s2261;+        SWord8  s2262;+        SWord32 s2263;+        SWord32 s2264;+        SWord8  s2265;+        SWord32 s2266;+        SWord32 s2267;+        SWord8  s2268;+        SWord32 s2269;+        SWord32 s2270;+        SWord8  s2271;+        SWord8  s2272;+        SWord8  s2273;+        SWord8  s2274;+        SWord8  s2275;+        SWord8  s2276;+        SWord8  s2277;+        SWord8  s2278;+        SWord8  s2279;+        SWord8  s2280;+        SWord8  s2281;+        SWord8  s2282;+        SWord8  s2283;+        SWord8  s2284;+        SWord8  s2285;+        SWord8  s2286;+        SWord8  s2287;+        SWord8  s2288;+        SWord16 s2289;+        SWord8  s2290;+        SWord8  s2291;+        SWord8  s2292;+        SWord8  s2293;+        SWord8  s2294;+        SWord8  s2295;+        SWord8  s2296;+        SWord8  s2297;+        SWord8  s2298;+        SWord8  s2299;+        SWord8  s2300;+        SWord8  s2301;+        SWord8  s2302;+        SWord8  s2303;+        SWord16 s2304;+        SWord32 s2305;+        SWord32 s2306;+        SWord8  s2307;+        SWord32 s2308;+        SWord32 s2309;+        SWord8  s2310;+        SWord32 s2311;+        SWord8  s2312;+        SWord32 s2313;+        SWord32 s2314;+        SWord8  s2315;+        SWord32 s2316;+        SWord32 s2317;+        SWord8  s2318;+        SWord32 s2319;+        SWord32 s2320;+        SWord8  s2321;+        SWord8  s2322;+        SWord8  s2323;+        SWord8  s2324;+        SWord8  s2325;+        SWord8  s2326;+        SWord8  s2327;+        SWord8  s2328;+        SWord8  s2329;+        SWord8  s2330;+        SWord8  s2331;+        SWord8  s2332;+        SWord8  s2333;+        SWord8  s2334;+        SWord8  s2335;+        SWord8  s2336;+        SWord8  s2337;+        SWord8  s2338;+        SWord16 s2339;+        SWord8  s2340;+        SWord8  s2341;+        SWord8  s2342;+        SWord8  s2343;+        SWord8  s2344;+        SWord8  s2345;+        SWord8  s2346;+        SWord8  s2347;+        SWord8  s2348;+        SWord8  s2349;+        SWord8  s2350;+        SWord8  s2351;+        SWord8  s2352;+        SWord8  s2353;+        SWord16 s2354;+        SWord32 s2355;+        SWord32 s2356;+        SWord8  s2357;+        SWord32 s2358;+        SWord32 s2359;+        SWord8  s2360;+        SWord32 s2361;+        SWord8  s2362;+        SWord32 s2363;+        SWord32 s2364;+        SWord8  s2365;+        SWord32 s2366;+        SWord32 s2367;+        SWord8  s2368;+        SWord32 s2369;+        SWord32 s2370;+        SWord8  s2371;+        SWord8  s2372;+        SWord8  s2373;+        SWord8  s2374;+        SWord8  s2375;+        SWord8  s2376;+        SWord8  s2377;+        SWord8  s2378;+        SWord8  s2379;+        SWord8  s2380;+        SWord8  s2381;+        SWord8  s2382;+        SWord8  s2383;+        SWord8  s2384;+        SWord8  s2385;+        SWord8  s2386;+        SWord8  s2387;+        SWord8  s2388;+        SWord16 s2389;+        SWord8  s2390;+        SWord8  s2391;+        SWord8  s2392;+        SWord8  s2393;+        SWord8  s2394;+        SWord8  s2395;+        SWord8  s2396;+        SWord8  s2397;+        SWord8  s2398;+        SWord8  s2399;+        SWord8  s2400;+        SWord8  s2401;+        SWord8  s2402;+        SWord8  s2403;+        SWord16 s2404;+        SWord32 s2405;+        SWord32 s2406;+        SWord8  s2407;+        SWord32 s2408;+        SWord32 s2409;+        SWord8  s2410;+        SWord8  s2411;+        SWord8  s2412;+        SWord8  s2413;+        SWord8  s2414;+        SWord8  s2415;+        SWord8  s2416;+        SWord8  s2417;+        SWord8  s2418;+        SWord8  s2419;+        SWord8  s2420;+        SWord8  s2421;+        SWord8  s2422;+        SWord8  s2423;+        SWord8  s2424;+        SWord8  s2425;+        SWord8  s2426;+        SWord8  s2427;+        SWord16 s2428;+        SWord8  s2429;+        SWord8  s2430;+        SWord8  s2431;+        SWord8  s2432;+        SWord8  s2433;+        SWord8  s2434;+        SWord8  s2435;+        SWord8  s2436;+        SWord8  s2437;+        SWord8  s2438;+        SWord8  s2439;+        SWord8  s2440;+        SWord8  s2441;+        SWord8  s2442;+        SWord16 s2443;+        SWord32 s2444;+        SWord32 s2445;+        SWord8  s2446;+        SWord32 s2447;+        SWord8  s2448;+        SWord32 s2449;+        SWord8  s2450;+        SWord32 s2451;+        SWord32 s2452;+        SWord8  s2453;+        SWord32 s2454;+        SWord32 s2455;+        SWord8  s2456;+        SWord32 s2457;+        SWord32 s2458;+        SWord8  s2459;+        SWord8  s2460;+        SWord8  s2461;+        SWord8  s2462;+        SWord8  s2463;+        SWord8  s2464;+        SWord8  s2465;+        SWord8  s2466;+        SWord8  s2467;+        SWord8  s2468;+        SWord8  s2469;+        SWord8  s2470;+        SWord8  s2471;+        SWord8  s2472;+        SWord8  s2473;+        SWord8  s2474;+        SWord8  s2475;+        SWord8  s2476;+        SWord16 s2477;+        SWord8  s2478;+        SWord8  s2479;+        SWord8  s2480;+        SWord8  s2481;+        SWord8  s2482;+        SWord8  s2483;+        SWord8  s2484;+        SWord8  s2485;+        SWord8  s2486;+        SWord8  s2487;+        SWord8  s2488;+        SWord8  s2489;+        SWord8  s2490;+        SWord8  s2491;+        SWord16 s2492;+        SWord32 s2493;+        SWord32 s2494;+        SWord8  s2495;+        SWord32 s2496;+        SWord32 s2497;+        SWord8  s2498;+        SWord32 s2499;+        SWord8  s2500;+        SWord32 s2501;+        SWord32 s2502;+        SWord8  s2503;+        SWord32 s2504;+        SWord32 s2505;+        SWord8  s2506;+        SWord32 s2507;+        SWord32 s2508;+        SWord8  s2509;+        SWord8  s2510;+        SWord8  s2511;+        SWord8  s2512;+        SWord8  s2513;+        SWord8  s2514;+        SWord8  s2515;+        SWord8  s2516;+        SWord8  s2517;+        SWord8  s2518;+        SWord8  s2519;+        SWord8  s2520;+        SWord8  s2521;+        SWord8  s2522;+        SWord8  s2523;+        SWord8  s2524;+        SWord8  s2525;+        SWord8  s2526;+        SWord16 s2527;+        SWord8  s2528;+        SWord8  s2529;+        SWord8  s2530;+        SWord8  s2531;+        SWord8  s2532;+        SWord8  s2533;+        SWord8  s2534;+        SWord8  s2535;+        SWord8  s2536;+        SWord8  s2537;+        SWord8  s2538;+        SWord8  s2539;+        SWord8  s2540;+        SWord8  s2541;+        SWord16 s2542;+        SWord32 s2543;+        SWord32 s2544;+        SWord8  s2545;+        SWord32 s2546;+        SWord32 s2547;+        SWord8  s2548;+        SWord32 s2549;+        SWord8  s2550;+        SWord32 s2551;+        SWord32 s2552;+        SWord8  s2553;+        SWord32 s2554;+        SWord32 s2555;+        SWord8  s2556;+        SWord32 s2557;+        SWord32 s2558;+        SWord8  s2559;+        SWord8  s2560;+        SWord8  s2561;+        SWord8  s2562;+        SWord8  s2563;+        SWord8  s2564;+        SWord8  s2565;+        SWord8  s2566;+        SWord8  s2567;+        SWord8  s2568;+        SWord8  s2569;+        SWord8  s2570;+        SWord8  s2571;+        SWord8  s2572;+        SWord8  s2573;+        SWord8  s2574;+        SWord8  s2575;+        SWord8  s2576;+        SWord16 s2577;+        SWord8  s2578;+        SWord8  s2579;+        SWord8  s2580;+        SWord8  s2581;+        SWord8  s2582;+        SWord8  s2583;+        SWord8  s2584;+        SWord8  s2585;+        SWord8  s2586;+        SWord8  s2587;+        SWord8  s2588;+        SWord8  s2589;+        SWord8  s2590;+        SWord8  s2591;+        SWord16 s2592;+        SWord32 s2593;+        SWord32 s2594;+        SWord8  s2595;+        SWord32 s2596;+        SWord32 s2597;+        SWord8  s2598;+        SWord8  s2599;+        SWord8  s2600;+        SWord8  s2601;+        SWord8  s2602;+        SWord8  s2603;+        SWord8  s2604;+        SWord8  s2605;+        SWord8  s2606;+        SWord8  s2607;+        SWord8  s2608;+        SWord8  s2609;+        SWord8  s2610;+        SWord8  s2611;+        SWord8  s2612;+        SWord8  s2613;+        SWord8  s2614;+        SWord8  s2615;+        SWord16 s2616;+        SWord8  s2617;+        SWord8  s2618;+        SWord8  s2619;+        SWord8  s2620;+        SWord8  s2621;+        SWord8  s2622;+        SWord8  s2623;+        SWord8  s2624;+        SWord8  s2625;+        SWord8  s2626;+        SWord8  s2627;+        SWord8  s2628;+        SWord8  s2629;+        SWord8  s2630;+        SWord16 s2631;+        SWord32 s2632;+        SWord32 s2633;+        SWord8  s2634;+        SWord32 s2635;+        SWord8  s2636;+        SWord32 s2637;+        SWord8  s2638;+        SWord32 s2639;+        SWord32 s2640;+        SWord8  s2641;+        SWord32 s2642;+        SWord32 s2643;+        SWord8  s2644;+        SWord32 s2645;+        SWord32 s2646;+        SWord8  s2647;+        SWord8  s2648;+        SWord8  s2649;+        SWord8  s2650;+        SWord8  s2651;+        SWord8  s2652;+        SWord8  s2653;+        SWord8  s2654;+        SWord8  s2655;+        SWord8  s2656;+        SWord8  s2657;+        SWord8  s2658;+        SWord8  s2659;+        SWord8  s2660;+        SWord8  s2661;+        SWord8  s2662;+        SWord8  s2663;+        SWord8  s2664;+        SWord16 s2665;+        SWord8  s2666;+        SWord8  s2667;+        SWord8  s2668;+        SWord8  s2669;+        SWord8  s2670;+        SWord8  s2671;+        SWord8  s2672;+        SWord8  s2673;+        SWord8  s2674;+        SWord8  s2675;+        SWord8  s2676;+        SWord8  s2677;+        SWord8  s2678;+        SWord8  s2679;+        SWord16 s2680;+        SWord32 s2681;+        SWord32 s2682;+        SWord8  s2683;+        SWord32 s2684;+        SWord32 s2685;+        SWord8  s2686;+        SWord32 s2687;+        SWord8  s2688;+        SWord32 s2689;+        SWord32 s2690;+        SWord8  s2691;+        SWord32 s2692;+        SWord32 s2693;+        SWord8  s2694;+        SWord32 s2695;+        SWord32 s2696;+        SWord8  s2697;+        SWord8  s2698;+        SWord8  s2699;+        SWord8  s2700;+        SWord8  s2701;+        SWord8  s2702;+        SWord8  s2703;+        SWord8  s2704;+        SWord8  s2705;+        SWord8  s2706;+        SWord8  s2707;+        SWord8  s2708;+        SWord8  s2709;+        SWord8  s2710;+        SWord8  s2711;+        SWord8  s2712;+        SWord8  s2713;+        SWord8  s2714;+        SWord16 s2715;+        SWord8  s2716;+        SWord8  s2717;+        SWord8  s2718;+        SWord8  s2719;+        SWord8  s2720;+        SWord8  s2721;+        SWord8  s2722;+        SWord8  s2723;+        SWord8  s2724;+        SWord8  s2725;+        SWord8  s2726;+        SWord8  s2727;+        SWord8  s2728;+        SWord8  s2729;+        SWord16 s2730;+        SWord32 s2731;+        SWord32 s2732;+        SWord8  s2733;+        SWord32 s2734;+        SWord32 s2735;+        SWord8  s2736;+        SWord32 s2737;+        SWord8  s2738;+        SWord32 s2739;+        SWord32 s2740;+        SWord8  s2741;+        SWord32 s2742;+        SWord32 s2743;+        SWord8  s2744;+        SWord32 s2745;+        SWord32 s2746;+        SWord8  s2747;+        SWord8  s2748;+        SWord8  s2749;+        SWord8  s2750;+        SWord8  s2751;+        SWord8  s2752;+        SWord8  s2753;+        SWord8  s2754;+        SWord8  s2755;+        SWord8  s2756;+        SWord8  s2757;+        SWord8  s2758;+        SWord8  s2759;+        SWord8  s2760;+        SWord8  s2761;+        SWord8  s2762;+        SWord8  s2763;+        SWord8  s2764;+        SWord16 s2765;+        SWord8  s2766;+        SWord8  s2767;+        SWord8  s2768;+        SWord8  s2769;+        SWord8  s2770;+        SWord8  s2771;+        SWord8  s2772;+        SWord8  s2773;+        SWord8  s2774;+        SWord8  s2775;+        SWord8  s2776;+        SWord8  s2777;+        SWord8  s2778;+        SWord8  s2779;+        SWord16 s2780;+        SWord32 s2781;+        SWord32 s2782;+        SWord8  s2783;+        SWord32 s2784;+        SWord32 s2785;+        SWord8  s2786;+        SWord8  s2787;+        SWord8  s2788;+        SWord8  s2789;+        SWord8  s2790;+        SWord8  s2791;+        SWord8  s2792;+        SWord8  s2793;+        SWord8  s2794;+        SWord8  s2795;+        SWord8  s2796;+        SWord8  s2797;+        SWord8  s2798;+        SWord8  s2799;+        SWord8  s2800;+        SWord8  s2801;+        SWord8  s2802;+        SWord8  s2803;+        SWord16 s2804;+        SWord8  s2805;+        SWord8  s2806;+        SWord8  s2807;+        SWord8  s2808;+        SWord8  s2809;+        SWord8  s2810;+        SWord8  s2811;+        SWord8  s2812;+        SWord8  s2813;+        SWord8  s2814;+        SWord8  s2815;+        SWord8  s2816;+        SWord8  s2817;+        SWord8  s2818;+        SWord16 s2819;+        SWord32 s2820;+        SWord32 s2821;+        SWord8  s2822;+        SWord32 s2823;+        SWord8  s2824;+        SWord32 s2825;+        SWord8  s2826;+        SWord32 s2827;+        SWord32 s2828;+        SWord8  s2829;+        SWord32 s2830;+        SWord32 s2831;+        SWord8  s2832;+        SWord32 s2833;+        SWord32 s2834;+        SWord8  s2835;+        SWord8  s2836;+        SWord8  s2837;+        SWord8  s2838;+        SWord8  s2839;+        SWord8  s2840;+        SWord8  s2841;+        SWord8  s2842;+        SWord8  s2843;+        SWord8  s2844;+        SWord8  s2845;+        SWord8  s2846;+        SWord8  s2847;+        SWord8  s2848;+        SWord8  s2849;+        SWord8  s2850;+        SWord8  s2851;+        SWord8  s2852;+        SWord16 s2853;+        SWord8  s2854;+        SWord8  s2855;+        SWord8  s2856;+        SWord8  s2857;+        SWord8  s2858;+        SWord8  s2859;+        SWord8  s2860;+        SWord8  s2861;+        SWord8  s2862;+        SWord8  s2863;+        SWord8  s2864;+        SWord8  s2865;+        SWord8  s2866;+        SWord8  s2867;+        SWord16 s2868;+        SWord32 s2869;+        SWord32 s2870;+        SWord8  s2871;+        SWord32 s2872;+        SWord32 s2873;+        SWord8  s2874;+        SWord32 s2875;+        SWord8  s2876;+        SWord32 s2877;+        SWord32 s2878;+        SWord8  s2879;+        SWord32 s2880;+        SWord32 s2881;+        SWord8  s2882;+        SWord32 s2883;+        SWord32 s2884;+        SWord8  s2885;+        SWord8  s2886;+        SWord8  s2887;+        SWord8  s2888;+        SWord8  s2889;+        SWord8  s2890;+        SWord8  s2891;+        SWord8  s2892;+        SWord8  s2893;+        SWord8  s2894;+        SWord8  s2895;+        SWord8  s2896;+        SWord8  s2897;+        SWord8  s2898;+        SWord8  s2899;+        SWord8  s2900;+        SWord8  s2901;+        SWord8  s2902;+        SWord16 s2903;+        SWord8  s2904;+        SWord8  s2905;+        SWord8  s2906;+        SWord8  s2907;+        SWord8  s2908;+        SWord8  s2909;+        SWord8  s2910;+        SWord8  s2911;+        SWord8  s2912;+        SWord8  s2913;+        SWord8  s2914;+        SWord8  s2915;+        SWord8  s2916;+        SWord8  s2917;+        SWord16 s2918;+        SWord32 s2919;+        SWord32 s2920;+        SWord8  s2921;+        SWord32 s2922;+        SWord32 s2923;+        SWord8  s2924;+        SWord32 s2925;+        SWord8  s2926;+        SWord32 s2927;+        SWord32 s2928;+        SWord8  s2929;+        SWord32 s2930;+        SWord32 s2931;+        SWord8  s2932;+        SWord32 s2933;+        SWord32 s2934;+        SWord8  s2935;+        SWord8  s2936;+        SWord8  s2937;+        SWord8  s2938;+        SWord8  s2939;+        SWord8  s2940;+        SWord8  s2941;+        SWord8  s2942;+        SWord8  s2943;+        SWord8  s2944;+        SWord8  s2945;+        SWord8  s2946;+        SWord8  s2947;+        SWord8  s2948;+        SWord8  s2949;+        SWord8  s2950;+        SWord8  s2951;+        SWord8  s2952;+        SWord16 s2953;+        SWord8  s2954;+        SWord8  s2955;+        SWord8  s2956;+        SWord8  s2957;+        SWord8  s2958;+        SWord8  s2959;+        SWord8  s2960;+        SWord8  s2961;+        SWord8  s2962;+        SWord8  s2963;+        SWord8  s2964;+        SWord8  s2965;+        SWord8  s2966;+        SWord8  s2967;+        SWord16 s2968;+        SWord32 s2969;+        SWord32 s2970;+        SWord8  s2971;+        SWord32 s2972;+        SWord32 s2973;+        SWord8  s2974;+        SWord8  s2975;+        SWord8  s2976;+        SWord8  s2977;+        SWord8  s2978;+        SWord8  s2979;+        SWord8  s2980;+        SWord8  s2981;+        SWord8  s2982;+        SWord8  s2983;+        SWord8  s2984;+        SWord8  s2985;+        SWord8  s2986;+        SWord8  s2987;+        SWord8  s2988;+        SWord8  s2989;+        SWord8  s2990;+        SWord8  s2991;+        SWord16 s2992;+        SWord8  s2993;+        SWord8  s2994;+        SWord8  s2995;+        SWord8  s2996;+        SWord8  s2997;+        SWord8  s2998;+        SWord8  s2999;+        SWord8  s3000;+        SWord8  s3001;+        SWord8  s3002;+        SWord8  s3003;+        SWord8  s3004;+        SWord8  s3005;+        SWord8  s3006;+        SWord16 s3007;+        SWord32 s3008;+        SWord32 s3009;+        SWord8  s3010;+        SWord8  s3011;+        SWord8  s3012;+        SWord32 s3013;+        SWord8  s3014;+        SWord32 s3015;+        SWord32 s3016;+        SWord8  s3017;+        SWord32 s3018;+        SWord32 s3019;+        SWord8  s3020;+        SWord32 s3021;+        SWord32 s3022;+        SWord8  s3023;+        SWord8  s3024;+        SWord8  s3025;+        SWord8  s3026;+        SWord8  s3027;+        SWord8  s3028;+        SWord8  s3029;+        SWord8  s3030;+        SWord8  s3031;+        SWord8  s3032;+        SWord8  s3033;+        SWord8  s3034;+        SWord8  s3035;+        SWord8  s3036;+        SWord8  s3037;+        SWord8  s3038;+        SWord8  s3039;+        SWord8  s3040;+        SWord16 s3041;+        SWord8  s3042;+        SWord8  s3043;+        SWord8  s3044;+        SWord8  s3045;+        SWord8  s3046;+        SWord8  s3047;+        SWord8  s3048;+        SWord8  s3049;+        SWord8  s3050;+        SWord8  s3051;+        SWord8  s3052;+        SWord8  s3053;+        SWord8  s3054;+        SWord8  s3055;+        SWord16 s3056;+        SWord32 s3057;+        SWord32 s3058;+        SWord8  s3059;+        SWord8  s3060;+        SWord16 s3061;+        SWord8  s3062;+        SWord32 s3063;+        SWord8  s3064;+        SWord32 s3065;+        SWord32 s3066;+        SWord8  s3067;+        SWord32 s3068;+        SWord32 s3069;+        SWord8  s3070;+        SWord32 s3071;+        SWord32 s3072;+        SWord8  s3073;+        SWord8  s3074;+        SWord8  s3075;+        SWord8  s3076;+        SWord8  s3077;+        SWord8  s3078;+        SWord8  s3079;+        SWord8  s3080;+        SWord8  s3081;+        SWord8  s3082;+        SWord8  s3083;+        SWord8  s3084;+        SWord8  s3085;+        SWord8  s3086;+        SWord8  s3087;+        SWord8  s3088;+        SWord8  s3089;+        SWord8  s3090;+        SWord16 s3091;+        SWord8  s3092;+        SWord8  s3093;+        SWord8  s3094;+        SWord8  s3095;+        SWord8  s3096;+        SWord8  s3097;+        SWord8  s3098;+        SWord8  s3099;+        SWord8  s3100;+        SWord8  s3101;+        SWord8  s3102;+        SWord8  s3103;+        SWord8  s3104;+        SWord8  s3105;+        SWord16 s3106;+        SWord32 s3107;+        SWord32 s3108;+        SWord8  s3109;+        SWord8  s3110;+        SWord8  s3111;+        SWord32 s3112;+        SWord8  s3113;+        SWord32 s3114;+        SWord32 s3115;+        SWord8  s3116;+        SWord32 s3117;+        SWord32 s3118;+        SWord8  s3119;+        SWord32 s3120;+        SWord32 s3121;+        SWord8  s3122;+        SWord8  s3123;+        SWord8  s3124;+        SWord8  s3125;+        SWord8  s3126;+        SWord8  s3127;+        SWord8  s3128;+        SWord8  s3129;+        SWord8  s3130;+        SWord8  s3131;+        SWord8  s3132;+        SWord8  s3133;+        SWord8  s3134;+        SWord8  s3135;+        SWord8  s3136;+        SWord8  s3137;+        SWord8  s3138;+        SWord8  s3139;+        SWord16 s3140;+        SWord8  s3141;+        SWord8  s3142;+        SWord8  s3143;+        SWord8  s3144;+        SWord8  s3145;+        SWord8  s3146;+        SWord8  s3147;+        SWord8  s3148;+        SWord8  s3149;+        SWord8  s3150;+        SWord8  s3151;+        SWord8  s3152;+        SWord8  s3153;+        SWord8  s3154;+        SWord16 s3155;+        SWord32 s3156;+        SWord32 s3157;+        SWord8  s3158;+        SWord8  s3159;+        SWord16 s3160;+        SWord32 s3161;+        SWord32 s3162;+        SWord8  s3163;+        SWord8  s3164;+        SWord8  s3165;+        SWord8  s3166;+        SWord16 s3167;+        SWord8  s3168;+        SWord8  s3169;+        SWord8  s3170;+        SWord8  s3171;+        SWord16 s3172;+        SWord32 s3173;+        SWord32 s3174;+        SWord8  s3175;+        SWord8  s3176;+        SWord8  s3177;+        SWord8  s3178;+        SWord16 s3179;+        SWord8  s3180;+        SWord8  s3181;+        SWord8  s3182;+        SWord8  s3183;+        SWord16 s3184;+        SWord32 s3185;+        SWord32 s3186;+        SWord8  s3187;+        SWord8  s3188;+        SWord8  s3189;+        SWord8  s3190;+        SWord16 s3191;+        SWord8  s3192;+        SWord8  s3193;+        SWord8  s3194;+        SWord8  s3195;+        SWord16 s3196;+        SWord32 s3197;+        SWord32 s3198;+  static const SWord8 table2[] = {+       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,+      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,+      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,+      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,+       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,+      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,+       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,+       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,+       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,+      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,+       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,+      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,+      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,+      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,+       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,+       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,+      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,+      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,+      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,+      104,  65, 153,  45,  15, 176,  84, 187,  22+  };+  s522 = table2[s521];+  s523 = 1 ^ s522;+  s525 = table2[s524];+  s526 = sbv_bv_join_u8_u8_u16(s523, s525);+  s528 = table2[s527];+  s530 = table2[s529];+  s531 = sbv_bv_join_u8_u8_u16(s528, s530);+  s532 = sbv_bv_join_u16_u16_u32(s526, s531);+  s533 = s4 ^ s532;+  s534 = s5 ^ s533;+  s535 = s6 ^ s534;+  s536 = s7 ^ s535;+  s537 = sbv_bv_u32_rotl(s536, 8);+  s538 = sbv_bv_extract_u32_31_24_u8(s537);+  s539 = table2[s538];+  s540 = 2 ^ s539;+  s541 = sbv_bv_extract_u32_23_16_u8(s537);+  s542 = table2[s541];+  s543 = sbv_bv_join_u8_u8_u16(s540, s542);+  s544 = sbv_bv_extract_u32_15_8_u8(s537);+  s545 = table2[s544];+  s546 = sbv_bv_extract_u32_7_0_u8(s537);+  s547 = table2[s546];+  s548 = sbv_bv_join_u8_u8_u16(s545, s547);+  s549 = sbv_bv_join_u16_u16_u32(s543, s548);+  s550 = s533 ^ s549;+  s551 = s534 ^ s550;+  s552 = s535 ^ s551;+  s553 = s536 ^ s552;+  s554 = sbv_bv_u32_rotl(s553, 8);+  s555 = sbv_bv_extract_u32_31_24_u8(s554);+  s556 = table2[s555];+  s557 = 4 ^ s556;+  s558 = sbv_bv_extract_u32_23_16_u8(s554);+  s559 = table2[s558];+  s560 = sbv_bv_join_u8_u8_u16(s557, s559);+  s561 = sbv_bv_extract_u32_15_8_u8(s554);+  s562 = table2[s561];+  s563 = sbv_bv_extract_u32_7_0_u8(s554);+  s564 = table2[s563];+  s565 = sbv_bv_join_u8_u8_u16(s562, s564);+  s566 = sbv_bv_join_u16_u16_u32(s560, s565);+  s567 = s550 ^ s566;+  s568 = s551 ^ s567;+  s569 = s552 ^ s568;+  s570 = s553 ^ s569;+  s571 = sbv_bv_u32_rotl(s570, 8);+  s572 = sbv_bv_extract_u32_31_24_u8(s571);+  s573 = table2[s572];+  s574 = 8 ^ s573;+  s575 = sbv_bv_extract_u32_23_16_u8(s571);+  s576 = table2[s575];+  s577 = sbv_bv_join_u8_u8_u16(s574, s576);+  s578 = sbv_bv_extract_u32_15_8_u8(s571);+  s579 = table2[s578];+  s580 = sbv_bv_extract_u32_7_0_u8(s571);+  s581 = table2[s580];+  s582 = sbv_bv_join_u8_u8_u16(s579, s581);+  s583 = sbv_bv_join_u16_u16_u32(s577, s582);+  s584 = s567 ^ s583;+  s585 = s568 ^ s584;+  s586 = s569 ^ s585;+  s587 = s570 ^ s586;+  s588 = sbv_bv_u32_rotl(s587, 8);+  s589 = sbv_bv_extract_u32_31_24_u8(s588);+  s590 = table2[s589];+  s591 = 16 ^ s590;+  s592 = sbv_bv_extract_u32_23_16_u8(s588);+  s593 = table2[s592];+  s594 = sbv_bv_join_u8_u8_u16(s591, s593);+  s595 = sbv_bv_extract_u32_15_8_u8(s588);+  s596 = table2[s595];+  s597 = sbv_bv_extract_u32_7_0_u8(s588);+  s598 = table2[s597];+  s599 = sbv_bv_join_u8_u8_u16(s596, s598);+  s600 = sbv_bv_join_u16_u16_u32(s594, s599);+  s601 = s584 ^ s600;+  s602 = s585 ^ s601;+  s603 = s586 ^ s602;+  s604 = s587 ^ s603;+  s605 = sbv_bv_u32_rotl(s604, 8);+  s606 = sbv_bv_extract_u32_31_24_u8(s605);+  s607 = table2[s606];+  s608 = 32 ^ s607;+  s609 = sbv_bv_extract_u32_23_16_u8(s605);+  s610 = table2[s609];+  s611 = sbv_bv_join_u8_u8_u16(s608, s610);+  s612 = sbv_bv_extract_u32_15_8_u8(s605);+  s613 = table2[s612];+  s614 = sbv_bv_extract_u32_7_0_u8(s605);+  s615 = table2[s614];+  s616 = sbv_bv_join_u8_u8_u16(s613, s615);+  s617 = sbv_bv_join_u16_u16_u32(s611, s616);+  s618 = s601 ^ s617;+  s619 = s602 ^ s618;+  s620 = s603 ^ s619;+  s621 = s604 ^ s620;+  s622 = sbv_bv_u32_rotl(s621, 8);+  s623 = sbv_bv_extract_u32_31_24_u8(s622);+  s624 = table2[s623];+  s625 = 64 ^ s624;+  s626 = sbv_bv_extract_u32_23_16_u8(s622);+  s627 = table2[s626];+  s628 = sbv_bv_join_u8_u8_u16(s625, s627);+  s629 = sbv_bv_extract_u32_15_8_u8(s622);+  s630 = table2[s629];+  s631 = sbv_bv_extract_u32_7_0_u8(s622);+  s632 = table2[s631];+  s633 = sbv_bv_join_u8_u8_u16(s630, s632);+  s634 = sbv_bv_join_u16_u16_u32(s628, s633);+  s635 = s618 ^ s634;+  s636 = s619 ^ s635;+  s637 = s620 ^ s636;+  s638 = s621 ^ s637;+  s639 = sbv_bv_u32_rotl(s638, 8);+  s640 = sbv_bv_extract_u32_31_24_u8(s639);+  s641 = table2[s640];+  s642 = 128 ^ s641;+  s643 = sbv_bv_extract_u32_23_16_u8(s639);+  s644 = table2[s643];+  s645 = sbv_bv_join_u8_u8_u16(s642, s644);+  s646 = sbv_bv_extract_u32_15_8_u8(s639);+  s647 = table2[s646];+  s648 = sbv_bv_extract_u32_7_0_u8(s639);+  s649 = table2[s648];+  s650 = sbv_bv_join_u8_u8_u16(s647, s649);+  s651 = sbv_bv_join_u16_u16_u32(s645, s650);+  s652 = s635 ^ s651;+  s653 = s636 ^ s652;+  s654 = s637 ^ s653;+  s655 = s638 ^ s654;+  s656 = sbv_bv_u32_rotl(s655, 8);+  s657 = sbv_bv_extract_u32_31_24_u8(s656);+  s658 = table2[s657];+  s659 = 27 ^ s658;+  s660 = sbv_bv_extract_u32_23_16_u8(s656);+  s661 = table2[s660];+  s662 = sbv_bv_join_u8_u8_u16(s659, s661);+  s663 = sbv_bv_extract_u32_15_8_u8(s656);+  s664 = table2[s663];+  s665 = sbv_bv_extract_u32_7_0_u8(s656);+  s666 = table2[s665];+  s667 = sbv_bv_join_u8_u8_u16(s664, s666);+  s668 = sbv_bv_join_u16_u16_u32(s662, s667);+  s669 = s652 ^ s668;+  s670 = s653 ^ s669;+  s671 = s654 ^ s670;+  s672 = s655 ^ s671;+  s673 = sbv_bv_u32_rotl(s672, 8);+  s674 = sbv_bv_extract_u32_31_24_u8(s673);+  s675 = table2[s674];+  s676 = 54 ^ s675;+  s677 = sbv_bv_extract_u32_23_16_u8(s673);+  s678 = table2[s677];+  s679 = sbv_bv_join_u8_u8_u16(s676, s678);+  s680 = sbv_bv_extract_u32_15_8_u8(s673);+  s681 = table2[s680];+  s682 = sbv_bv_extract_u32_7_0_u8(s673);+  s683 = table2[s682];+  s684 = sbv_bv_join_u8_u8_u16(s681, s683);+  s685 = sbv_bv_join_u16_u16_u32(s679, s684);+  s686 = s669 ^ s685;+  s687 = s0 ^ s686;+  s688 = sbv_bv_extract_u32_31_24_u8(s687);+  static const SWord32 table1[] = {+      0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,+      0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,+      0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,+      0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,+      0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,+      0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,+      0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,+      0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,+      0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,+      0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,+      0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,+      0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,+      0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,+      0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,+      0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,+      0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,+      0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,+      0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,+      0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,+      0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,+      0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,+      0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,+      0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,+      0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,+      0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,+      0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,+      0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,+      0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,+      0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,+      0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,+      0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,+      0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,+      0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,+      0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,+      0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,+      0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,+      0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,+      0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,+      0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,+      0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,+      0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,+      0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,+      0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,+      0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,+      0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,+      0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,+      0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,+      0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,+      0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,+      0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,+      0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,+      0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,+      0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,+      0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,+      0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,+      0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,+      0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,+      0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,+      0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,+      0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,+      0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,+      0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,+      0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,+      0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL+  };+  s689 = table1[s688];+  s945 = s670 ^ s686;+  s946 = s671 ^ s945;+  s947 = s672 ^ s946;+  s948 = s3 ^ s947;+  s949 = sbv_bv_extract_u32_23_16_u8(s948);+  static const SWord32 table3[] = {+      0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,+      0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,+      0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,+      0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,+      0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,+      0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,+      0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,+      0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,+      0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,+      0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,+      0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,+      0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,+      0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,+      0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,+      0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,+      0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,+      0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,+      0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,+      0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,+      0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,+      0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,+      0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,+      0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,+      0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,+      0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,+      0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,+      0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,+      0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,+      0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,+      0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,+      0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,+      0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,+      0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,+      0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,+      0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,+      0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,+      0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,+      0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,+      0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,+      0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,+      0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,+      0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,+      0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,+      0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,+      0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,+      0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,+      0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,+      0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,+      0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,+      0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,+      0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,+      0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,+      0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,+      0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,+      0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,+      0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,+      0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,+      0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,+      0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,+      0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,+      0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,+      0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,+      0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,+      0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL+  };+  s950 = table3[s949];+  s951 = s689 ^ s950;+  s1207 = s2 ^ s946;+  s1208 = sbv_bv_extract_u32_15_8_u8(s1207);+  static const SWord32 table4[] = {+      0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,+      0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,+      0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,+      0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,+      0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,+      0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,+      0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,+      0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,+      0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,+      0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,+      0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,+      0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,+      0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,+      0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,+      0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,+      0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,+      0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,+      0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,+      0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,+      0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,+      0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,+      0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,+      0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,+      0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,+      0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,+      0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,+      0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,+      0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,+      0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,+      0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,+      0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,+      0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,+      0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,+      0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,+      0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,+      0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,+      0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,+      0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,+      0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,+      0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,+      0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,+      0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,+      0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,+      0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,+      0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,+      0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,+      0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,+      0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,+      0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,+      0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,+      0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,+      0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,+      0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,+      0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,+      0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,+      0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,+      0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,+      0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,+      0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,+      0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,+      0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,+      0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,+      0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,+      0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL+  };+  s1209 = table4[s1208];+  s1210 = s951 ^ s1209;+  s1466 = s1 ^ s945;+  s1467 = sbv_bv_extract_u32_7_0_u8(s1466);+  static const SWord32 table5[] = {+      0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,+      0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,+      0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,+      0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,+      0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,+      0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,+      0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,+      0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,+      0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,+      0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,+      0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,+      0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,+      0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,+      0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,+      0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,+      0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,+      0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,+      0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,+      0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,+      0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,+      0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,+      0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,+      0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,+      0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,+      0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,+      0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,+      0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,+      0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,+      0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,+      0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,+      0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,+      0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,+      0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,+      0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,+      0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,+      0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,+      0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,+      0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,+      0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,+      0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,+      0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,+      0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,+      0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,+      0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,+      0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,+      0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,+      0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,+      0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,+      0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,+      0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,+      0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,+      0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,+      0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,+      0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,+      0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,+      0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,+      0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,+      0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,+      0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,+      0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,+      0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,+      0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,+      0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,+      0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL+  };+  s1468 = table5[s1467];+  s1469 = s1210 ^ s1468;+  s1470 = sbv_bv_extract_u32_31_24_u8(s669);+  static const SWord8 table6[] = {+        0,  14,  28,  18,  56,  54,  36,  42, 112, 126, 108,  98,  72,+       70,  84,  90, 224, 238, 252, 242, 216, 214, 196, 202, 144, 158,+      140, 130, 168, 166, 180, 186, 219, 213, 199, 201, 227, 237, 255,+      241, 171, 165, 183, 185, 147, 157, 143, 129,  59,  53,  39,  41,+        3,  13,  31,  17,  75,  69,  87,  89, 115, 125, 111,  97, 173,+      163, 177, 191, 149, 155, 137, 135, 221, 211, 193, 207, 229, 235,+      249, 247,  77,  67,  81,  95, 117, 123, 105, 103,  61,  51,  33,+       47,   5,  11,  25,  23, 118, 120, 106, 100,  78,  64,  82,  92,+        6,   8,  26,  20,  62,  48,  34,  44, 150, 152, 138, 132, 174,+      160, 178, 188, 230, 232, 250, 244, 222, 208, 194, 204,  65,  79,+       93,  83, 121, 119, 101, 107,  49,  63,  45,  35,   9,   7,  21,+       27, 161, 175, 189, 179, 153, 151, 133, 139, 209, 223, 205, 195,+      233, 231, 245, 251, 154, 148, 134, 136, 162, 172, 190, 176, 234,+      228, 246, 248, 210, 220, 206, 192, 122, 116, 102, 104,  66,  76,+       94,  80,  10,   4,  22,  24,  50,  60,  46,  32, 236, 226, 240,+      254, 212, 218, 200, 198, 156, 146, 128, 142, 164, 170, 184, 182,+       12,   2,  16,  30,  52,  58,  40,  38, 124, 114,  96, 110,  68,+       74,  88,  86,  55,  57,  43,  37,  15,   1,  19,  29,  71,  73,+       91,  85, 127, 113,  99, 109, 215, 217, 203, 197, 239, 225, 243,+      253, 167, 169, 187, 181, 159, 145, 131, 141+  };+  s1471 = table6[s1470];+  s1472 = sbv_bv_extract_u32_23_16_u8(s669);+  static const SWord8 table7[] = {+        0,  11,  22,  29,  44,  39,  58,  49,  88,  83,  78,  69, 116,+      127,  98, 105, 176, 187, 166, 173, 156, 151, 138, 129, 232, 227,+      254, 245, 196, 207, 210, 217, 123, 112, 109, 102,  87,  92,  65,+       74,  35,  40,  53,  62,  15,   4,  25,  18, 203, 192, 221, 214,+      231, 236, 241, 250, 147, 152, 133, 142, 191, 180, 169, 162, 246,+      253, 224, 235, 218, 209, 204, 199, 174, 165, 184, 179, 130, 137,+      148, 159,  70,  77,  80,  91, 106,  97, 124, 119,  30,  21,   8,+        3,  50,  57,  36,  47, 141, 134, 155, 144, 161, 170, 183, 188,+      213, 222, 195, 200, 249, 242, 239, 228,  61,  54,  43,  32,  17,+       26,   7,  12, 101, 110, 115, 120,  73,  66,  95,  84, 247, 252,+      225, 234, 219, 208, 205, 198, 175, 164, 185, 178, 131, 136, 149,+      158,  71,  76,  81,  90, 107,  96, 125, 118,  31,  20,   9,   2,+       51,  56,  37,  46, 140, 135, 154, 145, 160, 171, 182, 189, 212,+      223, 194, 201, 248, 243, 238, 229,  60,  55,  42,  33,  16,  27,+        6,  13, 100, 111, 114, 121,  72,  67,  94,  85,   1,  10,  23,+       28,  45,  38,  59,  48,  89,  82,  79,  68, 117, 126,  99, 104,+      177, 186, 167, 172, 157, 150, 139, 128, 233, 226, 255, 244, 197,+      206, 211, 216, 122, 113, 108, 103,  86,  93,  64,  75,  34,  41,+       52,  63,  14,   5,  24,  19, 202, 193, 220, 215, 230, 237, 240,+      251, 146, 153, 132, 143, 190, 181, 168, 163+  };+  s1473 = table7[s1472];+  s1474 = sbv_bv_extract_u32_15_8_u8(s669);+  static const SWord8 table8[] = {+        0,  13,  26,  23,  52,  57,  46,  35, 104, 101, 114, 127,  92,+       81,  70,  75, 208, 221, 202, 199, 228, 233, 254, 243, 184, 181,+      162, 175, 140, 129, 150, 155, 187, 182, 161, 172, 143, 130, 149,+      152, 211, 222, 201, 196, 231, 234, 253, 240, 107, 102, 113, 124,+       95,  82,  69,  72,   3,  14,  25,  20,  55,  58,  45,  32, 109,+       96, 119, 122,  89,  84,  67,  78,   5,   8,  31,  18,  49,  60,+       43,  38, 189, 176, 167, 170, 137, 132, 147, 158, 213, 216, 207,+      194, 225, 236, 251, 246, 214, 219, 204, 193, 226, 239, 248, 245,+      190, 179, 164, 169, 138, 135, 144, 157,   6,  11,  28,  17,  50,+       63,  40,  37, 110,  99, 116, 121,  90,  87,  64,  77, 218, 215,+      192, 205, 238, 227, 244, 249, 178, 191, 168, 165, 134, 139, 156,+      145,  10,   7,  16,  29,  62,  51,  36,  41,  98, 111, 120, 117,+       86,  91,  76,  65,  97, 108, 123, 118,  85,  88,  79,  66,   9,+        4,  19,  30,  61,  48,  39,  42, 177, 188, 171, 166, 133, 136,+      159, 146, 217, 212, 195, 206, 237, 224, 247, 250, 183, 186, 173,+      160, 131, 142, 153, 148, 223, 210, 197, 200, 235, 230, 241, 252,+      103, 106, 125, 112,  83,  94,  73,  68,  15,   2,  21,  24,  59,+       54,  33,  44,  12,   1,  22,  27,  56,  53,  34,  47, 100, 105,+      126, 115,  80,  93,  74,  71, 220, 209, 198, 203, 232, 229, 242,+      255, 180, 185, 174, 163, 128, 141, 154, 151+  };+  s1475 = table8[s1474];+  s1476 = sbv_bv_extract_u32_7_0_u8(s669);+  static const SWord8 table9[] = {+        0,   9,  18,  27,  36,  45,  54,  63,  72,  65,  90,  83, 108,+      101, 126, 119, 144, 153, 130, 139, 180, 189, 166, 175, 216, 209,+      202, 195, 252, 245, 238, 231,  59,  50,  41,  32,  31,  22,  13,+        4, 115, 122,  97, 104,  87,  94,  69,  76, 171, 162, 185, 176,+      143, 134, 157, 148, 227, 234, 241, 248, 199, 206, 213, 220, 118,+      127, 100, 109,  82,  91,  64,  73,  62,  55,  44,  37,  26,  19,+        8,   1, 230, 239, 244, 253, 194, 203, 208, 217, 174, 167, 188,+      181, 138, 131, 152, 145,  77,  68,  95,  86, 105,  96, 123, 114,+        5,  12,  23,  30,  33,  40,  51,  58, 221, 212, 207, 198, 249,+      240, 235, 226, 149, 156, 135, 142, 177, 184, 163, 170, 236, 229,+      254, 247, 200, 193, 218, 211, 164, 173, 182, 191, 128, 137, 146,+      155, 124, 117, 110, 103,  88,  81,  74,  67,  52,  61,  38,  47,+       16,  25,   2,  11, 215, 222, 197, 204, 243, 250, 225, 232, 159,+      150, 141, 132, 187, 178, 169, 160,  71,  78,  85,  92,  99, 106,+      113, 120,  15,   6,  29,  20,  43,  34,  57,  48, 154, 147, 136,+      129, 190, 183, 172, 165, 210, 219, 192, 201, 246, 255, 228, 237,+       10,   3,  24,  17,  46,  39,  60,  53,  66,  75,  80,  89, 102,+      111, 116, 125, 161, 168, 179, 186, 133, 140, 151, 158, 233, 224,+      251, 242, 205, 196, 223, 214,  49,  56,  35,  42,  21,  28,   7,+       14, 121, 112, 107,  98,  93,  84,  79,  70+  };+  s1477 = table9[s1476];+  s1478 = s1475 ^ s1477;+  s1479 = s1473 ^ s1478;+  s1480 = s1471 ^ s1479;+  s1481 = table9[s1470];+  s1482 = table6[s1472];+  s1483 = table7[s1474];+  s1484 = table8[s1476];+  s1485 = s1483 ^ s1484;+  s1486 = s1482 ^ s1485;+  s1487 = s1481 ^ s1486;+  s1488 = sbv_bv_join_u8_u8_u16(s1480, s1487);+  s1489 = table8[s1470];+  s1490 = table9[s1472];+  s1491 = table6[s1474];+  s1492 = table7[s1476];+  s1493 = s1491 ^ s1492;+  s1494 = s1490 ^ s1493;+  s1495 = s1489 ^ s1494;+  s1496 = table7[s1470];+  s1497 = table8[s1472];+  s1498 = table9[s1474];+  s1499 = table6[s1476];+  s1500 = s1498 ^ s1499;+  s1501 = s1497 ^ s1500;+  s1502 = s1496 ^ s1501;+  s1503 = sbv_bv_join_u8_u8_u16(s1495, s1502);+  s1504 = sbv_bv_join_u16_u16_u32(s1488, s1503);+  s1505 = s1469 ^ s1504;+  s1506 = sbv_bv_extract_u32_31_24_u8(s1505);+  s1507 = table1[s1506];+  s1508 = sbv_bv_extract_u32_31_24_u8(s948);+  s1509 = table1[s1508];+  s1510 = sbv_bv_extract_u32_23_16_u8(s1207);+  s1511 = table3[s1510];+  s1512 = s1509 ^ s1511;+  s1513 = sbv_bv_extract_u32_15_8_u8(s1466);+  s1514 = table4[s1513];+  s1515 = s1512 ^ s1514;+  s1516 = sbv_bv_extract_u32_7_0_u8(s687);+  s1517 = table5[s1516];+  s1518 = s1515 ^ s1517;+  s1519 = sbv_bv_extract_u32_31_24_u8(s672);+  s1520 = table6[s1519];+  s1521 = sbv_bv_extract_u32_23_16_u8(s672);+  s1522 = table7[s1521];+  s1523 = sbv_bv_extract_u32_15_8_u8(s672);+  s1524 = table8[s1523];+  s1525 = sbv_bv_extract_u32_7_0_u8(s672);+  s1526 = table9[s1525];+  s1527 = s1524 ^ s1526;+  s1528 = s1522 ^ s1527;+  s1529 = s1520 ^ s1528;+  s1530 = table9[s1519];+  s1531 = table6[s1521];+  s1532 = table7[s1523];+  s1533 = table8[s1525];+  s1534 = s1532 ^ s1533;+  s1535 = s1531 ^ s1534;+  s1536 = s1530 ^ s1535;+  s1537 = sbv_bv_join_u8_u8_u16(s1529, s1536);+  s1538 = table8[s1519];+  s1539 = table9[s1521];+  s1540 = table6[s1523];+  s1541 = table7[s1525];+  s1542 = s1540 ^ s1541;+  s1543 = s1539 ^ s1542;+  s1544 = s1538 ^ s1543;+  s1545 = table7[s1519];+  s1546 = table8[s1521];+  s1547 = table9[s1523];+  s1548 = table6[s1525];+  s1549 = s1547 ^ s1548;+  s1550 = s1546 ^ s1549;+  s1551 = s1545 ^ s1550;+  s1552 = sbv_bv_join_u8_u8_u16(s1544, s1551);+  s1553 = sbv_bv_join_u16_u16_u32(s1537, s1552);+  s1554 = s1518 ^ s1553;+  s1555 = sbv_bv_extract_u32_23_16_u8(s1554);+  s1556 = table3[s1555];+  s1557 = s1507 ^ s1556;+  s1558 = sbv_bv_extract_u32_31_24_u8(s1207);+  s1559 = table1[s1558];+  s1560 = sbv_bv_extract_u32_23_16_u8(s1466);+  s1561 = table3[s1560];+  s1562 = s1559 ^ s1561;+  s1563 = sbv_bv_extract_u32_15_8_u8(s687);+  s1564 = table4[s1563];+  s1565 = s1562 ^ s1564;+  s1566 = sbv_bv_extract_u32_7_0_u8(s948);+  s1567 = table5[s1566];+  s1568 = s1565 ^ s1567;+  s1569 = sbv_bv_extract_u32_31_24_u8(s671);+  s1570 = table6[s1569];+  s1571 = sbv_bv_extract_u32_23_16_u8(s671);+  s1572 = table7[s1571];+  s1573 = sbv_bv_extract_u32_15_8_u8(s671);+  s1574 = table8[s1573];+  s1575 = sbv_bv_extract_u32_7_0_u8(s671);+  s1576 = table9[s1575];+  s1577 = s1574 ^ s1576;+  s1578 = s1572 ^ s1577;+  s1579 = s1570 ^ s1578;+  s1580 = table9[s1569];+  s1581 = table6[s1571];+  s1582 = table7[s1573];+  s1583 = table8[s1575];+  s1584 = s1582 ^ s1583;+  s1585 = s1581 ^ s1584;+  s1586 = s1580 ^ s1585;+  s1587 = sbv_bv_join_u8_u8_u16(s1579, s1586);+  s1588 = table8[s1569];+  s1589 = table9[s1571];+  s1590 = table6[s1573];+  s1591 = table7[s1575];+  s1592 = s1590 ^ s1591;+  s1593 = s1589 ^ s1592;+  s1594 = s1588 ^ s1593;+  s1595 = table7[s1569];+  s1596 = table8[s1571];+  s1597 = table9[s1573];+  s1598 = table6[s1575];+  s1599 = s1597 ^ s1598;+  s1600 = s1596 ^ s1599;+  s1601 = s1595 ^ s1600;+  s1602 = sbv_bv_join_u8_u8_u16(s1594, s1601);+  s1603 = sbv_bv_join_u16_u16_u32(s1587, s1602);+  s1604 = s1568 ^ s1603;+  s1605 = sbv_bv_extract_u32_15_8_u8(s1604);+  s1606 = table4[s1605];+  s1607 = s1557 ^ s1606;+  s1608 = sbv_bv_extract_u32_31_24_u8(s1466);+  s1609 = table1[s1608];+  s1610 = sbv_bv_extract_u32_23_16_u8(s687);+  s1611 = table3[s1610];+  s1612 = s1609 ^ s1611;+  s1613 = sbv_bv_extract_u32_15_8_u8(s948);+  s1614 = table4[s1613];+  s1615 = s1612 ^ s1614;+  s1616 = sbv_bv_extract_u32_7_0_u8(s1207);+  s1617 = table5[s1616];+  s1618 = s1615 ^ s1617;+  s1619 = sbv_bv_extract_u32_31_24_u8(s670);+  s1620 = table6[s1619];+  s1621 = sbv_bv_extract_u32_23_16_u8(s670);+  s1622 = table7[s1621];+  s1623 = sbv_bv_extract_u32_15_8_u8(s670);+  s1624 = table8[s1623];+  s1625 = sbv_bv_extract_u32_7_0_u8(s670);+  s1626 = table9[s1625];+  s1627 = s1624 ^ s1626;+  s1628 = s1622 ^ s1627;+  s1629 = s1620 ^ s1628;+  s1630 = table9[s1619];+  s1631 = table6[s1621];+  s1632 = table7[s1623];+  s1633 = table8[s1625];+  s1634 = s1632 ^ s1633;+  s1635 = s1631 ^ s1634;+  s1636 = s1630 ^ s1635;+  s1637 = sbv_bv_join_u8_u8_u16(s1629, s1636);+  s1638 = table8[s1619];+  s1639 = table9[s1621];+  s1640 = table6[s1623];+  s1641 = table7[s1625];+  s1642 = s1640 ^ s1641;+  s1643 = s1639 ^ s1642;+  s1644 = s1638 ^ s1643;+  s1645 = table7[s1619];+  s1646 = table8[s1621];+  s1647 = table9[s1623];+  s1648 = table6[s1625];+  s1649 = s1647 ^ s1648;+  s1650 = s1646 ^ s1649;+  s1651 = s1645 ^ s1650;+  s1652 = sbv_bv_join_u8_u8_u16(s1644, s1651);+  s1653 = sbv_bv_join_u16_u16_u32(s1637, s1652);+  s1654 = s1618 ^ s1653;+  s1655 = sbv_bv_extract_u32_7_0_u8(s1654);+  s1656 = table5[s1655];+  s1657 = s1607 ^ s1656;+  s1658 = sbv_bv_extract_u32_31_24_u8(s652);+  s1659 = table6[s1658];+  s1660 = sbv_bv_extract_u32_23_16_u8(s652);+  s1661 = table7[s1660];+  s1662 = sbv_bv_extract_u32_15_8_u8(s652);+  s1663 = table8[s1662];+  s1664 = sbv_bv_extract_u32_7_0_u8(s652);+  s1665 = table9[s1664];+  s1666 = s1663 ^ s1665;+  s1667 = s1661 ^ s1666;+  s1668 = s1659 ^ s1667;+  s1669 = table9[s1658];+  s1670 = table6[s1660];+  s1671 = table7[s1662];+  s1672 = table8[s1664];+  s1673 = s1671 ^ s1672;+  s1674 = s1670 ^ s1673;+  s1675 = s1669 ^ s1674;+  s1676 = sbv_bv_join_u8_u8_u16(s1668, s1675);+  s1677 = table8[s1658];+  s1678 = table9[s1660];+  s1679 = table6[s1662];+  s1680 = table7[s1664];+  s1681 = s1679 ^ s1680;+  s1682 = s1678 ^ s1681;+  s1683 = s1677 ^ s1682;+  s1684 = table7[s1658];+  s1685 = table8[s1660];+  s1686 = table9[s1662];+  s1687 = table6[s1664];+  s1688 = s1686 ^ s1687;+  s1689 = s1685 ^ s1688;+  s1690 = s1684 ^ s1689;+  s1691 = sbv_bv_join_u8_u8_u16(s1683, s1690);+  s1692 = sbv_bv_join_u16_u16_u32(s1676, s1691);+  s1693 = s1657 ^ s1692;+  s1694 = sbv_bv_extract_u32_31_24_u8(s1693);+  s1695 = table1[s1694];+  s1696 = sbv_bv_extract_u32_31_24_u8(s1554);+  s1697 = table1[s1696];+  s1698 = sbv_bv_extract_u32_23_16_u8(s1604);+  s1699 = table3[s1698];+  s1700 = s1697 ^ s1699;+  s1701 = sbv_bv_extract_u32_15_8_u8(s1654);+  s1702 = table4[s1701];+  s1703 = s1700 ^ s1702;+  s1704 = sbv_bv_extract_u32_7_0_u8(s1505);+  s1705 = table5[s1704];+  s1706 = s1703 ^ s1705;+  s1707 = sbv_bv_extract_u32_31_24_u8(s655);+  s1708 = table6[s1707];+  s1709 = sbv_bv_extract_u32_23_16_u8(s655);+  s1710 = table7[s1709];+  s1711 = sbv_bv_extract_u32_15_8_u8(s655);+  s1712 = table8[s1711];+  s1713 = sbv_bv_extract_u32_7_0_u8(s655);+  s1714 = table9[s1713];+  s1715 = s1712 ^ s1714;+  s1716 = s1710 ^ s1715;+  s1717 = s1708 ^ s1716;+  s1718 = table9[s1707];+  s1719 = table6[s1709];+  s1720 = table7[s1711];+  s1721 = table8[s1713];+  s1722 = s1720 ^ s1721;+  s1723 = s1719 ^ s1722;+  s1724 = s1718 ^ s1723;+  s1725 = sbv_bv_join_u8_u8_u16(s1717, s1724);+  s1726 = table8[s1707];+  s1727 = table9[s1709];+  s1728 = table6[s1711];+  s1729 = table7[s1713];+  s1730 = s1728 ^ s1729;+  s1731 = s1727 ^ s1730;+  s1732 = s1726 ^ s1731;+  s1733 = table7[s1707];+  s1734 = table8[s1709];+  s1735 = table9[s1711];+  s1736 = table6[s1713];+  s1737 = s1735 ^ s1736;+  s1738 = s1734 ^ s1737;+  s1739 = s1733 ^ s1738;+  s1740 = sbv_bv_join_u8_u8_u16(s1732, s1739);+  s1741 = sbv_bv_join_u16_u16_u32(s1725, s1740);+  s1742 = s1706 ^ s1741;+  s1743 = sbv_bv_extract_u32_23_16_u8(s1742);+  s1744 = table3[s1743];+  s1745 = s1695 ^ s1744;+  s1746 = sbv_bv_extract_u32_31_24_u8(s1604);+  s1747 = table1[s1746];+  s1748 = sbv_bv_extract_u32_23_16_u8(s1654);+  s1749 = table3[s1748];+  s1750 = s1747 ^ s1749;+  s1751 = sbv_bv_extract_u32_15_8_u8(s1505);+  s1752 = table4[s1751];+  s1753 = s1750 ^ s1752;+  s1754 = sbv_bv_extract_u32_7_0_u8(s1554);+  s1755 = table5[s1754];+  s1756 = s1753 ^ s1755;+  s1757 = sbv_bv_extract_u32_31_24_u8(s654);+  s1758 = table6[s1757];+  s1759 = sbv_bv_extract_u32_23_16_u8(s654);+  s1760 = table7[s1759];+  s1761 = sbv_bv_extract_u32_15_8_u8(s654);+  s1762 = table8[s1761];+  s1763 = sbv_bv_extract_u32_7_0_u8(s654);+  s1764 = table9[s1763];+  s1765 = s1762 ^ s1764;+  s1766 = s1760 ^ s1765;+  s1767 = s1758 ^ s1766;+  s1768 = table9[s1757];+  s1769 = table6[s1759];+  s1770 = table7[s1761];+  s1771 = table8[s1763];+  s1772 = s1770 ^ s1771;+  s1773 = s1769 ^ s1772;+  s1774 = s1768 ^ s1773;+  s1775 = sbv_bv_join_u8_u8_u16(s1767, s1774);+  s1776 = table8[s1757];+  s1777 = table9[s1759];+  s1778 = table6[s1761];+  s1779 = table7[s1763];+  s1780 = s1778 ^ s1779;+  s1781 = s1777 ^ s1780;+  s1782 = s1776 ^ s1781;+  s1783 = table7[s1757];+  s1784 = table8[s1759];+  s1785 = table9[s1761];+  s1786 = table6[s1763];+  s1787 = s1785 ^ s1786;+  s1788 = s1784 ^ s1787;+  s1789 = s1783 ^ s1788;+  s1790 = sbv_bv_join_u8_u8_u16(s1782, s1789);+  s1791 = sbv_bv_join_u16_u16_u32(s1775, s1790);+  s1792 = s1756 ^ s1791;+  s1793 = sbv_bv_extract_u32_15_8_u8(s1792);+  s1794 = table4[s1793];+  s1795 = s1745 ^ s1794;+  s1796 = sbv_bv_extract_u32_31_24_u8(s1654);+  s1797 = table1[s1796];+  s1798 = sbv_bv_extract_u32_23_16_u8(s1505);+  s1799 = table3[s1798];+  s1800 = s1797 ^ s1799;+  s1801 = sbv_bv_extract_u32_15_8_u8(s1554);+  s1802 = table4[s1801];+  s1803 = s1800 ^ s1802;+  s1804 = sbv_bv_extract_u32_7_0_u8(s1604);+  s1805 = table5[s1804];+  s1806 = s1803 ^ s1805;+  s1807 = sbv_bv_extract_u32_31_24_u8(s653);+  s1808 = table6[s1807];+  s1809 = sbv_bv_extract_u32_23_16_u8(s653);+  s1810 = table7[s1809];+  s1811 = sbv_bv_extract_u32_15_8_u8(s653);+  s1812 = table8[s1811];+  s1813 = sbv_bv_extract_u32_7_0_u8(s653);+  s1814 = table9[s1813];+  s1815 = s1812 ^ s1814;+  s1816 = s1810 ^ s1815;+  s1817 = s1808 ^ s1816;+  s1818 = table9[s1807];+  s1819 = table6[s1809];+  s1820 = table7[s1811];+  s1821 = table8[s1813];+  s1822 = s1820 ^ s1821;+  s1823 = s1819 ^ s1822;+  s1824 = s1818 ^ s1823;+  s1825 = sbv_bv_join_u8_u8_u16(s1817, s1824);+  s1826 = table8[s1807];+  s1827 = table9[s1809];+  s1828 = table6[s1811];+  s1829 = table7[s1813];+  s1830 = s1828 ^ s1829;+  s1831 = s1827 ^ s1830;+  s1832 = s1826 ^ s1831;+  s1833 = table7[s1807];+  s1834 = table8[s1809];+  s1835 = table9[s1811];+  s1836 = table6[s1813];+  s1837 = s1835 ^ s1836;+  s1838 = s1834 ^ s1837;+  s1839 = s1833 ^ s1838;+  s1840 = sbv_bv_join_u8_u8_u16(s1832, s1839);+  s1841 = sbv_bv_join_u16_u16_u32(s1825, s1840);+  s1842 = s1806 ^ s1841;+  s1843 = sbv_bv_extract_u32_7_0_u8(s1842);+  s1844 = table5[s1843];+  s1845 = s1795 ^ s1844;+  s1846 = sbv_bv_extract_u32_31_24_u8(s635);+  s1847 = table6[s1846];+  s1848 = sbv_bv_extract_u32_23_16_u8(s635);+  s1849 = table7[s1848];+  s1850 = sbv_bv_extract_u32_15_8_u8(s635);+  s1851 = table8[s1850];+  s1852 = sbv_bv_extract_u32_7_0_u8(s635);+  s1853 = table9[s1852];+  s1854 = s1851 ^ s1853;+  s1855 = s1849 ^ s1854;+  s1856 = s1847 ^ s1855;+  s1857 = table9[s1846];+  s1858 = table6[s1848];+  s1859 = table7[s1850];+  s1860 = table8[s1852];+  s1861 = s1859 ^ s1860;+  s1862 = s1858 ^ s1861;+  s1863 = s1857 ^ s1862;+  s1864 = sbv_bv_join_u8_u8_u16(s1856, s1863);+  s1865 = table8[s1846];+  s1866 = table9[s1848];+  s1867 = table6[s1850];+  s1868 = table7[s1852];+  s1869 = s1867 ^ s1868;+  s1870 = s1866 ^ s1869;+  s1871 = s1865 ^ s1870;+  s1872 = table7[s1846];+  s1873 = table8[s1848];+  s1874 = table9[s1850];+  s1875 = table6[s1852];+  s1876 = s1874 ^ s1875;+  s1877 = s1873 ^ s1876;+  s1878 = s1872 ^ s1877;+  s1879 = sbv_bv_join_u8_u8_u16(s1871, s1878);+  s1880 = sbv_bv_join_u16_u16_u32(s1864, s1879);+  s1881 = s1845 ^ s1880;+  s1882 = sbv_bv_extract_u32_31_24_u8(s1881);+  s1883 = table1[s1882];+  s1884 = sbv_bv_extract_u32_31_24_u8(s1742);+  s1885 = table1[s1884];+  s1886 = sbv_bv_extract_u32_23_16_u8(s1792);+  s1887 = table3[s1886];+  s1888 = s1885 ^ s1887;+  s1889 = sbv_bv_extract_u32_15_8_u8(s1842);+  s1890 = table4[s1889];+  s1891 = s1888 ^ s1890;+  s1892 = sbv_bv_extract_u32_7_0_u8(s1693);+  s1893 = table5[s1892];+  s1894 = s1891 ^ s1893;+  s1895 = sbv_bv_extract_u32_31_24_u8(s638);+  s1896 = table6[s1895];+  s1897 = sbv_bv_extract_u32_23_16_u8(s638);+  s1898 = table7[s1897];+  s1899 = sbv_bv_extract_u32_15_8_u8(s638);+  s1900 = table8[s1899];+  s1901 = sbv_bv_extract_u32_7_0_u8(s638);+  s1902 = table9[s1901];+  s1903 = s1900 ^ s1902;+  s1904 = s1898 ^ s1903;+  s1905 = s1896 ^ s1904;+  s1906 = table9[s1895];+  s1907 = table6[s1897];+  s1908 = table7[s1899];+  s1909 = table8[s1901];+  s1910 = s1908 ^ s1909;+  s1911 = s1907 ^ s1910;+  s1912 = s1906 ^ s1911;+  s1913 = sbv_bv_join_u8_u8_u16(s1905, s1912);+  s1914 = table8[s1895];+  s1915 = table9[s1897];+  s1916 = table6[s1899];+  s1917 = table7[s1901];+  s1918 = s1916 ^ s1917;+  s1919 = s1915 ^ s1918;+  s1920 = s1914 ^ s1919;+  s1921 = table7[s1895];+  s1922 = table8[s1897];+  s1923 = table9[s1899];+  s1924 = table6[s1901];+  s1925 = s1923 ^ s1924;+  s1926 = s1922 ^ s1925;+  s1927 = s1921 ^ s1926;+  s1928 = sbv_bv_join_u8_u8_u16(s1920, s1927);+  s1929 = sbv_bv_join_u16_u16_u32(s1913, s1928);+  s1930 = s1894 ^ s1929;+  s1931 = sbv_bv_extract_u32_23_16_u8(s1930);+  s1932 = table3[s1931];+  s1933 = s1883 ^ s1932;+  s1934 = sbv_bv_extract_u32_31_24_u8(s1792);+  s1935 = table1[s1934];+  s1936 = sbv_bv_extract_u32_23_16_u8(s1842);+  s1937 = table3[s1936];+  s1938 = s1935 ^ s1937;+  s1939 = sbv_bv_extract_u32_15_8_u8(s1693);+  s1940 = table4[s1939];+  s1941 = s1938 ^ s1940;+  s1942 = sbv_bv_extract_u32_7_0_u8(s1742);+  s1943 = table5[s1942];+  s1944 = s1941 ^ s1943;+  s1945 = sbv_bv_extract_u32_31_24_u8(s637);+  s1946 = table6[s1945];+  s1947 = sbv_bv_extract_u32_23_16_u8(s637);+  s1948 = table7[s1947];+  s1949 = sbv_bv_extract_u32_15_8_u8(s637);+  s1950 = table8[s1949];+  s1951 = sbv_bv_extract_u32_7_0_u8(s637);+  s1952 = table9[s1951];+  s1953 = s1950 ^ s1952;+  s1954 = s1948 ^ s1953;+  s1955 = s1946 ^ s1954;+  s1956 = table9[s1945];+  s1957 = table6[s1947];+  s1958 = table7[s1949];+  s1959 = table8[s1951];+  s1960 = s1958 ^ s1959;+  s1961 = s1957 ^ s1960;+  s1962 = s1956 ^ s1961;+  s1963 = sbv_bv_join_u8_u8_u16(s1955, s1962);+  s1964 = table8[s1945];+  s1965 = table9[s1947];+  s1966 = table6[s1949];+  s1967 = table7[s1951];+  s1968 = s1966 ^ s1967;+  s1969 = s1965 ^ s1968;+  s1970 = s1964 ^ s1969;+  s1971 = table7[s1945];+  s1972 = table8[s1947];+  s1973 = table9[s1949];+  s1974 = table6[s1951];+  s1975 = s1973 ^ s1974;+  s1976 = s1972 ^ s1975;+  s1977 = s1971 ^ s1976;+  s1978 = sbv_bv_join_u8_u8_u16(s1970, s1977);+  s1979 = sbv_bv_join_u16_u16_u32(s1963, s1978);+  s1980 = s1944 ^ s1979;+  s1981 = sbv_bv_extract_u32_15_8_u8(s1980);+  s1982 = table4[s1981];+  s1983 = s1933 ^ s1982;+  s1984 = sbv_bv_extract_u32_31_24_u8(s1842);+  s1985 = table1[s1984];+  s1986 = sbv_bv_extract_u32_23_16_u8(s1693);+  s1987 = table3[s1986];+  s1988 = s1985 ^ s1987;+  s1989 = sbv_bv_extract_u32_15_8_u8(s1742);+  s1990 = table4[s1989];+  s1991 = s1988 ^ s1990;+  s1992 = sbv_bv_extract_u32_7_0_u8(s1792);+  s1993 = table5[s1992];+  s1994 = s1991 ^ s1993;+  s1995 = sbv_bv_extract_u32_31_24_u8(s636);+  s1996 = table6[s1995];+  s1997 = sbv_bv_extract_u32_23_16_u8(s636);+  s1998 = table7[s1997];+  s1999 = sbv_bv_extract_u32_15_8_u8(s636);+  s2000 = table8[s1999];+  s2001 = sbv_bv_extract_u32_7_0_u8(s636);+  s2002 = table9[s2001];+  s2003 = s2000 ^ s2002;+  s2004 = s1998 ^ s2003;+  s2005 = s1996 ^ s2004;+  s2006 = table9[s1995];+  s2007 = table6[s1997];+  s2008 = table7[s1999];+  s2009 = table8[s2001];+  s2010 = s2008 ^ s2009;+  s2011 = s2007 ^ s2010;+  s2012 = s2006 ^ s2011;+  s2013 = sbv_bv_join_u8_u8_u16(s2005, s2012);+  s2014 = table8[s1995];+  s2015 = table9[s1997];+  s2016 = table6[s1999];+  s2017 = table7[s2001];+  s2018 = s2016 ^ s2017;+  s2019 = s2015 ^ s2018;+  s2020 = s2014 ^ s2019;+  s2021 = table7[s1995];+  s2022 = table8[s1997];+  s2023 = table9[s1999];+  s2024 = table6[s2001];+  s2025 = s2023 ^ s2024;+  s2026 = s2022 ^ s2025;+  s2027 = s2021 ^ s2026;+  s2028 = sbv_bv_join_u8_u8_u16(s2020, s2027);+  s2029 = sbv_bv_join_u16_u16_u32(s2013, s2028);+  s2030 = s1994 ^ s2029;+  s2031 = sbv_bv_extract_u32_7_0_u8(s2030);+  s2032 = table5[s2031];+  s2033 = s1983 ^ s2032;+  s2034 = sbv_bv_extract_u32_31_24_u8(s618);+  s2035 = table6[s2034];+  s2036 = sbv_bv_extract_u32_23_16_u8(s618);+  s2037 = table7[s2036];+  s2038 = sbv_bv_extract_u32_15_8_u8(s618);+  s2039 = table8[s2038];+  s2040 = sbv_bv_extract_u32_7_0_u8(s618);+  s2041 = table9[s2040];+  s2042 = s2039 ^ s2041;+  s2043 = s2037 ^ s2042;+  s2044 = s2035 ^ s2043;+  s2045 = table9[s2034];+  s2046 = table6[s2036];+  s2047 = table7[s2038];+  s2048 = table8[s2040];+  s2049 = s2047 ^ s2048;+  s2050 = s2046 ^ s2049;+  s2051 = s2045 ^ s2050;+  s2052 = sbv_bv_join_u8_u8_u16(s2044, s2051);+  s2053 = table8[s2034];+  s2054 = table9[s2036];+  s2055 = table6[s2038];+  s2056 = table7[s2040];+  s2057 = s2055 ^ s2056;+  s2058 = s2054 ^ s2057;+  s2059 = s2053 ^ s2058;+  s2060 = table7[s2034];+  s2061 = table8[s2036];+  s2062 = table9[s2038];+  s2063 = table6[s2040];+  s2064 = s2062 ^ s2063;+  s2065 = s2061 ^ s2064;+  s2066 = s2060 ^ s2065;+  s2067 = sbv_bv_join_u8_u8_u16(s2059, s2066);+  s2068 = sbv_bv_join_u16_u16_u32(s2052, s2067);+  s2069 = s2033 ^ s2068;+  s2070 = sbv_bv_extract_u32_31_24_u8(s2069);+  s2071 = table1[s2070];+  s2072 = sbv_bv_extract_u32_31_24_u8(s1930);+  s2073 = table1[s2072];+  s2074 = sbv_bv_extract_u32_23_16_u8(s1980);+  s2075 = table3[s2074];+  s2076 = s2073 ^ s2075;+  s2077 = sbv_bv_extract_u32_15_8_u8(s2030);+  s2078 = table4[s2077];+  s2079 = s2076 ^ s2078;+  s2080 = sbv_bv_extract_u32_7_0_u8(s1881);+  s2081 = table5[s2080];+  s2082 = s2079 ^ s2081;+  s2083 = sbv_bv_extract_u32_31_24_u8(s621);+  s2084 = table6[s2083];+  s2085 = sbv_bv_extract_u32_23_16_u8(s621);+  s2086 = table7[s2085];+  s2087 = sbv_bv_extract_u32_15_8_u8(s621);+  s2088 = table8[s2087];+  s2089 = sbv_bv_extract_u32_7_0_u8(s621);+  s2090 = table9[s2089];+  s2091 = s2088 ^ s2090;+  s2092 = s2086 ^ s2091;+  s2093 = s2084 ^ s2092;+  s2094 = table9[s2083];+  s2095 = table6[s2085];+  s2096 = table7[s2087];+  s2097 = table8[s2089];+  s2098 = s2096 ^ s2097;+  s2099 = s2095 ^ s2098;+  s2100 = s2094 ^ s2099;+  s2101 = sbv_bv_join_u8_u8_u16(s2093, s2100);+  s2102 = table8[s2083];+  s2103 = table9[s2085];+  s2104 = table6[s2087];+  s2105 = table7[s2089];+  s2106 = s2104 ^ s2105;+  s2107 = s2103 ^ s2106;+  s2108 = s2102 ^ s2107;+  s2109 = table7[s2083];+  s2110 = table8[s2085];+  s2111 = table9[s2087];+  s2112 = table6[s2089];+  s2113 = s2111 ^ s2112;+  s2114 = s2110 ^ s2113;+  s2115 = s2109 ^ s2114;+  s2116 = sbv_bv_join_u8_u8_u16(s2108, s2115);+  s2117 = sbv_bv_join_u16_u16_u32(s2101, s2116);+  s2118 = s2082 ^ s2117;+  s2119 = sbv_bv_extract_u32_23_16_u8(s2118);+  s2120 = table3[s2119];+  s2121 = s2071 ^ s2120;+  s2122 = sbv_bv_extract_u32_31_24_u8(s1980);+  s2123 = table1[s2122];+  s2124 = sbv_bv_extract_u32_23_16_u8(s2030);+  s2125 = table3[s2124];+  s2126 = s2123 ^ s2125;+  s2127 = sbv_bv_extract_u32_15_8_u8(s1881);+  s2128 = table4[s2127];+  s2129 = s2126 ^ s2128;+  s2130 = sbv_bv_extract_u32_7_0_u8(s1930);+  s2131 = table5[s2130];+  s2132 = s2129 ^ s2131;+  s2133 = sbv_bv_extract_u32_31_24_u8(s620);+  s2134 = table6[s2133];+  s2135 = sbv_bv_extract_u32_23_16_u8(s620);+  s2136 = table7[s2135];+  s2137 = sbv_bv_extract_u32_15_8_u8(s620);+  s2138 = table8[s2137];+  s2139 = sbv_bv_extract_u32_7_0_u8(s620);+  s2140 = table9[s2139];+  s2141 = s2138 ^ s2140;+  s2142 = s2136 ^ s2141;+  s2143 = s2134 ^ s2142;+  s2144 = table9[s2133];+  s2145 = table6[s2135];+  s2146 = table7[s2137];+  s2147 = table8[s2139];+  s2148 = s2146 ^ s2147;+  s2149 = s2145 ^ s2148;+  s2150 = s2144 ^ s2149;+  s2151 = sbv_bv_join_u8_u8_u16(s2143, s2150);+  s2152 = table8[s2133];+  s2153 = table9[s2135];+  s2154 = table6[s2137];+  s2155 = table7[s2139];+  s2156 = s2154 ^ s2155;+  s2157 = s2153 ^ s2156;+  s2158 = s2152 ^ s2157;+  s2159 = table7[s2133];+  s2160 = table8[s2135];+  s2161 = table9[s2137];+  s2162 = table6[s2139];+  s2163 = s2161 ^ s2162;+  s2164 = s2160 ^ s2163;+  s2165 = s2159 ^ s2164;+  s2166 = sbv_bv_join_u8_u8_u16(s2158, s2165);+  s2167 = sbv_bv_join_u16_u16_u32(s2151, s2166);+  s2168 = s2132 ^ s2167;+  s2169 = sbv_bv_extract_u32_15_8_u8(s2168);+  s2170 = table4[s2169];+  s2171 = s2121 ^ s2170;+  s2172 = sbv_bv_extract_u32_31_24_u8(s2030);+  s2173 = table1[s2172];+  s2174 = sbv_bv_extract_u32_23_16_u8(s1881);+  s2175 = table3[s2174];+  s2176 = s2173 ^ s2175;+  s2177 = sbv_bv_extract_u32_15_8_u8(s1930);+  s2178 = table4[s2177];+  s2179 = s2176 ^ s2178;+  s2180 = sbv_bv_extract_u32_7_0_u8(s1980);+  s2181 = table5[s2180];+  s2182 = s2179 ^ s2181;+  s2183 = sbv_bv_extract_u32_31_24_u8(s619);+  s2184 = table6[s2183];+  s2185 = sbv_bv_extract_u32_23_16_u8(s619);+  s2186 = table7[s2185];+  s2187 = sbv_bv_extract_u32_15_8_u8(s619);+  s2188 = table8[s2187];+  s2189 = sbv_bv_extract_u32_7_0_u8(s619);+  s2190 = table9[s2189];+  s2191 = s2188 ^ s2190;+  s2192 = s2186 ^ s2191;+  s2193 = s2184 ^ s2192;+  s2194 = table9[s2183];+  s2195 = table6[s2185];+  s2196 = table7[s2187];+  s2197 = table8[s2189];+  s2198 = s2196 ^ s2197;+  s2199 = s2195 ^ s2198;+  s2200 = s2194 ^ s2199;+  s2201 = sbv_bv_join_u8_u8_u16(s2193, s2200);+  s2202 = table8[s2183];+  s2203 = table9[s2185];+  s2204 = table6[s2187];+  s2205 = table7[s2189];+  s2206 = s2204 ^ s2205;+  s2207 = s2203 ^ s2206;+  s2208 = s2202 ^ s2207;+  s2209 = table7[s2183];+  s2210 = table8[s2185];+  s2211 = table9[s2187];+  s2212 = table6[s2189];+  s2213 = s2211 ^ s2212;+  s2214 = s2210 ^ s2213;+  s2215 = s2209 ^ s2214;+  s2216 = sbv_bv_join_u8_u8_u16(s2208, s2215);+  s2217 = sbv_bv_join_u16_u16_u32(s2201, s2216);+  s2218 = s2182 ^ s2217;+  s2219 = sbv_bv_extract_u32_7_0_u8(s2218);+  s2220 = table5[s2219];+  s2221 = s2171 ^ s2220;+  s2222 = sbv_bv_extract_u32_31_24_u8(s601);+  s2223 = table6[s2222];+  s2224 = sbv_bv_extract_u32_23_16_u8(s601);+  s2225 = table7[s2224];+  s2226 = sbv_bv_extract_u32_15_8_u8(s601);+  s2227 = table8[s2226];+  s2228 = sbv_bv_extract_u32_7_0_u8(s601);+  s2229 = table9[s2228];+  s2230 = s2227 ^ s2229;+  s2231 = s2225 ^ s2230;+  s2232 = s2223 ^ s2231;+  s2233 = table9[s2222];+  s2234 = table6[s2224];+  s2235 = table7[s2226];+  s2236 = table8[s2228];+  s2237 = s2235 ^ s2236;+  s2238 = s2234 ^ s2237;+  s2239 = s2233 ^ s2238;+  s2240 = sbv_bv_join_u8_u8_u16(s2232, s2239);+  s2241 = table8[s2222];+  s2242 = table9[s2224];+  s2243 = table6[s2226];+  s2244 = table7[s2228];+  s2245 = s2243 ^ s2244;+  s2246 = s2242 ^ s2245;+  s2247 = s2241 ^ s2246;+  s2248 = table7[s2222];+  s2249 = table8[s2224];+  s2250 = table9[s2226];+  s2251 = table6[s2228];+  s2252 = s2250 ^ s2251;+  s2253 = s2249 ^ s2252;+  s2254 = s2248 ^ s2253;+  s2255 = sbv_bv_join_u8_u8_u16(s2247, s2254);+  s2256 = sbv_bv_join_u16_u16_u32(s2240, s2255);+  s2257 = s2221 ^ s2256;+  s2258 = sbv_bv_extract_u32_31_24_u8(s2257);+  s2259 = table1[s2258];+  s2260 = sbv_bv_extract_u32_31_24_u8(s2118);+  s2261 = table1[s2260];+  s2262 = sbv_bv_extract_u32_23_16_u8(s2168);+  s2263 = table3[s2262];+  s2264 = s2261 ^ s2263;+  s2265 = sbv_bv_extract_u32_15_8_u8(s2218);+  s2266 = table4[s2265];+  s2267 = s2264 ^ s2266;+  s2268 = sbv_bv_extract_u32_7_0_u8(s2069);+  s2269 = table5[s2268];+  s2270 = s2267 ^ s2269;+  s2271 = sbv_bv_extract_u32_31_24_u8(s604);+  s2272 = table6[s2271];+  s2273 = sbv_bv_extract_u32_23_16_u8(s604);+  s2274 = table7[s2273];+  s2275 = sbv_bv_extract_u32_15_8_u8(s604);+  s2276 = table8[s2275];+  s2277 = sbv_bv_extract_u32_7_0_u8(s604);+  s2278 = table9[s2277];+  s2279 = s2276 ^ s2278;+  s2280 = s2274 ^ s2279;+  s2281 = s2272 ^ s2280;+  s2282 = table9[s2271];+  s2283 = table6[s2273];+  s2284 = table7[s2275];+  s2285 = table8[s2277];+  s2286 = s2284 ^ s2285;+  s2287 = s2283 ^ s2286;+  s2288 = s2282 ^ s2287;+  s2289 = sbv_bv_join_u8_u8_u16(s2281, s2288);+  s2290 = table8[s2271];+  s2291 = table9[s2273];+  s2292 = table6[s2275];+  s2293 = table7[s2277];+  s2294 = s2292 ^ s2293;+  s2295 = s2291 ^ s2294;+  s2296 = s2290 ^ s2295;+  s2297 = table7[s2271];+  s2298 = table8[s2273];+  s2299 = table9[s2275];+  s2300 = table6[s2277];+  s2301 = s2299 ^ s2300;+  s2302 = s2298 ^ s2301;+  s2303 = s2297 ^ s2302;+  s2304 = sbv_bv_join_u8_u8_u16(s2296, s2303);+  s2305 = sbv_bv_join_u16_u16_u32(s2289, s2304);+  s2306 = s2270 ^ s2305;+  s2307 = sbv_bv_extract_u32_23_16_u8(s2306);+  s2308 = table3[s2307];+  s2309 = s2259 ^ s2308;+  s2310 = sbv_bv_extract_u32_31_24_u8(s2168);+  s2311 = table1[s2310];+  s2312 = sbv_bv_extract_u32_23_16_u8(s2218);+  s2313 = table3[s2312];+  s2314 = s2311 ^ s2313;+  s2315 = sbv_bv_extract_u32_15_8_u8(s2069);+  s2316 = table4[s2315];+  s2317 = s2314 ^ s2316;+  s2318 = sbv_bv_extract_u32_7_0_u8(s2118);+  s2319 = table5[s2318];+  s2320 = s2317 ^ s2319;+  s2321 = sbv_bv_extract_u32_31_24_u8(s603);+  s2322 = table6[s2321];+  s2323 = sbv_bv_extract_u32_23_16_u8(s603);+  s2324 = table7[s2323];+  s2325 = sbv_bv_extract_u32_15_8_u8(s603);+  s2326 = table8[s2325];+  s2327 = sbv_bv_extract_u32_7_0_u8(s603);+  s2328 = table9[s2327];+  s2329 = s2326 ^ s2328;+  s2330 = s2324 ^ s2329;+  s2331 = s2322 ^ s2330;+  s2332 = table9[s2321];+  s2333 = table6[s2323];+  s2334 = table7[s2325];+  s2335 = table8[s2327];+  s2336 = s2334 ^ s2335;+  s2337 = s2333 ^ s2336;+  s2338 = s2332 ^ s2337;+  s2339 = sbv_bv_join_u8_u8_u16(s2331, s2338);+  s2340 = table8[s2321];+  s2341 = table9[s2323];+  s2342 = table6[s2325];+  s2343 = table7[s2327];+  s2344 = s2342 ^ s2343;+  s2345 = s2341 ^ s2344;+  s2346 = s2340 ^ s2345;+  s2347 = table7[s2321];+  s2348 = table8[s2323];+  s2349 = table9[s2325];+  s2350 = table6[s2327];+  s2351 = s2349 ^ s2350;+  s2352 = s2348 ^ s2351;+  s2353 = s2347 ^ s2352;+  s2354 = sbv_bv_join_u8_u8_u16(s2346, s2353);+  s2355 = sbv_bv_join_u16_u16_u32(s2339, s2354);+  s2356 = s2320 ^ s2355;+  s2357 = sbv_bv_extract_u32_15_8_u8(s2356);+  s2358 = table4[s2357];+  s2359 = s2309 ^ s2358;+  s2360 = sbv_bv_extract_u32_31_24_u8(s2218);+  s2361 = table1[s2360];+  s2362 = sbv_bv_extract_u32_23_16_u8(s2069);+  s2363 = table3[s2362];+  s2364 = s2361 ^ s2363;+  s2365 = sbv_bv_extract_u32_15_8_u8(s2118);+  s2366 = table4[s2365];+  s2367 = s2364 ^ s2366;+  s2368 = sbv_bv_extract_u32_7_0_u8(s2168);+  s2369 = table5[s2368];+  s2370 = s2367 ^ s2369;+  s2371 = sbv_bv_extract_u32_31_24_u8(s602);+  s2372 = table6[s2371];+  s2373 = sbv_bv_extract_u32_23_16_u8(s602);+  s2374 = table7[s2373];+  s2375 = sbv_bv_extract_u32_15_8_u8(s602);+  s2376 = table8[s2375];+  s2377 = sbv_bv_extract_u32_7_0_u8(s602);+  s2378 = table9[s2377];+  s2379 = s2376 ^ s2378;+  s2380 = s2374 ^ s2379;+  s2381 = s2372 ^ s2380;+  s2382 = table9[s2371];+  s2383 = table6[s2373];+  s2384 = table7[s2375];+  s2385 = table8[s2377];+  s2386 = s2384 ^ s2385;+  s2387 = s2383 ^ s2386;+  s2388 = s2382 ^ s2387;+  s2389 = sbv_bv_join_u8_u8_u16(s2381, s2388);+  s2390 = table8[s2371];+  s2391 = table9[s2373];+  s2392 = table6[s2375];+  s2393 = table7[s2377];+  s2394 = s2392 ^ s2393;+  s2395 = s2391 ^ s2394;+  s2396 = s2390 ^ s2395;+  s2397 = table7[s2371];+  s2398 = table8[s2373];+  s2399 = table9[s2375];+  s2400 = table6[s2377];+  s2401 = s2399 ^ s2400;+  s2402 = s2398 ^ s2401;+  s2403 = s2397 ^ s2402;+  s2404 = sbv_bv_join_u8_u8_u16(s2396, s2403);+  s2405 = sbv_bv_join_u16_u16_u32(s2389, s2404);+  s2406 = s2370 ^ s2405;+  s2407 = sbv_bv_extract_u32_7_0_u8(s2406);+  s2408 = table5[s2407];+  s2409 = s2359 ^ s2408;+  s2410 = sbv_bv_extract_u32_31_24_u8(s584);+  s2411 = table6[s2410];+  s2412 = sbv_bv_extract_u32_23_16_u8(s584);+  s2413 = table7[s2412];+  s2414 = sbv_bv_extract_u32_15_8_u8(s584);+  s2415 = table8[s2414];+  s2416 = sbv_bv_extract_u32_7_0_u8(s584);+  s2417 = table9[s2416];+  s2418 = s2415 ^ s2417;+  s2419 = s2413 ^ s2418;+  s2420 = s2411 ^ s2419;+  s2421 = table9[s2410];+  s2422 = table6[s2412];+  s2423 = table7[s2414];+  s2424 = table8[s2416];+  s2425 = s2423 ^ s2424;+  s2426 = s2422 ^ s2425;+  s2427 = s2421 ^ s2426;+  s2428 = sbv_bv_join_u8_u8_u16(s2420, s2427);+  s2429 = table8[s2410];+  s2430 = table9[s2412];+  s2431 = table6[s2414];+  s2432 = table7[s2416];+  s2433 = s2431 ^ s2432;+  s2434 = s2430 ^ s2433;+  s2435 = s2429 ^ s2434;+  s2436 = table7[s2410];+  s2437 = table8[s2412];+  s2438 = table9[s2414];+  s2439 = table6[s2416];+  s2440 = s2438 ^ s2439;+  s2441 = s2437 ^ s2440;+  s2442 = s2436 ^ s2441;+  s2443 = sbv_bv_join_u8_u8_u16(s2435, s2442);+  s2444 = sbv_bv_join_u16_u16_u32(s2428, s2443);+  s2445 = s2409 ^ s2444;+  s2446 = sbv_bv_extract_u32_31_24_u8(s2445);+  s2447 = table1[s2446];+  s2448 = sbv_bv_extract_u32_31_24_u8(s2306);+  s2449 = table1[s2448];+  s2450 = sbv_bv_extract_u32_23_16_u8(s2356);+  s2451 = table3[s2450];+  s2452 = s2449 ^ s2451;+  s2453 = sbv_bv_extract_u32_15_8_u8(s2406);+  s2454 = table4[s2453];+  s2455 = s2452 ^ s2454;+  s2456 = sbv_bv_extract_u32_7_0_u8(s2257);+  s2457 = table5[s2456];+  s2458 = s2455 ^ s2457;+  s2459 = sbv_bv_extract_u32_31_24_u8(s587);+  s2460 = table6[s2459];+  s2461 = sbv_bv_extract_u32_23_16_u8(s587);+  s2462 = table7[s2461];+  s2463 = sbv_bv_extract_u32_15_8_u8(s587);+  s2464 = table8[s2463];+  s2465 = sbv_bv_extract_u32_7_0_u8(s587);+  s2466 = table9[s2465];+  s2467 = s2464 ^ s2466;+  s2468 = s2462 ^ s2467;+  s2469 = s2460 ^ s2468;+  s2470 = table9[s2459];+  s2471 = table6[s2461];+  s2472 = table7[s2463];+  s2473 = table8[s2465];+  s2474 = s2472 ^ s2473;+  s2475 = s2471 ^ s2474;+  s2476 = s2470 ^ s2475;+  s2477 = sbv_bv_join_u8_u8_u16(s2469, s2476);+  s2478 = table8[s2459];+  s2479 = table9[s2461];+  s2480 = table6[s2463];+  s2481 = table7[s2465];+  s2482 = s2480 ^ s2481;+  s2483 = s2479 ^ s2482;+  s2484 = s2478 ^ s2483;+  s2485 = table7[s2459];+  s2486 = table8[s2461];+  s2487 = table9[s2463];+  s2488 = table6[s2465];+  s2489 = s2487 ^ s2488;+  s2490 = s2486 ^ s2489;+  s2491 = s2485 ^ s2490;+  s2492 = sbv_bv_join_u8_u8_u16(s2484, s2491);+  s2493 = sbv_bv_join_u16_u16_u32(s2477, s2492);+  s2494 = s2458 ^ s2493;+  s2495 = sbv_bv_extract_u32_23_16_u8(s2494);+  s2496 = table3[s2495];+  s2497 = s2447 ^ s2496;+  s2498 = sbv_bv_extract_u32_31_24_u8(s2356);+  s2499 = table1[s2498];+  s2500 = sbv_bv_extract_u32_23_16_u8(s2406);+  s2501 = table3[s2500];+  s2502 = s2499 ^ s2501;+  s2503 = sbv_bv_extract_u32_15_8_u8(s2257);+  s2504 = table4[s2503];+  s2505 = s2502 ^ s2504;+  s2506 = sbv_bv_extract_u32_7_0_u8(s2306);+  s2507 = table5[s2506];+  s2508 = s2505 ^ s2507;+  s2509 = sbv_bv_extract_u32_31_24_u8(s586);+  s2510 = table6[s2509];+  s2511 = sbv_bv_extract_u32_23_16_u8(s586);+  s2512 = table7[s2511];+  s2513 = sbv_bv_extract_u32_15_8_u8(s586);+  s2514 = table8[s2513];+  s2515 = sbv_bv_extract_u32_7_0_u8(s586);+  s2516 = table9[s2515];+  s2517 = s2514 ^ s2516;+  s2518 = s2512 ^ s2517;+  s2519 = s2510 ^ s2518;+  s2520 = table9[s2509];+  s2521 = table6[s2511];+  s2522 = table7[s2513];+  s2523 = table8[s2515];+  s2524 = s2522 ^ s2523;+  s2525 = s2521 ^ s2524;+  s2526 = s2520 ^ s2525;+  s2527 = sbv_bv_join_u8_u8_u16(s2519, s2526);+  s2528 = table8[s2509];+  s2529 = table9[s2511];+  s2530 = table6[s2513];+  s2531 = table7[s2515];+  s2532 = s2530 ^ s2531;+  s2533 = s2529 ^ s2532;+  s2534 = s2528 ^ s2533;+  s2535 = table7[s2509];+  s2536 = table8[s2511];+  s2537 = table9[s2513];+  s2538 = table6[s2515];+  s2539 = s2537 ^ s2538;+  s2540 = s2536 ^ s2539;+  s2541 = s2535 ^ s2540;+  s2542 = sbv_bv_join_u8_u8_u16(s2534, s2541);+  s2543 = sbv_bv_join_u16_u16_u32(s2527, s2542);+  s2544 = s2508 ^ s2543;+  s2545 = sbv_bv_extract_u32_15_8_u8(s2544);+  s2546 = table4[s2545];+  s2547 = s2497 ^ s2546;+  s2548 = sbv_bv_extract_u32_31_24_u8(s2406);+  s2549 = table1[s2548];+  s2550 = sbv_bv_extract_u32_23_16_u8(s2257);+  s2551 = table3[s2550];+  s2552 = s2549 ^ s2551;+  s2553 = sbv_bv_extract_u32_15_8_u8(s2306);+  s2554 = table4[s2553];+  s2555 = s2552 ^ s2554;+  s2556 = sbv_bv_extract_u32_7_0_u8(s2356);+  s2557 = table5[s2556];+  s2558 = s2555 ^ s2557;+  s2559 = sbv_bv_extract_u32_31_24_u8(s585);+  s2560 = table6[s2559];+  s2561 = sbv_bv_extract_u32_23_16_u8(s585);+  s2562 = table7[s2561];+  s2563 = sbv_bv_extract_u32_15_8_u8(s585);+  s2564 = table8[s2563];+  s2565 = sbv_bv_extract_u32_7_0_u8(s585);+  s2566 = table9[s2565];+  s2567 = s2564 ^ s2566;+  s2568 = s2562 ^ s2567;+  s2569 = s2560 ^ s2568;+  s2570 = table9[s2559];+  s2571 = table6[s2561];+  s2572 = table7[s2563];+  s2573 = table8[s2565];+  s2574 = s2572 ^ s2573;+  s2575 = s2571 ^ s2574;+  s2576 = s2570 ^ s2575;+  s2577 = sbv_bv_join_u8_u8_u16(s2569, s2576);+  s2578 = table8[s2559];+  s2579 = table9[s2561];+  s2580 = table6[s2563];+  s2581 = table7[s2565];+  s2582 = s2580 ^ s2581;+  s2583 = s2579 ^ s2582;+  s2584 = s2578 ^ s2583;+  s2585 = table7[s2559];+  s2586 = table8[s2561];+  s2587 = table9[s2563];+  s2588 = table6[s2565];+  s2589 = s2587 ^ s2588;+  s2590 = s2586 ^ s2589;+  s2591 = s2585 ^ s2590;+  s2592 = sbv_bv_join_u8_u8_u16(s2584, s2591);+  s2593 = sbv_bv_join_u16_u16_u32(s2577, s2592);+  s2594 = s2558 ^ s2593;+  s2595 = sbv_bv_extract_u32_7_0_u8(s2594);+  s2596 = table5[s2595];+  s2597 = s2547 ^ s2596;+  s2598 = sbv_bv_extract_u32_31_24_u8(s567);+  s2599 = table6[s2598];+  s2600 = sbv_bv_extract_u32_23_16_u8(s567);+  s2601 = table7[s2600];+  s2602 = sbv_bv_extract_u32_15_8_u8(s567);+  s2603 = table8[s2602];+  s2604 = sbv_bv_extract_u32_7_0_u8(s567);+  s2605 = table9[s2604];+  s2606 = s2603 ^ s2605;+  s2607 = s2601 ^ s2606;+  s2608 = s2599 ^ s2607;+  s2609 = table9[s2598];+  s2610 = table6[s2600];+  s2611 = table7[s2602];+  s2612 = table8[s2604];+  s2613 = s2611 ^ s2612;+  s2614 = s2610 ^ s2613;+  s2615 = s2609 ^ s2614;+  s2616 = sbv_bv_join_u8_u8_u16(s2608, s2615);+  s2617 = table8[s2598];+  s2618 = table9[s2600];+  s2619 = table6[s2602];+  s2620 = table7[s2604];+  s2621 = s2619 ^ s2620;+  s2622 = s2618 ^ s2621;+  s2623 = s2617 ^ s2622;+  s2624 = table7[s2598];+  s2625 = table8[s2600];+  s2626 = table9[s2602];+  s2627 = table6[s2604];+  s2628 = s2626 ^ s2627;+  s2629 = s2625 ^ s2628;+  s2630 = s2624 ^ s2629;+  s2631 = sbv_bv_join_u8_u8_u16(s2623, s2630);+  s2632 = sbv_bv_join_u16_u16_u32(s2616, s2631);+  s2633 = s2597 ^ s2632;+  s2634 = sbv_bv_extract_u32_31_24_u8(s2633);+  s2635 = table1[s2634];+  s2636 = sbv_bv_extract_u32_31_24_u8(s2494);+  s2637 = table1[s2636];+  s2638 = sbv_bv_extract_u32_23_16_u8(s2544);+  s2639 = table3[s2638];+  s2640 = s2637 ^ s2639;+  s2641 = sbv_bv_extract_u32_15_8_u8(s2594);+  s2642 = table4[s2641];+  s2643 = s2640 ^ s2642;+  s2644 = sbv_bv_extract_u32_7_0_u8(s2445);+  s2645 = table5[s2644];+  s2646 = s2643 ^ s2645;+  s2647 = sbv_bv_extract_u32_31_24_u8(s570);+  s2648 = table6[s2647];+  s2649 = sbv_bv_extract_u32_23_16_u8(s570);+  s2650 = table7[s2649];+  s2651 = sbv_bv_extract_u32_15_8_u8(s570);+  s2652 = table8[s2651];+  s2653 = sbv_bv_extract_u32_7_0_u8(s570);+  s2654 = table9[s2653];+  s2655 = s2652 ^ s2654;+  s2656 = s2650 ^ s2655;+  s2657 = s2648 ^ s2656;+  s2658 = table9[s2647];+  s2659 = table6[s2649];+  s2660 = table7[s2651];+  s2661 = table8[s2653];+  s2662 = s2660 ^ s2661;+  s2663 = s2659 ^ s2662;+  s2664 = s2658 ^ s2663;+  s2665 = sbv_bv_join_u8_u8_u16(s2657, s2664);+  s2666 = table8[s2647];+  s2667 = table9[s2649];+  s2668 = table6[s2651];+  s2669 = table7[s2653];+  s2670 = s2668 ^ s2669;+  s2671 = s2667 ^ s2670;+  s2672 = s2666 ^ s2671;+  s2673 = table7[s2647];+  s2674 = table8[s2649];+  s2675 = table9[s2651];+  s2676 = table6[s2653];+  s2677 = s2675 ^ s2676;+  s2678 = s2674 ^ s2677;+  s2679 = s2673 ^ s2678;+  s2680 = sbv_bv_join_u8_u8_u16(s2672, s2679);+  s2681 = sbv_bv_join_u16_u16_u32(s2665, s2680);+  s2682 = s2646 ^ s2681;+  s2683 = sbv_bv_extract_u32_23_16_u8(s2682);+  s2684 = table3[s2683];+  s2685 = s2635 ^ s2684;+  s2686 = sbv_bv_extract_u32_31_24_u8(s2544);+  s2687 = table1[s2686];+  s2688 = sbv_bv_extract_u32_23_16_u8(s2594);+  s2689 = table3[s2688];+  s2690 = s2687 ^ s2689;+  s2691 = sbv_bv_extract_u32_15_8_u8(s2445);+  s2692 = table4[s2691];+  s2693 = s2690 ^ s2692;+  s2694 = sbv_bv_extract_u32_7_0_u8(s2494);+  s2695 = table5[s2694];+  s2696 = s2693 ^ s2695;+  s2697 = sbv_bv_extract_u32_31_24_u8(s569);+  s2698 = table6[s2697];+  s2699 = sbv_bv_extract_u32_23_16_u8(s569);+  s2700 = table7[s2699];+  s2701 = sbv_bv_extract_u32_15_8_u8(s569);+  s2702 = table8[s2701];+  s2703 = sbv_bv_extract_u32_7_0_u8(s569);+  s2704 = table9[s2703];+  s2705 = s2702 ^ s2704;+  s2706 = s2700 ^ s2705;+  s2707 = s2698 ^ s2706;+  s2708 = table9[s2697];+  s2709 = table6[s2699];+  s2710 = table7[s2701];+  s2711 = table8[s2703];+  s2712 = s2710 ^ s2711;+  s2713 = s2709 ^ s2712;+  s2714 = s2708 ^ s2713;+  s2715 = sbv_bv_join_u8_u8_u16(s2707, s2714);+  s2716 = table8[s2697];+  s2717 = table9[s2699];+  s2718 = table6[s2701];+  s2719 = table7[s2703];+  s2720 = s2718 ^ s2719;+  s2721 = s2717 ^ s2720;+  s2722 = s2716 ^ s2721;+  s2723 = table7[s2697];+  s2724 = table8[s2699];+  s2725 = table9[s2701];+  s2726 = table6[s2703];+  s2727 = s2725 ^ s2726;+  s2728 = s2724 ^ s2727;+  s2729 = s2723 ^ s2728;+  s2730 = sbv_bv_join_u8_u8_u16(s2722, s2729);+  s2731 = sbv_bv_join_u16_u16_u32(s2715, s2730);+  s2732 = s2696 ^ s2731;+  s2733 = sbv_bv_extract_u32_15_8_u8(s2732);+  s2734 = table4[s2733];+  s2735 = s2685 ^ s2734;+  s2736 = sbv_bv_extract_u32_31_24_u8(s2594);+  s2737 = table1[s2736];+  s2738 = sbv_bv_extract_u32_23_16_u8(s2445);+  s2739 = table3[s2738];+  s2740 = s2737 ^ s2739;+  s2741 = sbv_bv_extract_u32_15_8_u8(s2494);+  s2742 = table4[s2741];+  s2743 = s2740 ^ s2742;+  s2744 = sbv_bv_extract_u32_7_0_u8(s2544);+  s2745 = table5[s2744];+  s2746 = s2743 ^ s2745;+  s2747 = sbv_bv_extract_u32_31_24_u8(s568);+  s2748 = table6[s2747];+  s2749 = sbv_bv_extract_u32_23_16_u8(s568);+  s2750 = table7[s2749];+  s2751 = sbv_bv_extract_u32_15_8_u8(s568);+  s2752 = table8[s2751];+  s2753 = sbv_bv_extract_u32_7_0_u8(s568);+  s2754 = table9[s2753];+  s2755 = s2752 ^ s2754;+  s2756 = s2750 ^ s2755;+  s2757 = s2748 ^ s2756;+  s2758 = table9[s2747];+  s2759 = table6[s2749];+  s2760 = table7[s2751];+  s2761 = table8[s2753];+  s2762 = s2760 ^ s2761;+  s2763 = s2759 ^ s2762;+  s2764 = s2758 ^ s2763;+  s2765 = sbv_bv_join_u8_u8_u16(s2757, s2764);+  s2766 = table8[s2747];+  s2767 = table9[s2749];+  s2768 = table6[s2751];+  s2769 = table7[s2753];+  s2770 = s2768 ^ s2769;+  s2771 = s2767 ^ s2770;+  s2772 = s2766 ^ s2771;+  s2773 = table7[s2747];+  s2774 = table8[s2749];+  s2775 = table9[s2751];+  s2776 = table6[s2753];+  s2777 = s2775 ^ s2776;+  s2778 = s2774 ^ s2777;+  s2779 = s2773 ^ s2778;+  s2780 = sbv_bv_join_u8_u8_u16(s2772, s2779);+  s2781 = sbv_bv_join_u16_u16_u32(s2765, s2780);+  s2782 = s2746 ^ s2781;+  s2783 = sbv_bv_extract_u32_7_0_u8(s2782);+  s2784 = table5[s2783];+  s2785 = s2735 ^ s2784;+  s2786 = sbv_bv_extract_u32_31_24_u8(s550);+  s2787 = table6[s2786];+  s2788 = sbv_bv_extract_u32_23_16_u8(s550);+  s2789 = table7[s2788];+  s2790 = sbv_bv_extract_u32_15_8_u8(s550);+  s2791 = table8[s2790];+  s2792 = sbv_bv_extract_u32_7_0_u8(s550);+  s2793 = table9[s2792];+  s2794 = s2791 ^ s2793;+  s2795 = s2789 ^ s2794;+  s2796 = s2787 ^ s2795;+  s2797 = table9[s2786];+  s2798 = table6[s2788];+  s2799 = table7[s2790];+  s2800 = table8[s2792];+  s2801 = s2799 ^ s2800;+  s2802 = s2798 ^ s2801;+  s2803 = s2797 ^ s2802;+  s2804 = sbv_bv_join_u8_u8_u16(s2796, s2803);+  s2805 = table8[s2786];+  s2806 = table9[s2788];+  s2807 = table6[s2790];+  s2808 = table7[s2792];+  s2809 = s2807 ^ s2808;+  s2810 = s2806 ^ s2809;+  s2811 = s2805 ^ s2810;+  s2812 = table7[s2786];+  s2813 = table8[s2788];+  s2814 = table9[s2790];+  s2815 = table6[s2792];+  s2816 = s2814 ^ s2815;+  s2817 = s2813 ^ s2816;+  s2818 = s2812 ^ s2817;+  s2819 = sbv_bv_join_u8_u8_u16(s2811, s2818);+  s2820 = sbv_bv_join_u16_u16_u32(s2804, s2819);+  s2821 = s2785 ^ s2820;+  s2822 = sbv_bv_extract_u32_31_24_u8(s2821);+  s2823 = table1[s2822];+  s2824 = sbv_bv_extract_u32_31_24_u8(s2682);+  s2825 = table1[s2824];+  s2826 = sbv_bv_extract_u32_23_16_u8(s2732);+  s2827 = table3[s2826];+  s2828 = s2825 ^ s2827;+  s2829 = sbv_bv_extract_u32_15_8_u8(s2782);+  s2830 = table4[s2829];+  s2831 = s2828 ^ s2830;+  s2832 = sbv_bv_extract_u32_7_0_u8(s2633);+  s2833 = table5[s2832];+  s2834 = s2831 ^ s2833;+  s2835 = sbv_bv_extract_u32_31_24_u8(s553);+  s2836 = table6[s2835];+  s2837 = sbv_bv_extract_u32_23_16_u8(s553);+  s2838 = table7[s2837];+  s2839 = sbv_bv_extract_u32_15_8_u8(s553);+  s2840 = table8[s2839];+  s2841 = sbv_bv_extract_u32_7_0_u8(s553);+  s2842 = table9[s2841];+  s2843 = s2840 ^ s2842;+  s2844 = s2838 ^ s2843;+  s2845 = s2836 ^ s2844;+  s2846 = table9[s2835];+  s2847 = table6[s2837];+  s2848 = table7[s2839];+  s2849 = table8[s2841];+  s2850 = s2848 ^ s2849;+  s2851 = s2847 ^ s2850;+  s2852 = s2846 ^ s2851;+  s2853 = sbv_bv_join_u8_u8_u16(s2845, s2852);+  s2854 = table8[s2835];+  s2855 = table9[s2837];+  s2856 = table6[s2839];+  s2857 = table7[s2841];+  s2858 = s2856 ^ s2857;+  s2859 = s2855 ^ s2858;+  s2860 = s2854 ^ s2859;+  s2861 = table7[s2835];+  s2862 = table8[s2837];+  s2863 = table9[s2839];+  s2864 = table6[s2841];+  s2865 = s2863 ^ s2864;+  s2866 = s2862 ^ s2865;+  s2867 = s2861 ^ s2866;+  s2868 = sbv_bv_join_u8_u8_u16(s2860, s2867);+  s2869 = sbv_bv_join_u16_u16_u32(s2853, s2868);+  s2870 = s2834 ^ s2869;+  s2871 = sbv_bv_extract_u32_23_16_u8(s2870);+  s2872 = table3[s2871];+  s2873 = s2823 ^ s2872;+  s2874 = sbv_bv_extract_u32_31_24_u8(s2732);+  s2875 = table1[s2874];+  s2876 = sbv_bv_extract_u32_23_16_u8(s2782);+  s2877 = table3[s2876];+  s2878 = s2875 ^ s2877;+  s2879 = sbv_bv_extract_u32_15_8_u8(s2633);+  s2880 = table4[s2879];+  s2881 = s2878 ^ s2880;+  s2882 = sbv_bv_extract_u32_7_0_u8(s2682);+  s2883 = table5[s2882];+  s2884 = s2881 ^ s2883;+  s2885 = sbv_bv_extract_u32_31_24_u8(s552);+  s2886 = table6[s2885];+  s2887 = sbv_bv_extract_u32_23_16_u8(s552);+  s2888 = table7[s2887];+  s2889 = sbv_bv_extract_u32_15_8_u8(s552);+  s2890 = table8[s2889];+  s2891 = sbv_bv_extract_u32_7_0_u8(s552);+  s2892 = table9[s2891];+  s2893 = s2890 ^ s2892;+  s2894 = s2888 ^ s2893;+  s2895 = s2886 ^ s2894;+  s2896 = table9[s2885];+  s2897 = table6[s2887];+  s2898 = table7[s2889];+  s2899 = table8[s2891];+  s2900 = s2898 ^ s2899;+  s2901 = s2897 ^ s2900;+  s2902 = s2896 ^ s2901;+  s2903 = sbv_bv_join_u8_u8_u16(s2895, s2902);+  s2904 = table8[s2885];+  s2905 = table9[s2887];+  s2906 = table6[s2889];+  s2907 = table7[s2891];+  s2908 = s2906 ^ s2907;+  s2909 = s2905 ^ s2908;+  s2910 = s2904 ^ s2909;+  s2911 = table7[s2885];+  s2912 = table8[s2887];+  s2913 = table9[s2889];+  s2914 = table6[s2891];+  s2915 = s2913 ^ s2914;+  s2916 = s2912 ^ s2915;+  s2917 = s2911 ^ s2916;+  s2918 = sbv_bv_join_u8_u8_u16(s2910, s2917);+  s2919 = sbv_bv_join_u16_u16_u32(s2903, s2918);+  s2920 = s2884 ^ s2919;+  s2921 = sbv_bv_extract_u32_15_8_u8(s2920);+  s2922 = table4[s2921];+  s2923 = s2873 ^ s2922;+  s2924 = sbv_bv_extract_u32_31_24_u8(s2782);+  s2925 = table1[s2924];+  s2926 = sbv_bv_extract_u32_23_16_u8(s2633);+  s2927 = table3[s2926];+  s2928 = s2925 ^ s2927;+  s2929 = sbv_bv_extract_u32_15_8_u8(s2682);+  s2930 = table4[s2929];+  s2931 = s2928 ^ s2930;+  s2932 = sbv_bv_extract_u32_7_0_u8(s2732);+  s2933 = table5[s2932];+  s2934 = s2931 ^ s2933;+  s2935 = sbv_bv_extract_u32_31_24_u8(s551);+  s2936 = table6[s2935];+  s2937 = sbv_bv_extract_u32_23_16_u8(s551);+  s2938 = table7[s2937];+  s2939 = sbv_bv_extract_u32_15_8_u8(s551);+  s2940 = table8[s2939];+  s2941 = sbv_bv_extract_u32_7_0_u8(s551);+  s2942 = table9[s2941];+  s2943 = s2940 ^ s2942;+  s2944 = s2938 ^ s2943;+  s2945 = s2936 ^ s2944;+  s2946 = table9[s2935];+  s2947 = table6[s2937];+  s2948 = table7[s2939];+  s2949 = table8[s2941];+  s2950 = s2948 ^ s2949;+  s2951 = s2947 ^ s2950;+  s2952 = s2946 ^ s2951;+  s2953 = sbv_bv_join_u8_u8_u16(s2945, s2952);+  s2954 = table8[s2935];+  s2955 = table9[s2937];+  s2956 = table6[s2939];+  s2957 = table7[s2941];+  s2958 = s2956 ^ s2957;+  s2959 = s2955 ^ s2958;+  s2960 = s2954 ^ s2959;+  s2961 = table7[s2935];+  s2962 = table8[s2937];+  s2963 = table9[s2939];+  s2964 = table6[s2941];+  s2965 = s2963 ^ s2964;+  s2966 = s2962 ^ s2965;+  s2967 = s2961 ^ s2966;+  s2968 = sbv_bv_join_u8_u8_u16(s2960, s2967);+  s2969 = sbv_bv_join_u16_u16_u32(s2953, s2968);+  s2970 = s2934 ^ s2969;+  s2971 = sbv_bv_extract_u32_7_0_u8(s2970);+  s2972 = table5[s2971];+  s2973 = s2923 ^ s2972;+  s2974 = sbv_bv_extract_u32_31_24_u8(s533);+  s2975 = table6[s2974];+  s2976 = sbv_bv_extract_u32_23_16_u8(s533);+  s2977 = table7[s2976];+  s2978 = sbv_bv_extract_u32_15_8_u8(s533);+  s2979 = table8[s2978];+  s2980 = sbv_bv_extract_u32_7_0_u8(s533);+  s2981 = table9[s2980];+  s2982 = s2979 ^ s2981;+  s2983 = s2977 ^ s2982;+  s2984 = s2975 ^ s2983;+  s2985 = table9[s2974];+  s2986 = table6[s2976];+  s2987 = table7[s2978];+  s2988 = table8[s2980];+  s2989 = s2987 ^ s2988;+  s2990 = s2986 ^ s2989;+  s2991 = s2985 ^ s2990;+  s2992 = sbv_bv_join_u8_u8_u16(s2984, s2991);+  s2993 = table8[s2974];+  s2994 = table9[s2976];+  s2995 = table6[s2978];+  s2996 = table7[s2980];+  s2997 = s2995 ^ s2996;+  s2998 = s2994 ^ s2997;+  s2999 = s2993 ^ s2998;+  s3000 = table7[s2974];+  s3001 = table8[s2976];+  s3002 = table9[s2978];+  s3003 = table6[s2980];+  s3004 = s3002 ^ s3003;+  s3005 = s3001 ^ s3004;+  s3006 = s3000 ^ s3005;+  s3007 = sbv_bv_join_u8_u8_u16(s2999, s3006);+  s3008 = sbv_bv_join_u16_u16_u32(s2992, s3007);+  s3009 = s2973 ^ s3008;+  s3010 = sbv_bv_extract_u32_31_24_u8(s3009);+  static const SWord8 table0[] = {+       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,+      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,+       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,+       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,+       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,+      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,+      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,+       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,+      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,+       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,+       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,+      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,+       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,+      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,+      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,+       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,+       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,+      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,+      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,+       38, 225, 105,  20,  99,  85,  33,  12, 125+  };+  s3011 = table0[s3010];+  s3012 = sbv_bv_extract_u32_31_24_u8(s2870);+  s3013 = table1[s3012];+  s3014 = sbv_bv_extract_u32_23_16_u8(s2920);+  s3015 = table3[s3014];+  s3016 = s3013 ^ s3015;+  s3017 = sbv_bv_extract_u32_15_8_u8(s2970);+  s3018 = table4[s3017];+  s3019 = s3016 ^ s3018;+  s3020 = sbv_bv_extract_u32_7_0_u8(s2821);+  s3021 = table5[s3020];+  s3022 = s3019 ^ s3021;+  s3023 = sbv_bv_extract_u32_31_24_u8(s536);+  s3024 = table6[s3023];+  s3025 = sbv_bv_extract_u32_23_16_u8(s536);+  s3026 = table7[s3025];+  s3027 = sbv_bv_extract_u32_15_8_u8(s536);+  s3028 = table8[s3027];+  s3029 = sbv_bv_extract_u32_7_0_u8(s536);+  s3030 = table9[s3029];+  s3031 = s3028 ^ s3030;+  s3032 = s3026 ^ s3031;+  s3033 = s3024 ^ s3032;+  s3034 = table9[s3023];+  s3035 = table6[s3025];+  s3036 = table7[s3027];+  s3037 = table8[s3029];+  s3038 = s3036 ^ s3037;+  s3039 = s3035 ^ s3038;+  s3040 = s3034 ^ s3039;+  s3041 = sbv_bv_join_u8_u8_u16(s3033, s3040);+  s3042 = table8[s3023];+  s3043 = table9[s3025];+  s3044 = table6[s3027];+  s3045 = table7[s3029];+  s3046 = s3044 ^ s3045;+  s3047 = s3043 ^ s3046;+  s3048 = s3042 ^ s3047;+  s3049 = table7[s3023];+  s3050 = table8[s3025];+  s3051 = table9[s3027];+  s3052 = table6[s3029];+  s3053 = s3051 ^ s3052;+  s3054 = s3050 ^ s3053;+  s3055 = s3049 ^ s3054;+  s3056 = sbv_bv_join_u8_u8_u16(s3048, s3055);+  s3057 = sbv_bv_join_u16_u16_u32(s3041, s3056);+  s3058 = s3022 ^ s3057;+  s3059 = sbv_bv_extract_u32_23_16_u8(s3058);+  s3060 = table0[s3059];+  s3061 = sbv_bv_join_u8_u8_u16(s3011, s3060);+  s3062 = sbv_bv_extract_u32_31_24_u8(s2920);+  s3063 = table1[s3062];+  s3064 = sbv_bv_extract_u32_23_16_u8(s2970);+  s3065 = table3[s3064];+  s3066 = s3063 ^ s3065;+  s3067 = sbv_bv_extract_u32_15_8_u8(s2821);+  s3068 = table4[s3067];+  s3069 = s3066 ^ s3068;+  s3070 = sbv_bv_extract_u32_7_0_u8(s2870);+  s3071 = table5[s3070];+  s3072 = s3069 ^ s3071;+  s3073 = sbv_bv_extract_u32_31_24_u8(s535);+  s3074 = table6[s3073];+  s3075 = sbv_bv_extract_u32_23_16_u8(s535);+  s3076 = table7[s3075];+  s3077 = sbv_bv_extract_u32_15_8_u8(s535);+  s3078 = table8[s3077];+  s3079 = sbv_bv_extract_u32_7_0_u8(s535);+  s3080 = table9[s3079];+  s3081 = s3078 ^ s3080;+  s3082 = s3076 ^ s3081;+  s3083 = s3074 ^ s3082;+  s3084 = table9[s3073];+  s3085 = table6[s3075];+  s3086 = table7[s3077];+  s3087 = table8[s3079];+  s3088 = s3086 ^ s3087;+  s3089 = s3085 ^ s3088;+  s3090 = s3084 ^ s3089;+  s3091 = sbv_bv_join_u8_u8_u16(s3083, s3090);+  s3092 = table8[s3073];+  s3093 = table9[s3075];+  s3094 = table6[s3077];+  s3095 = table7[s3079];+  s3096 = s3094 ^ s3095;+  s3097 = s3093 ^ s3096;+  s3098 = s3092 ^ s3097;+  s3099 = table7[s3073];+  s3100 = table8[s3075];+  s3101 = table9[s3077];+  s3102 = table6[s3079];+  s3103 = s3101 ^ s3102;+  s3104 = s3100 ^ s3103;+  s3105 = s3099 ^ s3104;+  s3106 = sbv_bv_join_u8_u8_u16(s3098, s3105);+  s3107 = sbv_bv_join_u16_u16_u32(s3091, s3106);+  s3108 = s3072 ^ s3107;+  s3109 = sbv_bv_extract_u32_15_8_u8(s3108);+  s3110 = table0[s3109];+  s3111 = sbv_bv_extract_u32_31_24_u8(s2970);+  s3112 = table1[s3111];+  s3113 = sbv_bv_extract_u32_23_16_u8(s2821);+  s3114 = table3[s3113];+  s3115 = s3112 ^ s3114;+  s3116 = sbv_bv_extract_u32_15_8_u8(s2870);+  s3117 = table4[s3116];+  s3118 = s3115 ^ s3117;+  s3119 = sbv_bv_extract_u32_7_0_u8(s2920);+  s3120 = table5[s3119];+  s3121 = s3118 ^ s3120;+  s3122 = sbv_bv_extract_u32_31_24_u8(s534);+  s3123 = table6[s3122];+  s3124 = sbv_bv_extract_u32_23_16_u8(s534);+  s3125 = table7[s3124];+  s3126 = sbv_bv_extract_u32_15_8_u8(s534);+  s3127 = table8[s3126];+  s3128 = sbv_bv_extract_u32_7_0_u8(s534);+  s3129 = table9[s3128];+  s3130 = s3127 ^ s3129;+  s3131 = s3125 ^ s3130;+  s3132 = s3123 ^ s3131;+  s3133 = table9[s3122];+  s3134 = table6[s3124];+  s3135 = table7[s3126];+  s3136 = table8[s3128];+  s3137 = s3135 ^ s3136;+  s3138 = s3134 ^ s3137;+  s3139 = s3133 ^ s3138;+  s3140 = sbv_bv_join_u8_u8_u16(s3132, s3139);+  s3141 = table8[s3122];+  s3142 = table9[s3124];+  s3143 = table6[s3126];+  s3144 = table7[s3128];+  s3145 = s3143 ^ s3144;+  s3146 = s3142 ^ s3145;+  s3147 = s3141 ^ s3146;+  s3148 = table7[s3122];+  s3149 = table8[s3124];+  s3150 = table9[s3126];+  s3151 = table6[s3128];+  s3152 = s3150 ^ s3151;+  s3153 = s3149 ^ s3152;+  s3154 = s3148 ^ s3153;+  s3155 = sbv_bv_join_u8_u8_u16(s3147, s3154);+  s3156 = sbv_bv_join_u16_u16_u32(s3140, s3155);+  s3157 = s3121 ^ s3156;+  s3158 = sbv_bv_extract_u32_7_0_u8(s3157);+  s3159 = table0[s3158];+  s3160 = sbv_bv_join_u8_u8_u16(s3110, s3159);+  s3161 = sbv_bv_join_u16_u16_u32(s3061, s3160);+  s3162 = s4 ^ s3161;+  s3163 = sbv_bv_extract_u32_31_24_u8(s3157);+  s3164 = table0[s3163];+  s3165 = sbv_bv_extract_u32_23_16_u8(s3009);+  s3166 = table0[s3165];+  s3167 = sbv_bv_join_u8_u8_u16(s3164, s3166);+  s3168 = sbv_bv_extract_u32_15_8_u8(s3058);+  s3169 = table0[s3168];+  s3170 = sbv_bv_extract_u32_7_0_u8(s3108);+  s3171 = table0[s3170];+  s3172 = sbv_bv_join_u8_u8_u16(s3169, s3171);+  s3173 = sbv_bv_join_u16_u16_u32(s3167, s3172);+  s3174 = s5 ^ s3173;+  s3175 = sbv_bv_extract_u32_31_24_u8(s3108);+  s3176 = table0[s3175];+  s3177 = sbv_bv_extract_u32_23_16_u8(s3157);+  s3178 = table0[s3177];+  s3179 = sbv_bv_join_u8_u8_u16(s3176, s3178);+  s3180 = sbv_bv_extract_u32_15_8_u8(s3009);+  s3181 = table0[s3180];+  s3182 = sbv_bv_extract_u32_7_0_u8(s3058);+  s3183 = table0[s3182];+  s3184 = sbv_bv_join_u8_u8_u16(s3181, s3183);+  s3185 = sbv_bv_join_u16_u16_u32(s3179, s3184);+  s3186 = s6 ^ s3185;+  s3187 = sbv_bv_extract_u32_31_24_u8(s3058);+  s3188 = table0[s3187];+  s3189 = sbv_bv_extract_u32_23_16_u8(s3108);+  s3190 = table0[s3189];+  s3191 = sbv_bv_join_u8_u8_u16(s3188, s3190);+  s3192 = sbv_bv_extract_u32_15_8_u8(s3157);+  s3193 = table0[s3192];+  s3194 = sbv_bv_extract_u32_7_0_u8(s3009);+  s3195 = table0[s3194];+  s3196 = sbv_bv_join_u8_u8_u16(s3193, s3195);+  s3197 = sbv_bv_join_u16_u16_u32(s3191, s3196);+  s3198 = s7 ^ s3197;++  sbv_output_0[0] = s3162;+  sbv_output_0[1] = s3174;+  sbv_output_0[2] = s3186;+  sbv_output_0[3] = s3198; } == END: "aes128Dec.c" ==================
SBVTestSuite/GoldFiles/aes128Enc.gold view
@@ -12,1056 +12,1776 @@ aes128Enc.o: aes128Enc.c aes128Enc.h 	${CC} ${CCFLAGS} -c $< -o $@ -aes128Enc_driver.o: aes128Enc_driver.c-	${CC} ${CCFLAGS} -c $< -o $@--aes128Enc_driver: aes128Enc.o aes128Enc_driver.o-	${CC} ${CCFLAGS} $^ -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f aes128Enc_driver-== END: "Makefile" ==================-== BEGIN: "aes128Enc.h" ================-/* Header file for aes128Enc. Automatically generated by SBV. Do not edit! */--#ifndef __aes128Enc__HEADER_INCLUDED__-#define __aes128Enc__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* Entry point prototype: */-void aes128Enc(const SWord32 *pt, const SWord32 *key, SWord32 *ct);--#endif /* __aes128Enc__HEADER_INCLUDED__ */-== END: "aes128Enc.h" ==================-== BEGIN: "aes128Enc_driver.c" ================-/* Example driver program for aes128Enc. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "aes128Enc.h"--int main(void)-{-  const SWord32 pt[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array pt:\n");-  int pt_ctr;-  for(pt_ctr = 0; pt_ctr < 4 ; ++pt_ctr)-    printf("  pt[%1d] = 0x%08"PRIx32"UL\n", pt_ctr ,pt[pt_ctr]);--  const SWord32 key[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array key:\n");-  int key_ctr;-  for(key_ctr = 0; key_ctr < 4 ; ++key_ctr)-    printf("  key[%1d] = 0x%08"PRIx32"UL\n", key_ctr ,key[key_ctr]);--  SWord32 ct[4];--  aes128Enc(pt, key, ct);--  printf("aes128Enc(pt, key, ct) ->\n");-  int ct_ctr;-  for(ct_ctr = 0; ct_ctr < 4 ; ++ct_ctr)-    printf("  ct[%1d] = 0x%08"PRIx32"UL\n", ct_ctr ,ct[ct_ctr]);--  return 0;-}-== END: "aes128Enc_driver.c" ==================-== BEGIN: "aes128Enc.c" ================-/* File: "aes128Enc.c". Automatically generated by SBV. Do not edit! */--#include "aes128Enc.h"--void aes128Enc(const SWord32 *pt, const SWord32 *key, SWord32 *ct)-{-  const SWord32 s0 = pt[0];-  const SWord32 s1 = pt[1];-  const SWord32 s2 = pt[2];-  const SWord32 s3 = pt[3];-  const SWord32 s4 = key[0];-  const SWord32 s5 = key[1];-  const SWord32 s6 = key[2];-  const SWord32 s7 = key[3];-  static const SWord8 table0[] = {-       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,-      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,-      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,-      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,-       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,-      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,-       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,-       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,-       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,-      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,-       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,-      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,-      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,-      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,-       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,-       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,-      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,-      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,-      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,-      104,  65, 153,  45,  15, 176,  84, 187,  22-  };-  static const SWord32 table1[] = {-      0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,-      0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,-      0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,-      0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,-      0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,-      0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,-      0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,-      0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,-      0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,-      0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,-      0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,-      0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,-      0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,-      0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,-      0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,-      0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,-      0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,-      0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,-      0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,-      0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,-      0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,-      0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,-      0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,-      0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,-      0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,-      0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,-      0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,-      0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,-      0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,-      0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,-      0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,-      0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,-      0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,-      0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,-      0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,-      0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,-      0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,-      0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,-      0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,-      0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,-      0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,-      0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,-      0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,-      0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,-      0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,-      0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,-      0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,-      0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,-      0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,-      0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,-      0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,-      0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,-      0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,-      0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,-      0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,-      0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,-      0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,-      0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,-      0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,-      0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,-      0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,-      0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,-      0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,-      0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL-  };-  static const SWord32 table2[] = {-      0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,-      0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,-      0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,-      0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,-      0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,-      0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,-      0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,-      0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,-      0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,-      0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,-      0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,-      0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,-      0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,-      0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,-      0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,-      0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,-      0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,-      0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,-      0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,-      0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,-      0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,-      0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,-      0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,-      0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,-      0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,-      0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,-      0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,-      0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,-      0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,-      0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,-      0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,-      0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,-      0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,-      0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,-      0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,-      0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,-      0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,-      0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,-      0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,-      0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,-      0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,-      0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,-      0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,-      0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,-      0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,-      0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,-      0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,-      0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,-      0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,-      0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,-      0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,-      0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,-      0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,-      0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,-      0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,-      0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,-      0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,-      0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,-      0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,-      0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,-      0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,-      0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,-      0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,-      0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL-  };-  static const SWord32 table3[] = {-      0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,-      0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,-      0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,-      0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,-      0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,-      0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,-      0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,-      0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,-      0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,-      0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,-      0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,-      0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,-      0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,-      0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,-      0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,-      0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,-      0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,-      0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,-      0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,-      0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,-      0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,-      0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,-      0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,-      0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,-      0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,-      0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,-      0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,-      0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,-      0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,-      0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,-      0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,-      0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,-      0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,-      0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,-      0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,-      0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,-      0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,-      0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,-      0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,-      0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,-      0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,-      0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,-      0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,-      0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,-      0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,-      0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,-      0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,-      0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,-      0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,-      0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,-      0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,-      0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,-      0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,-      0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,-      0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,-      0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,-      0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,-      0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,-      0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,-      0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,-      0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,-      0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,-      0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,-      0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL-  };-  static const SWord32 table4[] = {-      0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,-      0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,-      0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,-      0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,-      0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,-      0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,-      0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,-      0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,-      0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,-      0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,-      0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,-      0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,-      0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,-      0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,-      0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,-      0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,-      0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,-      0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,-      0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,-      0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,-      0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,-      0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,-      0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,-      0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,-      0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,-      0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,-      0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,-      0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,-      0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,-      0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,-      0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,-      0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,-      0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,-      0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,-      0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,-      0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,-      0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,-      0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,-      0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,-      0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,-      0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,-      0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,-      0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,-      0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,-      0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,-      0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,-      0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,-      0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,-      0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,-      0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,-      0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,-      0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,-      0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,-      0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,-      0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,-      0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,-      0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,-      0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,-      0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,-      0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,-      0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,-      0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,-      0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,-      0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL-  };-  const SWord32 s520 = s0 ^ s4;-  const SWord8  s521 = (SWord8) (s520 >> 24);-  const SWord32 s522 = table1[s521];-  const SWord32 s778 = s1 ^ s5;-  const SWord8  s779 = (SWord8) (s778 >> 16);-  const SWord32 s780 = table2[s779];-  const SWord32 s781 = s522 ^ s780;-  const SWord32 s1037 = s2 ^ s6;-  const SWord8  s1038 = (SWord8) (s1037 >> 8);-  const SWord32 s1039 = table3[s1038];-  const SWord32 s1040 = s781 ^ s1039;-  const SWord32 s1296 = s3 ^ s7;-  const SWord8  s1297 = (SWord8) s1296;-  const SWord32 s1298 = table4[s1297];-  const SWord32 s1299 = s1040 ^ s1298;-  const SWord32 s1300 = (s7 << 8) | (s7 >> 24);-  const SWord8  s1301 = (SWord8) (s1300 >> 24);-  const SWord8  s1302 = table0[s1301];-  const SWord8  s1303 = 1 ^ s1302;-  const SWord8  s1304 = (SWord8) (s1300 >> 16);-  const SWord8  s1305 = table0[s1304];-  const SWord16 s1306 = (((SWord16) s1303) << 8) | ((SWord16) s1305);-  const SWord8  s1307 = (SWord8) (s1300 >> 8);-  const SWord8  s1308 = table0[s1307];-  const SWord8  s1309 = (SWord8) s1300;-  const SWord8  s1310 = table0[s1309];-  const SWord16 s1311 = (((SWord16) s1308) << 8) | ((SWord16) s1310);-  const SWord32 s1312 = (((SWord32) s1306) << 16) | ((SWord32) s1311);-  const SWord32 s1313 = s4 ^ s1312;-  const SWord32 s1314 = s1299 ^ s1313;-  const SWord8  s1315 = (SWord8) (s1314 >> 24);-  const SWord32 s1316 = table1[s1315];-  const SWord8  s1317 = (SWord8) (s778 >> 24);-  const SWord32 s1318 = table1[s1317];-  const SWord8  s1319 = (SWord8) (s1037 >> 16);-  const SWord32 s1320 = table2[s1319];-  const SWord32 s1321 = s1318 ^ s1320;-  const SWord8  s1322 = (SWord8) (s1296 >> 8);-  const SWord32 s1323 = table3[s1322];-  const SWord32 s1324 = s1321 ^ s1323;-  const SWord8  s1325 = (SWord8) s520;-  const SWord32 s1326 = table4[s1325];-  const SWord32 s1327 = s1324 ^ s1326;-  const SWord32 s1328 = s5 ^ s1313;-  const SWord32 s1329 = s1327 ^ s1328;-  const SWord8  s1330 = (SWord8) (s1329 >> 16);-  const SWord32 s1331 = table2[s1330];-  const SWord32 s1332 = s1316 ^ s1331;-  const SWord8  s1333 = (SWord8) (s1037 >> 24);-  const SWord32 s1334 = table1[s1333];-  const SWord8  s1335 = (SWord8) (s1296 >> 16);-  const SWord32 s1336 = table2[s1335];-  const SWord32 s1337 = s1334 ^ s1336;-  const SWord8  s1338 = (SWord8) (s520 >> 8);-  const SWord32 s1339 = table3[s1338];-  const SWord32 s1340 = s1337 ^ s1339;-  const SWord8  s1341 = (SWord8) s778;-  const SWord32 s1342 = table4[s1341];-  const SWord32 s1343 = s1340 ^ s1342;-  const SWord32 s1344 = s6 ^ s1328;-  const SWord32 s1345 = s1343 ^ s1344;-  const SWord8  s1346 = (SWord8) (s1345 >> 8);-  const SWord32 s1347 = table3[s1346];-  const SWord32 s1348 = s1332 ^ s1347;-  const SWord8  s1349 = (SWord8) (s1296 >> 24);-  const SWord32 s1350 = table1[s1349];-  const SWord8  s1351 = (SWord8) (s520 >> 16);-  const SWord32 s1352 = table2[s1351];-  const SWord32 s1353 = s1350 ^ s1352;-  const SWord8  s1354 = (SWord8) (s778 >> 8);-  const SWord32 s1355 = table3[s1354];-  const SWord32 s1356 = s1353 ^ s1355;-  const SWord8  s1357 = (SWord8) s1037;-  const SWord32 s1358 = table4[s1357];-  const SWord32 s1359 = s1356 ^ s1358;-  const SWord32 s1360 = s7 ^ s1344;-  const SWord32 s1361 = s1359 ^ s1360;-  const SWord8  s1362 = (SWord8) s1361;-  const SWord32 s1363 = table4[s1362];-  const SWord32 s1364 = s1348 ^ s1363;-  const SWord32 s1365 = (s1360 << 8) | (s1360 >> 24);-  const SWord8  s1366 = (SWord8) (s1365 >> 24);-  const SWord8  s1367 = table0[s1366];-  const SWord8  s1368 = 2 ^ s1367;-  const SWord8  s1369 = (SWord8) (s1365 >> 16);-  const SWord8  s1370 = table0[s1369];-  const SWord16 s1371 = (((SWord16) s1368) << 8) | ((SWord16) s1370);-  const SWord8  s1372 = (SWord8) (s1365 >> 8);-  const SWord8  s1373 = table0[s1372];-  const SWord8  s1374 = (SWord8) s1365;-  const SWord8  s1375 = table0[s1374];-  const SWord16 s1376 = (((SWord16) s1373) << 8) | ((SWord16) s1375);-  const SWord32 s1377 = (((SWord32) s1371) << 16) | ((SWord32) s1376);-  const SWord32 s1378 = s1313 ^ s1377;-  const SWord32 s1379 = s1364 ^ s1378;-  const SWord8  s1380 = (SWord8) (s1379 >> 24);-  const SWord32 s1381 = table1[s1380];-  const SWord8  s1382 = (SWord8) (s1329 >> 24);-  const SWord32 s1383 = table1[s1382];-  const SWord8  s1384 = (SWord8) (s1345 >> 16);-  const SWord32 s1385 = table2[s1384];-  const SWord32 s1386 = s1383 ^ s1385;-  const SWord8  s1387 = (SWord8) (s1361 >> 8);-  const SWord32 s1388 = table3[s1387];-  const SWord32 s1389 = s1386 ^ s1388;-  const SWord8  s1390 = (SWord8) s1314;-  const SWord32 s1391 = table4[s1390];-  const SWord32 s1392 = s1389 ^ s1391;-  const SWord32 s1393 = s1328 ^ s1378;-  const SWord32 s1394 = s1392 ^ s1393;-  const SWord8  s1395 = (SWord8) (s1394 >> 16);-  const SWord32 s1396 = table2[s1395];-  const SWord32 s1397 = s1381 ^ s1396;-  const SWord8  s1398 = (SWord8) (s1345 >> 24);-  const SWord32 s1399 = table1[s1398];-  const SWord8  s1400 = (SWord8) (s1361 >> 16);-  const SWord32 s1401 = table2[s1400];-  const SWord32 s1402 = s1399 ^ s1401;-  const SWord8  s1403 = (SWord8) (s1314 >> 8);-  const SWord32 s1404 = table3[s1403];-  const SWord32 s1405 = s1402 ^ s1404;-  const SWord8  s1406 = (SWord8) s1329;-  const SWord32 s1407 = table4[s1406];-  const SWord32 s1408 = s1405 ^ s1407;-  const SWord32 s1409 = s1344 ^ s1393;-  const SWord32 s1410 = s1408 ^ s1409;-  const SWord8  s1411 = (SWord8) (s1410 >> 8);-  const SWord32 s1412 = table3[s1411];-  const SWord32 s1413 = s1397 ^ s1412;-  const SWord8  s1414 = (SWord8) (s1361 >> 24);-  const SWord32 s1415 = table1[s1414];-  const SWord8  s1416 = (SWord8) (s1314 >> 16);-  const SWord32 s1417 = table2[s1416];-  const SWord32 s1418 = s1415 ^ s1417;-  const SWord8  s1419 = (SWord8) (s1329 >> 8);-  const SWord32 s1420 = table3[s1419];-  const SWord32 s1421 = s1418 ^ s1420;-  const SWord8  s1422 = (SWord8) s1345;-  const SWord32 s1423 = table4[s1422];-  const SWord32 s1424 = s1421 ^ s1423;-  const SWord32 s1425 = s1360 ^ s1409;-  const SWord32 s1426 = s1424 ^ s1425;-  const SWord8  s1427 = (SWord8) s1426;-  const SWord32 s1428 = table4[s1427];-  const SWord32 s1429 = s1413 ^ s1428;-  const SWord32 s1430 = (s1425 << 8) | (s1425 >> 24);-  const SWord8  s1431 = (SWord8) (s1430 >> 24);-  const SWord8  s1432 = table0[s1431];-  const SWord8  s1433 = 4 ^ s1432;-  const SWord8  s1434 = (SWord8) (s1430 >> 16);-  const SWord8  s1435 = table0[s1434];-  const SWord16 s1436 = (((SWord16) s1433) << 8) | ((SWord16) s1435);-  const SWord8  s1437 = (SWord8) (s1430 >> 8);-  const SWord8  s1438 = table0[s1437];-  const SWord8  s1439 = (SWord8) s1430;-  const SWord8  s1440 = table0[s1439];-  const SWord16 s1441 = (((SWord16) s1438) << 8) | ((SWord16) s1440);-  const SWord32 s1442 = (((SWord32) s1436) << 16) | ((SWord32) s1441);-  const SWord32 s1443 = s1378 ^ s1442;-  const SWord32 s1444 = s1429 ^ s1443;-  const SWord8  s1445 = (SWord8) (s1444 >> 24);-  const SWord32 s1446 = table1[s1445];-  const SWord8  s1447 = (SWord8) (s1394 >> 24);-  const SWord32 s1448 = table1[s1447];-  const SWord8  s1449 = (SWord8) (s1410 >> 16);-  const SWord32 s1450 = table2[s1449];-  const SWord32 s1451 = s1448 ^ s1450;-  const SWord8  s1452 = (SWord8) (s1426 >> 8);-  const SWord32 s1453 = table3[s1452];-  const SWord32 s1454 = s1451 ^ s1453;-  const SWord8  s1455 = (SWord8) s1379;-  const SWord32 s1456 = table4[s1455];-  const SWord32 s1457 = s1454 ^ s1456;-  const SWord32 s1458 = s1393 ^ s1443;-  const SWord32 s1459 = s1457 ^ s1458;-  const SWord8  s1460 = (SWord8) (s1459 >> 16);-  const SWord32 s1461 = table2[s1460];-  const SWord32 s1462 = s1446 ^ s1461;-  const SWord8  s1463 = (SWord8) (s1410 >> 24);-  const SWord32 s1464 = table1[s1463];-  const SWord8  s1465 = (SWord8) (s1426 >> 16);-  const SWord32 s1466 = table2[s1465];-  const SWord32 s1467 = s1464 ^ s1466;-  const SWord8  s1468 = (SWord8) (s1379 >> 8);-  const SWord32 s1469 = table3[s1468];-  const SWord32 s1470 = s1467 ^ s1469;-  const SWord8  s1471 = (SWord8) s1394;-  const SWord32 s1472 = table4[s1471];-  const SWord32 s1473 = s1470 ^ s1472;-  const SWord32 s1474 = s1409 ^ s1458;-  const SWord32 s1475 = s1473 ^ s1474;-  const SWord8  s1476 = (SWord8) (s1475 >> 8);-  const SWord32 s1477 = table3[s1476];-  const SWord32 s1478 = s1462 ^ s1477;-  const SWord8  s1479 = (SWord8) (s1426 >> 24);-  const SWord32 s1480 = table1[s1479];-  const SWord8  s1481 = (SWord8) (s1379 >> 16);-  const SWord32 s1482 = table2[s1481];-  const SWord32 s1483 = s1480 ^ s1482;-  const SWord8  s1484 = (SWord8) (s1394 >> 8);-  const SWord32 s1485 = table3[s1484];-  const SWord32 s1486 = s1483 ^ s1485;-  const SWord8  s1487 = (SWord8) s1410;-  const SWord32 s1488 = table4[s1487];-  const SWord32 s1489 = s1486 ^ s1488;-  const SWord32 s1490 = s1425 ^ s1474;-  const SWord32 s1491 = s1489 ^ s1490;-  const SWord8  s1492 = (SWord8) s1491;-  const SWord32 s1493 = table4[s1492];-  const SWord32 s1494 = s1478 ^ s1493;-  const SWord32 s1495 = (s1490 << 8) | (s1490 >> 24);-  const SWord8  s1496 = (SWord8) (s1495 >> 24);-  const SWord8  s1497 = table0[s1496];-  const SWord8  s1498 = 8 ^ s1497;-  const SWord8  s1499 = (SWord8) (s1495 >> 16);-  const SWord8  s1500 = table0[s1499];-  const SWord16 s1501 = (((SWord16) s1498) << 8) | ((SWord16) s1500);-  const SWord8  s1502 = (SWord8) (s1495 >> 8);-  const SWord8  s1503 = table0[s1502];-  const SWord8  s1504 = (SWord8) s1495;-  const SWord8  s1505 = table0[s1504];-  const SWord16 s1506 = (((SWord16) s1503) << 8) | ((SWord16) s1505);-  const SWord32 s1507 = (((SWord32) s1501) << 16) | ((SWord32) s1506);-  const SWord32 s1508 = s1443 ^ s1507;-  const SWord32 s1509 = s1494 ^ s1508;-  const SWord8  s1510 = (SWord8) (s1509 >> 24);-  const SWord32 s1511 = table1[s1510];-  const SWord8  s1512 = (SWord8) (s1459 >> 24);-  const SWord32 s1513 = table1[s1512];-  const SWord8  s1514 = (SWord8) (s1475 >> 16);-  const SWord32 s1515 = table2[s1514];-  const SWord32 s1516 = s1513 ^ s1515;-  const SWord8  s1517 = (SWord8) (s1491 >> 8);-  const SWord32 s1518 = table3[s1517];-  const SWord32 s1519 = s1516 ^ s1518;-  const SWord8  s1520 = (SWord8) s1444;-  const SWord32 s1521 = table4[s1520];-  const SWord32 s1522 = s1519 ^ s1521;-  const SWord32 s1523 = s1458 ^ s1508;-  const SWord32 s1524 = s1522 ^ s1523;-  const SWord8  s1525 = (SWord8) (s1524 >> 16);-  const SWord32 s1526 = table2[s1525];-  const SWord32 s1527 = s1511 ^ s1526;-  const SWord8  s1528 = (SWord8) (s1475 >> 24);-  const SWord32 s1529 = table1[s1528];-  const SWord8  s1530 = (SWord8) (s1491 >> 16);-  const SWord32 s1531 = table2[s1530];-  const SWord32 s1532 = s1529 ^ s1531;-  const SWord8  s1533 = (SWord8) (s1444 >> 8);-  const SWord32 s1534 = table3[s1533];-  const SWord32 s1535 = s1532 ^ s1534;-  const SWord8  s1536 = (SWord8) s1459;-  const SWord32 s1537 = table4[s1536];-  const SWord32 s1538 = s1535 ^ s1537;-  const SWord32 s1539 = s1474 ^ s1523;-  const SWord32 s1540 = s1538 ^ s1539;-  const SWord8  s1541 = (SWord8) (s1540 >> 8);-  const SWord32 s1542 = table3[s1541];-  const SWord32 s1543 = s1527 ^ s1542;-  const SWord8  s1544 = (SWord8) (s1491 >> 24);-  const SWord32 s1545 = table1[s1544];-  const SWord8  s1546 = (SWord8) (s1444 >> 16);-  const SWord32 s1547 = table2[s1546];-  const SWord32 s1548 = s1545 ^ s1547;-  const SWord8  s1549 = (SWord8) (s1459 >> 8);-  const SWord32 s1550 = table3[s1549];-  const SWord32 s1551 = s1548 ^ s1550;-  const SWord8  s1552 = (SWord8) s1475;-  const SWord32 s1553 = table4[s1552];-  const SWord32 s1554 = s1551 ^ s1553;-  const SWord32 s1555 = s1490 ^ s1539;-  const SWord32 s1556 = s1554 ^ s1555;-  const SWord8  s1557 = (SWord8) s1556;-  const SWord32 s1558 = table4[s1557];-  const SWord32 s1559 = s1543 ^ s1558;-  const SWord32 s1560 = (s1555 << 8) | (s1555 >> 24);-  const SWord8  s1561 = (SWord8) (s1560 >> 24);-  const SWord8  s1562 = table0[s1561];-  const SWord8  s1563 = 16 ^ s1562;-  const SWord8  s1564 = (SWord8) (s1560 >> 16);-  const SWord8  s1565 = table0[s1564];-  const SWord16 s1566 = (((SWord16) s1563) << 8) | ((SWord16) s1565);-  const SWord8  s1567 = (SWord8) (s1560 >> 8);-  const SWord8  s1568 = table0[s1567];-  const SWord8  s1569 = (SWord8) s1560;-  const SWord8  s1570 = table0[s1569];-  const SWord16 s1571 = (((SWord16) s1568) << 8) | ((SWord16) s1570);-  const SWord32 s1572 = (((SWord32) s1566) << 16) | ((SWord32) s1571);-  const SWord32 s1573 = s1508 ^ s1572;-  const SWord32 s1574 = s1559 ^ s1573;-  const SWord8  s1575 = (SWord8) (s1574 >> 24);-  const SWord32 s1576 = table1[s1575];-  const SWord8  s1577 = (SWord8) (s1524 >> 24);-  const SWord32 s1578 = table1[s1577];-  const SWord8  s1579 = (SWord8) (s1540 >> 16);-  const SWord32 s1580 = table2[s1579];-  const SWord32 s1581 = s1578 ^ s1580;-  const SWord8  s1582 = (SWord8) (s1556 >> 8);-  const SWord32 s1583 = table3[s1582];-  const SWord32 s1584 = s1581 ^ s1583;-  const SWord8  s1585 = (SWord8) s1509;-  const SWord32 s1586 = table4[s1585];-  const SWord32 s1587 = s1584 ^ s1586;-  const SWord32 s1588 = s1523 ^ s1573;-  const SWord32 s1589 = s1587 ^ s1588;-  const SWord8  s1590 = (SWord8) (s1589 >> 16);-  const SWord32 s1591 = table2[s1590];-  const SWord32 s1592 = s1576 ^ s1591;-  const SWord8  s1593 = (SWord8) (s1540 >> 24);-  const SWord32 s1594 = table1[s1593];-  const SWord8  s1595 = (SWord8) (s1556 >> 16);-  const SWord32 s1596 = table2[s1595];-  const SWord32 s1597 = s1594 ^ s1596;-  const SWord8  s1598 = (SWord8) (s1509 >> 8);-  const SWord32 s1599 = table3[s1598];-  const SWord32 s1600 = s1597 ^ s1599;-  const SWord8  s1601 = (SWord8) s1524;-  const SWord32 s1602 = table4[s1601];-  const SWord32 s1603 = s1600 ^ s1602;-  const SWord32 s1604 = s1539 ^ s1588;-  const SWord32 s1605 = s1603 ^ s1604;-  const SWord8  s1606 = (SWord8) (s1605 >> 8);-  const SWord32 s1607 = table3[s1606];-  const SWord32 s1608 = s1592 ^ s1607;-  const SWord8  s1609 = (SWord8) (s1556 >> 24);-  const SWord32 s1610 = table1[s1609];-  const SWord8  s1611 = (SWord8) (s1509 >> 16);-  const SWord32 s1612 = table2[s1611];-  const SWord32 s1613 = s1610 ^ s1612;-  const SWord8  s1614 = (SWord8) (s1524 >> 8);-  const SWord32 s1615 = table3[s1614];-  const SWord32 s1616 = s1613 ^ s1615;-  const SWord8  s1617 = (SWord8) s1540;-  const SWord32 s1618 = table4[s1617];-  const SWord32 s1619 = s1616 ^ s1618;-  const SWord32 s1620 = s1555 ^ s1604;-  const SWord32 s1621 = s1619 ^ s1620;-  const SWord8  s1622 = (SWord8) s1621;-  const SWord32 s1623 = table4[s1622];-  const SWord32 s1624 = s1608 ^ s1623;-  const SWord32 s1625 = (s1620 << 8) | (s1620 >> 24);-  const SWord8  s1626 = (SWord8) (s1625 >> 24);-  const SWord8  s1627 = table0[s1626];-  const SWord8  s1628 = 32 ^ s1627;-  const SWord8  s1629 = (SWord8) (s1625 >> 16);-  const SWord8  s1630 = table0[s1629];-  const SWord16 s1631 = (((SWord16) s1628) << 8) | ((SWord16) s1630);-  const SWord8  s1632 = (SWord8) (s1625 >> 8);-  const SWord8  s1633 = table0[s1632];-  const SWord8  s1634 = (SWord8) s1625;-  const SWord8  s1635 = table0[s1634];-  const SWord16 s1636 = (((SWord16) s1633) << 8) | ((SWord16) s1635);-  const SWord32 s1637 = (((SWord32) s1631) << 16) | ((SWord32) s1636);-  const SWord32 s1638 = s1573 ^ s1637;-  const SWord32 s1639 = s1624 ^ s1638;-  const SWord8  s1640 = (SWord8) (s1639 >> 24);-  const SWord32 s1641 = table1[s1640];-  const SWord8  s1642 = (SWord8) (s1589 >> 24);-  const SWord32 s1643 = table1[s1642];-  const SWord8  s1644 = (SWord8) (s1605 >> 16);-  const SWord32 s1645 = table2[s1644];-  const SWord32 s1646 = s1643 ^ s1645;-  const SWord8  s1647 = (SWord8) (s1621 >> 8);-  const SWord32 s1648 = table3[s1647];-  const SWord32 s1649 = s1646 ^ s1648;-  const SWord8  s1650 = (SWord8) s1574;-  const SWord32 s1651 = table4[s1650];-  const SWord32 s1652 = s1649 ^ s1651;-  const SWord32 s1653 = s1588 ^ s1638;-  const SWord32 s1654 = s1652 ^ s1653;-  const SWord8  s1655 = (SWord8) (s1654 >> 16);-  const SWord32 s1656 = table2[s1655];-  const SWord32 s1657 = s1641 ^ s1656;-  const SWord8  s1658 = (SWord8) (s1605 >> 24);-  const SWord32 s1659 = table1[s1658];-  const SWord8  s1660 = (SWord8) (s1621 >> 16);-  const SWord32 s1661 = table2[s1660];-  const SWord32 s1662 = s1659 ^ s1661;-  const SWord8  s1663 = (SWord8) (s1574 >> 8);-  const SWord32 s1664 = table3[s1663];-  const SWord32 s1665 = s1662 ^ s1664;-  const SWord8  s1666 = (SWord8) s1589;-  const SWord32 s1667 = table4[s1666];-  const SWord32 s1668 = s1665 ^ s1667;-  const SWord32 s1669 = s1604 ^ s1653;-  const SWord32 s1670 = s1668 ^ s1669;-  const SWord8  s1671 = (SWord8) (s1670 >> 8);-  const SWord32 s1672 = table3[s1671];-  const SWord32 s1673 = s1657 ^ s1672;-  const SWord8  s1674 = (SWord8) (s1621 >> 24);-  const SWord32 s1675 = table1[s1674];-  const SWord8  s1676 = (SWord8) (s1574 >> 16);-  const SWord32 s1677 = table2[s1676];-  const SWord32 s1678 = s1675 ^ s1677;-  const SWord8  s1679 = (SWord8) (s1589 >> 8);-  const SWord32 s1680 = table3[s1679];-  const SWord32 s1681 = s1678 ^ s1680;-  const SWord8  s1682 = (SWord8) s1605;-  const SWord32 s1683 = table4[s1682];-  const SWord32 s1684 = s1681 ^ s1683;-  const SWord32 s1685 = s1620 ^ s1669;-  const SWord32 s1686 = s1684 ^ s1685;-  const SWord8  s1687 = (SWord8) s1686;-  const SWord32 s1688 = table4[s1687];-  const SWord32 s1689 = s1673 ^ s1688;-  const SWord32 s1690 = (s1685 << 8) | (s1685 >> 24);-  const SWord8  s1691 = (SWord8) (s1690 >> 24);-  const SWord8  s1692 = table0[s1691];-  const SWord8  s1693 = 64 ^ s1692;-  const SWord8  s1694 = (SWord8) (s1690 >> 16);-  const SWord8  s1695 = table0[s1694];-  const SWord16 s1696 = (((SWord16) s1693) << 8) | ((SWord16) s1695);-  const SWord8  s1697 = (SWord8) (s1690 >> 8);-  const SWord8  s1698 = table0[s1697];-  const SWord8  s1699 = (SWord8) s1690;-  const SWord8  s1700 = table0[s1699];-  const SWord16 s1701 = (((SWord16) s1698) << 8) | ((SWord16) s1700);-  const SWord32 s1702 = (((SWord32) s1696) << 16) | ((SWord32) s1701);-  const SWord32 s1703 = s1638 ^ s1702;-  const SWord32 s1704 = s1689 ^ s1703;-  const SWord8  s1705 = (SWord8) (s1704 >> 24);-  const SWord32 s1706 = table1[s1705];-  const SWord8  s1707 = (SWord8) (s1654 >> 24);-  const SWord32 s1708 = table1[s1707];-  const SWord8  s1709 = (SWord8) (s1670 >> 16);-  const SWord32 s1710 = table2[s1709];-  const SWord32 s1711 = s1708 ^ s1710;-  const SWord8  s1712 = (SWord8) (s1686 >> 8);-  const SWord32 s1713 = table3[s1712];-  const SWord32 s1714 = s1711 ^ s1713;-  const SWord8  s1715 = (SWord8) s1639;-  const SWord32 s1716 = table4[s1715];-  const SWord32 s1717 = s1714 ^ s1716;-  const SWord32 s1718 = s1653 ^ s1703;-  const SWord32 s1719 = s1717 ^ s1718;-  const SWord8  s1720 = (SWord8) (s1719 >> 16);-  const SWord32 s1721 = table2[s1720];-  const SWord32 s1722 = s1706 ^ s1721;-  const SWord8  s1723 = (SWord8) (s1670 >> 24);-  const SWord32 s1724 = table1[s1723];-  const SWord8  s1725 = (SWord8) (s1686 >> 16);-  const SWord32 s1726 = table2[s1725];-  const SWord32 s1727 = s1724 ^ s1726;-  const SWord8  s1728 = (SWord8) (s1639 >> 8);-  const SWord32 s1729 = table3[s1728];-  const SWord32 s1730 = s1727 ^ s1729;-  const SWord8  s1731 = (SWord8) s1654;-  const SWord32 s1732 = table4[s1731];-  const SWord32 s1733 = s1730 ^ s1732;-  const SWord32 s1734 = s1669 ^ s1718;-  const SWord32 s1735 = s1733 ^ s1734;-  const SWord8  s1736 = (SWord8) (s1735 >> 8);-  const SWord32 s1737 = table3[s1736];-  const SWord32 s1738 = s1722 ^ s1737;-  const SWord8  s1739 = (SWord8) (s1686 >> 24);-  const SWord32 s1740 = table1[s1739];-  const SWord8  s1741 = (SWord8) (s1639 >> 16);-  const SWord32 s1742 = table2[s1741];-  const SWord32 s1743 = s1740 ^ s1742;-  const SWord8  s1744 = (SWord8) (s1654 >> 8);-  const SWord32 s1745 = table3[s1744];-  const SWord32 s1746 = s1743 ^ s1745;-  const SWord8  s1747 = (SWord8) s1670;-  const SWord32 s1748 = table4[s1747];-  const SWord32 s1749 = s1746 ^ s1748;-  const SWord32 s1750 = s1685 ^ s1734;-  const SWord32 s1751 = s1749 ^ s1750;-  const SWord8  s1752 = (SWord8) s1751;-  const SWord32 s1753 = table4[s1752];-  const SWord32 s1754 = s1738 ^ s1753;-  const SWord32 s1755 = (s1750 << 8) | (s1750 >> 24);-  const SWord8  s1756 = (SWord8) (s1755 >> 24);-  const SWord8  s1757 = table0[s1756];-  const SWord8  s1758 = 128 ^ s1757;-  const SWord8  s1759 = (SWord8) (s1755 >> 16);-  const SWord8  s1760 = table0[s1759];-  const SWord16 s1761 = (((SWord16) s1758) << 8) | ((SWord16) s1760);-  const SWord8  s1762 = (SWord8) (s1755 >> 8);-  const SWord8  s1763 = table0[s1762];-  const SWord8  s1764 = (SWord8) s1755;-  const SWord8  s1765 = table0[s1764];-  const SWord16 s1766 = (((SWord16) s1763) << 8) | ((SWord16) s1765);-  const SWord32 s1767 = (((SWord32) s1761) << 16) | ((SWord32) s1766);-  const SWord32 s1768 = s1703 ^ s1767;-  const SWord32 s1769 = s1754 ^ s1768;-  const SWord8  s1770 = (SWord8) (s1769 >> 24);-  const SWord32 s1771 = table1[s1770];-  const SWord8  s1772 = (SWord8) (s1719 >> 24);-  const SWord32 s1773 = table1[s1772];-  const SWord8  s1774 = (SWord8) (s1735 >> 16);-  const SWord32 s1775 = table2[s1774];-  const SWord32 s1776 = s1773 ^ s1775;-  const SWord8  s1777 = (SWord8) (s1751 >> 8);-  const SWord32 s1778 = table3[s1777];-  const SWord32 s1779 = s1776 ^ s1778;-  const SWord8  s1780 = (SWord8) s1704;-  const SWord32 s1781 = table4[s1780];-  const SWord32 s1782 = s1779 ^ s1781;-  const SWord32 s1783 = s1718 ^ s1768;-  const SWord32 s1784 = s1782 ^ s1783;-  const SWord8  s1785 = (SWord8) (s1784 >> 16);-  const SWord32 s1786 = table2[s1785];-  const SWord32 s1787 = s1771 ^ s1786;-  const SWord8  s1788 = (SWord8) (s1735 >> 24);-  const SWord32 s1789 = table1[s1788];-  const SWord8  s1790 = (SWord8) (s1751 >> 16);-  const SWord32 s1791 = table2[s1790];-  const SWord32 s1792 = s1789 ^ s1791;-  const SWord8  s1793 = (SWord8) (s1704 >> 8);-  const SWord32 s1794 = table3[s1793];-  const SWord32 s1795 = s1792 ^ s1794;-  const SWord8  s1796 = (SWord8) s1719;-  const SWord32 s1797 = table4[s1796];-  const SWord32 s1798 = s1795 ^ s1797;-  const SWord32 s1799 = s1734 ^ s1783;-  const SWord32 s1800 = s1798 ^ s1799;-  const SWord8  s1801 = (SWord8) (s1800 >> 8);-  const SWord32 s1802 = table3[s1801];-  const SWord32 s1803 = s1787 ^ s1802;-  const SWord8  s1804 = (SWord8) (s1751 >> 24);-  const SWord32 s1805 = table1[s1804];-  const SWord8  s1806 = (SWord8) (s1704 >> 16);-  const SWord32 s1807 = table2[s1806];-  const SWord32 s1808 = s1805 ^ s1807;-  const SWord8  s1809 = (SWord8) (s1719 >> 8);-  const SWord32 s1810 = table3[s1809];-  const SWord32 s1811 = s1808 ^ s1810;-  const SWord8  s1812 = (SWord8) s1735;-  const SWord32 s1813 = table4[s1812];-  const SWord32 s1814 = s1811 ^ s1813;-  const SWord32 s1815 = s1750 ^ s1799;-  const SWord32 s1816 = s1814 ^ s1815;-  const SWord8  s1817 = (SWord8) s1816;-  const SWord32 s1818 = table4[s1817];-  const SWord32 s1819 = s1803 ^ s1818;-  const SWord32 s1820 = (s1815 << 8) | (s1815 >> 24);-  const SWord8  s1821 = (SWord8) (s1820 >> 24);-  const SWord8  s1822 = table0[s1821];-  const SWord8  s1823 = 27 ^ s1822;-  const SWord8  s1824 = (SWord8) (s1820 >> 16);-  const SWord8  s1825 = table0[s1824];-  const SWord16 s1826 = (((SWord16) s1823) << 8) | ((SWord16) s1825);-  const SWord8  s1827 = (SWord8) (s1820 >> 8);-  const SWord8  s1828 = table0[s1827];-  const SWord8  s1829 = (SWord8) s1820;-  const SWord8  s1830 = table0[s1829];-  const SWord16 s1831 = (((SWord16) s1828) << 8) | ((SWord16) s1830);-  const SWord32 s1832 = (((SWord32) s1826) << 16) | ((SWord32) s1831);-  const SWord32 s1833 = s1768 ^ s1832;-  const SWord32 s1834 = s1819 ^ s1833;-  const SWord8  s1835 = (SWord8) (s1834 >> 24);-  const SWord8  s1836 = table0[s1835];-  const SWord8  s1837 = (SWord8) (s1784 >> 24);-  const SWord32 s1838 = table1[s1837];-  const SWord8  s1839 = (SWord8) (s1800 >> 16);-  const SWord32 s1840 = table2[s1839];-  const SWord32 s1841 = s1838 ^ s1840;-  const SWord8  s1842 = (SWord8) (s1816 >> 8);-  const SWord32 s1843 = table3[s1842];-  const SWord32 s1844 = s1841 ^ s1843;-  const SWord8  s1845 = (SWord8) s1769;-  const SWord32 s1846 = table4[s1845];-  const SWord32 s1847 = s1844 ^ s1846;-  const SWord32 s1848 = s1783 ^ s1833;-  const SWord32 s1849 = s1847 ^ s1848;-  const SWord8  s1850 = (SWord8) (s1849 >> 16);-  const SWord8  s1851 = table0[s1850];-  const SWord16 s1852 = (((SWord16) s1836) << 8) | ((SWord16) s1851);-  const SWord8  s1853 = (SWord8) (s1800 >> 24);-  const SWord32 s1854 = table1[s1853];-  const SWord8  s1855 = (SWord8) (s1816 >> 16);-  const SWord32 s1856 = table2[s1855];-  const SWord32 s1857 = s1854 ^ s1856;-  const SWord8  s1858 = (SWord8) (s1769 >> 8);-  const SWord32 s1859 = table3[s1858];-  const SWord32 s1860 = s1857 ^ s1859;-  const SWord8  s1861 = (SWord8) s1784;-  const SWord32 s1862 = table4[s1861];-  const SWord32 s1863 = s1860 ^ s1862;-  const SWord32 s1864 = s1799 ^ s1848;-  const SWord32 s1865 = s1863 ^ s1864;-  const SWord8  s1866 = (SWord8) (s1865 >> 8);-  const SWord8  s1867 = table0[s1866];-  const SWord8  s1868 = (SWord8) (s1816 >> 24);-  const SWord32 s1869 = table1[s1868];-  const SWord8  s1870 = (SWord8) (s1769 >> 16);-  const SWord32 s1871 = table2[s1870];-  const SWord32 s1872 = s1869 ^ s1871;-  const SWord8  s1873 = (SWord8) (s1784 >> 8);-  const SWord32 s1874 = table3[s1873];-  const SWord32 s1875 = s1872 ^ s1874;-  const SWord8  s1876 = (SWord8) s1800;-  const SWord32 s1877 = table4[s1876];-  const SWord32 s1878 = s1875 ^ s1877;-  const SWord32 s1879 = s1815 ^ s1864;-  const SWord32 s1880 = s1878 ^ s1879;-  const SWord8  s1881 = (SWord8) s1880;-  const SWord8  s1882 = table0[s1881];-  const SWord16 s1883 = (((SWord16) s1867) << 8) | ((SWord16) s1882);-  const SWord32 s1884 = (((SWord32) s1852) << 16) | ((SWord32) s1883);-  const SWord32 s1885 = (s1879 << 8) | (s1879 >> 24);-  const SWord8  s1886 = (SWord8) (s1885 >> 24);-  const SWord8  s1887 = table0[s1886];-  const SWord8  s1888 = 54 ^ s1887;-  const SWord8  s1889 = (SWord8) (s1885 >> 16);-  const SWord8  s1890 = table0[s1889];-  const SWord16 s1891 = (((SWord16) s1888) << 8) | ((SWord16) s1890);-  const SWord8  s1892 = (SWord8) (s1885 >> 8);-  const SWord8  s1893 = table0[s1892];-  const SWord8  s1894 = (SWord8) s1885;-  const SWord8  s1895 = table0[s1894];-  const SWord16 s1896 = (((SWord16) s1893) << 8) | ((SWord16) s1895);-  const SWord32 s1897 = (((SWord32) s1891) << 16) | ((SWord32) s1896);-  const SWord32 s1898 = s1833 ^ s1897;-  const SWord32 s1899 = s1884 ^ s1898;-  const SWord8  s1900 = (SWord8) (s1849 >> 24);-  const SWord8  s1901 = table0[s1900];-  const SWord8  s1902 = (SWord8) (s1865 >> 16);-  const SWord8  s1903 = table0[s1902];-  const SWord16 s1904 = (((SWord16) s1901) << 8) | ((SWord16) s1903);-  const SWord8  s1905 = (SWord8) (s1880 >> 8);-  const SWord8  s1906 = table0[s1905];-  const SWord8  s1907 = (SWord8) s1834;-  const SWord8  s1908 = table0[s1907];-  const SWord16 s1909 = (((SWord16) s1906) << 8) | ((SWord16) s1908);-  const SWord32 s1910 = (((SWord32) s1904) << 16) | ((SWord32) s1909);-  const SWord32 s1911 = s1848 ^ s1898;-  const SWord32 s1912 = s1910 ^ s1911;-  const SWord8  s1913 = (SWord8) (s1865 >> 24);-  const SWord8  s1914 = table0[s1913];-  const SWord8  s1915 = (SWord8) (s1880 >> 16);-  const SWord8  s1916 = table0[s1915];-  const SWord16 s1917 = (((SWord16) s1914) << 8) | ((SWord16) s1916);-  const SWord8  s1918 = (SWord8) (s1834 >> 8);-  const SWord8  s1919 = table0[s1918];-  const SWord8  s1920 = (SWord8) s1849;-  const SWord8  s1921 = table0[s1920];-  const SWord16 s1922 = (((SWord16) s1919) << 8) | ((SWord16) s1921);-  const SWord32 s1923 = (((SWord32) s1917) << 16) | ((SWord32) s1922);-  const SWord32 s1924 = s1864 ^ s1911;-  const SWord32 s1925 = s1923 ^ s1924;-  const SWord8  s1926 = (SWord8) (s1880 >> 24);-  const SWord8  s1927 = table0[s1926];-  const SWord8  s1928 = (SWord8) (s1834 >> 16);-  const SWord8  s1929 = table0[s1928];-  const SWord16 s1930 = (((SWord16) s1927) << 8) | ((SWord16) s1929);-  const SWord8  s1931 = (SWord8) (s1849 >> 8);-  const SWord8  s1932 = table0[s1931];-  const SWord8  s1933 = (SWord8) s1865;-  const SWord8  s1934 = table0[s1933];-  const SWord16 s1935 = (((SWord16) s1932) << 8) | ((SWord16) s1934);-  const SWord32 s1936 = (((SWord32) s1930) << 16) | ((SWord32) s1935);-  const SWord32 s1937 = s1879 ^ s1924;-  const SWord32 s1938 = s1936 ^ s1937;--  ct[0] = s1899;-  ct[1] = s1912;-  ct[2] = s1925;-  ct[3] = s1938;+aes128Enc_driver.o: aes128Enc_driver.c aes128Enc.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128Enc_driver: aes128Enc.o aes128Enc_driver.o+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}++clean:+	rm -f *.o++veryclean: clean+	rm -f aes128Enc_driver+== END: "Makefile" ==================+== BEGIN: "aes128Enc.h" ================+/* Header file for aes128Enc. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_aes128Enc_HEADER_INCLUDED+#define SBV_GENERATED_aes128Enc_HEADER_INCLUDED+++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* Entry point prototype: */+void aes128Enc(const SWord32 *pt, const SWord32 *key, SWord32 *ct);++#endif /* SBV_GENERATED_aes128Enc_HEADER_INCLUDED */+== END: "aes128Enc.h" ==================+== BEGIN: "aes128Enc_driver.c" ================+/* Example driver program for aes128Enc. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "aes128Enc.h"++int main(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array pt:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  pt[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord32 sbv_driver_input_1[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array key:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 4 ; ++sbv_driver_input_1_ctr)+  { printf("  key[%1d] = ", sbv_driver_input_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[4];++  aes128Enc(sbv_driver_input_0, sbv_driver_input_1,+            sbv_driver_output_0);++  printf("aes128Enc(pt, key, ct) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 4 ; ++sbv_driver_output_0_ctr)+  { printf("  ct[%1d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }++  return 0;+}+== END: "aes128Enc_driver.c" ==================+== BEGIN: "aes128Enc.c" ================+/* File: "aes128Enc.c". Automatically generated by SBV. Do not edit! */++#include "aes128Enc.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotl(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) << amount) | (((uint64_t) (SWord32) a) >> (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotr(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) >> amount) | (((uint64_t) (SWord32) a) << (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128Enc(const SWord32 *sbv_input_0,+               const SWord32 *sbv_input_1, SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s4 = sbv_input_1[0];+  const SWord32 s5 = sbv_input_1[1];+  const SWord32 s6 = sbv_input_1[2];+  const SWord32 s7 = sbv_input_1[3];+  const SWord32 s520 = s0 ^ s4;+  const SWord8  s521 = sbv_bv_extract_u32_31_24_u8(s520);+  const SWord32 s778 = s1 ^ s5;+  const SWord8  s779 = sbv_bv_extract_u32_23_16_u8(s778);+  const SWord32 s1037 = s2 ^ s6;+  const SWord8  s1038 = sbv_bv_extract_u32_15_8_u8(s1037);+  const SWord32 s1296 = s3 ^ s7;+  const SWord8  s1297 = sbv_bv_extract_u32_7_0_u8(s1296);+  const SWord32 s1300 = sbv_bv_u32_rotl(s7, 8);+  const SWord8  s1301 = sbv_bv_extract_u32_31_24_u8(s1300);+  const SWord8  s1304 = sbv_bv_extract_u32_23_16_u8(s1300);+  const SWord8  s1307 = sbv_bv_extract_u32_15_8_u8(s1300);+  const SWord8  s1309 = sbv_bv_extract_u32_7_0_u8(s1300);+  const SWord8  s1317 = sbv_bv_extract_u32_31_24_u8(s778);+  const SWord8  s1319 = sbv_bv_extract_u32_23_16_u8(s1037);+  const SWord8  s1322 = sbv_bv_extract_u32_15_8_u8(s1296);+  const SWord8  s1325 = sbv_bv_extract_u32_7_0_u8(s520);+  const SWord8  s1333 = sbv_bv_extract_u32_31_24_u8(s1037);+  const SWord8  s1335 = sbv_bv_extract_u32_23_16_u8(s1296);+  const SWord8  s1338 = sbv_bv_extract_u32_15_8_u8(s520);+  const SWord8  s1341 = sbv_bv_extract_u32_7_0_u8(s778);+  const SWord8  s1349 = sbv_bv_extract_u32_31_24_u8(s1296);+  const SWord8  s1351 = sbv_bv_extract_u32_23_16_u8(s520);+  const SWord8  s1354 = sbv_bv_extract_u32_15_8_u8(s778);+  const SWord8  s1357 = sbv_bv_extract_u32_7_0_u8(s1037);+        SWord32 s522;+        SWord32 s780;+        SWord32 s781;+        SWord32 s1039;+        SWord32 s1040;+        SWord32 s1298;+        SWord32 s1299;+        SWord8  s1302;+        SWord8  s1303;+        SWord8  s1305;+        SWord16 s1306;+        SWord8  s1308;+        SWord8  s1310;+        SWord16 s1311;+        SWord32 s1312;+        SWord32 s1313;+        SWord32 s1314;+        SWord8  s1315;+        SWord32 s1316;+        SWord32 s1318;+        SWord32 s1320;+        SWord32 s1321;+        SWord32 s1323;+        SWord32 s1324;+        SWord32 s1326;+        SWord32 s1327;+        SWord32 s1328;+        SWord32 s1329;+        SWord8  s1330;+        SWord32 s1331;+        SWord32 s1332;+        SWord32 s1334;+        SWord32 s1336;+        SWord32 s1337;+        SWord32 s1339;+        SWord32 s1340;+        SWord32 s1342;+        SWord32 s1343;+        SWord32 s1344;+        SWord32 s1345;+        SWord8  s1346;+        SWord32 s1347;+        SWord32 s1348;+        SWord32 s1350;+        SWord32 s1352;+        SWord32 s1353;+        SWord32 s1355;+        SWord32 s1356;+        SWord32 s1358;+        SWord32 s1359;+        SWord32 s1360;+        SWord32 s1361;+        SWord8  s1362;+        SWord32 s1363;+        SWord32 s1364;+        SWord32 s1365;+        SWord8  s1366;+        SWord8  s1367;+        SWord8  s1368;+        SWord8  s1369;+        SWord8  s1370;+        SWord16 s1371;+        SWord8  s1372;+        SWord8  s1373;+        SWord8  s1374;+        SWord8  s1375;+        SWord16 s1376;+        SWord32 s1377;+        SWord32 s1378;+        SWord32 s1379;+        SWord8  s1380;+        SWord32 s1381;+        SWord8  s1382;+        SWord32 s1383;+        SWord8  s1384;+        SWord32 s1385;+        SWord32 s1386;+        SWord8  s1387;+        SWord32 s1388;+        SWord32 s1389;+        SWord8  s1390;+        SWord32 s1391;+        SWord32 s1392;+        SWord32 s1393;+        SWord32 s1394;+        SWord8  s1395;+        SWord32 s1396;+        SWord32 s1397;+        SWord8  s1398;+        SWord32 s1399;+        SWord8  s1400;+        SWord32 s1401;+        SWord32 s1402;+        SWord8  s1403;+        SWord32 s1404;+        SWord32 s1405;+        SWord8  s1406;+        SWord32 s1407;+        SWord32 s1408;+        SWord32 s1409;+        SWord32 s1410;+        SWord8  s1411;+        SWord32 s1412;+        SWord32 s1413;+        SWord8  s1414;+        SWord32 s1415;+        SWord8  s1416;+        SWord32 s1417;+        SWord32 s1418;+        SWord8  s1419;+        SWord32 s1420;+        SWord32 s1421;+        SWord8  s1422;+        SWord32 s1423;+        SWord32 s1424;+        SWord32 s1425;+        SWord32 s1426;+        SWord8  s1427;+        SWord32 s1428;+        SWord32 s1429;+        SWord32 s1430;+        SWord8  s1431;+        SWord8  s1432;+        SWord8  s1433;+        SWord8  s1434;+        SWord8  s1435;+        SWord16 s1436;+        SWord8  s1437;+        SWord8  s1438;+        SWord8  s1439;+        SWord8  s1440;+        SWord16 s1441;+        SWord32 s1442;+        SWord32 s1443;+        SWord32 s1444;+        SWord8  s1445;+        SWord32 s1446;+        SWord8  s1447;+        SWord32 s1448;+        SWord8  s1449;+        SWord32 s1450;+        SWord32 s1451;+        SWord8  s1452;+        SWord32 s1453;+        SWord32 s1454;+        SWord8  s1455;+        SWord32 s1456;+        SWord32 s1457;+        SWord32 s1458;+        SWord32 s1459;+        SWord8  s1460;+        SWord32 s1461;+        SWord32 s1462;+        SWord8  s1463;+        SWord32 s1464;+        SWord8  s1465;+        SWord32 s1466;+        SWord32 s1467;+        SWord8  s1468;+        SWord32 s1469;+        SWord32 s1470;+        SWord8  s1471;+        SWord32 s1472;+        SWord32 s1473;+        SWord32 s1474;+        SWord32 s1475;+        SWord8  s1476;+        SWord32 s1477;+        SWord32 s1478;+        SWord8  s1479;+        SWord32 s1480;+        SWord8  s1481;+        SWord32 s1482;+        SWord32 s1483;+        SWord8  s1484;+        SWord32 s1485;+        SWord32 s1486;+        SWord8  s1487;+        SWord32 s1488;+        SWord32 s1489;+        SWord32 s1490;+        SWord32 s1491;+        SWord8  s1492;+        SWord32 s1493;+        SWord32 s1494;+        SWord32 s1495;+        SWord8  s1496;+        SWord8  s1497;+        SWord8  s1498;+        SWord8  s1499;+        SWord8  s1500;+        SWord16 s1501;+        SWord8  s1502;+        SWord8  s1503;+        SWord8  s1504;+        SWord8  s1505;+        SWord16 s1506;+        SWord32 s1507;+        SWord32 s1508;+        SWord32 s1509;+        SWord8  s1510;+        SWord32 s1511;+        SWord8  s1512;+        SWord32 s1513;+        SWord8  s1514;+        SWord32 s1515;+        SWord32 s1516;+        SWord8  s1517;+        SWord32 s1518;+        SWord32 s1519;+        SWord8  s1520;+        SWord32 s1521;+        SWord32 s1522;+        SWord32 s1523;+        SWord32 s1524;+        SWord8  s1525;+        SWord32 s1526;+        SWord32 s1527;+        SWord8  s1528;+        SWord32 s1529;+        SWord8  s1530;+        SWord32 s1531;+        SWord32 s1532;+        SWord8  s1533;+        SWord32 s1534;+        SWord32 s1535;+        SWord8  s1536;+        SWord32 s1537;+        SWord32 s1538;+        SWord32 s1539;+        SWord32 s1540;+        SWord8  s1541;+        SWord32 s1542;+        SWord32 s1543;+        SWord8  s1544;+        SWord32 s1545;+        SWord8  s1546;+        SWord32 s1547;+        SWord32 s1548;+        SWord8  s1549;+        SWord32 s1550;+        SWord32 s1551;+        SWord8  s1552;+        SWord32 s1553;+        SWord32 s1554;+        SWord32 s1555;+        SWord32 s1556;+        SWord8  s1557;+        SWord32 s1558;+        SWord32 s1559;+        SWord32 s1560;+        SWord8  s1561;+        SWord8  s1562;+        SWord8  s1563;+        SWord8  s1564;+        SWord8  s1565;+        SWord16 s1566;+        SWord8  s1567;+        SWord8  s1568;+        SWord8  s1569;+        SWord8  s1570;+        SWord16 s1571;+        SWord32 s1572;+        SWord32 s1573;+        SWord32 s1574;+        SWord8  s1575;+        SWord32 s1576;+        SWord8  s1577;+        SWord32 s1578;+        SWord8  s1579;+        SWord32 s1580;+        SWord32 s1581;+        SWord8  s1582;+        SWord32 s1583;+        SWord32 s1584;+        SWord8  s1585;+        SWord32 s1586;+        SWord32 s1587;+        SWord32 s1588;+        SWord32 s1589;+        SWord8  s1590;+        SWord32 s1591;+        SWord32 s1592;+        SWord8  s1593;+        SWord32 s1594;+        SWord8  s1595;+        SWord32 s1596;+        SWord32 s1597;+        SWord8  s1598;+        SWord32 s1599;+        SWord32 s1600;+        SWord8  s1601;+        SWord32 s1602;+        SWord32 s1603;+        SWord32 s1604;+        SWord32 s1605;+        SWord8  s1606;+        SWord32 s1607;+        SWord32 s1608;+        SWord8  s1609;+        SWord32 s1610;+        SWord8  s1611;+        SWord32 s1612;+        SWord32 s1613;+        SWord8  s1614;+        SWord32 s1615;+        SWord32 s1616;+        SWord8  s1617;+        SWord32 s1618;+        SWord32 s1619;+        SWord32 s1620;+        SWord32 s1621;+        SWord8  s1622;+        SWord32 s1623;+        SWord32 s1624;+        SWord32 s1625;+        SWord8  s1626;+        SWord8  s1627;+        SWord8  s1628;+        SWord8  s1629;+        SWord8  s1630;+        SWord16 s1631;+        SWord8  s1632;+        SWord8  s1633;+        SWord8  s1634;+        SWord8  s1635;+        SWord16 s1636;+        SWord32 s1637;+        SWord32 s1638;+        SWord32 s1639;+        SWord8  s1640;+        SWord32 s1641;+        SWord8  s1642;+        SWord32 s1643;+        SWord8  s1644;+        SWord32 s1645;+        SWord32 s1646;+        SWord8  s1647;+        SWord32 s1648;+        SWord32 s1649;+        SWord8  s1650;+        SWord32 s1651;+        SWord32 s1652;+        SWord32 s1653;+        SWord32 s1654;+        SWord8  s1655;+        SWord32 s1656;+        SWord32 s1657;+        SWord8  s1658;+        SWord32 s1659;+        SWord8  s1660;+        SWord32 s1661;+        SWord32 s1662;+        SWord8  s1663;+        SWord32 s1664;+        SWord32 s1665;+        SWord8  s1666;+        SWord32 s1667;+        SWord32 s1668;+        SWord32 s1669;+        SWord32 s1670;+        SWord8  s1671;+        SWord32 s1672;+        SWord32 s1673;+        SWord8  s1674;+        SWord32 s1675;+        SWord8  s1676;+        SWord32 s1677;+        SWord32 s1678;+        SWord8  s1679;+        SWord32 s1680;+        SWord32 s1681;+        SWord8  s1682;+        SWord32 s1683;+        SWord32 s1684;+        SWord32 s1685;+        SWord32 s1686;+        SWord8  s1687;+        SWord32 s1688;+        SWord32 s1689;+        SWord32 s1690;+        SWord8  s1691;+        SWord8  s1692;+        SWord8  s1693;+        SWord8  s1694;+        SWord8  s1695;+        SWord16 s1696;+        SWord8  s1697;+        SWord8  s1698;+        SWord8  s1699;+        SWord8  s1700;+        SWord16 s1701;+        SWord32 s1702;+        SWord32 s1703;+        SWord32 s1704;+        SWord8  s1705;+        SWord32 s1706;+        SWord8  s1707;+        SWord32 s1708;+        SWord8  s1709;+        SWord32 s1710;+        SWord32 s1711;+        SWord8  s1712;+        SWord32 s1713;+        SWord32 s1714;+        SWord8  s1715;+        SWord32 s1716;+        SWord32 s1717;+        SWord32 s1718;+        SWord32 s1719;+        SWord8  s1720;+        SWord32 s1721;+        SWord32 s1722;+        SWord8  s1723;+        SWord32 s1724;+        SWord8  s1725;+        SWord32 s1726;+        SWord32 s1727;+        SWord8  s1728;+        SWord32 s1729;+        SWord32 s1730;+        SWord8  s1731;+        SWord32 s1732;+        SWord32 s1733;+        SWord32 s1734;+        SWord32 s1735;+        SWord8  s1736;+        SWord32 s1737;+        SWord32 s1738;+        SWord8  s1739;+        SWord32 s1740;+        SWord8  s1741;+        SWord32 s1742;+        SWord32 s1743;+        SWord8  s1744;+        SWord32 s1745;+        SWord32 s1746;+        SWord8  s1747;+        SWord32 s1748;+        SWord32 s1749;+        SWord32 s1750;+        SWord32 s1751;+        SWord8  s1752;+        SWord32 s1753;+        SWord32 s1754;+        SWord32 s1755;+        SWord8  s1756;+        SWord8  s1757;+        SWord8  s1758;+        SWord8  s1759;+        SWord8  s1760;+        SWord16 s1761;+        SWord8  s1762;+        SWord8  s1763;+        SWord8  s1764;+        SWord8  s1765;+        SWord16 s1766;+        SWord32 s1767;+        SWord32 s1768;+        SWord32 s1769;+        SWord8  s1770;+        SWord32 s1771;+        SWord8  s1772;+        SWord32 s1773;+        SWord8  s1774;+        SWord32 s1775;+        SWord32 s1776;+        SWord8  s1777;+        SWord32 s1778;+        SWord32 s1779;+        SWord8  s1780;+        SWord32 s1781;+        SWord32 s1782;+        SWord32 s1783;+        SWord32 s1784;+        SWord8  s1785;+        SWord32 s1786;+        SWord32 s1787;+        SWord8  s1788;+        SWord32 s1789;+        SWord8  s1790;+        SWord32 s1791;+        SWord32 s1792;+        SWord8  s1793;+        SWord32 s1794;+        SWord32 s1795;+        SWord8  s1796;+        SWord32 s1797;+        SWord32 s1798;+        SWord32 s1799;+        SWord32 s1800;+        SWord8  s1801;+        SWord32 s1802;+        SWord32 s1803;+        SWord8  s1804;+        SWord32 s1805;+        SWord8  s1806;+        SWord32 s1807;+        SWord32 s1808;+        SWord8  s1809;+        SWord32 s1810;+        SWord32 s1811;+        SWord8  s1812;+        SWord32 s1813;+        SWord32 s1814;+        SWord32 s1815;+        SWord32 s1816;+        SWord8  s1817;+        SWord32 s1818;+        SWord32 s1819;+        SWord32 s1820;+        SWord8  s1821;+        SWord8  s1822;+        SWord8  s1823;+        SWord8  s1824;+        SWord8  s1825;+        SWord16 s1826;+        SWord8  s1827;+        SWord8  s1828;+        SWord8  s1829;+        SWord8  s1830;+        SWord16 s1831;+        SWord32 s1832;+        SWord32 s1833;+        SWord32 s1834;+        SWord8  s1835;+        SWord8  s1836;+        SWord8  s1837;+        SWord32 s1838;+        SWord8  s1839;+        SWord32 s1840;+        SWord32 s1841;+        SWord8  s1842;+        SWord32 s1843;+        SWord32 s1844;+        SWord8  s1845;+        SWord32 s1846;+        SWord32 s1847;+        SWord32 s1848;+        SWord32 s1849;+        SWord8  s1850;+        SWord8  s1851;+        SWord16 s1852;+        SWord8  s1853;+        SWord32 s1854;+        SWord8  s1855;+        SWord32 s1856;+        SWord32 s1857;+        SWord8  s1858;+        SWord32 s1859;+        SWord32 s1860;+        SWord8  s1861;+        SWord32 s1862;+        SWord32 s1863;+        SWord32 s1864;+        SWord32 s1865;+        SWord8  s1866;+        SWord8  s1867;+        SWord8  s1868;+        SWord32 s1869;+        SWord8  s1870;+        SWord32 s1871;+        SWord32 s1872;+        SWord8  s1873;+        SWord32 s1874;+        SWord32 s1875;+        SWord8  s1876;+        SWord32 s1877;+        SWord32 s1878;+        SWord32 s1879;+        SWord32 s1880;+        SWord8  s1881;+        SWord8  s1882;+        SWord16 s1883;+        SWord32 s1884;+        SWord32 s1885;+        SWord8  s1886;+        SWord8  s1887;+        SWord8  s1888;+        SWord8  s1889;+        SWord8  s1890;+        SWord16 s1891;+        SWord8  s1892;+        SWord8  s1893;+        SWord8  s1894;+        SWord8  s1895;+        SWord16 s1896;+        SWord32 s1897;+        SWord32 s1898;+        SWord32 s1899;+        SWord8  s1900;+        SWord8  s1901;+        SWord8  s1902;+        SWord8  s1903;+        SWord16 s1904;+        SWord8  s1905;+        SWord8  s1906;+        SWord8  s1907;+        SWord8  s1908;+        SWord16 s1909;+        SWord32 s1910;+        SWord32 s1911;+        SWord32 s1912;+        SWord8  s1913;+        SWord8  s1914;+        SWord8  s1915;+        SWord8  s1916;+        SWord16 s1917;+        SWord8  s1918;+        SWord8  s1919;+        SWord8  s1920;+        SWord8  s1921;+        SWord16 s1922;+        SWord32 s1923;+        SWord32 s1924;+        SWord32 s1925;+        SWord8  s1926;+        SWord8  s1927;+        SWord8  s1928;+        SWord8  s1929;+        SWord16 s1930;+        SWord8  s1931;+        SWord8  s1932;+        SWord8  s1933;+        SWord8  s1934;+        SWord16 s1935;+        SWord32 s1936;+        SWord32 s1937;+        SWord32 s1938;+  static const SWord32 table1[] = {+      0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,+      0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,+      0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,+      0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,+      0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,+      0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,+      0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,+      0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,+      0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,+      0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,+      0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,+      0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,+      0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,+      0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,+      0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,+      0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,+      0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,+      0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,+      0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,+      0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,+      0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,+      0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,+      0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,+      0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,+      0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,+      0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,+      0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,+      0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,+      0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,+      0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,+      0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,+      0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,+      0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,+      0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,+      0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,+      0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,+      0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,+      0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,+      0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,+      0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,+      0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,+      0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,+      0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,+      0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,+      0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,+      0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,+      0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,+      0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,+      0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,+      0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,+      0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,+      0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,+      0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,+      0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,+      0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,+      0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,+      0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,+      0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,+      0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,+      0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,+      0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,+      0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,+      0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,+      0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL+  };+  s522 = table1[s521];+  static const SWord32 table2[] = {+      0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,+      0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,+      0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,+      0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,+      0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,+      0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,+      0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,+      0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,+      0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,+      0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,+      0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,+      0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,+      0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,+      0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,+      0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,+      0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,+      0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,+      0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,+      0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,+      0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,+      0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,+      0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,+      0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,+      0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,+      0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,+      0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,+      0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,+      0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,+      0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,+      0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,+      0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,+      0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,+      0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,+      0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,+      0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,+      0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,+      0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,+      0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,+      0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,+      0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,+      0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,+      0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,+      0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,+      0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,+      0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,+      0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,+      0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,+      0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,+      0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,+      0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,+      0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,+      0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,+      0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,+      0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,+      0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,+      0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,+      0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,+      0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,+      0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,+      0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,+      0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,+      0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,+      0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,+      0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL+  };+  s780 = table2[s779];+  s781 = s522 ^ s780;+  static const SWord32 table3[] = {+      0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,+      0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,+      0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,+      0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,+      0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,+      0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,+      0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,+      0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,+      0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,+      0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,+      0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,+      0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,+      0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,+      0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,+      0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,+      0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,+      0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,+      0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,+      0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,+      0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,+      0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,+      0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,+      0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,+      0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,+      0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,+      0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,+      0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,+      0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,+      0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,+      0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,+      0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,+      0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,+      0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,+      0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,+      0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,+      0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,+      0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,+      0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,+      0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,+      0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,+      0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,+      0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,+      0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,+      0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,+      0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,+      0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,+      0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,+      0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,+      0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,+      0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,+      0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,+      0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,+      0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,+      0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,+      0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,+      0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,+      0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,+      0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,+      0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,+      0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,+      0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,+      0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,+      0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,+      0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL+  };+  s1039 = table3[s1038];+  s1040 = s781 ^ s1039;+  static const SWord32 table4[] = {+      0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,+      0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,+      0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,+      0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,+      0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,+      0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,+      0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,+      0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,+      0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,+      0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,+      0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,+      0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,+      0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,+      0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,+      0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,+      0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,+      0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,+      0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,+      0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,+      0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,+      0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,+      0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,+      0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,+      0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,+      0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,+      0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,+      0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,+      0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,+      0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,+      0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,+      0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,+      0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,+      0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,+      0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,+      0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,+      0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,+      0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,+      0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,+      0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,+      0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,+      0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,+      0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,+      0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,+      0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,+      0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,+      0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,+      0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,+      0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,+      0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,+      0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,+      0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,+      0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,+      0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,+      0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,+      0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,+      0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,+      0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,+      0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,+      0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,+      0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,+      0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,+      0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,+      0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,+      0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL+  };+  s1298 = table4[s1297];+  s1299 = s1040 ^ s1298;+  static const SWord8 table0[] = {+       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,+      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,+      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,+      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,+       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,+      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,+       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,+       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,+       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,+      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,+       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,+      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,+      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,+      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,+       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,+       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,+      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,+      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,+      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,+      104,  65, 153,  45,  15, 176,  84, 187,  22+  };+  s1302 = table0[s1301];+  s1303 = 1 ^ s1302;+  s1305 = table0[s1304];+  s1306 = sbv_bv_join_u8_u8_u16(s1303, s1305);+  s1308 = table0[s1307];+  s1310 = table0[s1309];+  s1311 = sbv_bv_join_u8_u8_u16(s1308, s1310);+  s1312 = sbv_bv_join_u16_u16_u32(s1306, s1311);+  s1313 = s4 ^ s1312;+  s1314 = s1299 ^ s1313;+  s1315 = sbv_bv_extract_u32_31_24_u8(s1314);+  s1316 = table1[s1315];+  s1318 = table1[s1317];+  s1320 = table2[s1319];+  s1321 = s1318 ^ s1320;+  s1323 = table3[s1322];+  s1324 = s1321 ^ s1323;+  s1326 = table4[s1325];+  s1327 = s1324 ^ s1326;+  s1328 = s5 ^ s1313;+  s1329 = s1327 ^ s1328;+  s1330 = sbv_bv_extract_u32_23_16_u8(s1329);+  s1331 = table2[s1330];+  s1332 = s1316 ^ s1331;+  s1334 = table1[s1333];+  s1336 = table2[s1335];+  s1337 = s1334 ^ s1336;+  s1339 = table3[s1338];+  s1340 = s1337 ^ s1339;+  s1342 = table4[s1341];+  s1343 = s1340 ^ s1342;+  s1344 = s6 ^ s1328;+  s1345 = s1343 ^ s1344;+  s1346 = sbv_bv_extract_u32_15_8_u8(s1345);+  s1347 = table3[s1346];+  s1348 = s1332 ^ s1347;+  s1350 = table1[s1349];+  s1352 = table2[s1351];+  s1353 = s1350 ^ s1352;+  s1355 = table3[s1354];+  s1356 = s1353 ^ s1355;+  s1358 = table4[s1357];+  s1359 = s1356 ^ s1358;+  s1360 = s7 ^ s1344;+  s1361 = s1359 ^ s1360;+  s1362 = sbv_bv_extract_u32_7_0_u8(s1361);+  s1363 = table4[s1362];+  s1364 = s1348 ^ s1363;+  s1365 = sbv_bv_u32_rotl(s1360, 8);+  s1366 = sbv_bv_extract_u32_31_24_u8(s1365);+  s1367 = table0[s1366];+  s1368 = 2 ^ s1367;+  s1369 = sbv_bv_extract_u32_23_16_u8(s1365);+  s1370 = table0[s1369];+  s1371 = sbv_bv_join_u8_u8_u16(s1368, s1370);+  s1372 = sbv_bv_extract_u32_15_8_u8(s1365);+  s1373 = table0[s1372];+  s1374 = sbv_bv_extract_u32_7_0_u8(s1365);+  s1375 = table0[s1374];+  s1376 = sbv_bv_join_u8_u8_u16(s1373, s1375);+  s1377 = sbv_bv_join_u16_u16_u32(s1371, s1376);+  s1378 = s1313 ^ s1377;+  s1379 = s1364 ^ s1378;+  s1380 = sbv_bv_extract_u32_31_24_u8(s1379);+  s1381 = table1[s1380];+  s1382 = sbv_bv_extract_u32_31_24_u8(s1329);+  s1383 = table1[s1382];+  s1384 = sbv_bv_extract_u32_23_16_u8(s1345);+  s1385 = table2[s1384];+  s1386 = s1383 ^ s1385;+  s1387 = sbv_bv_extract_u32_15_8_u8(s1361);+  s1388 = table3[s1387];+  s1389 = s1386 ^ s1388;+  s1390 = sbv_bv_extract_u32_7_0_u8(s1314);+  s1391 = table4[s1390];+  s1392 = s1389 ^ s1391;+  s1393 = s1328 ^ s1378;+  s1394 = s1392 ^ s1393;+  s1395 = sbv_bv_extract_u32_23_16_u8(s1394);+  s1396 = table2[s1395];+  s1397 = s1381 ^ s1396;+  s1398 = sbv_bv_extract_u32_31_24_u8(s1345);+  s1399 = table1[s1398];+  s1400 = sbv_bv_extract_u32_23_16_u8(s1361);+  s1401 = table2[s1400];+  s1402 = s1399 ^ s1401;+  s1403 = sbv_bv_extract_u32_15_8_u8(s1314);+  s1404 = table3[s1403];+  s1405 = s1402 ^ s1404;+  s1406 = sbv_bv_extract_u32_7_0_u8(s1329);+  s1407 = table4[s1406];+  s1408 = s1405 ^ s1407;+  s1409 = s1344 ^ s1393;+  s1410 = s1408 ^ s1409;+  s1411 = sbv_bv_extract_u32_15_8_u8(s1410);+  s1412 = table3[s1411];+  s1413 = s1397 ^ s1412;+  s1414 = sbv_bv_extract_u32_31_24_u8(s1361);+  s1415 = table1[s1414];+  s1416 = sbv_bv_extract_u32_23_16_u8(s1314);+  s1417 = table2[s1416];+  s1418 = s1415 ^ s1417;+  s1419 = sbv_bv_extract_u32_15_8_u8(s1329);+  s1420 = table3[s1419];+  s1421 = s1418 ^ s1420;+  s1422 = sbv_bv_extract_u32_7_0_u8(s1345);+  s1423 = table4[s1422];+  s1424 = s1421 ^ s1423;+  s1425 = s1360 ^ s1409;+  s1426 = s1424 ^ s1425;+  s1427 = sbv_bv_extract_u32_7_0_u8(s1426);+  s1428 = table4[s1427];+  s1429 = s1413 ^ s1428;+  s1430 = sbv_bv_u32_rotl(s1425, 8);+  s1431 = sbv_bv_extract_u32_31_24_u8(s1430);+  s1432 = table0[s1431];+  s1433 = 4 ^ s1432;+  s1434 = sbv_bv_extract_u32_23_16_u8(s1430);+  s1435 = table0[s1434];+  s1436 = sbv_bv_join_u8_u8_u16(s1433, s1435);+  s1437 = sbv_bv_extract_u32_15_8_u8(s1430);+  s1438 = table0[s1437];+  s1439 = sbv_bv_extract_u32_7_0_u8(s1430);+  s1440 = table0[s1439];+  s1441 = sbv_bv_join_u8_u8_u16(s1438, s1440);+  s1442 = sbv_bv_join_u16_u16_u32(s1436, s1441);+  s1443 = s1378 ^ s1442;+  s1444 = s1429 ^ s1443;+  s1445 = sbv_bv_extract_u32_31_24_u8(s1444);+  s1446 = table1[s1445];+  s1447 = sbv_bv_extract_u32_31_24_u8(s1394);+  s1448 = table1[s1447];+  s1449 = sbv_bv_extract_u32_23_16_u8(s1410);+  s1450 = table2[s1449];+  s1451 = s1448 ^ s1450;+  s1452 = sbv_bv_extract_u32_15_8_u8(s1426);+  s1453 = table3[s1452];+  s1454 = s1451 ^ s1453;+  s1455 = sbv_bv_extract_u32_7_0_u8(s1379);+  s1456 = table4[s1455];+  s1457 = s1454 ^ s1456;+  s1458 = s1393 ^ s1443;+  s1459 = s1457 ^ s1458;+  s1460 = sbv_bv_extract_u32_23_16_u8(s1459);+  s1461 = table2[s1460];+  s1462 = s1446 ^ s1461;+  s1463 = sbv_bv_extract_u32_31_24_u8(s1410);+  s1464 = table1[s1463];+  s1465 = sbv_bv_extract_u32_23_16_u8(s1426);+  s1466 = table2[s1465];+  s1467 = s1464 ^ s1466;+  s1468 = sbv_bv_extract_u32_15_8_u8(s1379);+  s1469 = table3[s1468];+  s1470 = s1467 ^ s1469;+  s1471 = sbv_bv_extract_u32_7_0_u8(s1394);+  s1472 = table4[s1471];+  s1473 = s1470 ^ s1472;+  s1474 = s1409 ^ s1458;+  s1475 = s1473 ^ s1474;+  s1476 = sbv_bv_extract_u32_15_8_u8(s1475);+  s1477 = table3[s1476];+  s1478 = s1462 ^ s1477;+  s1479 = sbv_bv_extract_u32_31_24_u8(s1426);+  s1480 = table1[s1479];+  s1481 = sbv_bv_extract_u32_23_16_u8(s1379);+  s1482 = table2[s1481];+  s1483 = s1480 ^ s1482;+  s1484 = sbv_bv_extract_u32_15_8_u8(s1394);+  s1485 = table3[s1484];+  s1486 = s1483 ^ s1485;+  s1487 = sbv_bv_extract_u32_7_0_u8(s1410);+  s1488 = table4[s1487];+  s1489 = s1486 ^ s1488;+  s1490 = s1425 ^ s1474;+  s1491 = s1489 ^ s1490;+  s1492 = sbv_bv_extract_u32_7_0_u8(s1491);+  s1493 = table4[s1492];+  s1494 = s1478 ^ s1493;+  s1495 = sbv_bv_u32_rotl(s1490, 8);+  s1496 = sbv_bv_extract_u32_31_24_u8(s1495);+  s1497 = table0[s1496];+  s1498 = 8 ^ s1497;+  s1499 = sbv_bv_extract_u32_23_16_u8(s1495);+  s1500 = table0[s1499];+  s1501 = sbv_bv_join_u8_u8_u16(s1498, s1500);+  s1502 = sbv_bv_extract_u32_15_8_u8(s1495);+  s1503 = table0[s1502];+  s1504 = sbv_bv_extract_u32_7_0_u8(s1495);+  s1505 = table0[s1504];+  s1506 = sbv_bv_join_u8_u8_u16(s1503, s1505);+  s1507 = sbv_bv_join_u16_u16_u32(s1501, s1506);+  s1508 = s1443 ^ s1507;+  s1509 = s1494 ^ s1508;+  s1510 = sbv_bv_extract_u32_31_24_u8(s1509);+  s1511 = table1[s1510];+  s1512 = sbv_bv_extract_u32_31_24_u8(s1459);+  s1513 = table1[s1512];+  s1514 = sbv_bv_extract_u32_23_16_u8(s1475);+  s1515 = table2[s1514];+  s1516 = s1513 ^ s1515;+  s1517 = sbv_bv_extract_u32_15_8_u8(s1491);+  s1518 = table3[s1517];+  s1519 = s1516 ^ s1518;+  s1520 = sbv_bv_extract_u32_7_0_u8(s1444);+  s1521 = table4[s1520];+  s1522 = s1519 ^ s1521;+  s1523 = s1458 ^ s1508;+  s1524 = s1522 ^ s1523;+  s1525 = sbv_bv_extract_u32_23_16_u8(s1524);+  s1526 = table2[s1525];+  s1527 = s1511 ^ s1526;+  s1528 = sbv_bv_extract_u32_31_24_u8(s1475);+  s1529 = table1[s1528];+  s1530 = sbv_bv_extract_u32_23_16_u8(s1491);+  s1531 = table2[s1530];+  s1532 = s1529 ^ s1531;+  s1533 = sbv_bv_extract_u32_15_8_u8(s1444);+  s1534 = table3[s1533];+  s1535 = s1532 ^ s1534;+  s1536 = sbv_bv_extract_u32_7_0_u8(s1459);+  s1537 = table4[s1536];+  s1538 = s1535 ^ s1537;+  s1539 = s1474 ^ s1523;+  s1540 = s1538 ^ s1539;+  s1541 = sbv_bv_extract_u32_15_8_u8(s1540);+  s1542 = table3[s1541];+  s1543 = s1527 ^ s1542;+  s1544 = sbv_bv_extract_u32_31_24_u8(s1491);+  s1545 = table1[s1544];+  s1546 = sbv_bv_extract_u32_23_16_u8(s1444);+  s1547 = table2[s1546];+  s1548 = s1545 ^ s1547;+  s1549 = sbv_bv_extract_u32_15_8_u8(s1459);+  s1550 = table3[s1549];+  s1551 = s1548 ^ s1550;+  s1552 = sbv_bv_extract_u32_7_0_u8(s1475);+  s1553 = table4[s1552];+  s1554 = s1551 ^ s1553;+  s1555 = s1490 ^ s1539;+  s1556 = s1554 ^ s1555;+  s1557 = sbv_bv_extract_u32_7_0_u8(s1556);+  s1558 = table4[s1557];+  s1559 = s1543 ^ s1558;+  s1560 = sbv_bv_u32_rotl(s1555, 8);+  s1561 = sbv_bv_extract_u32_31_24_u8(s1560);+  s1562 = table0[s1561];+  s1563 = 16 ^ s1562;+  s1564 = sbv_bv_extract_u32_23_16_u8(s1560);+  s1565 = table0[s1564];+  s1566 = sbv_bv_join_u8_u8_u16(s1563, s1565);+  s1567 = sbv_bv_extract_u32_15_8_u8(s1560);+  s1568 = table0[s1567];+  s1569 = sbv_bv_extract_u32_7_0_u8(s1560);+  s1570 = table0[s1569];+  s1571 = sbv_bv_join_u8_u8_u16(s1568, s1570);+  s1572 = sbv_bv_join_u16_u16_u32(s1566, s1571);+  s1573 = s1508 ^ s1572;+  s1574 = s1559 ^ s1573;+  s1575 = sbv_bv_extract_u32_31_24_u8(s1574);+  s1576 = table1[s1575];+  s1577 = sbv_bv_extract_u32_31_24_u8(s1524);+  s1578 = table1[s1577];+  s1579 = sbv_bv_extract_u32_23_16_u8(s1540);+  s1580 = table2[s1579];+  s1581 = s1578 ^ s1580;+  s1582 = sbv_bv_extract_u32_15_8_u8(s1556);+  s1583 = table3[s1582];+  s1584 = s1581 ^ s1583;+  s1585 = sbv_bv_extract_u32_7_0_u8(s1509);+  s1586 = table4[s1585];+  s1587 = s1584 ^ s1586;+  s1588 = s1523 ^ s1573;+  s1589 = s1587 ^ s1588;+  s1590 = sbv_bv_extract_u32_23_16_u8(s1589);+  s1591 = table2[s1590];+  s1592 = s1576 ^ s1591;+  s1593 = sbv_bv_extract_u32_31_24_u8(s1540);+  s1594 = table1[s1593];+  s1595 = sbv_bv_extract_u32_23_16_u8(s1556);+  s1596 = table2[s1595];+  s1597 = s1594 ^ s1596;+  s1598 = sbv_bv_extract_u32_15_8_u8(s1509);+  s1599 = table3[s1598];+  s1600 = s1597 ^ s1599;+  s1601 = sbv_bv_extract_u32_7_0_u8(s1524);+  s1602 = table4[s1601];+  s1603 = s1600 ^ s1602;+  s1604 = s1539 ^ s1588;+  s1605 = s1603 ^ s1604;+  s1606 = sbv_bv_extract_u32_15_8_u8(s1605);+  s1607 = table3[s1606];+  s1608 = s1592 ^ s1607;+  s1609 = sbv_bv_extract_u32_31_24_u8(s1556);+  s1610 = table1[s1609];+  s1611 = sbv_bv_extract_u32_23_16_u8(s1509);+  s1612 = table2[s1611];+  s1613 = s1610 ^ s1612;+  s1614 = sbv_bv_extract_u32_15_8_u8(s1524);+  s1615 = table3[s1614];+  s1616 = s1613 ^ s1615;+  s1617 = sbv_bv_extract_u32_7_0_u8(s1540);+  s1618 = table4[s1617];+  s1619 = s1616 ^ s1618;+  s1620 = s1555 ^ s1604;+  s1621 = s1619 ^ s1620;+  s1622 = sbv_bv_extract_u32_7_0_u8(s1621);+  s1623 = table4[s1622];+  s1624 = s1608 ^ s1623;+  s1625 = sbv_bv_u32_rotl(s1620, 8);+  s1626 = sbv_bv_extract_u32_31_24_u8(s1625);+  s1627 = table0[s1626];+  s1628 = 32 ^ s1627;+  s1629 = sbv_bv_extract_u32_23_16_u8(s1625);+  s1630 = table0[s1629];+  s1631 = sbv_bv_join_u8_u8_u16(s1628, s1630);+  s1632 = sbv_bv_extract_u32_15_8_u8(s1625);+  s1633 = table0[s1632];+  s1634 = sbv_bv_extract_u32_7_0_u8(s1625);+  s1635 = table0[s1634];+  s1636 = sbv_bv_join_u8_u8_u16(s1633, s1635);+  s1637 = sbv_bv_join_u16_u16_u32(s1631, s1636);+  s1638 = s1573 ^ s1637;+  s1639 = s1624 ^ s1638;+  s1640 = sbv_bv_extract_u32_31_24_u8(s1639);+  s1641 = table1[s1640];+  s1642 = sbv_bv_extract_u32_31_24_u8(s1589);+  s1643 = table1[s1642];+  s1644 = sbv_bv_extract_u32_23_16_u8(s1605);+  s1645 = table2[s1644];+  s1646 = s1643 ^ s1645;+  s1647 = sbv_bv_extract_u32_15_8_u8(s1621);+  s1648 = table3[s1647];+  s1649 = s1646 ^ s1648;+  s1650 = sbv_bv_extract_u32_7_0_u8(s1574);+  s1651 = table4[s1650];+  s1652 = s1649 ^ s1651;+  s1653 = s1588 ^ s1638;+  s1654 = s1652 ^ s1653;+  s1655 = sbv_bv_extract_u32_23_16_u8(s1654);+  s1656 = table2[s1655];+  s1657 = s1641 ^ s1656;+  s1658 = sbv_bv_extract_u32_31_24_u8(s1605);+  s1659 = table1[s1658];+  s1660 = sbv_bv_extract_u32_23_16_u8(s1621);+  s1661 = table2[s1660];+  s1662 = s1659 ^ s1661;+  s1663 = sbv_bv_extract_u32_15_8_u8(s1574);+  s1664 = table3[s1663];+  s1665 = s1662 ^ s1664;+  s1666 = sbv_bv_extract_u32_7_0_u8(s1589);+  s1667 = table4[s1666];+  s1668 = s1665 ^ s1667;+  s1669 = s1604 ^ s1653;+  s1670 = s1668 ^ s1669;+  s1671 = sbv_bv_extract_u32_15_8_u8(s1670);+  s1672 = table3[s1671];+  s1673 = s1657 ^ s1672;+  s1674 = sbv_bv_extract_u32_31_24_u8(s1621);+  s1675 = table1[s1674];+  s1676 = sbv_bv_extract_u32_23_16_u8(s1574);+  s1677 = table2[s1676];+  s1678 = s1675 ^ s1677;+  s1679 = sbv_bv_extract_u32_15_8_u8(s1589);+  s1680 = table3[s1679];+  s1681 = s1678 ^ s1680;+  s1682 = sbv_bv_extract_u32_7_0_u8(s1605);+  s1683 = table4[s1682];+  s1684 = s1681 ^ s1683;+  s1685 = s1620 ^ s1669;+  s1686 = s1684 ^ s1685;+  s1687 = sbv_bv_extract_u32_7_0_u8(s1686);+  s1688 = table4[s1687];+  s1689 = s1673 ^ s1688;+  s1690 = sbv_bv_u32_rotl(s1685, 8);+  s1691 = sbv_bv_extract_u32_31_24_u8(s1690);+  s1692 = table0[s1691];+  s1693 = 64 ^ s1692;+  s1694 = sbv_bv_extract_u32_23_16_u8(s1690);+  s1695 = table0[s1694];+  s1696 = sbv_bv_join_u8_u8_u16(s1693, s1695);+  s1697 = sbv_bv_extract_u32_15_8_u8(s1690);+  s1698 = table0[s1697];+  s1699 = sbv_bv_extract_u32_7_0_u8(s1690);+  s1700 = table0[s1699];+  s1701 = sbv_bv_join_u8_u8_u16(s1698, s1700);+  s1702 = sbv_bv_join_u16_u16_u32(s1696, s1701);+  s1703 = s1638 ^ s1702;+  s1704 = s1689 ^ s1703;+  s1705 = sbv_bv_extract_u32_31_24_u8(s1704);+  s1706 = table1[s1705];+  s1707 = sbv_bv_extract_u32_31_24_u8(s1654);+  s1708 = table1[s1707];+  s1709 = sbv_bv_extract_u32_23_16_u8(s1670);+  s1710 = table2[s1709];+  s1711 = s1708 ^ s1710;+  s1712 = sbv_bv_extract_u32_15_8_u8(s1686);+  s1713 = table3[s1712];+  s1714 = s1711 ^ s1713;+  s1715 = sbv_bv_extract_u32_7_0_u8(s1639);+  s1716 = table4[s1715];+  s1717 = s1714 ^ s1716;+  s1718 = s1653 ^ s1703;+  s1719 = s1717 ^ s1718;+  s1720 = sbv_bv_extract_u32_23_16_u8(s1719);+  s1721 = table2[s1720];+  s1722 = s1706 ^ s1721;+  s1723 = sbv_bv_extract_u32_31_24_u8(s1670);+  s1724 = table1[s1723];+  s1725 = sbv_bv_extract_u32_23_16_u8(s1686);+  s1726 = table2[s1725];+  s1727 = s1724 ^ s1726;+  s1728 = sbv_bv_extract_u32_15_8_u8(s1639);+  s1729 = table3[s1728];+  s1730 = s1727 ^ s1729;+  s1731 = sbv_bv_extract_u32_7_0_u8(s1654);+  s1732 = table4[s1731];+  s1733 = s1730 ^ s1732;+  s1734 = s1669 ^ s1718;+  s1735 = s1733 ^ s1734;+  s1736 = sbv_bv_extract_u32_15_8_u8(s1735);+  s1737 = table3[s1736];+  s1738 = s1722 ^ s1737;+  s1739 = sbv_bv_extract_u32_31_24_u8(s1686);+  s1740 = table1[s1739];+  s1741 = sbv_bv_extract_u32_23_16_u8(s1639);+  s1742 = table2[s1741];+  s1743 = s1740 ^ s1742;+  s1744 = sbv_bv_extract_u32_15_8_u8(s1654);+  s1745 = table3[s1744];+  s1746 = s1743 ^ s1745;+  s1747 = sbv_bv_extract_u32_7_0_u8(s1670);+  s1748 = table4[s1747];+  s1749 = s1746 ^ s1748;+  s1750 = s1685 ^ s1734;+  s1751 = s1749 ^ s1750;+  s1752 = sbv_bv_extract_u32_7_0_u8(s1751);+  s1753 = table4[s1752];+  s1754 = s1738 ^ s1753;+  s1755 = sbv_bv_u32_rotl(s1750, 8);+  s1756 = sbv_bv_extract_u32_31_24_u8(s1755);+  s1757 = table0[s1756];+  s1758 = 128 ^ s1757;+  s1759 = sbv_bv_extract_u32_23_16_u8(s1755);+  s1760 = table0[s1759];+  s1761 = sbv_bv_join_u8_u8_u16(s1758, s1760);+  s1762 = sbv_bv_extract_u32_15_8_u8(s1755);+  s1763 = table0[s1762];+  s1764 = sbv_bv_extract_u32_7_0_u8(s1755);+  s1765 = table0[s1764];+  s1766 = sbv_bv_join_u8_u8_u16(s1763, s1765);+  s1767 = sbv_bv_join_u16_u16_u32(s1761, s1766);+  s1768 = s1703 ^ s1767;+  s1769 = s1754 ^ s1768;+  s1770 = sbv_bv_extract_u32_31_24_u8(s1769);+  s1771 = table1[s1770];+  s1772 = sbv_bv_extract_u32_31_24_u8(s1719);+  s1773 = table1[s1772];+  s1774 = sbv_bv_extract_u32_23_16_u8(s1735);+  s1775 = table2[s1774];+  s1776 = s1773 ^ s1775;+  s1777 = sbv_bv_extract_u32_15_8_u8(s1751);+  s1778 = table3[s1777];+  s1779 = s1776 ^ s1778;+  s1780 = sbv_bv_extract_u32_7_0_u8(s1704);+  s1781 = table4[s1780];+  s1782 = s1779 ^ s1781;+  s1783 = s1718 ^ s1768;+  s1784 = s1782 ^ s1783;+  s1785 = sbv_bv_extract_u32_23_16_u8(s1784);+  s1786 = table2[s1785];+  s1787 = s1771 ^ s1786;+  s1788 = sbv_bv_extract_u32_31_24_u8(s1735);+  s1789 = table1[s1788];+  s1790 = sbv_bv_extract_u32_23_16_u8(s1751);+  s1791 = table2[s1790];+  s1792 = s1789 ^ s1791;+  s1793 = sbv_bv_extract_u32_15_8_u8(s1704);+  s1794 = table3[s1793];+  s1795 = s1792 ^ s1794;+  s1796 = sbv_bv_extract_u32_7_0_u8(s1719);+  s1797 = table4[s1796];+  s1798 = s1795 ^ s1797;+  s1799 = s1734 ^ s1783;+  s1800 = s1798 ^ s1799;+  s1801 = sbv_bv_extract_u32_15_8_u8(s1800);+  s1802 = table3[s1801];+  s1803 = s1787 ^ s1802;+  s1804 = sbv_bv_extract_u32_31_24_u8(s1751);+  s1805 = table1[s1804];+  s1806 = sbv_bv_extract_u32_23_16_u8(s1704);+  s1807 = table2[s1806];+  s1808 = s1805 ^ s1807;+  s1809 = sbv_bv_extract_u32_15_8_u8(s1719);+  s1810 = table3[s1809];+  s1811 = s1808 ^ s1810;+  s1812 = sbv_bv_extract_u32_7_0_u8(s1735);+  s1813 = table4[s1812];+  s1814 = s1811 ^ s1813;+  s1815 = s1750 ^ s1799;+  s1816 = s1814 ^ s1815;+  s1817 = sbv_bv_extract_u32_7_0_u8(s1816);+  s1818 = table4[s1817];+  s1819 = s1803 ^ s1818;+  s1820 = sbv_bv_u32_rotl(s1815, 8);+  s1821 = sbv_bv_extract_u32_31_24_u8(s1820);+  s1822 = table0[s1821];+  s1823 = 27 ^ s1822;+  s1824 = sbv_bv_extract_u32_23_16_u8(s1820);+  s1825 = table0[s1824];+  s1826 = sbv_bv_join_u8_u8_u16(s1823, s1825);+  s1827 = sbv_bv_extract_u32_15_8_u8(s1820);+  s1828 = table0[s1827];+  s1829 = sbv_bv_extract_u32_7_0_u8(s1820);+  s1830 = table0[s1829];+  s1831 = sbv_bv_join_u8_u8_u16(s1828, s1830);+  s1832 = sbv_bv_join_u16_u16_u32(s1826, s1831);+  s1833 = s1768 ^ s1832;+  s1834 = s1819 ^ s1833;+  s1835 = sbv_bv_extract_u32_31_24_u8(s1834);+  s1836 = table0[s1835];+  s1837 = sbv_bv_extract_u32_31_24_u8(s1784);+  s1838 = table1[s1837];+  s1839 = sbv_bv_extract_u32_23_16_u8(s1800);+  s1840 = table2[s1839];+  s1841 = s1838 ^ s1840;+  s1842 = sbv_bv_extract_u32_15_8_u8(s1816);+  s1843 = table3[s1842];+  s1844 = s1841 ^ s1843;+  s1845 = sbv_bv_extract_u32_7_0_u8(s1769);+  s1846 = table4[s1845];+  s1847 = s1844 ^ s1846;+  s1848 = s1783 ^ s1833;+  s1849 = s1847 ^ s1848;+  s1850 = sbv_bv_extract_u32_23_16_u8(s1849);+  s1851 = table0[s1850];+  s1852 = sbv_bv_join_u8_u8_u16(s1836, s1851);+  s1853 = sbv_bv_extract_u32_31_24_u8(s1800);+  s1854 = table1[s1853];+  s1855 = sbv_bv_extract_u32_23_16_u8(s1816);+  s1856 = table2[s1855];+  s1857 = s1854 ^ s1856;+  s1858 = sbv_bv_extract_u32_15_8_u8(s1769);+  s1859 = table3[s1858];+  s1860 = s1857 ^ s1859;+  s1861 = sbv_bv_extract_u32_7_0_u8(s1784);+  s1862 = table4[s1861];+  s1863 = s1860 ^ s1862;+  s1864 = s1799 ^ s1848;+  s1865 = s1863 ^ s1864;+  s1866 = sbv_bv_extract_u32_15_8_u8(s1865);+  s1867 = table0[s1866];+  s1868 = sbv_bv_extract_u32_31_24_u8(s1816);+  s1869 = table1[s1868];+  s1870 = sbv_bv_extract_u32_23_16_u8(s1769);+  s1871 = table2[s1870];+  s1872 = s1869 ^ s1871;+  s1873 = sbv_bv_extract_u32_15_8_u8(s1784);+  s1874 = table3[s1873];+  s1875 = s1872 ^ s1874;+  s1876 = sbv_bv_extract_u32_7_0_u8(s1800);+  s1877 = table4[s1876];+  s1878 = s1875 ^ s1877;+  s1879 = s1815 ^ s1864;+  s1880 = s1878 ^ s1879;+  s1881 = sbv_bv_extract_u32_7_0_u8(s1880);+  s1882 = table0[s1881];+  s1883 = sbv_bv_join_u8_u8_u16(s1867, s1882);+  s1884 = sbv_bv_join_u16_u16_u32(s1852, s1883);+  s1885 = sbv_bv_u32_rotl(s1879, 8);+  s1886 = sbv_bv_extract_u32_31_24_u8(s1885);+  s1887 = table0[s1886];+  s1888 = 54 ^ s1887;+  s1889 = sbv_bv_extract_u32_23_16_u8(s1885);+  s1890 = table0[s1889];+  s1891 = sbv_bv_join_u8_u8_u16(s1888, s1890);+  s1892 = sbv_bv_extract_u32_15_8_u8(s1885);+  s1893 = table0[s1892];+  s1894 = sbv_bv_extract_u32_7_0_u8(s1885);+  s1895 = table0[s1894];+  s1896 = sbv_bv_join_u8_u8_u16(s1893, s1895);+  s1897 = sbv_bv_join_u16_u16_u32(s1891, s1896);+  s1898 = s1833 ^ s1897;+  s1899 = s1884 ^ s1898;+  s1900 = sbv_bv_extract_u32_31_24_u8(s1849);+  s1901 = table0[s1900];+  s1902 = sbv_bv_extract_u32_23_16_u8(s1865);+  s1903 = table0[s1902];+  s1904 = sbv_bv_join_u8_u8_u16(s1901, s1903);+  s1905 = sbv_bv_extract_u32_15_8_u8(s1880);+  s1906 = table0[s1905];+  s1907 = sbv_bv_extract_u32_7_0_u8(s1834);+  s1908 = table0[s1907];+  s1909 = sbv_bv_join_u8_u8_u16(s1906, s1908);+  s1910 = sbv_bv_join_u16_u16_u32(s1904, s1909);+  s1911 = s1848 ^ s1898;+  s1912 = s1910 ^ s1911;+  s1913 = sbv_bv_extract_u32_31_24_u8(s1865);+  s1914 = table0[s1913];+  s1915 = sbv_bv_extract_u32_23_16_u8(s1880);+  s1916 = table0[s1915];+  s1917 = sbv_bv_join_u8_u8_u16(s1914, s1916);+  s1918 = sbv_bv_extract_u32_15_8_u8(s1834);+  s1919 = table0[s1918];+  s1920 = sbv_bv_extract_u32_7_0_u8(s1849);+  s1921 = table0[s1920];+  s1922 = sbv_bv_join_u8_u8_u16(s1919, s1921);+  s1923 = sbv_bv_join_u16_u16_u32(s1917, s1922);+  s1924 = s1864 ^ s1911;+  s1925 = s1923 ^ s1924;+  s1926 = sbv_bv_extract_u32_31_24_u8(s1880);+  s1927 = table0[s1926];+  s1928 = sbv_bv_extract_u32_23_16_u8(s1834);+  s1929 = table0[s1928];+  s1930 = sbv_bv_join_u8_u8_u16(s1927, s1929);+  s1931 = sbv_bv_extract_u32_15_8_u8(s1849);+  s1932 = table0[s1931];+  s1933 = sbv_bv_extract_u32_7_0_u8(s1865);+  s1934 = table0[s1933];+  s1935 = sbv_bv_join_u8_u8_u16(s1932, s1934);+  s1936 = sbv_bv_join_u16_u16_u32(s1930, s1935);+  s1937 = s1879 ^ s1924;+  s1938 = s1936 ^ s1937;++  sbv_output_0[0] = s1899;+  sbv_output_0[1] = s1912;+  sbv_output_0[2] = s1925;+  sbv_output_0[3] = s1938; } == END: "aes128Enc.c" ==================
SBVTestSuite/GoldFiles/aes128Lib.gold view
@@ -3,5077 +3,8670 @@  #include "aes128Lib.h" -void aes128KeySchedule(const SWord32 *key, SWord32 *encKS,-                       SWord32 *decKS)-{-  const SWord32 s0 = key[0];-  const SWord32 s1 = key[1];-  const SWord32 s2 = key[2];-  const SWord32 s3 = key[3];-  static const SWord8 table0[] = {-       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,-      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,-      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,-      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,-       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,-      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,-       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,-       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,-       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,-      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,-       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,-      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,-      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,-      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,-       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,-       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,-      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,-      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,-      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,-      104,  65, 153,  45,  15, 176,  84, 187,  22-  };-  static const SWord8 table1[] = {-        0,  14,  28,  18,  56,  54,  36,  42, 112, 126, 108,  98,  72,-       70,  84,  90, 224, 238, 252, 242, 216, 214, 196, 202, 144, 158,-      140, 130, 168, 166, 180, 186, 219, 213, 199, 201, 227, 237, 255,-      241, 171, 165, 183, 185, 147, 157, 143, 129,  59,  53,  39,  41,-        3,  13,  31,  17,  75,  69,  87,  89, 115, 125, 111,  97, 173,-      163, 177, 191, 149, 155, 137, 135, 221, 211, 193, 207, 229, 235,-      249, 247,  77,  67,  81,  95, 117, 123, 105, 103,  61,  51,  33,-       47,   5,  11,  25,  23, 118, 120, 106, 100,  78,  64,  82,  92,-        6,   8,  26,  20,  62,  48,  34,  44, 150, 152, 138, 132, 174,-      160, 178, 188, 230, 232, 250, 244, 222, 208, 194, 204,  65,  79,-       93,  83, 121, 119, 101, 107,  49,  63,  45,  35,   9,   7,  21,-       27, 161, 175, 189, 179, 153, 151, 133, 139, 209, 223, 205, 195,-      233, 231, 245, 251, 154, 148, 134, 136, 162, 172, 190, 176, 234,-      228, 246, 248, 210, 220, 206, 192, 122, 116, 102, 104,  66,  76,-       94,  80,  10,   4,  22,  24,  50,  60,  46,  32, 236, 226, 240,-      254, 212, 218, 200, 198, 156, 146, 128, 142, 164, 170, 184, 182,-       12,   2,  16,  30,  52,  58,  40,  38, 124, 114,  96, 110,  68,-       74,  88,  86,  55,  57,  43,  37,  15,   1,  19,  29,  71,  73,-       91,  85, 127, 113,  99, 109, 215, 217, 203, 197, 239, 225, 243,-      253, 167, 169, 187, 181, 159, 145, 131, 141-  };-  static const SWord8 table2[] = {-        0,  11,  22,  29,  44,  39,  58,  49,  88,  83,  78,  69, 116,-      127,  98, 105, 176, 187, 166, 173, 156, 151, 138, 129, 232, 227,-      254, 245, 196, 207, 210, 217, 123, 112, 109, 102,  87,  92,  65,-       74,  35,  40,  53,  62,  15,   4,  25,  18, 203, 192, 221, 214,-      231, 236, 241, 250, 147, 152, 133, 142, 191, 180, 169, 162, 246,-      253, 224, 235, 218, 209, 204, 199, 174, 165, 184, 179, 130, 137,-      148, 159,  70,  77,  80,  91, 106,  97, 124, 119,  30,  21,   8,-        3,  50,  57,  36,  47, 141, 134, 155, 144, 161, 170, 183, 188,-      213, 222, 195, 200, 249, 242, 239, 228,  61,  54,  43,  32,  17,-       26,   7,  12, 101, 110, 115, 120,  73,  66,  95,  84, 247, 252,-      225, 234, 219, 208, 205, 198, 175, 164, 185, 178, 131, 136, 149,-      158,  71,  76,  81,  90, 107,  96, 125, 118,  31,  20,   9,   2,-       51,  56,  37,  46, 140, 135, 154, 145, 160, 171, 182, 189, 212,-      223, 194, 201, 248, 243, 238, 229,  60,  55,  42,  33,  16,  27,-        6,  13, 100, 111, 114, 121,  72,  67,  94,  85,   1,  10,  23,-       28,  45,  38,  59,  48,  89,  82,  79,  68, 117, 126,  99, 104,-      177, 186, 167, 172, 157, 150, 139, 128, 233, 226, 255, 244, 197,-      206, 211, 216, 122, 113, 108, 103,  86,  93,  64,  75,  34,  41,-       52,  63,  14,   5,  24,  19, 202, 193, 220, 215, 230, 237, 240,-      251, 146, 153, 132, 143, 190, 181, 168, 163-  };-  static const SWord8 table3[] = {-        0,  13,  26,  23,  52,  57,  46,  35, 104, 101, 114, 127,  92,-       81,  70,  75, 208, 221, 202, 199, 228, 233, 254, 243, 184, 181,-      162, 175, 140, 129, 150, 155, 187, 182, 161, 172, 143, 130, 149,-      152, 211, 222, 201, 196, 231, 234, 253, 240, 107, 102, 113, 124,-       95,  82,  69,  72,   3,  14,  25,  20,  55,  58,  45,  32, 109,-       96, 119, 122,  89,  84,  67,  78,   5,   8,  31,  18,  49,  60,-       43,  38, 189, 176, 167, 170, 137, 132, 147, 158, 213, 216, 207,-      194, 225, 236, 251, 246, 214, 219, 204, 193, 226, 239, 248, 245,-      190, 179, 164, 169, 138, 135, 144, 157,   6,  11,  28,  17,  50,-       63,  40,  37, 110,  99, 116, 121,  90,  87,  64,  77, 218, 215,-      192, 205, 238, 227, 244, 249, 178, 191, 168, 165, 134, 139, 156,-      145,  10,   7,  16,  29,  62,  51,  36,  41,  98, 111, 120, 117,-       86,  91,  76,  65,  97, 108, 123, 118,  85,  88,  79,  66,   9,-        4,  19,  30,  61,  48,  39,  42, 177, 188, 171, 166, 133, 136,-      159, 146, 217, 212, 195, 206, 237, 224, 247, 250, 183, 186, 173,-      160, 131, 142, 153, 148, 223, 210, 197, 200, 235, 230, 241, 252,-      103, 106, 125, 112,  83,  94,  73,  68,  15,   2,  21,  24,  59,-       54,  33,  44,  12,   1,  22,  27,  56,  53,  34,  47, 100, 105,-      126, 115,  80,  93,  74,  71, 220, 209, 198, 203, 232, 229, 242,-      255, 180, 185, 174, 163, 128, 141, 154, 151-  };-  static const SWord8 table4[] = {-        0,   9,  18,  27,  36,  45,  54,  63,  72,  65,  90,  83, 108,-      101, 126, 119, 144, 153, 130, 139, 180, 189, 166, 175, 216, 209,-      202, 195, 252, 245, 238, 231,  59,  50,  41,  32,  31,  22,  13,-        4, 115, 122,  97, 104,  87,  94,  69,  76, 171, 162, 185, 176,-      143, 134, 157, 148, 227, 234, 241, 248, 199, 206, 213, 220, 118,-      127, 100, 109,  82,  91,  64,  73,  62,  55,  44,  37,  26,  19,-        8,   1, 230, 239, 244, 253, 194, 203, 208, 217, 174, 167, 188,-      181, 138, 131, 152, 145,  77,  68,  95,  86, 105,  96, 123, 114,-        5,  12,  23,  30,  33,  40,  51,  58, 221, 212, 207, 198, 249,-      240, 235, 226, 149, 156, 135, 142, 177, 184, 163, 170, 236, 229,-      254, 247, 200, 193, 218, 211, 164, 173, 182, 191, 128, 137, 146,-      155, 124, 117, 110, 103,  88,  81,  74,  67,  52,  61,  38,  47,-       16,  25,   2,  11, 215, 222, 197, 204, 243, 250, 225, 232, 159,-      150, 141, 132, 187, 178, 169, 160,  71,  78,  85,  92,  99, 106,-      113, 120,  15,   6,  29,  20,  43,  34,  57,  48, 154, 147, 136,-      129, 190, 183, 172, 165, 210, 219, 192, 201, 246, 255, 228, 237,-       10,   3,  24,  17,  46,  39,  60,  53,  66,  75,  80,  89, 102,-      111, 116, 125, 161, 168, 179, 186, 133, 140, 151, 158, 233, 224,-      251, 242, 205, 196, 223, 214,  49,  56,  35,  42,  21,  28,   7,-       14, 121, 112, 107,  98,  93,  84,  79,  70-  };-  const SWord32 s260 = (s3 << 8) | (s3 >> 24);-  const SWord8  s261 = (SWord8) (s260 >> 24);-  const SWord8  s262 = table0[s261];-  const SWord8  s263 = 1 ^ s262;-  const SWord8  s264 = (SWord8) (s260 >> 16);-  const SWord8  s265 = table0[s264];-  const SWord16 s266 = (((SWord16) s263) << 8) | ((SWord16) s265);-  const SWord8  s267 = (SWord8) (s260 >> 8);-  const SWord8  s268 = table0[s267];-  const SWord8  s269 = (SWord8) s260;-  const SWord8  s270 = table0[s269];-  const SWord16 s271 = (((SWord16) s268) << 8) | ((SWord16) s270);-  const SWord32 s272 = (((SWord32) s266) << 16) | ((SWord32) s271);-  const SWord32 s273 = s0 ^ s272;-  const SWord32 s274 = s1 ^ s273;-  const SWord32 s275 = s2 ^ s274;-  const SWord32 s276 = s3 ^ s275;-  const SWord32 s277 = (s276 << 8) | (s276 >> 24);-  const SWord8  s278 = (SWord8) (s277 >> 24);-  const SWord8  s279 = table0[s278];-  const SWord8  s280 = 2 ^ s279;-  const SWord8  s281 = (SWord8) (s277 >> 16);-  const SWord8  s282 = table0[s281];-  const SWord16 s283 = (((SWord16) s280) << 8) | ((SWord16) s282);-  const SWord8  s284 = (SWord8) (s277 >> 8);-  const SWord8  s285 = table0[s284];-  const SWord8  s286 = (SWord8) s277;-  const SWord8  s287 = table0[s286];-  const SWord16 s288 = (((SWord16) s285) << 8) | ((SWord16) s287);-  const SWord32 s289 = (((SWord32) s283) << 16) | ((SWord32) s288);-  const SWord32 s290 = s273 ^ s289;-  const SWord32 s291 = s274 ^ s290;-  const SWord32 s292 = s275 ^ s291;-  const SWord32 s293 = s276 ^ s292;-  const SWord32 s294 = (s293 << 8) | (s293 >> 24);-  const SWord8  s295 = (SWord8) (s294 >> 24);-  const SWord8  s296 = table0[s295];-  const SWord8  s297 = 4 ^ s296;-  const SWord8  s298 = (SWord8) (s294 >> 16);-  const SWord8  s299 = table0[s298];-  const SWord16 s300 = (((SWord16) s297) << 8) | ((SWord16) s299);-  const SWord8  s301 = (SWord8) (s294 >> 8);-  const SWord8  s302 = table0[s301];-  const SWord8  s303 = (SWord8) s294;-  const SWord8  s304 = table0[s303];-  const SWord16 s305 = (((SWord16) s302) << 8) | ((SWord16) s304);-  const SWord32 s306 = (((SWord32) s300) << 16) | ((SWord32) s305);-  const SWord32 s307 = s290 ^ s306;-  const SWord32 s308 = s291 ^ s307;-  const SWord32 s309 = s292 ^ s308;-  const SWord32 s310 = s293 ^ s309;-  const SWord32 s311 = (s310 << 8) | (s310 >> 24);-  const SWord8  s312 = (SWord8) (s311 >> 24);-  const SWord8  s313 = table0[s312];-  const SWord8  s314 = 8 ^ s313;-  const SWord8  s315 = (SWord8) (s311 >> 16);-  const SWord8  s316 = table0[s315];-  const SWord16 s317 = (((SWord16) s314) << 8) | ((SWord16) s316);-  const SWord8  s318 = (SWord8) (s311 >> 8);-  const SWord8  s319 = table0[s318];-  const SWord8  s320 = (SWord8) s311;-  const SWord8  s321 = table0[s320];-  const SWord16 s322 = (((SWord16) s319) << 8) | ((SWord16) s321);-  const SWord32 s323 = (((SWord32) s317) << 16) | ((SWord32) s322);-  const SWord32 s324 = s307 ^ s323;-  const SWord32 s325 = s308 ^ s324;-  const SWord32 s326 = s309 ^ s325;-  const SWord32 s327 = s310 ^ s326;-  const SWord32 s328 = (s327 << 8) | (s327 >> 24);-  const SWord8  s329 = (SWord8) (s328 >> 24);-  const SWord8  s330 = table0[s329];-  const SWord8  s331 = 16 ^ s330;-  const SWord8  s332 = (SWord8) (s328 >> 16);-  const SWord8  s333 = table0[s332];-  const SWord16 s334 = (((SWord16) s331) << 8) | ((SWord16) s333);-  const SWord8  s335 = (SWord8) (s328 >> 8);-  const SWord8  s336 = table0[s335];-  const SWord8  s337 = (SWord8) s328;-  const SWord8  s338 = table0[s337];-  const SWord16 s339 = (((SWord16) s336) << 8) | ((SWord16) s338);-  const SWord32 s340 = (((SWord32) s334) << 16) | ((SWord32) s339);-  const SWord32 s341 = s324 ^ s340;-  const SWord32 s342 = s325 ^ s341;-  const SWord32 s343 = s326 ^ s342;-  const SWord32 s344 = s327 ^ s343;-  const SWord32 s345 = (s344 << 8) | (s344 >> 24);-  const SWord8  s346 = (SWord8) (s345 >> 24);-  const SWord8  s347 = table0[s346];-  const SWord8  s348 = 32 ^ s347;-  const SWord8  s349 = (SWord8) (s345 >> 16);-  const SWord8  s350 = table0[s349];-  const SWord16 s351 = (((SWord16) s348) << 8) | ((SWord16) s350);-  const SWord8  s352 = (SWord8) (s345 >> 8);-  const SWord8  s353 = table0[s352];-  const SWord8  s354 = (SWord8) s345;-  const SWord8  s355 = table0[s354];-  const SWord16 s356 = (((SWord16) s353) << 8) | ((SWord16) s355);-  const SWord32 s357 = (((SWord32) s351) << 16) | ((SWord32) s356);-  const SWord32 s358 = s341 ^ s357;-  const SWord32 s359 = s342 ^ s358;-  const SWord32 s360 = s343 ^ s359;-  const SWord32 s361 = s344 ^ s360;-  const SWord32 s362 = (s361 << 8) | (s361 >> 24);-  const SWord8  s363 = (SWord8) (s362 >> 24);-  const SWord8  s364 = table0[s363];-  const SWord8  s365 = 64 ^ s364;-  const SWord8  s366 = (SWord8) (s362 >> 16);-  const SWord8  s367 = table0[s366];-  const SWord16 s368 = (((SWord16) s365) << 8) | ((SWord16) s367);-  const SWord8  s369 = (SWord8) (s362 >> 8);-  const SWord8  s370 = table0[s369];-  const SWord8  s371 = (SWord8) s362;-  const SWord8  s372 = table0[s371];-  const SWord16 s373 = (((SWord16) s370) << 8) | ((SWord16) s372);-  const SWord32 s374 = (((SWord32) s368) << 16) | ((SWord32) s373);-  const SWord32 s375 = s358 ^ s374;-  const SWord32 s376 = s359 ^ s375;-  const SWord32 s377 = s360 ^ s376;-  const SWord32 s378 = s361 ^ s377;-  const SWord32 s379 = (s378 << 8) | (s378 >> 24);-  const SWord8  s380 = (SWord8) (s379 >> 24);-  const SWord8  s381 = table0[s380];-  const SWord8  s382 = 128 ^ s381;-  const SWord8  s383 = (SWord8) (s379 >> 16);-  const SWord8  s384 = table0[s383];-  const SWord16 s385 = (((SWord16) s382) << 8) | ((SWord16) s384);-  const SWord8  s386 = (SWord8) (s379 >> 8);-  const SWord8  s387 = table0[s386];-  const SWord8  s388 = (SWord8) s379;-  const SWord8  s389 = table0[s388];-  const SWord16 s390 = (((SWord16) s387) << 8) | ((SWord16) s389);-  const SWord32 s391 = (((SWord32) s385) << 16) | ((SWord32) s390);-  const SWord32 s392 = s375 ^ s391;-  const SWord32 s393 = s376 ^ s392;-  const SWord32 s394 = s377 ^ s393;-  const SWord32 s395 = s378 ^ s394;-  const SWord32 s396 = (s395 << 8) | (s395 >> 24);-  const SWord8  s397 = (SWord8) (s396 >> 24);-  const SWord8  s398 = table0[s397];-  const SWord8  s399 = 27 ^ s398;-  const SWord8  s400 = (SWord8) (s396 >> 16);-  const SWord8  s401 = table0[s400];-  const SWord16 s402 = (((SWord16) s399) << 8) | ((SWord16) s401);-  const SWord8  s403 = (SWord8) (s396 >> 8);-  const SWord8  s404 = table0[s403];-  const SWord8  s405 = (SWord8) s396;-  const SWord8  s406 = table0[s405];-  const SWord16 s407 = (((SWord16) s404) << 8) | ((SWord16) s406);-  const SWord32 s408 = (((SWord32) s402) << 16) | ((SWord32) s407);-  const SWord32 s409 = s392 ^ s408;-  const SWord32 s410 = s393 ^ s409;-  const SWord32 s411 = s394 ^ s410;-  const SWord32 s412 = s395 ^ s411;-  const SWord32 s413 = (s412 << 8) | (s412 >> 24);-  const SWord8  s414 = (SWord8) (s413 >> 24);-  const SWord8  s415 = table0[s414];-  const SWord8  s416 = 54 ^ s415;-  const SWord8  s417 = (SWord8) (s413 >> 16);-  const SWord8  s418 = table0[s417];-  const SWord16 s419 = (((SWord16) s416) << 8) | ((SWord16) s418);-  const SWord8  s420 = (SWord8) (s413 >> 8);-  const SWord8  s421 = table0[s420];-  const SWord8  s422 = (SWord8) s413;-  const SWord8  s423 = table0[s422];-  const SWord16 s424 = (((SWord16) s421) << 8) | ((SWord16) s423);-  const SWord32 s425 = (((SWord32) s419) << 16) | ((SWord32) s424);-  const SWord32 s426 = s409 ^ s425;-  const SWord32 s427 = s410 ^ s426;-  const SWord32 s428 = s411 ^ s427;-  const SWord32 s429 = s412 ^ s428;-  const SWord8  s430 = (SWord8) (s409 >> 24);-  const SWord8  s431 = table1[s430];-  const SWord8  s432 = (SWord8) (s409 >> 16);-  const SWord8  s433 = table2[s432];-  const SWord8  s434 = (SWord8) (s409 >> 8);-  const SWord8  s435 = table3[s434];-  const SWord8  s436 = (SWord8) s409;-  const SWord8  s437 = table4[s436];-  const SWord8  s438 = s435 ^ s437;-  const SWord8  s439 = s433 ^ s438;-  const SWord8  s440 = s431 ^ s439;-  const SWord8  s441 = table4[s430];-  const SWord8  s442 = table1[s432];-  const SWord8  s443 = table2[s434];-  const SWord8  s444 = table3[s436];-  const SWord8  s445 = s443 ^ s444;-  const SWord8  s446 = s442 ^ s445;-  const SWord8  s447 = s441 ^ s446;-  const SWord16 s448 = (((SWord16) s440) << 8) | ((SWord16) s447);-  const SWord8  s449 = table3[s430];-  const SWord8  s450 = table4[s432];-  const SWord8  s451 = table1[s434];-  const SWord8  s452 = table2[s436];-  const SWord8  s453 = s451 ^ s452;-  const SWord8  s454 = s450 ^ s453;-  const SWord8  s455 = s449 ^ s454;-  const SWord8  s456 = table2[s430];-  const SWord8  s457 = table3[s432];-  const SWord8  s458 = table4[s434];-  const SWord8  s459 = table1[s436];-  const SWord8  s460 = s458 ^ s459;-  const SWord8  s461 = s457 ^ s460;-  const SWord8  s462 = s456 ^ s461;-  const SWord16 s463 = (((SWord16) s455) << 8) | ((SWord16) s462);-  const SWord32 s464 = (((SWord32) s448) << 16) | ((SWord32) s463);-  const SWord8  s465 = (SWord8) (s410 >> 24);-  const SWord8  s466 = table1[s465];-  const SWord8  s467 = (SWord8) (s410 >> 16);-  const SWord8  s468 = table2[s467];-  const SWord8  s469 = (SWord8) (s410 >> 8);-  const SWord8  s470 = table3[s469];-  const SWord8  s471 = (SWord8) s410;-  const SWord8  s472 = table4[s471];-  const SWord8  s473 = s470 ^ s472;-  const SWord8  s474 = s468 ^ s473;-  const SWord8  s475 = s466 ^ s474;-  const SWord8  s476 = table4[s465];-  const SWord8  s477 = table1[s467];-  const SWord8  s478 = table2[s469];-  const SWord8  s479 = table3[s471];-  const SWord8  s480 = s478 ^ s479;-  const SWord8  s481 = s477 ^ s480;-  const SWord8  s482 = s476 ^ s481;-  const SWord16 s483 = (((SWord16) s475) << 8) | ((SWord16) s482);-  const SWord8  s484 = table3[s465];-  const SWord8  s485 = table4[s467];-  const SWord8  s486 = table1[s469];-  const SWord8  s487 = table2[s471];-  const SWord8  s488 = s486 ^ s487;-  const SWord8  s489 = s485 ^ s488;-  const SWord8  s490 = s484 ^ s489;-  const SWord8  s491 = table2[s465];-  const SWord8  s492 = table3[s467];-  const SWord8  s493 = table4[s469];-  const SWord8  s494 = table1[s471];-  const SWord8  s495 = s493 ^ s494;-  const SWord8  s496 = s492 ^ s495;-  const SWord8  s497 = s491 ^ s496;-  const SWord16 s498 = (((SWord16) s490) << 8) | ((SWord16) s497);-  const SWord32 s499 = (((SWord32) s483) << 16) | ((SWord32) s498);-  const SWord8  s500 = (SWord8) (s411 >> 24);-  const SWord8  s501 = table1[s500];-  const SWord8  s502 = (SWord8) (s411 >> 16);-  const SWord8  s503 = table2[s502];-  const SWord8  s504 = (SWord8) (s411 >> 8);-  const SWord8  s505 = table3[s504];-  const SWord8  s506 = (SWord8) s411;-  const SWord8  s507 = table4[s506];-  const SWord8  s508 = s505 ^ s507;-  const SWord8  s509 = s503 ^ s508;-  const SWord8  s510 = s501 ^ s509;-  const SWord8  s511 = table4[s500];-  const SWord8  s512 = table1[s502];-  const SWord8  s513 = table2[s504];-  const SWord8  s514 = table3[s506];-  const SWord8  s515 = s513 ^ s514;-  const SWord8  s516 = s512 ^ s515;-  const SWord8  s517 = s511 ^ s516;-  const SWord16 s518 = (((SWord16) s510) << 8) | ((SWord16) s517);-  const SWord8  s519 = table3[s500];-  const SWord8  s520 = table4[s502];-  const SWord8  s521 = table1[s504];-  const SWord8  s522 = table2[s506];-  const SWord8  s523 = s521 ^ s522;-  const SWord8  s524 = s520 ^ s523;-  const SWord8  s525 = s519 ^ s524;-  const SWord8  s526 = table2[s500];-  const SWord8  s527 = table3[s502];-  const SWord8  s528 = table4[s504];-  const SWord8  s529 = table1[s506];-  const SWord8  s530 = s528 ^ s529;-  const SWord8  s531 = s527 ^ s530;-  const SWord8  s532 = s526 ^ s531;-  const SWord16 s533 = (((SWord16) s525) << 8) | ((SWord16) s532);-  const SWord32 s534 = (((SWord32) s518) << 16) | ((SWord32) s533);-  const SWord8  s535 = (SWord8) (s412 >> 24);-  const SWord8  s536 = table1[s535];-  const SWord8  s537 = (SWord8) (s412 >> 16);-  const SWord8  s538 = table2[s537];-  const SWord8  s539 = (SWord8) (s412 >> 8);-  const SWord8  s540 = table3[s539];-  const SWord8  s541 = (SWord8) s412;-  const SWord8  s542 = table4[s541];-  const SWord8  s543 = s540 ^ s542;-  const SWord8  s544 = s538 ^ s543;-  const SWord8  s545 = s536 ^ s544;-  const SWord8  s546 = table4[s535];-  const SWord8  s547 = table1[s537];-  const SWord8  s548 = table2[s539];-  const SWord8  s549 = table3[s541];-  const SWord8  s550 = s548 ^ s549;-  const SWord8  s551 = s547 ^ s550;-  const SWord8  s552 = s546 ^ s551;-  const SWord16 s553 = (((SWord16) s545) << 8) | ((SWord16) s552);-  const SWord8  s554 = table3[s535];-  const SWord8  s555 = table4[s537];-  const SWord8  s556 = table1[s539];-  const SWord8  s557 = table2[s541];-  const SWord8  s558 = s556 ^ s557;-  const SWord8  s559 = s555 ^ s558;-  const SWord8  s560 = s554 ^ s559;-  const SWord8  s561 = table2[s535];-  const SWord8  s562 = table3[s537];-  const SWord8  s563 = table4[s539];-  const SWord8  s564 = table1[s541];-  const SWord8  s565 = s563 ^ s564;-  const SWord8  s566 = s562 ^ s565;-  const SWord8  s567 = s561 ^ s566;-  const SWord16 s568 = (((SWord16) s560) << 8) | ((SWord16) s567);-  const SWord32 s569 = (((SWord32) s553) << 16) | ((SWord32) s568);-  const SWord8  s570 = (SWord8) (s392 >> 24);-  const SWord8  s571 = table1[s570];-  const SWord8  s572 = (SWord8) (s392 >> 16);-  const SWord8  s573 = table2[s572];-  const SWord8  s574 = (SWord8) (s392 >> 8);-  const SWord8  s575 = table3[s574];-  const SWord8  s576 = (SWord8) s392;-  const SWord8  s577 = table4[s576];-  const SWord8  s578 = s575 ^ s577;-  const SWord8  s579 = s573 ^ s578;-  const SWord8  s580 = s571 ^ s579;-  const SWord8  s581 = table4[s570];-  const SWord8  s582 = table1[s572];-  const SWord8  s583 = table2[s574];-  const SWord8  s584 = table3[s576];-  const SWord8  s585 = s583 ^ s584;-  const SWord8  s586 = s582 ^ s585;-  const SWord8  s587 = s581 ^ s586;-  const SWord16 s588 = (((SWord16) s580) << 8) | ((SWord16) s587);-  const SWord8  s589 = table3[s570];-  const SWord8  s590 = table4[s572];-  const SWord8  s591 = table1[s574];-  const SWord8  s592 = table2[s576];-  const SWord8  s593 = s591 ^ s592;-  const SWord8  s594 = s590 ^ s593;-  const SWord8  s595 = s589 ^ s594;-  const SWord8  s596 = table2[s570];-  const SWord8  s597 = table3[s572];-  const SWord8  s598 = table4[s574];-  const SWord8  s599 = table1[s576];-  const SWord8  s600 = s598 ^ s599;-  const SWord8  s601 = s597 ^ s600;-  const SWord8  s602 = s596 ^ s601;-  const SWord16 s603 = (((SWord16) s595) << 8) | ((SWord16) s602);-  const SWord32 s604 = (((SWord32) s588) << 16) | ((SWord32) s603);-  const SWord8  s605 = (SWord8) (s393 >> 24);-  const SWord8  s606 = table1[s605];-  const SWord8  s607 = (SWord8) (s393 >> 16);-  const SWord8  s608 = table2[s607];-  const SWord8  s609 = (SWord8) (s393 >> 8);-  const SWord8  s610 = table3[s609];-  const SWord8  s611 = (SWord8) s393;-  const SWord8  s612 = table4[s611];-  const SWord8  s613 = s610 ^ s612;-  const SWord8  s614 = s608 ^ s613;-  const SWord8  s615 = s606 ^ s614;-  const SWord8  s616 = table4[s605];-  const SWord8  s617 = table1[s607];-  const SWord8  s618 = table2[s609];-  const SWord8  s619 = table3[s611];-  const SWord8  s620 = s618 ^ s619;-  const SWord8  s621 = s617 ^ s620;-  const SWord8  s622 = s616 ^ s621;-  const SWord16 s623 = (((SWord16) s615) << 8) | ((SWord16) s622);-  const SWord8  s624 = table3[s605];-  const SWord8  s625 = table4[s607];-  const SWord8  s626 = table1[s609];-  const SWord8  s627 = table2[s611];-  const SWord8  s628 = s626 ^ s627;-  const SWord8  s629 = s625 ^ s628;-  const SWord8  s630 = s624 ^ s629;-  const SWord8  s631 = table2[s605];-  const SWord8  s632 = table3[s607];-  const SWord8  s633 = table4[s609];-  const SWord8  s634 = table1[s611];-  const SWord8  s635 = s633 ^ s634;-  const SWord8  s636 = s632 ^ s635;-  const SWord8  s637 = s631 ^ s636;-  const SWord16 s638 = (((SWord16) s630) << 8) | ((SWord16) s637);-  const SWord32 s639 = (((SWord32) s623) << 16) | ((SWord32) s638);-  const SWord8  s640 = (SWord8) (s394 >> 24);-  const SWord8  s641 = table1[s640];-  const SWord8  s642 = (SWord8) (s394 >> 16);-  const SWord8  s643 = table2[s642];-  const SWord8  s644 = (SWord8) (s394 >> 8);-  const SWord8  s645 = table3[s644];-  const SWord8  s646 = (SWord8) s394;-  const SWord8  s647 = table4[s646];-  const SWord8  s648 = s645 ^ s647;-  const SWord8  s649 = s643 ^ s648;-  const SWord8  s650 = s641 ^ s649;-  const SWord8  s651 = table4[s640];-  const SWord8  s652 = table1[s642];-  const SWord8  s653 = table2[s644];-  const SWord8  s654 = table3[s646];-  const SWord8  s655 = s653 ^ s654;-  const SWord8  s656 = s652 ^ s655;-  const SWord8  s657 = s651 ^ s656;-  const SWord16 s658 = (((SWord16) s650) << 8) | ((SWord16) s657);-  const SWord8  s659 = table3[s640];-  const SWord8  s660 = table4[s642];-  const SWord8  s661 = table1[s644];-  const SWord8  s662 = table2[s646];-  const SWord8  s663 = s661 ^ s662;-  const SWord8  s664 = s660 ^ s663;-  const SWord8  s665 = s659 ^ s664;-  const SWord8  s666 = table2[s640];-  const SWord8  s667 = table3[s642];-  const SWord8  s668 = table4[s644];-  const SWord8  s669 = table1[s646];-  const SWord8  s670 = s668 ^ s669;-  const SWord8  s671 = s667 ^ s670;-  const SWord8  s672 = s666 ^ s671;-  const SWord16 s673 = (((SWord16) s665) << 8) | ((SWord16) s672);-  const SWord32 s674 = (((SWord32) s658) << 16) | ((SWord32) s673);-  const SWord8  s675 = (SWord8) (s395 >> 24);-  const SWord8  s676 = table1[s675];-  const SWord8  s677 = (SWord8) (s395 >> 16);-  const SWord8  s678 = table2[s677];-  const SWord8  s679 = (SWord8) (s395 >> 8);-  const SWord8  s680 = table3[s679];-  const SWord8  s681 = (SWord8) s395;-  const SWord8  s682 = table4[s681];-  const SWord8  s683 = s680 ^ s682;-  const SWord8  s684 = s678 ^ s683;-  const SWord8  s685 = s676 ^ s684;-  const SWord8  s686 = table4[s675];-  const SWord8  s687 = table1[s677];-  const SWord8  s688 = table2[s679];-  const SWord8  s689 = table3[s681];-  const SWord8  s690 = s688 ^ s689;-  const SWord8  s691 = s687 ^ s690;-  const SWord8  s692 = s686 ^ s691;-  const SWord16 s693 = (((SWord16) s685) << 8) | ((SWord16) s692);-  const SWord8  s694 = table3[s675];-  const SWord8  s695 = table4[s677];-  const SWord8  s696 = table1[s679];-  const SWord8  s697 = table2[s681];-  const SWord8  s698 = s696 ^ s697;-  const SWord8  s699 = s695 ^ s698;-  const SWord8  s700 = s694 ^ s699;-  const SWord8  s701 = table2[s675];-  const SWord8  s702 = table3[s677];-  const SWord8  s703 = table4[s679];-  const SWord8  s704 = table1[s681];-  const SWord8  s705 = s703 ^ s704;-  const SWord8  s706 = s702 ^ s705;-  const SWord8  s707 = s701 ^ s706;-  const SWord16 s708 = (((SWord16) s700) << 8) | ((SWord16) s707);-  const SWord32 s709 = (((SWord32) s693) << 16) | ((SWord32) s708);-  const SWord8  s710 = (SWord8) (s375 >> 24);-  const SWord8  s711 = table1[s710];-  const SWord8  s712 = (SWord8) (s375 >> 16);-  const SWord8  s713 = table2[s712];-  const SWord8  s714 = (SWord8) (s375 >> 8);-  const SWord8  s715 = table3[s714];-  const SWord8  s716 = (SWord8) s375;-  const SWord8  s717 = table4[s716];-  const SWord8  s718 = s715 ^ s717;-  const SWord8  s719 = s713 ^ s718;-  const SWord8  s720 = s711 ^ s719;-  const SWord8  s721 = table4[s710];-  const SWord8  s722 = table1[s712];-  const SWord8  s723 = table2[s714];-  const SWord8  s724 = table3[s716];-  const SWord8  s725 = s723 ^ s724;-  const SWord8  s726 = s722 ^ s725;-  const SWord8  s727 = s721 ^ s726;-  const SWord16 s728 = (((SWord16) s720) << 8) | ((SWord16) s727);-  const SWord8  s729 = table3[s710];-  const SWord8  s730 = table4[s712];-  const SWord8  s731 = table1[s714];-  const SWord8  s732 = table2[s716];-  const SWord8  s733 = s731 ^ s732;-  const SWord8  s734 = s730 ^ s733;-  const SWord8  s735 = s729 ^ s734;-  const SWord8  s736 = table2[s710];-  const SWord8  s737 = table3[s712];-  const SWord8  s738 = table4[s714];-  const SWord8  s739 = table1[s716];-  const SWord8  s740 = s738 ^ s739;-  const SWord8  s741 = s737 ^ s740;-  const SWord8  s742 = s736 ^ s741;-  const SWord16 s743 = (((SWord16) s735) << 8) | ((SWord16) s742);-  const SWord32 s744 = (((SWord32) s728) << 16) | ((SWord32) s743);-  const SWord8  s745 = (SWord8) (s376 >> 24);-  const SWord8  s746 = table1[s745];-  const SWord8  s747 = (SWord8) (s376 >> 16);-  const SWord8  s748 = table2[s747];-  const SWord8  s749 = (SWord8) (s376 >> 8);-  const SWord8  s750 = table3[s749];-  const SWord8  s751 = (SWord8) s376;-  const SWord8  s752 = table4[s751];-  const SWord8  s753 = s750 ^ s752;-  const SWord8  s754 = s748 ^ s753;-  const SWord8  s755 = s746 ^ s754;-  const SWord8  s756 = table4[s745];-  const SWord8  s757 = table1[s747];-  const SWord8  s758 = table2[s749];-  const SWord8  s759 = table3[s751];-  const SWord8  s760 = s758 ^ s759;-  const SWord8  s761 = s757 ^ s760;-  const SWord8  s762 = s756 ^ s761;-  const SWord16 s763 = (((SWord16) s755) << 8) | ((SWord16) s762);-  const SWord8  s764 = table3[s745];-  const SWord8  s765 = table4[s747];-  const SWord8  s766 = table1[s749];-  const SWord8  s767 = table2[s751];-  const SWord8  s768 = s766 ^ s767;-  const SWord8  s769 = s765 ^ s768;-  const SWord8  s770 = s764 ^ s769;-  const SWord8  s771 = table2[s745];-  const SWord8  s772 = table3[s747];-  const SWord8  s773 = table4[s749];-  const SWord8  s774 = table1[s751];-  const SWord8  s775 = s773 ^ s774;-  const SWord8  s776 = s772 ^ s775;-  const SWord8  s777 = s771 ^ s776;-  const SWord16 s778 = (((SWord16) s770) << 8) | ((SWord16) s777);-  const SWord32 s779 = (((SWord32) s763) << 16) | ((SWord32) s778);-  const SWord8  s780 = (SWord8) (s377 >> 24);-  const SWord8  s781 = table1[s780];-  const SWord8  s782 = (SWord8) (s377 >> 16);-  const SWord8  s783 = table2[s782];-  const SWord8  s784 = (SWord8) (s377 >> 8);-  const SWord8  s785 = table3[s784];-  const SWord8  s786 = (SWord8) s377;-  const SWord8  s787 = table4[s786];-  const SWord8  s788 = s785 ^ s787;-  const SWord8  s789 = s783 ^ s788;-  const SWord8  s790 = s781 ^ s789;-  const SWord8  s791 = table4[s780];-  const SWord8  s792 = table1[s782];-  const SWord8  s793 = table2[s784];-  const SWord8  s794 = table3[s786];-  const SWord8  s795 = s793 ^ s794;-  const SWord8  s796 = s792 ^ s795;-  const SWord8  s797 = s791 ^ s796;-  const SWord16 s798 = (((SWord16) s790) << 8) | ((SWord16) s797);-  const SWord8  s799 = table3[s780];-  const SWord8  s800 = table4[s782];-  const SWord8  s801 = table1[s784];-  const SWord8  s802 = table2[s786];-  const SWord8  s803 = s801 ^ s802;-  const SWord8  s804 = s800 ^ s803;-  const SWord8  s805 = s799 ^ s804;-  const SWord8  s806 = table2[s780];-  const SWord8  s807 = table3[s782];-  const SWord8  s808 = table4[s784];-  const SWord8  s809 = table1[s786];-  const SWord8  s810 = s808 ^ s809;-  const SWord8  s811 = s807 ^ s810;-  const SWord8  s812 = s806 ^ s811;-  const SWord16 s813 = (((SWord16) s805) << 8) | ((SWord16) s812);-  const SWord32 s814 = (((SWord32) s798) << 16) | ((SWord32) s813);-  const SWord8  s815 = (SWord8) (s378 >> 24);-  const SWord8  s816 = table1[s815];-  const SWord8  s817 = (SWord8) (s378 >> 16);-  const SWord8  s818 = table2[s817];-  const SWord8  s819 = (SWord8) (s378 >> 8);-  const SWord8  s820 = table3[s819];-  const SWord8  s821 = (SWord8) s378;-  const SWord8  s822 = table4[s821];-  const SWord8  s823 = s820 ^ s822;-  const SWord8  s824 = s818 ^ s823;-  const SWord8  s825 = s816 ^ s824;-  const SWord8  s826 = table4[s815];-  const SWord8  s827 = table1[s817];-  const SWord8  s828 = table2[s819];-  const SWord8  s829 = table3[s821];-  const SWord8  s830 = s828 ^ s829;-  const SWord8  s831 = s827 ^ s830;-  const SWord8  s832 = s826 ^ s831;-  const SWord16 s833 = (((SWord16) s825) << 8) | ((SWord16) s832);-  const SWord8  s834 = table3[s815];-  const SWord8  s835 = table4[s817];-  const SWord8  s836 = table1[s819];-  const SWord8  s837 = table2[s821];-  const SWord8  s838 = s836 ^ s837;-  const SWord8  s839 = s835 ^ s838;-  const SWord8  s840 = s834 ^ s839;-  const SWord8  s841 = table2[s815];-  const SWord8  s842 = table3[s817];-  const SWord8  s843 = table4[s819];-  const SWord8  s844 = table1[s821];-  const SWord8  s845 = s843 ^ s844;-  const SWord8  s846 = s842 ^ s845;-  const SWord8  s847 = s841 ^ s846;-  const SWord16 s848 = (((SWord16) s840) << 8) | ((SWord16) s847);-  const SWord32 s849 = (((SWord32) s833) << 16) | ((SWord32) s848);-  const SWord8  s850 = (SWord8) (s358 >> 24);-  const SWord8  s851 = table1[s850];-  const SWord8  s852 = (SWord8) (s358 >> 16);-  const SWord8  s853 = table2[s852];-  const SWord8  s854 = (SWord8) (s358 >> 8);-  const SWord8  s855 = table3[s854];-  const SWord8  s856 = (SWord8) s358;-  const SWord8  s857 = table4[s856];-  const SWord8  s858 = s855 ^ s857;-  const SWord8  s859 = s853 ^ s858;-  const SWord8  s860 = s851 ^ s859;-  const SWord8  s861 = table4[s850];-  const SWord8  s862 = table1[s852];-  const SWord8  s863 = table2[s854];-  const SWord8  s864 = table3[s856];-  const SWord8  s865 = s863 ^ s864;-  const SWord8  s866 = s862 ^ s865;-  const SWord8  s867 = s861 ^ s866;-  const SWord16 s868 = (((SWord16) s860) << 8) | ((SWord16) s867);-  const SWord8  s869 = table3[s850];-  const SWord8  s870 = table4[s852];-  const SWord8  s871 = table1[s854];-  const SWord8  s872 = table2[s856];-  const SWord8  s873 = s871 ^ s872;-  const SWord8  s874 = s870 ^ s873;-  const SWord8  s875 = s869 ^ s874;-  const SWord8  s876 = table2[s850];-  const SWord8  s877 = table3[s852];-  const SWord8  s878 = table4[s854];-  const SWord8  s879 = table1[s856];-  const SWord8  s880 = s878 ^ s879;-  const SWord8  s881 = s877 ^ s880;-  const SWord8  s882 = s876 ^ s881;-  const SWord16 s883 = (((SWord16) s875) << 8) | ((SWord16) s882);-  const SWord32 s884 = (((SWord32) s868) << 16) | ((SWord32) s883);-  const SWord8  s885 = (SWord8) (s359 >> 24);-  const SWord8  s886 = table1[s885];-  const SWord8  s887 = (SWord8) (s359 >> 16);-  const SWord8  s888 = table2[s887];-  const SWord8  s889 = (SWord8) (s359 >> 8);-  const SWord8  s890 = table3[s889];-  const SWord8  s891 = (SWord8) s359;-  const SWord8  s892 = table4[s891];-  const SWord8  s893 = s890 ^ s892;-  const SWord8  s894 = s888 ^ s893;-  const SWord8  s895 = s886 ^ s894;-  const SWord8  s896 = table4[s885];-  const SWord8  s897 = table1[s887];-  const SWord8  s898 = table2[s889];-  const SWord8  s899 = table3[s891];-  const SWord8  s900 = s898 ^ s899;-  const SWord8  s901 = s897 ^ s900;-  const SWord8  s902 = s896 ^ s901;-  const SWord16 s903 = (((SWord16) s895) << 8) | ((SWord16) s902);-  const SWord8  s904 = table3[s885];-  const SWord8  s905 = table4[s887];-  const SWord8  s906 = table1[s889];-  const SWord8  s907 = table2[s891];-  const SWord8  s908 = s906 ^ s907;-  const SWord8  s909 = s905 ^ s908;-  const SWord8  s910 = s904 ^ s909;-  const SWord8  s911 = table2[s885];-  const SWord8  s912 = table3[s887];-  const SWord8  s913 = table4[s889];-  const SWord8  s914 = table1[s891];-  const SWord8  s915 = s913 ^ s914;-  const SWord8  s916 = s912 ^ s915;-  const SWord8  s917 = s911 ^ s916;-  const SWord16 s918 = (((SWord16) s910) << 8) | ((SWord16) s917);-  const SWord32 s919 = (((SWord32) s903) << 16) | ((SWord32) s918);-  const SWord8  s920 = (SWord8) (s360 >> 24);-  const SWord8  s921 = table1[s920];-  const SWord8  s922 = (SWord8) (s360 >> 16);-  const SWord8  s923 = table2[s922];-  const SWord8  s924 = (SWord8) (s360 >> 8);-  const SWord8  s925 = table3[s924];-  const SWord8  s926 = (SWord8) s360;-  const SWord8  s927 = table4[s926];-  const SWord8  s928 = s925 ^ s927;-  const SWord8  s929 = s923 ^ s928;-  const SWord8  s930 = s921 ^ s929;-  const SWord8  s931 = table4[s920];-  const SWord8  s932 = table1[s922];-  const SWord8  s933 = table2[s924];-  const SWord8  s934 = table3[s926];-  const SWord8  s935 = s933 ^ s934;-  const SWord8  s936 = s932 ^ s935;-  const SWord8  s937 = s931 ^ s936;-  const SWord16 s938 = (((SWord16) s930) << 8) | ((SWord16) s937);-  const SWord8  s939 = table3[s920];-  const SWord8  s940 = table4[s922];-  const SWord8  s941 = table1[s924];-  const SWord8  s942 = table2[s926];-  const SWord8  s943 = s941 ^ s942;-  const SWord8  s944 = s940 ^ s943;-  const SWord8  s945 = s939 ^ s944;-  const SWord8  s946 = table2[s920];-  const SWord8  s947 = table3[s922];-  const SWord8  s948 = table4[s924];-  const SWord8  s949 = table1[s926];-  const SWord8  s950 = s948 ^ s949;-  const SWord8  s951 = s947 ^ s950;-  const SWord8  s952 = s946 ^ s951;-  const SWord16 s953 = (((SWord16) s945) << 8) | ((SWord16) s952);-  const SWord32 s954 = (((SWord32) s938) << 16) | ((SWord32) s953);-  const SWord8  s955 = (SWord8) (s361 >> 24);-  const SWord8  s956 = table1[s955];-  const SWord8  s957 = (SWord8) (s361 >> 16);-  const SWord8  s958 = table2[s957];-  const SWord8  s959 = (SWord8) (s361 >> 8);-  const SWord8  s960 = table3[s959];-  const SWord8  s961 = (SWord8) s361;-  const SWord8  s962 = table4[s961];-  const SWord8  s963 = s960 ^ s962;-  const SWord8  s964 = s958 ^ s963;-  const SWord8  s965 = s956 ^ s964;-  const SWord8  s966 = table4[s955];-  const SWord8  s967 = table1[s957];-  const SWord8  s968 = table2[s959];-  const SWord8  s969 = table3[s961];-  const SWord8  s970 = s968 ^ s969;-  const SWord8  s971 = s967 ^ s970;-  const SWord8  s972 = s966 ^ s971;-  const SWord16 s973 = (((SWord16) s965) << 8) | ((SWord16) s972);-  const SWord8  s974 = table3[s955];-  const SWord8  s975 = table4[s957];-  const SWord8  s976 = table1[s959];-  const SWord8  s977 = table2[s961];-  const SWord8  s978 = s976 ^ s977;-  const SWord8  s979 = s975 ^ s978;-  const SWord8  s980 = s974 ^ s979;-  const SWord8  s981 = table2[s955];-  const SWord8  s982 = table3[s957];-  const SWord8  s983 = table4[s959];-  const SWord8  s984 = table1[s961];-  const SWord8  s985 = s983 ^ s984;-  const SWord8  s986 = s982 ^ s985;-  const SWord8  s987 = s981 ^ s986;-  const SWord16 s988 = (((SWord16) s980) << 8) | ((SWord16) s987);-  const SWord32 s989 = (((SWord32) s973) << 16) | ((SWord32) s988);-  const SWord8  s990 = (SWord8) (s341 >> 24);-  const SWord8  s991 = table1[s990];-  const SWord8  s992 = (SWord8) (s341 >> 16);-  const SWord8  s993 = table2[s992];-  const SWord8  s994 = (SWord8) (s341 >> 8);-  const SWord8  s995 = table3[s994];-  const SWord8  s996 = (SWord8) s341;-  const SWord8  s997 = table4[s996];-  const SWord8  s998 = s995 ^ s997;-  const SWord8  s999 = s993 ^ s998;-  const SWord8  s1000 = s991 ^ s999;-  const SWord8  s1001 = table4[s990];-  const SWord8  s1002 = table1[s992];-  const SWord8  s1003 = table2[s994];-  const SWord8  s1004 = table3[s996];-  const SWord8  s1005 = s1003 ^ s1004;-  const SWord8  s1006 = s1002 ^ s1005;-  const SWord8  s1007 = s1001 ^ s1006;-  const SWord16 s1008 = (((SWord16) s1000) << 8) | ((SWord16) s1007);-  const SWord8  s1009 = table3[s990];-  const SWord8  s1010 = table4[s992];-  const SWord8  s1011 = table1[s994];-  const SWord8  s1012 = table2[s996];-  const SWord8  s1013 = s1011 ^ s1012;-  const SWord8  s1014 = s1010 ^ s1013;-  const SWord8  s1015 = s1009 ^ s1014;-  const SWord8  s1016 = table2[s990];-  const SWord8  s1017 = table3[s992];-  const SWord8  s1018 = table4[s994];-  const SWord8  s1019 = table1[s996];-  const SWord8  s1020 = s1018 ^ s1019;-  const SWord8  s1021 = s1017 ^ s1020;-  const SWord8  s1022 = s1016 ^ s1021;-  const SWord16 s1023 = (((SWord16) s1015) << 8) | ((SWord16) s1022);-  const SWord32 s1024 = (((SWord32) s1008) << 16) | ((SWord32) s1023);-  const SWord8  s1025 = (SWord8) (s342 >> 24);-  const SWord8  s1026 = table1[s1025];-  const SWord8  s1027 = (SWord8) (s342 >> 16);-  const SWord8  s1028 = table2[s1027];-  const SWord8  s1029 = (SWord8) (s342 >> 8);-  const SWord8  s1030 = table3[s1029];-  const SWord8  s1031 = (SWord8) s342;-  const SWord8  s1032 = table4[s1031];-  const SWord8  s1033 = s1030 ^ s1032;-  const SWord8  s1034 = s1028 ^ s1033;-  const SWord8  s1035 = s1026 ^ s1034;-  const SWord8  s1036 = table4[s1025];-  const SWord8  s1037 = table1[s1027];-  const SWord8  s1038 = table2[s1029];-  const SWord8  s1039 = table3[s1031];-  const SWord8  s1040 = s1038 ^ s1039;-  const SWord8  s1041 = s1037 ^ s1040;-  const SWord8  s1042 = s1036 ^ s1041;-  const SWord16 s1043 = (((SWord16) s1035) << 8) | ((SWord16) s1042);-  const SWord8  s1044 = table3[s1025];-  const SWord8  s1045 = table4[s1027];-  const SWord8  s1046 = table1[s1029];-  const SWord8  s1047 = table2[s1031];-  const SWord8  s1048 = s1046 ^ s1047;-  const SWord8  s1049 = s1045 ^ s1048;-  const SWord8  s1050 = s1044 ^ s1049;-  const SWord8  s1051 = table2[s1025];-  const SWord8  s1052 = table3[s1027];-  const SWord8  s1053 = table4[s1029];-  const SWord8  s1054 = table1[s1031];-  const SWord8  s1055 = s1053 ^ s1054;-  const SWord8  s1056 = s1052 ^ s1055;-  const SWord8  s1057 = s1051 ^ s1056;-  const SWord16 s1058 = (((SWord16) s1050) << 8) | ((SWord16) s1057);-  const SWord32 s1059 = (((SWord32) s1043) << 16) | ((SWord32) s1058);-  const SWord8  s1060 = (SWord8) (s343 >> 24);-  const SWord8  s1061 = table1[s1060];-  const SWord8  s1062 = (SWord8) (s343 >> 16);-  const SWord8  s1063 = table2[s1062];-  const SWord8  s1064 = (SWord8) (s343 >> 8);-  const SWord8  s1065 = table3[s1064];-  const SWord8  s1066 = (SWord8) s343;-  const SWord8  s1067 = table4[s1066];-  const SWord8  s1068 = s1065 ^ s1067;-  const SWord8  s1069 = s1063 ^ s1068;-  const SWord8  s1070 = s1061 ^ s1069;-  const SWord8  s1071 = table4[s1060];-  const SWord8  s1072 = table1[s1062];-  const SWord8  s1073 = table2[s1064];-  const SWord8  s1074 = table3[s1066];-  const SWord8  s1075 = s1073 ^ s1074;-  const SWord8  s1076 = s1072 ^ s1075;-  const SWord8  s1077 = s1071 ^ s1076;-  const SWord16 s1078 = (((SWord16) s1070) << 8) | ((SWord16) s1077);-  const SWord8  s1079 = table3[s1060];-  const SWord8  s1080 = table4[s1062];-  const SWord8  s1081 = table1[s1064];-  const SWord8  s1082 = table2[s1066];-  const SWord8  s1083 = s1081 ^ s1082;-  const SWord8  s1084 = s1080 ^ s1083;-  const SWord8  s1085 = s1079 ^ s1084;-  const SWord8  s1086 = table2[s1060];-  const SWord8  s1087 = table3[s1062];-  const SWord8  s1088 = table4[s1064];-  const SWord8  s1089 = table1[s1066];-  const SWord8  s1090 = s1088 ^ s1089;-  const SWord8  s1091 = s1087 ^ s1090;-  const SWord8  s1092 = s1086 ^ s1091;-  const SWord16 s1093 = (((SWord16) s1085) << 8) | ((SWord16) s1092);-  const SWord32 s1094 = (((SWord32) s1078) << 16) | ((SWord32) s1093);-  const SWord8  s1095 = (SWord8) (s344 >> 24);-  const SWord8  s1096 = table1[s1095];-  const SWord8  s1097 = (SWord8) (s344 >> 16);-  const SWord8  s1098 = table2[s1097];-  const SWord8  s1099 = (SWord8) (s344 >> 8);-  const SWord8  s1100 = table3[s1099];-  const SWord8  s1101 = (SWord8) s344;-  const SWord8  s1102 = table4[s1101];-  const SWord8  s1103 = s1100 ^ s1102;-  const SWord8  s1104 = s1098 ^ s1103;-  const SWord8  s1105 = s1096 ^ s1104;-  const SWord8  s1106 = table4[s1095];-  const SWord8  s1107 = table1[s1097];-  const SWord8  s1108 = table2[s1099];-  const SWord8  s1109 = table3[s1101];-  const SWord8  s1110 = s1108 ^ s1109;-  const SWord8  s1111 = s1107 ^ s1110;-  const SWord8  s1112 = s1106 ^ s1111;-  const SWord16 s1113 = (((SWord16) s1105) << 8) | ((SWord16) s1112);-  const SWord8  s1114 = table3[s1095];-  const SWord8  s1115 = table4[s1097];-  const SWord8  s1116 = table1[s1099];-  const SWord8  s1117 = table2[s1101];-  const SWord8  s1118 = s1116 ^ s1117;-  const SWord8  s1119 = s1115 ^ s1118;-  const SWord8  s1120 = s1114 ^ s1119;-  const SWord8  s1121 = table2[s1095];-  const SWord8  s1122 = table3[s1097];-  const SWord8  s1123 = table4[s1099];-  const SWord8  s1124 = table1[s1101];-  const SWord8  s1125 = s1123 ^ s1124;-  const SWord8  s1126 = s1122 ^ s1125;-  const SWord8  s1127 = s1121 ^ s1126;-  const SWord16 s1128 = (((SWord16) s1120) << 8) | ((SWord16) s1127);-  const SWord32 s1129 = (((SWord32) s1113) << 16) | ((SWord32) s1128);-  const SWord8  s1130 = (SWord8) (s324 >> 24);-  const SWord8  s1131 = table1[s1130];-  const SWord8  s1132 = (SWord8) (s324 >> 16);-  const SWord8  s1133 = table2[s1132];-  const SWord8  s1134 = (SWord8) (s324 >> 8);-  const SWord8  s1135 = table3[s1134];-  const SWord8  s1136 = (SWord8) s324;-  const SWord8  s1137 = table4[s1136];-  const SWord8  s1138 = s1135 ^ s1137;-  const SWord8  s1139 = s1133 ^ s1138;-  const SWord8  s1140 = s1131 ^ s1139;-  const SWord8  s1141 = table4[s1130];-  const SWord8  s1142 = table1[s1132];-  const SWord8  s1143 = table2[s1134];-  const SWord8  s1144 = table3[s1136];-  const SWord8  s1145 = s1143 ^ s1144;-  const SWord8  s1146 = s1142 ^ s1145;-  const SWord8  s1147 = s1141 ^ s1146;-  const SWord16 s1148 = (((SWord16) s1140) << 8) | ((SWord16) s1147);-  const SWord8  s1149 = table3[s1130];-  const SWord8  s1150 = table4[s1132];-  const SWord8  s1151 = table1[s1134];-  const SWord8  s1152 = table2[s1136];-  const SWord8  s1153 = s1151 ^ s1152;-  const SWord8  s1154 = s1150 ^ s1153;-  const SWord8  s1155 = s1149 ^ s1154;-  const SWord8  s1156 = table2[s1130];-  const SWord8  s1157 = table3[s1132];-  const SWord8  s1158 = table4[s1134];-  const SWord8  s1159 = table1[s1136];-  const SWord8  s1160 = s1158 ^ s1159;-  const SWord8  s1161 = s1157 ^ s1160;-  const SWord8  s1162 = s1156 ^ s1161;-  const SWord16 s1163 = (((SWord16) s1155) << 8) | ((SWord16) s1162);-  const SWord32 s1164 = (((SWord32) s1148) << 16) | ((SWord32) s1163);-  const SWord8  s1165 = (SWord8) (s325 >> 24);-  const SWord8  s1166 = table1[s1165];-  const SWord8  s1167 = (SWord8) (s325 >> 16);-  const SWord8  s1168 = table2[s1167];-  const SWord8  s1169 = (SWord8) (s325 >> 8);-  const SWord8  s1170 = table3[s1169];-  const SWord8  s1171 = (SWord8) s325;-  const SWord8  s1172 = table4[s1171];-  const SWord8  s1173 = s1170 ^ s1172;-  const SWord8  s1174 = s1168 ^ s1173;-  const SWord8  s1175 = s1166 ^ s1174;-  const SWord8  s1176 = table4[s1165];-  const SWord8  s1177 = table1[s1167];-  const SWord8  s1178 = table2[s1169];-  const SWord8  s1179 = table3[s1171];-  const SWord8  s1180 = s1178 ^ s1179;-  const SWord8  s1181 = s1177 ^ s1180;-  const SWord8  s1182 = s1176 ^ s1181;-  const SWord16 s1183 = (((SWord16) s1175) << 8) | ((SWord16) s1182);-  const SWord8  s1184 = table3[s1165];-  const SWord8  s1185 = table4[s1167];-  const SWord8  s1186 = table1[s1169];-  const SWord8  s1187 = table2[s1171];-  const SWord8  s1188 = s1186 ^ s1187;-  const SWord8  s1189 = s1185 ^ s1188;-  const SWord8  s1190 = s1184 ^ s1189;-  const SWord8  s1191 = table2[s1165];-  const SWord8  s1192 = table3[s1167];-  const SWord8  s1193 = table4[s1169];-  const SWord8  s1194 = table1[s1171];-  const SWord8  s1195 = s1193 ^ s1194;-  const SWord8  s1196 = s1192 ^ s1195;-  const SWord8  s1197 = s1191 ^ s1196;-  const SWord16 s1198 = (((SWord16) s1190) << 8) | ((SWord16) s1197);-  const SWord32 s1199 = (((SWord32) s1183) << 16) | ((SWord32) s1198);-  const SWord8  s1200 = (SWord8) (s326 >> 24);-  const SWord8  s1201 = table1[s1200];-  const SWord8  s1202 = (SWord8) (s326 >> 16);-  const SWord8  s1203 = table2[s1202];-  const SWord8  s1204 = (SWord8) (s326 >> 8);-  const SWord8  s1205 = table3[s1204];-  const SWord8  s1206 = (SWord8) s326;-  const SWord8  s1207 = table4[s1206];-  const SWord8  s1208 = s1205 ^ s1207;-  const SWord8  s1209 = s1203 ^ s1208;-  const SWord8  s1210 = s1201 ^ s1209;-  const SWord8  s1211 = table4[s1200];-  const SWord8  s1212 = table1[s1202];-  const SWord8  s1213 = table2[s1204];-  const SWord8  s1214 = table3[s1206];-  const SWord8  s1215 = s1213 ^ s1214;-  const SWord8  s1216 = s1212 ^ s1215;-  const SWord8  s1217 = s1211 ^ s1216;-  const SWord16 s1218 = (((SWord16) s1210) << 8) | ((SWord16) s1217);-  const SWord8  s1219 = table3[s1200];-  const SWord8  s1220 = table4[s1202];-  const SWord8  s1221 = table1[s1204];-  const SWord8  s1222 = table2[s1206];-  const SWord8  s1223 = s1221 ^ s1222;-  const SWord8  s1224 = s1220 ^ s1223;-  const SWord8  s1225 = s1219 ^ s1224;-  const SWord8  s1226 = table2[s1200];-  const SWord8  s1227 = table3[s1202];-  const SWord8  s1228 = table4[s1204];-  const SWord8  s1229 = table1[s1206];-  const SWord8  s1230 = s1228 ^ s1229;-  const SWord8  s1231 = s1227 ^ s1230;-  const SWord8  s1232 = s1226 ^ s1231;-  const SWord16 s1233 = (((SWord16) s1225) << 8) | ((SWord16) s1232);-  const SWord32 s1234 = (((SWord32) s1218) << 16) | ((SWord32) s1233);-  const SWord8  s1235 = (SWord8) (s327 >> 24);-  const SWord8  s1236 = table1[s1235];-  const SWord8  s1237 = (SWord8) (s327 >> 16);-  const SWord8  s1238 = table2[s1237];-  const SWord8  s1239 = (SWord8) (s327 >> 8);-  const SWord8  s1240 = table3[s1239];-  const SWord8  s1241 = (SWord8) s327;-  const SWord8  s1242 = table4[s1241];-  const SWord8  s1243 = s1240 ^ s1242;-  const SWord8  s1244 = s1238 ^ s1243;-  const SWord8  s1245 = s1236 ^ s1244;-  const SWord8  s1246 = table4[s1235];-  const SWord8  s1247 = table1[s1237];-  const SWord8  s1248 = table2[s1239];-  const SWord8  s1249 = table3[s1241];-  const SWord8  s1250 = s1248 ^ s1249;-  const SWord8  s1251 = s1247 ^ s1250;-  const SWord8  s1252 = s1246 ^ s1251;-  const SWord16 s1253 = (((SWord16) s1245) << 8) | ((SWord16) s1252);-  const SWord8  s1254 = table3[s1235];-  const SWord8  s1255 = table4[s1237];-  const SWord8  s1256 = table1[s1239];-  const SWord8  s1257 = table2[s1241];-  const SWord8  s1258 = s1256 ^ s1257;-  const SWord8  s1259 = s1255 ^ s1258;-  const SWord8  s1260 = s1254 ^ s1259;-  const SWord8  s1261 = table2[s1235];-  const SWord8  s1262 = table3[s1237];-  const SWord8  s1263 = table4[s1239];-  const SWord8  s1264 = table1[s1241];-  const SWord8  s1265 = s1263 ^ s1264;-  const SWord8  s1266 = s1262 ^ s1265;-  const SWord8  s1267 = s1261 ^ s1266;-  const SWord16 s1268 = (((SWord16) s1260) << 8) | ((SWord16) s1267);-  const SWord32 s1269 = (((SWord32) s1253) << 16) | ((SWord32) s1268);-  const SWord8  s1270 = (SWord8) (s307 >> 24);-  const SWord8  s1271 = table1[s1270];-  const SWord8  s1272 = (SWord8) (s307 >> 16);-  const SWord8  s1273 = table2[s1272];-  const SWord8  s1274 = (SWord8) (s307 >> 8);-  const SWord8  s1275 = table3[s1274];-  const SWord8  s1276 = (SWord8) s307;-  const SWord8  s1277 = table4[s1276];-  const SWord8  s1278 = s1275 ^ s1277;-  const SWord8  s1279 = s1273 ^ s1278;-  const SWord8  s1280 = s1271 ^ s1279;-  const SWord8  s1281 = table4[s1270];-  const SWord8  s1282 = table1[s1272];-  const SWord8  s1283 = table2[s1274];-  const SWord8  s1284 = table3[s1276];-  const SWord8  s1285 = s1283 ^ s1284;-  const SWord8  s1286 = s1282 ^ s1285;-  const SWord8  s1287 = s1281 ^ s1286;-  const SWord16 s1288 = (((SWord16) s1280) << 8) | ((SWord16) s1287);-  const SWord8  s1289 = table3[s1270];-  const SWord8  s1290 = table4[s1272];-  const SWord8  s1291 = table1[s1274];-  const SWord8  s1292 = table2[s1276];-  const SWord8  s1293 = s1291 ^ s1292;-  const SWord8  s1294 = s1290 ^ s1293;-  const SWord8  s1295 = s1289 ^ s1294;-  const SWord8  s1296 = table2[s1270];-  const SWord8  s1297 = table3[s1272];-  const SWord8  s1298 = table4[s1274];-  const SWord8  s1299 = table1[s1276];-  const SWord8  s1300 = s1298 ^ s1299;-  const SWord8  s1301 = s1297 ^ s1300;-  const SWord8  s1302 = s1296 ^ s1301;-  const SWord16 s1303 = (((SWord16) s1295) << 8) | ((SWord16) s1302);-  const SWord32 s1304 = (((SWord32) s1288) << 16) | ((SWord32) s1303);-  const SWord8  s1305 = (SWord8) (s308 >> 24);-  const SWord8  s1306 = table1[s1305];-  const SWord8  s1307 = (SWord8) (s308 >> 16);-  const SWord8  s1308 = table2[s1307];-  const SWord8  s1309 = (SWord8) (s308 >> 8);-  const SWord8  s1310 = table3[s1309];-  const SWord8  s1311 = (SWord8) s308;-  const SWord8  s1312 = table4[s1311];-  const SWord8  s1313 = s1310 ^ s1312;-  const SWord8  s1314 = s1308 ^ s1313;-  const SWord8  s1315 = s1306 ^ s1314;-  const SWord8  s1316 = table4[s1305];-  const SWord8  s1317 = table1[s1307];-  const SWord8  s1318 = table2[s1309];-  const SWord8  s1319 = table3[s1311];-  const SWord8  s1320 = s1318 ^ s1319;-  const SWord8  s1321 = s1317 ^ s1320;-  const SWord8  s1322 = s1316 ^ s1321;-  const SWord16 s1323 = (((SWord16) s1315) << 8) | ((SWord16) s1322);-  const SWord8  s1324 = table3[s1305];-  const SWord8  s1325 = table4[s1307];-  const SWord8  s1326 = table1[s1309];-  const SWord8  s1327 = table2[s1311];-  const SWord8  s1328 = s1326 ^ s1327;-  const SWord8  s1329 = s1325 ^ s1328;-  const SWord8  s1330 = s1324 ^ s1329;-  const SWord8  s1331 = table2[s1305];-  const SWord8  s1332 = table3[s1307];-  const SWord8  s1333 = table4[s1309];-  const SWord8  s1334 = table1[s1311];-  const SWord8  s1335 = s1333 ^ s1334;-  const SWord8  s1336 = s1332 ^ s1335;-  const SWord8  s1337 = s1331 ^ s1336;-  const SWord16 s1338 = (((SWord16) s1330) << 8) | ((SWord16) s1337);-  const SWord32 s1339 = (((SWord32) s1323) << 16) | ((SWord32) s1338);-  const SWord8  s1340 = (SWord8) (s309 >> 24);-  const SWord8  s1341 = table1[s1340];-  const SWord8  s1342 = (SWord8) (s309 >> 16);-  const SWord8  s1343 = table2[s1342];-  const SWord8  s1344 = (SWord8) (s309 >> 8);-  const SWord8  s1345 = table3[s1344];-  const SWord8  s1346 = (SWord8) s309;-  const SWord8  s1347 = table4[s1346];-  const SWord8  s1348 = s1345 ^ s1347;-  const SWord8  s1349 = s1343 ^ s1348;-  const SWord8  s1350 = s1341 ^ s1349;-  const SWord8  s1351 = table4[s1340];-  const SWord8  s1352 = table1[s1342];-  const SWord8  s1353 = table2[s1344];-  const SWord8  s1354 = table3[s1346];-  const SWord8  s1355 = s1353 ^ s1354;-  const SWord8  s1356 = s1352 ^ s1355;-  const SWord8  s1357 = s1351 ^ s1356;-  const SWord16 s1358 = (((SWord16) s1350) << 8) | ((SWord16) s1357);-  const SWord8  s1359 = table3[s1340];-  const SWord8  s1360 = table4[s1342];-  const SWord8  s1361 = table1[s1344];-  const SWord8  s1362 = table2[s1346];-  const SWord8  s1363 = s1361 ^ s1362;-  const SWord8  s1364 = s1360 ^ s1363;-  const SWord8  s1365 = s1359 ^ s1364;-  const SWord8  s1366 = table2[s1340];-  const SWord8  s1367 = table3[s1342];-  const SWord8  s1368 = table4[s1344];-  const SWord8  s1369 = table1[s1346];-  const SWord8  s1370 = s1368 ^ s1369;-  const SWord8  s1371 = s1367 ^ s1370;-  const SWord8  s1372 = s1366 ^ s1371;-  const SWord16 s1373 = (((SWord16) s1365) << 8) | ((SWord16) s1372);-  const SWord32 s1374 = (((SWord32) s1358) << 16) | ((SWord32) s1373);-  const SWord8  s1375 = (SWord8) (s310 >> 24);-  const SWord8  s1376 = table1[s1375];-  const SWord8  s1377 = (SWord8) (s310 >> 16);-  const SWord8  s1378 = table2[s1377];-  const SWord8  s1379 = (SWord8) (s310 >> 8);-  const SWord8  s1380 = table3[s1379];-  const SWord8  s1381 = (SWord8) s310;-  const SWord8  s1382 = table4[s1381];-  const SWord8  s1383 = s1380 ^ s1382;-  const SWord8  s1384 = s1378 ^ s1383;-  const SWord8  s1385 = s1376 ^ s1384;-  const SWord8  s1386 = table4[s1375];-  const SWord8  s1387 = table1[s1377];-  const SWord8  s1388 = table2[s1379];-  const SWord8  s1389 = table3[s1381];-  const SWord8  s1390 = s1388 ^ s1389;-  const SWord8  s1391 = s1387 ^ s1390;-  const SWord8  s1392 = s1386 ^ s1391;-  const SWord16 s1393 = (((SWord16) s1385) << 8) | ((SWord16) s1392);-  const SWord8  s1394 = table3[s1375];-  const SWord8  s1395 = table4[s1377];-  const SWord8  s1396 = table1[s1379];-  const SWord8  s1397 = table2[s1381];-  const SWord8  s1398 = s1396 ^ s1397;-  const SWord8  s1399 = s1395 ^ s1398;-  const SWord8  s1400 = s1394 ^ s1399;-  const SWord8  s1401 = table2[s1375];-  const SWord8  s1402 = table3[s1377];-  const SWord8  s1403 = table4[s1379];-  const SWord8  s1404 = table1[s1381];-  const SWord8  s1405 = s1403 ^ s1404;-  const SWord8  s1406 = s1402 ^ s1405;-  const SWord8  s1407 = s1401 ^ s1406;-  const SWord16 s1408 = (((SWord16) s1400) << 8) | ((SWord16) s1407);-  const SWord32 s1409 = (((SWord32) s1393) << 16) | ((SWord32) s1408);-  const SWord8  s1410 = (SWord8) (s290 >> 24);-  const SWord8  s1411 = table1[s1410];-  const SWord8  s1412 = (SWord8) (s290 >> 16);-  const SWord8  s1413 = table2[s1412];-  const SWord8  s1414 = (SWord8) (s290 >> 8);-  const SWord8  s1415 = table3[s1414];-  const SWord8  s1416 = (SWord8) s290;-  const SWord8  s1417 = table4[s1416];-  const SWord8  s1418 = s1415 ^ s1417;-  const SWord8  s1419 = s1413 ^ s1418;-  const SWord8  s1420 = s1411 ^ s1419;-  const SWord8  s1421 = table4[s1410];-  const SWord8  s1422 = table1[s1412];-  const SWord8  s1423 = table2[s1414];-  const SWord8  s1424 = table3[s1416];-  const SWord8  s1425 = s1423 ^ s1424;-  const SWord8  s1426 = s1422 ^ s1425;-  const SWord8  s1427 = s1421 ^ s1426;-  const SWord16 s1428 = (((SWord16) s1420) << 8) | ((SWord16) s1427);-  const SWord8  s1429 = table3[s1410];-  const SWord8  s1430 = table4[s1412];-  const SWord8  s1431 = table1[s1414];-  const SWord8  s1432 = table2[s1416];-  const SWord8  s1433 = s1431 ^ s1432;-  const SWord8  s1434 = s1430 ^ s1433;-  const SWord8  s1435 = s1429 ^ s1434;-  const SWord8  s1436 = table2[s1410];-  const SWord8  s1437 = table3[s1412];-  const SWord8  s1438 = table4[s1414];-  const SWord8  s1439 = table1[s1416];-  const SWord8  s1440 = s1438 ^ s1439;-  const SWord8  s1441 = s1437 ^ s1440;-  const SWord8  s1442 = s1436 ^ s1441;-  const SWord16 s1443 = (((SWord16) s1435) << 8) | ((SWord16) s1442);-  const SWord32 s1444 = (((SWord32) s1428) << 16) | ((SWord32) s1443);-  const SWord8  s1445 = (SWord8) (s291 >> 24);-  const SWord8  s1446 = table1[s1445];-  const SWord8  s1447 = (SWord8) (s291 >> 16);-  const SWord8  s1448 = table2[s1447];-  const SWord8  s1449 = (SWord8) (s291 >> 8);-  const SWord8  s1450 = table3[s1449];-  const SWord8  s1451 = (SWord8) s291;-  const SWord8  s1452 = table4[s1451];-  const SWord8  s1453 = s1450 ^ s1452;-  const SWord8  s1454 = s1448 ^ s1453;-  const SWord8  s1455 = s1446 ^ s1454;-  const SWord8  s1456 = table4[s1445];-  const SWord8  s1457 = table1[s1447];-  const SWord8  s1458 = table2[s1449];-  const SWord8  s1459 = table3[s1451];-  const SWord8  s1460 = s1458 ^ s1459;-  const SWord8  s1461 = s1457 ^ s1460;-  const SWord8  s1462 = s1456 ^ s1461;-  const SWord16 s1463 = (((SWord16) s1455) << 8) | ((SWord16) s1462);-  const SWord8  s1464 = table3[s1445];-  const SWord8  s1465 = table4[s1447];-  const SWord8  s1466 = table1[s1449];-  const SWord8  s1467 = table2[s1451];-  const SWord8  s1468 = s1466 ^ s1467;-  const SWord8  s1469 = s1465 ^ s1468;-  const SWord8  s1470 = s1464 ^ s1469;-  const SWord8  s1471 = table2[s1445];-  const SWord8  s1472 = table3[s1447];-  const SWord8  s1473 = table4[s1449];-  const SWord8  s1474 = table1[s1451];-  const SWord8  s1475 = s1473 ^ s1474;-  const SWord8  s1476 = s1472 ^ s1475;-  const SWord8  s1477 = s1471 ^ s1476;-  const SWord16 s1478 = (((SWord16) s1470) << 8) | ((SWord16) s1477);-  const SWord32 s1479 = (((SWord32) s1463) << 16) | ((SWord32) s1478);-  const SWord8  s1480 = (SWord8) (s292 >> 24);-  const SWord8  s1481 = table1[s1480];-  const SWord8  s1482 = (SWord8) (s292 >> 16);-  const SWord8  s1483 = table2[s1482];-  const SWord8  s1484 = (SWord8) (s292 >> 8);-  const SWord8  s1485 = table3[s1484];-  const SWord8  s1486 = (SWord8) s292;-  const SWord8  s1487 = table4[s1486];-  const SWord8  s1488 = s1485 ^ s1487;-  const SWord8  s1489 = s1483 ^ s1488;-  const SWord8  s1490 = s1481 ^ s1489;-  const SWord8  s1491 = table4[s1480];-  const SWord8  s1492 = table1[s1482];-  const SWord8  s1493 = table2[s1484];-  const SWord8  s1494 = table3[s1486];-  const SWord8  s1495 = s1493 ^ s1494;-  const SWord8  s1496 = s1492 ^ s1495;-  const SWord8  s1497 = s1491 ^ s1496;-  const SWord16 s1498 = (((SWord16) s1490) << 8) | ((SWord16) s1497);-  const SWord8  s1499 = table3[s1480];-  const SWord8  s1500 = table4[s1482];-  const SWord8  s1501 = table1[s1484];-  const SWord8  s1502 = table2[s1486];-  const SWord8  s1503 = s1501 ^ s1502;-  const SWord8  s1504 = s1500 ^ s1503;-  const SWord8  s1505 = s1499 ^ s1504;-  const SWord8  s1506 = table2[s1480];-  const SWord8  s1507 = table3[s1482];-  const SWord8  s1508 = table4[s1484];-  const SWord8  s1509 = table1[s1486];-  const SWord8  s1510 = s1508 ^ s1509;-  const SWord8  s1511 = s1507 ^ s1510;-  const SWord8  s1512 = s1506 ^ s1511;-  const SWord16 s1513 = (((SWord16) s1505) << 8) | ((SWord16) s1512);-  const SWord32 s1514 = (((SWord32) s1498) << 16) | ((SWord32) s1513);-  const SWord8  s1515 = (SWord8) (s293 >> 24);-  const SWord8  s1516 = table1[s1515];-  const SWord8  s1517 = (SWord8) (s293 >> 16);-  const SWord8  s1518 = table2[s1517];-  const SWord8  s1519 = (SWord8) (s293 >> 8);-  const SWord8  s1520 = table3[s1519];-  const SWord8  s1521 = (SWord8) s293;-  const SWord8  s1522 = table4[s1521];-  const SWord8  s1523 = s1520 ^ s1522;-  const SWord8  s1524 = s1518 ^ s1523;-  const SWord8  s1525 = s1516 ^ s1524;-  const SWord8  s1526 = table4[s1515];-  const SWord8  s1527 = table1[s1517];-  const SWord8  s1528 = table2[s1519];-  const SWord8  s1529 = table3[s1521];-  const SWord8  s1530 = s1528 ^ s1529;-  const SWord8  s1531 = s1527 ^ s1530;-  const SWord8  s1532 = s1526 ^ s1531;-  const SWord16 s1533 = (((SWord16) s1525) << 8) | ((SWord16) s1532);-  const SWord8  s1534 = table3[s1515];-  const SWord8  s1535 = table4[s1517];-  const SWord8  s1536 = table1[s1519];-  const SWord8  s1537 = table2[s1521];-  const SWord8  s1538 = s1536 ^ s1537;-  const SWord8  s1539 = s1535 ^ s1538;-  const SWord8  s1540 = s1534 ^ s1539;-  const SWord8  s1541 = table2[s1515];-  const SWord8  s1542 = table3[s1517];-  const SWord8  s1543 = table4[s1519];-  const SWord8  s1544 = table1[s1521];-  const SWord8  s1545 = s1543 ^ s1544;-  const SWord8  s1546 = s1542 ^ s1545;-  const SWord8  s1547 = s1541 ^ s1546;-  const SWord16 s1548 = (((SWord16) s1540) << 8) | ((SWord16) s1547);-  const SWord32 s1549 = (((SWord32) s1533) << 16) | ((SWord32) s1548);-  const SWord8  s1550 = (SWord8) (s273 >> 24);-  const SWord8  s1551 = table1[s1550];-  const SWord8  s1552 = (SWord8) (s273 >> 16);-  const SWord8  s1553 = table2[s1552];-  const SWord8  s1554 = (SWord8) (s273 >> 8);-  const SWord8  s1555 = table3[s1554];-  const SWord8  s1556 = (SWord8) s273;-  const SWord8  s1557 = table4[s1556];-  const SWord8  s1558 = s1555 ^ s1557;-  const SWord8  s1559 = s1553 ^ s1558;-  const SWord8  s1560 = s1551 ^ s1559;-  const SWord8  s1561 = table4[s1550];-  const SWord8  s1562 = table1[s1552];-  const SWord8  s1563 = table2[s1554];-  const SWord8  s1564 = table3[s1556];-  const SWord8  s1565 = s1563 ^ s1564;-  const SWord8  s1566 = s1562 ^ s1565;-  const SWord8  s1567 = s1561 ^ s1566;-  const SWord16 s1568 = (((SWord16) s1560) << 8) | ((SWord16) s1567);-  const SWord8  s1569 = table3[s1550];-  const SWord8  s1570 = table4[s1552];-  const SWord8  s1571 = table1[s1554];-  const SWord8  s1572 = table2[s1556];-  const SWord8  s1573 = s1571 ^ s1572;-  const SWord8  s1574 = s1570 ^ s1573;-  const SWord8  s1575 = s1569 ^ s1574;-  const SWord8  s1576 = table2[s1550];-  const SWord8  s1577 = table3[s1552];-  const SWord8  s1578 = table4[s1554];-  const SWord8  s1579 = table1[s1556];-  const SWord8  s1580 = s1578 ^ s1579;-  const SWord8  s1581 = s1577 ^ s1580;-  const SWord8  s1582 = s1576 ^ s1581;-  const SWord16 s1583 = (((SWord16) s1575) << 8) | ((SWord16) s1582);-  const SWord32 s1584 = (((SWord32) s1568) << 16) | ((SWord32) s1583);-  const SWord8  s1585 = (SWord8) (s274 >> 24);-  const SWord8  s1586 = table1[s1585];-  const SWord8  s1587 = (SWord8) (s274 >> 16);-  const SWord8  s1588 = table2[s1587];-  const SWord8  s1589 = (SWord8) (s274 >> 8);-  const SWord8  s1590 = table3[s1589];-  const SWord8  s1591 = (SWord8) s274;-  const SWord8  s1592 = table4[s1591];-  const SWord8  s1593 = s1590 ^ s1592;-  const SWord8  s1594 = s1588 ^ s1593;-  const SWord8  s1595 = s1586 ^ s1594;-  const SWord8  s1596 = table4[s1585];-  const SWord8  s1597 = table1[s1587];-  const SWord8  s1598 = table2[s1589];-  const SWord8  s1599 = table3[s1591];-  const SWord8  s1600 = s1598 ^ s1599;-  const SWord8  s1601 = s1597 ^ s1600;-  const SWord8  s1602 = s1596 ^ s1601;-  const SWord16 s1603 = (((SWord16) s1595) << 8) | ((SWord16) s1602);-  const SWord8  s1604 = table3[s1585];-  const SWord8  s1605 = table4[s1587];-  const SWord8  s1606 = table1[s1589];-  const SWord8  s1607 = table2[s1591];-  const SWord8  s1608 = s1606 ^ s1607;-  const SWord8  s1609 = s1605 ^ s1608;-  const SWord8  s1610 = s1604 ^ s1609;-  const SWord8  s1611 = table2[s1585];-  const SWord8  s1612 = table3[s1587];-  const SWord8  s1613 = table4[s1589];-  const SWord8  s1614 = table1[s1591];-  const SWord8  s1615 = s1613 ^ s1614;-  const SWord8  s1616 = s1612 ^ s1615;-  const SWord8  s1617 = s1611 ^ s1616;-  const SWord16 s1618 = (((SWord16) s1610) << 8) | ((SWord16) s1617);-  const SWord32 s1619 = (((SWord32) s1603) << 16) | ((SWord32) s1618);-  const SWord8  s1620 = (SWord8) (s275 >> 24);-  const SWord8  s1621 = table1[s1620];-  const SWord8  s1622 = (SWord8) (s275 >> 16);-  const SWord8  s1623 = table2[s1622];-  const SWord8  s1624 = (SWord8) (s275 >> 8);-  const SWord8  s1625 = table3[s1624];-  const SWord8  s1626 = (SWord8) s275;-  const SWord8  s1627 = table4[s1626];-  const SWord8  s1628 = s1625 ^ s1627;-  const SWord8  s1629 = s1623 ^ s1628;-  const SWord8  s1630 = s1621 ^ s1629;-  const SWord8  s1631 = table4[s1620];-  const SWord8  s1632 = table1[s1622];-  const SWord8  s1633 = table2[s1624];-  const SWord8  s1634 = table3[s1626];-  const SWord8  s1635 = s1633 ^ s1634;-  const SWord8  s1636 = s1632 ^ s1635;-  const SWord8  s1637 = s1631 ^ s1636;-  const SWord16 s1638 = (((SWord16) s1630) << 8) | ((SWord16) s1637);-  const SWord8  s1639 = table3[s1620];-  const SWord8  s1640 = table4[s1622];-  const SWord8  s1641 = table1[s1624];-  const SWord8  s1642 = table2[s1626];-  const SWord8  s1643 = s1641 ^ s1642;-  const SWord8  s1644 = s1640 ^ s1643;-  const SWord8  s1645 = s1639 ^ s1644;-  const SWord8  s1646 = table2[s1620];-  const SWord8  s1647 = table3[s1622];-  const SWord8  s1648 = table4[s1624];-  const SWord8  s1649 = table1[s1626];-  const SWord8  s1650 = s1648 ^ s1649;-  const SWord8  s1651 = s1647 ^ s1650;-  const SWord8  s1652 = s1646 ^ s1651;-  const SWord16 s1653 = (((SWord16) s1645) << 8) | ((SWord16) s1652);-  const SWord32 s1654 = (((SWord32) s1638) << 16) | ((SWord32) s1653);-  const SWord8  s1655 = (SWord8) (s276 >> 24);-  const SWord8  s1656 = table1[s1655];-  const SWord8  s1657 = (SWord8) (s276 >> 16);-  const SWord8  s1658 = table2[s1657];-  const SWord8  s1659 = (SWord8) (s276 >> 8);-  const SWord8  s1660 = table3[s1659];-  const SWord8  s1661 = (SWord8) s276;-  const SWord8  s1662 = table4[s1661];-  const SWord8  s1663 = s1660 ^ s1662;-  const SWord8  s1664 = s1658 ^ s1663;-  const SWord8  s1665 = s1656 ^ s1664;-  const SWord8  s1666 = table4[s1655];-  const SWord8  s1667 = table1[s1657];-  const SWord8  s1668 = table2[s1659];-  const SWord8  s1669 = table3[s1661];-  const SWord8  s1670 = s1668 ^ s1669;-  const SWord8  s1671 = s1667 ^ s1670;-  const SWord8  s1672 = s1666 ^ s1671;-  const SWord16 s1673 = (((SWord16) s1665) << 8) | ((SWord16) s1672);-  const SWord8  s1674 = table3[s1655];-  const SWord8  s1675 = table4[s1657];-  const SWord8  s1676 = table1[s1659];-  const SWord8  s1677 = table2[s1661];-  const SWord8  s1678 = s1676 ^ s1677;-  const SWord8  s1679 = s1675 ^ s1678;-  const SWord8  s1680 = s1674 ^ s1679;-  const SWord8  s1681 = table2[s1655];-  const SWord8  s1682 = table3[s1657];-  const SWord8  s1683 = table4[s1659];-  const SWord8  s1684 = table1[s1661];-  const SWord8  s1685 = s1683 ^ s1684;-  const SWord8  s1686 = s1682 ^ s1685;-  const SWord8  s1687 = s1681 ^ s1686;-  const SWord16 s1688 = (((SWord16) s1680) << 8) | ((SWord16) s1687);-  const SWord32 s1689 = (((SWord32) s1673) << 16) | ((SWord32) s1688);--  encKS[0] = s0;-  encKS[1] = s1;-  encKS[2] = s2;-  encKS[3] = s3;-  encKS[4] = s273;-  encKS[5] = s274;-  encKS[6] = s275;-  encKS[7] = s276;-  encKS[8] = s290;-  encKS[9] = s291;-  encKS[10] = s292;-  encKS[11] = s293;-  encKS[12] = s307;-  encKS[13] = s308;-  encKS[14] = s309;-  encKS[15] = s310;-  encKS[16] = s324;-  encKS[17] = s325;-  encKS[18] = s326;-  encKS[19] = s327;-  encKS[20] = s341;-  encKS[21] = s342;-  encKS[22] = s343;-  encKS[23] = s344;-  encKS[24] = s358;-  encKS[25] = s359;-  encKS[26] = s360;-  encKS[27] = s361;-  encKS[28] = s375;-  encKS[29] = s376;-  encKS[30] = s377;-  encKS[31] = s378;-  encKS[32] = s392;-  encKS[33] = s393;-  encKS[34] = s394;-  encKS[35] = s395;-  encKS[36] = s409;-  encKS[37] = s410;-  encKS[38] = s411;-  encKS[39] = s412;-  encKS[40] = s426;-  encKS[41] = s427;-  encKS[42] = s428;-  encKS[43] = s429;-  decKS[0] = s426;-  decKS[1] = s427;-  decKS[2] = s428;-  decKS[3] = s429;-  decKS[4] = s464;-  decKS[5] = s499;-  decKS[6] = s534;-  decKS[7] = s569;-  decKS[8] = s604;-  decKS[9] = s639;-  decKS[10] = s674;-  decKS[11] = s709;-  decKS[12] = s744;-  decKS[13] = s779;-  decKS[14] = s814;-  decKS[15] = s849;-  decKS[16] = s884;-  decKS[17] = s919;-  decKS[18] = s954;-  decKS[19] = s989;-  decKS[20] = s1024;-  decKS[21] = s1059;-  decKS[22] = s1094;-  decKS[23] = s1129;-  decKS[24] = s1164;-  decKS[25] = s1199;-  decKS[26] = s1234;-  decKS[27] = s1269;-  decKS[28] = s1304;-  decKS[29] = s1339;-  decKS[30] = s1374;-  decKS[31] = s1409;-  decKS[32] = s1444;-  decKS[33] = s1479;-  decKS[34] = s1514;-  decKS[35] = s1549;-  decKS[36] = s1584;-  decKS[37] = s1619;-  decKS[38] = s1654;-  decKS[39] = s1689;-  decKS[40] = s0;-  decKS[41] = s1;-  decKS[42] = s2;-  decKS[43] = s3;-}-== END: "aes128KeySchedule.c" ==================-== BEGIN: "aes128BlockEncrypt.c" ================-/* File: "aes128BlockEncrypt.c". Automatically generated by SBV. Do not edit! */--#include "aes128Lib.h"--void aes128BlockEncrypt(const SWord32 *pt, const SWord32 *xkey,-                        SWord32 *ct)-{-  const SWord32 s0 = pt[0];-  const SWord32 s1 = pt[1];-  const SWord32 s2 = pt[2];-  const SWord32 s3 = pt[3];-  const SWord32 s4 = xkey[0];-  const SWord32 s5 = xkey[1];-  const SWord32 s6 = xkey[2];-  const SWord32 s7 = xkey[3];-  const SWord32 s8 = xkey[4];-  const SWord32 s9 = xkey[5];-  const SWord32 s10 = xkey[6];-  const SWord32 s11 = xkey[7];-  const SWord32 s12 = xkey[8];-  const SWord32 s13 = xkey[9];-  const SWord32 s14 = xkey[10];-  const SWord32 s15 = xkey[11];-  const SWord32 s16 = xkey[12];-  const SWord32 s17 = xkey[13];-  const SWord32 s18 = xkey[14];-  const SWord32 s19 = xkey[15];-  const SWord32 s20 = xkey[16];-  const SWord32 s21 = xkey[17];-  const SWord32 s22 = xkey[18];-  const SWord32 s23 = xkey[19];-  const SWord32 s24 = xkey[20];-  const SWord32 s25 = xkey[21];-  const SWord32 s26 = xkey[22];-  const SWord32 s27 = xkey[23];-  const SWord32 s28 = xkey[24];-  const SWord32 s29 = xkey[25];-  const SWord32 s30 = xkey[26];-  const SWord32 s31 = xkey[27];-  const SWord32 s32 = xkey[28];-  const SWord32 s33 = xkey[29];-  const SWord32 s34 = xkey[30];-  const SWord32 s35 = xkey[31];-  const SWord32 s36 = xkey[32];-  const SWord32 s37 = xkey[33];-  const SWord32 s38 = xkey[34];-  const SWord32 s39 = xkey[35];-  const SWord32 s40 = xkey[36];-  const SWord32 s41 = xkey[37];-  const SWord32 s42 = xkey[38];-  const SWord32 s43 = xkey[39];-  const SWord32 s44 = xkey[40];-  const SWord32 s45 = xkey[41];-  const SWord32 s46 = xkey[42];-  const SWord32 s47 = xkey[43];-  static const SWord8 table0[] = {-       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,-      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,-      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,-      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,-       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,-      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,-       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,-       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,-       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,-      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,-       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,-      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,-      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,-      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,-       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,-       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,-      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,-      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,-      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,-      104,  65, 153,  45,  15, 176,  84, 187,  22-  };-  static const SWord32 table1[] = {-      0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,-      0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,-      0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,-      0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,-      0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,-      0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,-      0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,-      0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,-      0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,-      0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,-      0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,-      0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,-      0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,-      0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,-      0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,-      0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,-      0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,-      0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,-      0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,-      0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,-      0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,-      0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,-      0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,-      0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,-      0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,-      0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,-      0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,-      0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,-      0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,-      0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,-      0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,-      0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,-      0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,-      0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,-      0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,-      0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,-      0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,-      0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,-      0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,-      0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,-      0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,-      0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,-      0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,-      0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,-      0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,-      0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,-      0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,-      0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,-      0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,-      0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,-      0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,-      0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,-      0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,-      0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,-      0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,-      0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,-      0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,-      0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,-      0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,-      0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,-      0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,-      0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,-      0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,-      0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL-  };-  static const SWord32 table2[] = {-      0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,-      0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,-      0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,-      0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,-      0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,-      0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,-      0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,-      0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,-      0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,-      0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,-      0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,-      0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,-      0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,-      0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,-      0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,-      0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,-      0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,-      0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,-      0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,-      0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,-      0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,-      0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,-      0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,-      0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,-      0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,-      0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,-      0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,-      0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,-      0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,-      0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,-      0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,-      0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,-      0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,-      0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,-      0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,-      0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,-      0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,-      0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,-      0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,-      0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,-      0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,-      0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,-      0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,-      0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,-      0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,-      0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,-      0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,-      0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,-      0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,-      0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,-      0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,-      0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,-      0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,-      0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,-      0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,-      0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,-      0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,-      0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,-      0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,-      0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,-      0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,-      0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,-      0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,-      0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL-  };-  static const SWord32 table3[] = {-      0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,-      0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,-      0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,-      0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,-      0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,-      0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,-      0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,-      0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,-      0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,-      0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,-      0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,-      0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,-      0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,-      0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,-      0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,-      0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,-      0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,-      0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,-      0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,-      0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,-      0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,-      0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,-      0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,-      0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,-      0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,-      0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,-      0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,-      0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,-      0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,-      0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,-      0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,-      0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,-      0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,-      0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,-      0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,-      0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,-      0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,-      0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,-      0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,-      0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,-      0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,-      0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,-      0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,-      0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,-      0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,-      0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,-      0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,-      0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,-      0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,-      0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,-      0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,-      0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,-      0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,-      0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,-      0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,-      0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,-      0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,-      0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,-      0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,-      0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,-      0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,-      0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,-      0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,-      0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL-  };-  static const SWord32 table4[] = {-      0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,-      0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,-      0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,-      0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,-      0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,-      0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,-      0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,-      0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,-      0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,-      0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,-      0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,-      0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,-      0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,-      0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,-      0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,-      0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,-      0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,-      0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,-      0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,-      0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,-      0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,-      0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,-      0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,-      0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,-      0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,-      0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,-      0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,-      0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,-      0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,-      0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,-      0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,-      0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,-      0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,-      0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,-      0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,-      0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,-      0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,-      0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,-      0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,-      0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,-      0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,-      0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,-      0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,-      0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,-      0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,-      0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,-      0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,-      0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,-      0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,-      0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,-      0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,-      0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,-      0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,-      0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,-      0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,-      0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,-      0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,-      0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,-      0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,-      0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,-      0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,-      0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,-      0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,-      0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL-  };-  const SWord32 s560 = s0 ^ s4;-  const SWord8  s561 = (SWord8) (s560 >> 24);-  const SWord32 s562 = table1[s561];-  const SWord32 s818 = s1 ^ s5;-  const SWord8  s819 = (SWord8) (s818 >> 16);-  const SWord32 s820 = table2[s819];-  const SWord32 s821 = s562 ^ s820;-  const SWord32 s1077 = s2 ^ s6;-  const SWord8  s1078 = (SWord8) (s1077 >> 8);-  const SWord32 s1079 = table3[s1078];-  const SWord32 s1080 = s821 ^ s1079;-  const SWord32 s1336 = s3 ^ s7;-  const SWord8  s1337 = (SWord8) s1336;-  const SWord32 s1338 = table4[s1337];-  const SWord32 s1339 = s1080 ^ s1338;-  const SWord32 s1340 = s8 ^ s1339;-  const SWord8  s1341 = (SWord8) (s1340 >> 24);-  const SWord32 s1342 = table1[s1341];-  const SWord8  s1343 = (SWord8) (s818 >> 24);-  const SWord32 s1344 = table1[s1343];-  const SWord8  s1345 = (SWord8) (s1077 >> 16);-  const SWord32 s1346 = table2[s1345];-  const SWord32 s1347 = s1344 ^ s1346;-  const SWord8  s1348 = (SWord8) (s1336 >> 8);-  const SWord32 s1349 = table3[s1348];-  const SWord32 s1350 = s1347 ^ s1349;-  const SWord8  s1351 = (SWord8) s560;-  const SWord32 s1352 = table4[s1351];-  const SWord32 s1353 = s1350 ^ s1352;-  const SWord32 s1354 = s9 ^ s1353;-  const SWord8  s1355 = (SWord8) (s1354 >> 16);-  const SWord32 s1356 = table2[s1355];-  const SWord32 s1357 = s1342 ^ s1356;-  const SWord8  s1358 = (SWord8) (s1077 >> 24);-  const SWord32 s1359 = table1[s1358];-  const SWord8  s1360 = (SWord8) (s1336 >> 16);-  const SWord32 s1361 = table2[s1360];-  const SWord32 s1362 = s1359 ^ s1361;-  const SWord8  s1363 = (SWord8) (s560 >> 8);-  const SWord32 s1364 = table3[s1363];-  const SWord32 s1365 = s1362 ^ s1364;-  const SWord8  s1366 = (SWord8) s818;-  const SWord32 s1367 = table4[s1366];-  const SWord32 s1368 = s1365 ^ s1367;-  const SWord32 s1369 = s10 ^ s1368;-  const SWord8  s1370 = (SWord8) (s1369 >> 8);-  const SWord32 s1371 = table3[s1370];-  const SWord32 s1372 = s1357 ^ s1371;-  const SWord8  s1373 = (SWord8) (s1336 >> 24);-  const SWord32 s1374 = table1[s1373];-  const SWord8  s1375 = (SWord8) (s560 >> 16);-  const SWord32 s1376 = table2[s1375];-  const SWord32 s1377 = s1374 ^ s1376;-  const SWord8  s1378 = (SWord8) (s818 >> 8);-  const SWord32 s1379 = table3[s1378];-  const SWord32 s1380 = s1377 ^ s1379;-  const SWord8  s1381 = (SWord8) s1077;-  const SWord32 s1382 = table4[s1381];-  const SWord32 s1383 = s1380 ^ s1382;-  const SWord32 s1384 = s11 ^ s1383;-  const SWord8  s1385 = (SWord8) s1384;-  const SWord32 s1386 = table4[s1385];-  const SWord32 s1387 = s1372 ^ s1386;-  const SWord32 s1388 = s12 ^ s1387;-  const SWord8  s1389 = (SWord8) (s1388 >> 24);-  const SWord32 s1390 = table1[s1389];-  const SWord8  s1391 = (SWord8) (s1354 >> 24);-  const SWord32 s1392 = table1[s1391];-  const SWord8  s1393 = (SWord8) (s1369 >> 16);-  const SWord32 s1394 = table2[s1393];-  const SWord32 s1395 = s1392 ^ s1394;-  const SWord8  s1396 = (SWord8) (s1384 >> 8);-  const SWord32 s1397 = table3[s1396];-  const SWord32 s1398 = s1395 ^ s1397;-  const SWord8  s1399 = (SWord8) s1340;-  const SWord32 s1400 = table4[s1399];-  const SWord32 s1401 = s1398 ^ s1400;-  const SWord32 s1402 = s13 ^ s1401;-  const SWord8  s1403 = (SWord8) (s1402 >> 16);-  const SWord32 s1404 = table2[s1403];-  const SWord32 s1405 = s1390 ^ s1404;-  const SWord8  s1406 = (SWord8) (s1369 >> 24);-  const SWord32 s1407 = table1[s1406];-  const SWord8  s1408 = (SWord8) (s1384 >> 16);-  const SWord32 s1409 = table2[s1408];-  const SWord32 s1410 = s1407 ^ s1409;-  const SWord8  s1411 = (SWord8) (s1340 >> 8);-  const SWord32 s1412 = table3[s1411];-  const SWord32 s1413 = s1410 ^ s1412;-  const SWord8  s1414 = (SWord8) s1354;-  const SWord32 s1415 = table4[s1414];-  const SWord32 s1416 = s1413 ^ s1415;-  const SWord32 s1417 = s14 ^ s1416;-  const SWord8  s1418 = (SWord8) (s1417 >> 8);-  const SWord32 s1419 = table3[s1418];-  const SWord32 s1420 = s1405 ^ s1419;-  const SWord8  s1421 = (SWord8) (s1384 >> 24);-  const SWord32 s1422 = table1[s1421];-  const SWord8  s1423 = (SWord8) (s1340 >> 16);-  const SWord32 s1424 = table2[s1423];-  const SWord32 s1425 = s1422 ^ s1424;-  const SWord8  s1426 = (SWord8) (s1354 >> 8);-  const SWord32 s1427 = table3[s1426];-  const SWord32 s1428 = s1425 ^ s1427;-  const SWord8  s1429 = (SWord8) s1369;-  const SWord32 s1430 = table4[s1429];-  const SWord32 s1431 = s1428 ^ s1430;-  const SWord32 s1432 = s15 ^ s1431;-  const SWord8  s1433 = (SWord8) s1432;-  const SWord32 s1434 = table4[s1433];-  const SWord32 s1435 = s1420 ^ s1434;-  const SWord32 s1436 = s16 ^ s1435;-  const SWord8  s1437 = (SWord8) (s1436 >> 24);-  const SWord32 s1438 = table1[s1437];-  const SWord8  s1439 = (SWord8) (s1402 >> 24);-  const SWord32 s1440 = table1[s1439];-  const SWord8  s1441 = (SWord8) (s1417 >> 16);-  const SWord32 s1442 = table2[s1441];-  const SWord32 s1443 = s1440 ^ s1442;-  const SWord8  s1444 = (SWord8) (s1432 >> 8);-  const SWord32 s1445 = table3[s1444];-  const SWord32 s1446 = s1443 ^ s1445;-  const SWord8  s1447 = (SWord8) s1388;-  const SWord32 s1448 = table4[s1447];-  const SWord32 s1449 = s1446 ^ s1448;-  const SWord32 s1450 = s17 ^ s1449;-  const SWord8  s1451 = (SWord8) (s1450 >> 16);-  const SWord32 s1452 = table2[s1451];-  const SWord32 s1453 = s1438 ^ s1452;-  const SWord8  s1454 = (SWord8) (s1417 >> 24);-  const SWord32 s1455 = table1[s1454];-  const SWord8  s1456 = (SWord8) (s1432 >> 16);-  const SWord32 s1457 = table2[s1456];-  const SWord32 s1458 = s1455 ^ s1457;-  const SWord8  s1459 = (SWord8) (s1388 >> 8);-  const SWord32 s1460 = table3[s1459];-  const SWord32 s1461 = s1458 ^ s1460;-  const SWord8  s1462 = (SWord8) s1402;-  const SWord32 s1463 = table4[s1462];-  const SWord32 s1464 = s1461 ^ s1463;-  const SWord32 s1465 = s18 ^ s1464;-  const SWord8  s1466 = (SWord8) (s1465 >> 8);-  const SWord32 s1467 = table3[s1466];-  const SWord32 s1468 = s1453 ^ s1467;-  const SWord8  s1469 = (SWord8) (s1432 >> 24);-  const SWord32 s1470 = table1[s1469];-  const SWord8  s1471 = (SWord8) (s1388 >> 16);-  const SWord32 s1472 = table2[s1471];-  const SWord32 s1473 = s1470 ^ s1472;-  const SWord8  s1474 = (SWord8) (s1402 >> 8);-  const SWord32 s1475 = table3[s1474];-  const SWord32 s1476 = s1473 ^ s1475;-  const SWord8  s1477 = (SWord8) s1417;-  const SWord32 s1478 = table4[s1477];-  const SWord32 s1479 = s1476 ^ s1478;-  const SWord32 s1480 = s19 ^ s1479;-  const SWord8  s1481 = (SWord8) s1480;-  const SWord32 s1482 = table4[s1481];-  const SWord32 s1483 = s1468 ^ s1482;-  const SWord32 s1484 = s20 ^ s1483;-  const SWord8  s1485 = (SWord8) (s1484 >> 24);-  const SWord32 s1486 = table1[s1485];-  const SWord8  s1487 = (SWord8) (s1450 >> 24);-  const SWord32 s1488 = table1[s1487];-  const SWord8  s1489 = (SWord8) (s1465 >> 16);-  const SWord32 s1490 = table2[s1489];-  const SWord32 s1491 = s1488 ^ s1490;-  const SWord8  s1492 = (SWord8) (s1480 >> 8);-  const SWord32 s1493 = table3[s1492];-  const SWord32 s1494 = s1491 ^ s1493;-  const SWord8  s1495 = (SWord8) s1436;-  const SWord32 s1496 = table4[s1495];-  const SWord32 s1497 = s1494 ^ s1496;-  const SWord32 s1498 = s21 ^ s1497;-  const SWord8  s1499 = (SWord8) (s1498 >> 16);-  const SWord32 s1500 = table2[s1499];-  const SWord32 s1501 = s1486 ^ s1500;-  const SWord8  s1502 = (SWord8) (s1465 >> 24);-  const SWord32 s1503 = table1[s1502];-  const SWord8  s1504 = (SWord8) (s1480 >> 16);-  const SWord32 s1505 = table2[s1504];-  const SWord32 s1506 = s1503 ^ s1505;-  const SWord8  s1507 = (SWord8) (s1436 >> 8);-  const SWord32 s1508 = table3[s1507];-  const SWord32 s1509 = s1506 ^ s1508;-  const SWord8  s1510 = (SWord8) s1450;-  const SWord32 s1511 = table4[s1510];-  const SWord32 s1512 = s1509 ^ s1511;-  const SWord32 s1513 = s22 ^ s1512;-  const SWord8  s1514 = (SWord8) (s1513 >> 8);-  const SWord32 s1515 = table3[s1514];-  const SWord32 s1516 = s1501 ^ s1515;-  const SWord8  s1517 = (SWord8) (s1480 >> 24);-  const SWord32 s1518 = table1[s1517];-  const SWord8  s1519 = (SWord8) (s1436 >> 16);-  const SWord32 s1520 = table2[s1519];-  const SWord32 s1521 = s1518 ^ s1520;-  const SWord8  s1522 = (SWord8) (s1450 >> 8);-  const SWord32 s1523 = table3[s1522];-  const SWord32 s1524 = s1521 ^ s1523;-  const SWord8  s1525 = (SWord8) s1465;-  const SWord32 s1526 = table4[s1525];-  const SWord32 s1527 = s1524 ^ s1526;-  const SWord32 s1528 = s23 ^ s1527;-  const SWord8  s1529 = (SWord8) s1528;-  const SWord32 s1530 = table4[s1529];-  const SWord32 s1531 = s1516 ^ s1530;-  const SWord32 s1532 = s24 ^ s1531;-  const SWord8  s1533 = (SWord8) (s1532 >> 24);-  const SWord32 s1534 = table1[s1533];-  const SWord8  s1535 = (SWord8) (s1498 >> 24);-  const SWord32 s1536 = table1[s1535];-  const SWord8  s1537 = (SWord8) (s1513 >> 16);-  const SWord32 s1538 = table2[s1537];-  const SWord32 s1539 = s1536 ^ s1538;-  const SWord8  s1540 = (SWord8) (s1528 >> 8);-  const SWord32 s1541 = table3[s1540];-  const SWord32 s1542 = s1539 ^ s1541;-  const SWord8  s1543 = (SWord8) s1484;-  const SWord32 s1544 = table4[s1543];-  const SWord32 s1545 = s1542 ^ s1544;-  const SWord32 s1546 = s25 ^ s1545;-  const SWord8  s1547 = (SWord8) (s1546 >> 16);-  const SWord32 s1548 = table2[s1547];-  const SWord32 s1549 = s1534 ^ s1548;-  const SWord8  s1550 = (SWord8) (s1513 >> 24);-  const SWord32 s1551 = table1[s1550];-  const SWord8  s1552 = (SWord8) (s1528 >> 16);-  const SWord32 s1553 = table2[s1552];-  const SWord32 s1554 = s1551 ^ s1553;-  const SWord8  s1555 = (SWord8) (s1484 >> 8);-  const SWord32 s1556 = table3[s1555];-  const SWord32 s1557 = s1554 ^ s1556;-  const SWord8  s1558 = (SWord8) s1498;-  const SWord32 s1559 = table4[s1558];-  const SWord32 s1560 = s1557 ^ s1559;-  const SWord32 s1561 = s26 ^ s1560;-  const SWord8  s1562 = (SWord8) (s1561 >> 8);-  const SWord32 s1563 = table3[s1562];-  const SWord32 s1564 = s1549 ^ s1563;-  const SWord8  s1565 = (SWord8) (s1528 >> 24);-  const SWord32 s1566 = table1[s1565];-  const SWord8  s1567 = (SWord8) (s1484 >> 16);-  const SWord32 s1568 = table2[s1567];-  const SWord32 s1569 = s1566 ^ s1568;-  const SWord8  s1570 = (SWord8) (s1498 >> 8);-  const SWord32 s1571 = table3[s1570];-  const SWord32 s1572 = s1569 ^ s1571;-  const SWord8  s1573 = (SWord8) s1513;-  const SWord32 s1574 = table4[s1573];-  const SWord32 s1575 = s1572 ^ s1574;-  const SWord32 s1576 = s27 ^ s1575;-  const SWord8  s1577 = (SWord8) s1576;-  const SWord32 s1578 = table4[s1577];-  const SWord32 s1579 = s1564 ^ s1578;-  const SWord32 s1580 = s28 ^ s1579;-  const SWord8  s1581 = (SWord8) (s1580 >> 24);-  const SWord32 s1582 = table1[s1581];-  const SWord8  s1583 = (SWord8) (s1546 >> 24);-  const SWord32 s1584 = table1[s1583];-  const SWord8  s1585 = (SWord8) (s1561 >> 16);-  const SWord32 s1586 = table2[s1585];-  const SWord32 s1587 = s1584 ^ s1586;-  const SWord8  s1588 = (SWord8) (s1576 >> 8);-  const SWord32 s1589 = table3[s1588];-  const SWord32 s1590 = s1587 ^ s1589;-  const SWord8  s1591 = (SWord8) s1532;-  const SWord32 s1592 = table4[s1591];-  const SWord32 s1593 = s1590 ^ s1592;-  const SWord32 s1594 = s29 ^ s1593;-  const SWord8  s1595 = (SWord8) (s1594 >> 16);-  const SWord32 s1596 = table2[s1595];-  const SWord32 s1597 = s1582 ^ s1596;-  const SWord8  s1598 = (SWord8) (s1561 >> 24);-  const SWord32 s1599 = table1[s1598];-  const SWord8  s1600 = (SWord8) (s1576 >> 16);-  const SWord32 s1601 = table2[s1600];-  const SWord32 s1602 = s1599 ^ s1601;-  const SWord8  s1603 = (SWord8) (s1532 >> 8);-  const SWord32 s1604 = table3[s1603];-  const SWord32 s1605 = s1602 ^ s1604;-  const SWord8  s1606 = (SWord8) s1546;-  const SWord32 s1607 = table4[s1606];-  const SWord32 s1608 = s1605 ^ s1607;-  const SWord32 s1609 = s30 ^ s1608;-  const SWord8  s1610 = (SWord8) (s1609 >> 8);-  const SWord32 s1611 = table3[s1610];-  const SWord32 s1612 = s1597 ^ s1611;-  const SWord8  s1613 = (SWord8) (s1576 >> 24);-  const SWord32 s1614 = table1[s1613];-  const SWord8  s1615 = (SWord8) (s1532 >> 16);-  const SWord32 s1616 = table2[s1615];-  const SWord32 s1617 = s1614 ^ s1616;-  const SWord8  s1618 = (SWord8) (s1546 >> 8);-  const SWord32 s1619 = table3[s1618];-  const SWord32 s1620 = s1617 ^ s1619;-  const SWord8  s1621 = (SWord8) s1561;-  const SWord32 s1622 = table4[s1621];-  const SWord32 s1623 = s1620 ^ s1622;-  const SWord32 s1624 = s31 ^ s1623;-  const SWord8  s1625 = (SWord8) s1624;-  const SWord32 s1626 = table4[s1625];-  const SWord32 s1627 = s1612 ^ s1626;-  const SWord32 s1628 = s32 ^ s1627;-  const SWord8  s1629 = (SWord8) (s1628 >> 24);-  const SWord32 s1630 = table1[s1629];-  const SWord8  s1631 = (SWord8) (s1594 >> 24);-  const SWord32 s1632 = table1[s1631];-  const SWord8  s1633 = (SWord8) (s1609 >> 16);-  const SWord32 s1634 = table2[s1633];-  const SWord32 s1635 = s1632 ^ s1634;-  const SWord8  s1636 = (SWord8) (s1624 >> 8);-  const SWord32 s1637 = table3[s1636];-  const SWord32 s1638 = s1635 ^ s1637;-  const SWord8  s1639 = (SWord8) s1580;-  const SWord32 s1640 = table4[s1639];-  const SWord32 s1641 = s1638 ^ s1640;-  const SWord32 s1642 = s33 ^ s1641;-  const SWord8  s1643 = (SWord8) (s1642 >> 16);-  const SWord32 s1644 = table2[s1643];-  const SWord32 s1645 = s1630 ^ s1644;-  const SWord8  s1646 = (SWord8) (s1609 >> 24);-  const SWord32 s1647 = table1[s1646];-  const SWord8  s1648 = (SWord8) (s1624 >> 16);-  const SWord32 s1649 = table2[s1648];-  const SWord32 s1650 = s1647 ^ s1649;-  const SWord8  s1651 = (SWord8) (s1580 >> 8);-  const SWord32 s1652 = table3[s1651];-  const SWord32 s1653 = s1650 ^ s1652;-  const SWord8  s1654 = (SWord8) s1594;-  const SWord32 s1655 = table4[s1654];-  const SWord32 s1656 = s1653 ^ s1655;-  const SWord32 s1657 = s34 ^ s1656;-  const SWord8  s1658 = (SWord8) (s1657 >> 8);-  const SWord32 s1659 = table3[s1658];-  const SWord32 s1660 = s1645 ^ s1659;-  const SWord8  s1661 = (SWord8) (s1624 >> 24);-  const SWord32 s1662 = table1[s1661];-  const SWord8  s1663 = (SWord8) (s1580 >> 16);-  const SWord32 s1664 = table2[s1663];-  const SWord32 s1665 = s1662 ^ s1664;-  const SWord8  s1666 = (SWord8) (s1594 >> 8);-  const SWord32 s1667 = table3[s1666];-  const SWord32 s1668 = s1665 ^ s1667;-  const SWord8  s1669 = (SWord8) s1609;-  const SWord32 s1670 = table4[s1669];-  const SWord32 s1671 = s1668 ^ s1670;-  const SWord32 s1672 = s35 ^ s1671;-  const SWord8  s1673 = (SWord8) s1672;-  const SWord32 s1674 = table4[s1673];-  const SWord32 s1675 = s1660 ^ s1674;-  const SWord32 s1676 = s36 ^ s1675;-  const SWord8  s1677 = (SWord8) (s1676 >> 24);-  const SWord32 s1678 = table1[s1677];-  const SWord8  s1679 = (SWord8) (s1642 >> 24);-  const SWord32 s1680 = table1[s1679];-  const SWord8  s1681 = (SWord8) (s1657 >> 16);-  const SWord32 s1682 = table2[s1681];-  const SWord32 s1683 = s1680 ^ s1682;-  const SWord8  s1684 = (SWord8) (s1672 >> 8);-  const SWord32 s1685 = table3[s1684];-  const SWord32 s1686 = s1683 ^ s1685;-  const SWord8  s1687 = (SWord8) s1628;-  const SWord32 s1688 = table4[s1687];-  const SWord32 s1689 = s1686 ^ s1688;-  const SWord32 s1690 = s37 ^ s1689;-  const SWord8  s1691 = (SWord8) (s1690 >> 16);-  const SWord32 s1692 = table2[s1691];-  const SWord32 s1693 = s1678 ^ s1692;-  const SWord8  s1694 = (SWord8) (s1657 >> 24);-  const SWord32 s1695 = table1[s1694];-  const SWord8  s1696 = (SWord8) (s1672 >> 16);-  const SWord32 s1697 = table2[s1696];-  const SWord32 s1698 = s1695 ^ s1697;-  const SWord8  s1699 = (SWord8) (s1628 >> 8);-  const SWord32 s1700 = table3[s1699];-  const SWord32 s1701 = s1698 ^ s1700;-  const SWord8  s1702 = (SWord8) s1642;-  const SWord32 s1703 = table4[s1702];-  const SWord32 s1704 = s1701 ^ s1703;-  const SWord32 s1705 = s38 ^ s1704;-  const SWord8  s1706 = (SWord8) (s1705 >> 8);-  const SWord32 s1707 = table3[s1706];-  const SWord32 s1708 = s1693 ^ s1707;-  const SWord8  s1709 = (SWord8) (s1672 >> 24);-  const SWord32 s1710 = table1[s1709];-  const SWord8  s1711 = (SWord8) (s1628 >> 16);-  const SWord32 s1712 = table2[s1711];-  const SWord32 s1713 = s1710 ^ s1712;-  const SWord8  s1714 = (SWord8) (s1642 >> 8);-  const SWord32 s1715 = table3[s1714];-  const SWord32 s1716 = s1713 ^ s1715;-  const SWord8  s1717 = (SWord8) s1657;-  const SWord32 s1718 = table4[s1717];-  const SWord32 s1719 = s1716 ^ s1718;-  const SWord32 s1720 = s39 ^ s1719;-  const SWord8  s1721 = (SWord8) s1720;-  const SWord32 s1722 = table4[s1721];-  const SWord32 s1723 = s1708 ^ s1722;-  const SWord32 s1724 = s40 ^ s1723;-  const SWord8  s1725 = (SWord8) (s1724 >> 24);-  const SWord8  s1726 = table0[s1725];-  const SWord8  s1727 = (SWord8) (s1690 >> 24);-  const SWord32 s1728 = table1[s1727];-  const SWord8  s1729 = (SWord8) (s1705 >> 16);-  const SWord32 s1730 = table2[s1729];-  const SWord32 s1731 = s1728 ^ s1730;-  const SWord8  s1732 = (SWord8) (s1720 >> 8);-  const SWord32 s1733 = table3[s1732];-  const SWord32 s1734 = s1731 ^ s1733;-  const SWord8  s1735 = (SWord8) s1676;-  const SWord32 s1736 = table4[s1735];-  const SWord32 s1737 = s1734 ^ s1736;-  const SWord32 s1738 = s41 ^ s1737;-  const SWord8  s1739 = (SWord8) (s1738 >> 16);-  const SWord8  s1740 = table0[s1739];-  const SWord16 s1741 = (((SWord16) s1726) << 8) | ((SWord16) s1740);-  const SWord8  s1742 = (SWord8) (s1705 >> 24);-  const SWord32 s1743 = table1[s1742];-  const SWord8  s1744 = (SWord8) (s1720 >> 16);-  const SWord32 s1745 = table2[s1744];-  const SWord32 s1746 = s1743 ^ s1745;-  const SWord8  s1747 = (SWord8) (s1676 >> 8);-  const SWord32 s1748 = table3[s1747];-  const SWord32 s1749 = s1746 ^ s1748;-  const SWord8  s1750 = (SWord8) s1690;-  const SWord32 s1751 = table4[s1750];-  const SWord32 s1752 = s1749 ^ s1751;-  const SWord32 s1753 = s42 ^ s1752;-  const SWord8  s1754 = (SWord8) (s1753 >> 8);-  const SWord8  s1755 = table0[s1754];-  const SWord8  s1756 = (SWord8) (s1720 >> 24);-  const SWord32 s1757 = table1[s1756];-  const SWord8  s1758 = (SWord8) (s1676 >> 16);-  const SWord32 s1759 = table2[s1758];-  const SWord32 s1760 = s1757 ^ s1759;-  const SWord8  s1761 = (SWord8) (s1690 >> 8);-  const SWord32 s1762 = table3[s1761];-  const SWord32 s1763 = s1760 ^ s1762;-  const SWord8  s1764 = (SWord8) s1705;-  const SWord32 s1765 = table4[s1764];-  const SWord32 s1766 = s1763 ^ s1765;-  const SWord32 s1767 = s43 ^ s1766;-  const SWord8  s1768 = (SWord8) s1767;-  const SWord8  s1769 = table0[s1768];-  const SWord16 s1770 = (((SWord16) s1755) << 8) | ((SWord16) s1769);-  const SWord32 s1771 = (((SWord32) s1741) << 16) | ((SWord32) s1770);-  const SWord32 s1772 = s44 ^ s1771;-  const SWord8  s1773 = (SWord8) (s1738 >> 24);-  const SWord8  s1774 = table0[s1773];-  const SWord8  s1775 = (SWord8) (s1753 >> 16);-  const SWord8  s1776 = table0[s1775];-  const SWord16 s1777 = (((SWord16) s1774) << 8) | ((SWord16) s1776);-  const SWord8  s1778 = (SWord8) (s1767 >> 8);-  const SWord8  s1779 = table0[s1778];-  const SWord8  s1780 = (SWord8) s1724;-  const SWord8  s1781 = table0[s1780];-  const SWord16 s1782 = (((SWord16) s1779) << 8) | ((SWord16) s1781);-  const SWord32 s1783 = (((SWord32) s1777) << 16) | ((SWord32) s1782);-  const SWord32 s1784 = s45 ^ s1783;-  const SWord8  s1785 = (SWord8) (s1753 >> 24);-  const SWord8  s1786 = table0[s1785];-  const SWord8  s1787 = (SWord8) (s1767 >> 16);-  const SWord8  s1788 = table0[s1787];-  const SWord16 s1789 = (((SWord16) s1786) << 8) | ((SWord16) s1788);-  const SWord8  s1790 = (SWord8) (s1724 >> 8);-  const SWord8  s1791 = table0[s1790];-  const SWord8  s1792 = (SWord8) s1738;-  const SWord8  s1793 = table0[s1792];-  const SWord16 s1794 = (((SWord16) s1791) << 8) | ((SWord16) s1793);-  const SWord32 s1795 = (((SWord32) s1789) << 16) | ((SWord32) s1794);-  const SWord32 s1796 = s46 ^ s1795;-  const SWord8  s1797 = (SWord8) (s1767 >> 24);-  const SWord8  s1798 = table0[s1797];-  const SWord8  s1799 = (SWord8) (s1724 >> 16);-  const SWord8  s1800 = table0[s1799];-  const SWord16 s1801 = (((SWord16) s1798) << 8) | ((SWord16) s1800);-  const SWord8  s1802 = (SWord8) (s1738 >> 8);-  const SWord8  s1803 = table0[s1802];-  const SWord8  s1804 = (SWord8) s1753;-  const SWord8  s1805 = table0[s1804];-  const SWord16 s1806 = (((SWord16) s1803) << 8) | ((SWord16) s1805);-  const SWord32 s1807 = (((SWord32) s1801) << 16) | ((SWord32) s1806);-  const SWord32 s1808 = s47 ^ s1807;--  ct[0] = s1772;-  ct[1] = s1784;-  ct[2] = s1796;-  ct[3] = s1808;-}-== END: "aes128BlockEncrypt.c" ==================-== BEGIN: "aes128BlockDecrypt.c" ================-/* File: "aes128BlockDecrypt.c". Automatically generated by SBV. Do not edit! */--#include "aes128Lib.h"--void aes128BlockDecrypt(const SWord32 *ct, const SWord32 *xkey,-                        SWord32 *pt)-{-  const SWord32 s0 = ct[0];-  const SWord32 s1 = ct[1];-  const SWord32 s2 = ct[2];-  const SWord32 s3 = ct[3];-  const SWord32 s4 = xkey[0];-  const SWord32 s5 = xkey[1];-  const SWord32 s6 = xkey[2];-  const SWord32 s7 = xkey[3];-  const SWord32 s8 = xkey[4];-  const SWord32 s9 = xkey[5];-  const SWord32 s10 = xkey[6];-  const SWord32 s11 = xkey[7];-  const SWord32 s12 = xkey[8];-  const SWord32 s13 = xkey[9];-  const SWord32 s14 = xkey[10];-  const SWord32 s15 = xkey[11];-  const SWord32 s16 = xkey[12];-  const SWord32 s17 = xkey[13];-  const SWord32 s18 = xkey[14];-  const SWord32 s19 = xkey[15];-  const SWord32 s20 = xkey[16];-  const SWord32 s21 = xkey[17];-  const SWord32 s22 = xkey[18];-  const SWord32 s23 = xkey[19];-  const SWord32 s24 = xkey[20];-  const SWord32 s25 = xkey[21];-  const SWord32 s26 = xkey[22];-  const SWord32 s27 = xkey[23];-  const SWord32 s28 = xkey[24];-  const SWord32 s29 = xkey[25];-  const SWord32 s30 = xkey[26];-  const SWord32 s31 = xkey[27];-  const SWord32 s32 = xkey[28];-  const SWord32 s33 = xkey[29];-  const SWord32 s34 = xkey[30];-  const SWord32 s35 = xkey[31];-  const SWord32 s36 = xkey[32];-  const SWord32 s37 = xkey[33];-  const SWord32 s38 = xkey[34];-  const SWord32 s39 = xkey[35];-  const SWord32 s40 = xkey[36];-  const SWord32 s41 = xkey[37];-  const SWord32 s42 = xkey[38];-  const SWord32 s43 = xkey[39];-  const SWord32 s44 = xkey[40];-  const SWord32 s45 = xkey[41];-  const SWord32 s46 = xkey[42];-  const SWord32 s47 = xkey[43];-  static const SWord8 table0[] = {-       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,-      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,-       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,-       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,-       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,-      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,-      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,-       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,-      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,-       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,-       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,-      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,-       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,-      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,-      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,-       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,-       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,-      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,-      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,-       38, 225, 105,  20,  99,  85,  33,  12, 125-  };-  static const SWord32 table1[] = {-      0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,-      0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,-      0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,-      0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,-      0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,-      0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,-      0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,-      0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,-      0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,-      0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,-      0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,-      0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,-      0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,-      0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,-      0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,-      0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,-      0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,-      0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,-      0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,-      0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,-      0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,-      0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,-      0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,-      0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,-      0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,-      0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,-      0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,-      0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,-      0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,-      0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,-      0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,-      0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,-      0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,-      0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,-      0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,-      0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,-      0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,-      0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,-      0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,-      0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,-      0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,-      0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,-      0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,-      0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,-      0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,-      0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,-      0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,-      0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,-      0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,-      0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,-      0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,-      0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,-      0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,-      0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,-      0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,-      0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,-      0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,-      0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,-      0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,-      0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,-      0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,-      0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,-      0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,-      0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL-  };-  static const SWord32 table2[] = {-      0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,-      0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,-      0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,-      0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,-      0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,-      0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,-      0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,-      0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,-      0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,-      0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,-      0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,-      0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,-      0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,-      0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,-      0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,-      0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,-      0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,-      0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,-      0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,-      0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,-      0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,-      0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,-      0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,-      0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,-      0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,-      0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,-      0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,-      0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,-      0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,-      0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,-      0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,-      0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,-      0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,-      0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,-      0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,-      0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,-      0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,-      0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,-      0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,-      0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,-      0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,-      0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,-      0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,-      0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,-      0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,-      0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,-      0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,-      0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,-      0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,-      0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,-      0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,-      0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,-      0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,-      0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,-      0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,-      0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,-      0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,-      0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,-      0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,-      0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,-      0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,-      0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,-      0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,-      0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL-  };-  static const SWord32 table3[] = {-      0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,-      0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,-      0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,-      0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,-      0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,-      0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,-      0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,-      0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,-      0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,-      0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,-      0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,-      0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,-      0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,-      0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,-      0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,-      0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,-      0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,-      0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,-      0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,-      0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,-      0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,-      0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,-      0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,-      0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,-      0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,-      0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,-      0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,-      0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,-      0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,-      0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,-      0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,-      0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,-      0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,-      0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,-      0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,-      0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,-      0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,-      0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,-      0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,-      0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,-      0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,-      0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,-      0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,-      0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,-      0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,-      0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,-      0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,-      0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,-      0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,-      0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,-      0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,-      0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,-      0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,-      0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,-      0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,-      0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,-      0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,-      0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,-      0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,-      0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,-      0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,-      0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,-      0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,-      0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL-  };-  static const SWord32 table4[] = {-      0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,-      0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,-      0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,-      0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,-      0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,-      0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,-      0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,-      0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,-      0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,-      0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,-      0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,-      0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,-      0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,-      0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,-      0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,-      0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,-      0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,-      0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,-      0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,-      0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,-      0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,-      0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,-      0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,-      0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,-      0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,-      0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,-      0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,-      0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,-      0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,-      0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,-      0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,-      0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,-      0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,-      0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,-      0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,-      0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,-      0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,-      0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,-      0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,-      0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,-      0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,-      0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,-      0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,-      0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,-      0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,-      0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,-      0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,-      0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,-      0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,-      0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,-      0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,-      0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,-      0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,-      0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,-      0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,-      0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,-      0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,-      0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,-      0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,-      0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,-      0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,-      0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,-      0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,-      0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL-  };-  const SWord32 s560 = s0 ^ s4;-  const SWord8  s561 = (SWord8) (s560 >> 24);-  const SWord32 s562 = table1[s561];-  const SWord32 s818 = s3 ^ s7;-  const SWord8  s819 = (SWord8) (s818 >> 16);-  const SWord32 s820 = table2[s819];-  const SWord32 s821 = s562 ^ s820;-  const SWord32 s1077 = s2 ^ s6;-  const SWord8  s1078 = (SWord8) (s1077 >> 8);-  const SWord32 s1079 = table3[s1078];-  const SWord32 s1080 = s821 ^ s1079;-  const SWord32 s1336 = s1 ^ s5;-  const SWord8  s1337 = (SWord8) s1336;-  const SWord32 s1338 = table4[s1337];-  const SWord32 s1339 = s1080 ^ s1338;-  const SWord32 s1340 = s8 ^ s1339;-  const SWord8  s1341 = (SWord8) (s1340 >> 24);-  const SWord32 s1342 = table1[s1341];-  const SWord8  s1343 = (SWord8) (s818 >> 24);-  const SWord32 s1344 = table1[s1343];-  const SWord8  s1345 = (SWord8) (s1077 >> 16);-  const SWord32 s1346 = table2[s1345];-  const SWord32 s1347 = s1344 ^ s1346;-  const SWord8  s1348 = (SWord8) (s1336 >> 8);-  const SWord32 s1349 = table3[s1348];-  const SWord32 s1350 = s1347 ^ s1349;-  const SWord8  s1351 = (SWord8) s560;-  const SWord32 s1352 = table4[s1351];-  const SWord32 s1353 = s1350 ^ s1352;-  const SWord32 s1354 = s11 ^ s1353;-  const SWord8  s1355 = (SWord8) (s1354 >> 16);-  const SWord32 s1356 = table2[s1355];-  const SWord32 s1357 = s1342 ^ s1356;-  const SWord8  s1358 = (SWord8) (s1077 >> 24);-  const SWord32 s1359 = table1[s1358];-  const SWord8  s1360 = (SWord8) (s1336 >> 16);-  const SWord32 s1361 = table2[s1360];-  const SWord32 s1362 = s1359 ^ s1361;-  const SWord8  s1363 = (SWord8) (s560 >> 8);-  const SWord32 s1364 = table3[s1363];-  const SWord32 s1365 = s1362 ^ s1364;-  const SWord8  s1366 = (SWord8) s818;-  const SWord32 s1367 = table4[s1366];-  const SWord32 s1368 = s1365 ^ s1367;-  const SWord32 s1369 = s10 ^ s1368;-  const SWord8  s1370 = (SWord8) (s1369 >> 8);-  const SWord32 s1371 = table3[s1370];-  const SWord32 s1372 = s1357 ^ s1371;-  const SWord8  s1373 = (SWord8) (s1336 >> 24);-  const SWord32 s1374 = table1[s1373];-  const SWord8  s1375 = (SWord8) (s560 >> 16);-  const SWord32 s1376 = table2[s1375];-  const SWord32 s1377 = s1374 ^ s1376;-  const SWord8  s1378 = (SWord8) (s818 >> 8);-  const SWord32 s1379 = table3[s1378];-  const SWord32 s1380 = s1377 ^ s1379;-  const SWord8  s1381 = (SWord8) s1077;-  const SWord32 s1382 = table4[s1381];-  const SWord32 s1383 = s1380 ^ s1382;-  const SWord32 s1384 = s9 ^ s1383;-  const SWord8  s1385 = (SWord8) s1384;-  const SWord32 s1386 = table4[s1385];-  const SWord32 s1387 = s1372 ^ s1386;-  const SWord32 s1388 = s12 ^ s1387;-  const SWord8  s1389 = (SWord8) (s1388 >> 24);-  const SWord32 s1390 = table1[s1389];-  const SWord8  s1391 = (SWord8) (s1354 >> 24);-  const SWord32 s1392 = table1[s1391];-  const SWord8  s1393 = (SWord8) (s1369 >> 16);-  const SWord32 s1394 = table2[s1393];-  const SWord32 s1395 = s1392 ^ s1394;-  const SWord8  s1396 = (SWord8) (s1384 >> 8);-  const SWord32 s1397 = table3[s1396];-  const SWord32 s1398 = s1395 ^ s1397;-  const SWord8  s1399 = (SWord8) s1340;-  const SWord32 s1400 = table4[s1399];-  const SWord32 s1401 = s1398 ^ s1400;-  const SWord32 s1402 = s15 ^ s1401;-  const SWord8  s1403 = (SWord8) (s1402 >> 16);-  const SWord32 s1404 = table2[s1403];-  const SWord32 s1405 = s1390 ^ s1404;-  const SWord8  s1406 = (SWord8) (s1369 >> 24);-  const SWord32 s1407 = table1[s1406];-  const SWord8  s1408 = (SWord8) (s1384 >> 16);-  const SWord32 s1409 = table2[s1408];-  const SWord32 s1410 = s1407 ^ s1409;-  const SWord8  s1411 = (SWord8) (s1340 >> 8);-  const SWord32 s1412 = table3[s1411];-  const SWord32 s1413 = s1410 ^ s1412;-  const SWord8  s1414 = (SWord8) s1354;-  const SWord32 s1415 = table4[s1414];-  const SWord32 s1416 = s1413 ^ s1415;-  const SWord32 s1417 = s14 ^ s1416;-  const SWord8  s1418 = (SWord8) (s1417 >> 8);-  const SWord32 s1419 = table3[s1418];-  const SWord32 s1420 = s1405 ^ s1419;-  const SWord8  s1421 = (SWord8) (s1384 >> 24);-  const SWord32 s1422 = table1[s1421];-  const SWord8  s1423 = (SWord8) (s1340 >> 16);-  const SWord32 s1424 = table2[s1423];-  const SWord32 s1425 = s1422 ^ s1424;-  const SWord8  s1426 = (SWord8) (s1354 >> 8);-  const SWord32 s1427 = table3[s1426];-  const SWord32 s1428 = s1425 ^ s1427;-  const SWord8  s1429 = (SWord8) s1369;-  const SWord32 s1430 = table4[s1429];-  const SWord32 s1431 = s1428 ^ s1430;-  const SWord32 s1432 = s13 ^ s1431;-  const SWord8  s1433 = (SWord8) s1432;-  const SWord32 s1434 = table4[s1433];-  const SWord32 s1435 = s1420 ^ s1434;-  const SWord32 s1436 = s16 ^ s1435;-  const SWord8  s1437 = (SWord8) (s1436 >> 24);-  const SWord32 s1438 = table1[s1437];-  const SWord8  s1439 = (SWord8) (s1402 >> 24);-  const SWord32 s1440 = table1[s1439];-  const SWord8  s1441 = (SWord8) (s1417 >> 16);-  const SWord32 s1442 = table2[s1441];-  const SWord32 s1443 = s1440 ^ s1442;-  const SWord8  s1444 = (SWord8) (s1432 >> 8);-  const SWord32 s1445 = table3[s1444];-  const SWord32 s1446 = s1443 ^ s1445;-  const SWord8  s1447 = (SWord8) s1388;-  const SWord32 s1448 = table4[s1447];-  const SWord32 s1449 = s1446 ^ s1448;-  const SWord32 s1450 = s19 ^ s1449;-  const SWord8  s1451 = (SWord8) (s1450 >> 16);-  const SWord32 s1452 = table2[s1451];-  const SWord32 s1453 = s1438 ^ s1452;-  const SWord8  s1454 = (SWord8) (s1417 >> 24);-  const SWord32 s1455 = table1[s1454];-  const SWord8  s1456 = (SWord8) (s1432 >> 16);-  const SWord32 s1457 = table2[s1456];-  const SWord32 s1458 = s1455 ^ s1457;-  const SWord8  s1459 = (SWord8) (s1388 >> 8);-  const SWord32 s1460 = table3[s1459];-  const SWord32 s1461 = s1458 ^ s1460;-  const SWord8  s1462 = (SWord8) s1402;-  const SWord32 s1463 = table4[s1462];-  const SWord32 s1464 = s1461 ^ s1463;-  const SWord32 s1465 = s18 ^ s1464;-  const SWord8  s1466 = (SWord8) (s1465 >> 8);-  const SWord32 s1467 = table3[s1466];-  const SWord32 s1468 = s1453 ^ s1467;-  const SWord8  s1469 = (SWord8) (s1432 >> 24);-  const SWord32 s1470 = table1[s1469];-  const SWord8  s1471 = (SWord8) (s1388 >> 16);-  const SWord32 s1472 = table2[s1471];-  const SWord32 s1473 = s1470 ^ s1472;-  const SWord8  s1474 = (SWord8) (s1402 >> 8);-  const SWord32 s1475 = table3[s1474];-  const SWord32 s1476 = s1473 ^ s1475;-  const SWord8  s1477 = (SWord8) s1417;-  const SWord32 s1478 = table4[s1477];-  const SWord32 s1479 = s1476 ^ s1478;-  const SWord32 s1480 = s17 ^ s1479;-  const SWord8  s1481 = (SWord8) s1480;-  const SWord32 s1482 = table4[s1481];-  const SWord32 s1483 = s1468 ^ s1482;-  const SWord32 s1484 = s20 ^ s1483;-  const SWord8  s1485 = (SWord8) (s1484 >> 24);-  const SWord32 s1486 = table1[s1485];-  const SWord8  s1487 = (SWord8) (s1450 >> 24);-  const SWord32 s1488 = table1[s1487];-  const SWord8  s1489 = (SWord8) (s1465 >> 16);-  const SWord32 s1490 = table2[s1489];-  const SWord32 s1491 = s1488 ^ s1490;-  const SWord8  s1492 = (SWord8) (s1480 >> 8);-  const SWord32 s1493 = table3[s1492];-  const SWord32 s1494 = s1491 ^ s1493;-  const SWord8  s1495 = (SWord8) s1436;-  const SWord32 s1496 = table4[s1495];-  const SWord32 s1497 = s1494 ^ s1496;-  const SWord32 s1498 = s23 ^ s1497;-  const SWord8  s1499 = (SWord8) (s1498 >> 16);-  const SWord32 s1500 = table2[s1499];-  const SWord32 s1501 = s1486 ^ s1500;-  const SWord8  s1502 = (SWord8) (s1465 >> 24);-  const SWord32 s1503 = table1[s1502];-  const SWord8  s1504 = (SWord8) (s1480 >> 16);-  const SWord32 s1505 = table2[s1504];-  const SWord32 s1506 = s1503 ^ s1505;-  const SWord8  s1507 = (SWord8) (s1436 >> 8);-  const SWord32 s1508 = table3[s1507];-  const SWord32 s1509 = s1506 ^ s1508;-  const SWord8  s1510 = (SWord8) s1450;-  const SWord32 s1511 = table4[s1510];-  const SWord32 s1512 = s1509 ^ s1511;-  const SWord32 s1513 = s22 ^ s1512;-  const SWord8  s1514 = (SWord8) (s1513 >> 8);-  const SWord32 s1515 = table3[s1514];-  const SWord32 s1516 = s1501 ^ s1515;-  const SWord8  s1517 = (SWord8) (s1480 >> 24);-  const SWord32 s1518 = table1[s1517];-  const SWord8  s1519 = (SWord8) (s1436 >> 16);-  const SWord32 s1520 = table2[s1519];-  const SWord32 s1521 = s1518 ^ s1520;-  const SWord8  s1522 = (SWord8) (s1450 >> 8);-  const SWord32 s1523 = table3[s1522];-  const SWord32 s1524 = s1521 ^ s1523;-  const SWord8  s1525 = (SWord8) s1465;-  const SWord32 s1526 = table4[s1525];-  const SWord32 s1527 = s1524 ^ s1526;-  const SWord32 s1528 = s21 ^ s1527;-  const SWord8  s1529 = (SWord8) s1528;-  const SWord32 s1530 = table4[s1529];-  const SWord32 s1531 = s1516 ^ s1530;-  const SWord32 s1532 = s24 ^ s1531;-  const SWord8  s1533 = (SWord8) (s1532 >> 24);-  const SWord32 s1534 = table1[s1533];-  const SWord8  s1535 = (SWord8) (s1498 >> 24);-  const SWord32 s1536 = table1[s1535];-  const SWord8  s1537 = (SWord8) (s1513 >> 16);-  const SWord32 s1538 = table2[s1537];-  const SWord32 s1539 = s1536 ^ s1538;-  const SWord8  s1540 = (SWord8) (s1528 >> 8);-  const SWord32 s1541 = table3[s1540];-  const SWord32 s1542 = s1539 ^ s1541;-  const SWord8  s1543 = (SWord8) s1484;-  const SWord32 s1544 = table4[s1543];-  const SWord32 s1545 = s1542 ^ s1544;-  const SWord32 s1546 = s27 ^ s1545;-  const SWord8  s1547 = (SWord8) (s1546 >> 16);-  const SWord32 s1548 = table2[s1547];-  const SWord32 s1549 = s1534 ^ s1548;-  const SWord8  s1550 = (SWord8) (s1513 >> 24);-  const SWord32 s1551 = table1[s1550];-  const SWord8  s1552 = (SWord8) (s1528 >> 16);-  const SWord32 s1553 = table2[s1552];-  const SWord32 s1554 = s1551 ^ s1553;-  const SWord8  s1555 = (SWord8) (s1484 >> 8);-  const SWord32 s1556 = table3[s1555];-  const SWord32 s1557 = s1554 ^ s1556;-  const SWord8  s1558 = (SWord8) s1498;-  const SWord32 s1559 = table4[s1558];-  const SWord32 s1560 = s1557 ^ s1559;-  const SWord32 s1561 = s26 ^ s1560;-  const SWord8  s1562 = (SWord8) (s1561 >> 8);-  const SWord32 s1563 = table3[s1562];-  const SWord32 s1564 = s1549 ^ s1563;-  const SWord8  s1565 = (SWord8) (s1528 >> 24);-  const SWord32 s1566 = table1[s1565];-  const SWord8  s1567 = (SWord8) (s1484 >> 16);-  const SWord32 s1568 = table2[s1567];-  const SWord32 s1569 = s1566 ^ s1568;-  const SWord8  s1570 = (SWord8) (s1498 >> 8);-  const SWord32 s1571 = table3[s1570];-  const SWord32 s1572 = s1569 ^ s1571;-  const SWord8  s1573 = (SWord8) s1513;-  const SWord32 s1574 = table4[s1573];-  const SWord32 s1575 = s1572 ^ s1574;-  const SWord32 s1576 = s25 ^ s1575;-  const SWord8  s1577 = (SWord8) s1576;-  const SWord32 s1578 = table4[s1577];-  const SWord32 s1579 = s1564 ^ s1578;-  const SWord32 s1580 = s28 ^ s1579;-  const SWord8  s1581 = (SWord8) (s1580 >> 24);-  const SWord32 s1582 = table1[s1581];-  const SWord8  s1583 = (SWord8) (s1546 >> 24);-  const SWord32 s1584 = table1[s1583];-  const SWord8  s1585 = (SWord8) (s1561 >> 16);-  const SWord32 s1586 = table2[s1585];-  const SWord32 s1587 = s1584 ^ s1586;-  const SWord8  s1588 = (SWord8) (s1576 >> 8);-  const SWord32 s1589 = table3[s1588];-  const SWord32 s1590 = s1587 ^ s1589;-  const SWord8  s1591 = (SWord8) s1532;-  const SWord32 s1592 = table4[s1591];-  const SWord32 s1593 = s1590 ^ s1592;-  const SWord32 s1594 = s31 ^ s1593;-  const SWord8  s1595 = (SWord8) (s1594 >> 16);-  const SWord32 s1596 = table2[s1595];-  const SWord32 s1597 = s1582 ^ s1596;-  const SWord8  s1598 = (SWord8) (s1561 >> 24);-  const SWord32 s1599 = table1[s1598];-  const SWord8  s1600 = (SWord8) (s1576 >> 16);-  const SWord32 s1601 = table2[s1600];-  const SWord32 s1602 = s1599 ^ s1601;-  const SWord8  s1603 = (SWord8) (s1532 >> 8);-  const SWord32 s1604 = table3[s1603];-  const SWord32 s1605 = s1602 ^ s1604;-  const SWord8  s1606 = (SWord8) s1546;-  const SWord32 s1607 = table4[s1606];-  const SWord32 s1608 = s1605 ^ s1607;-  const SWord32 s1609 = s30 ^ s1608;-  const SWord8  s1610 = (SWord8) (s1609 >> 8);-  const SWord32 s1611 = table3[s1610];-  const SWord32 s1612 = s1597 ^ s1611;-  const SWord8  s1613 = (SWord8) (s1576 >> 24);-  const SWord32 s1614 = table1[s1613];-  const SWord8  s1615 = (SWord8) (s1532 >> 16);-  const SWord32 s1616 = table2[s1615];-  const SWord32 s1617 = s1614 ^ s1616;-  const SWord8  s1618 = (SWord8) (s1546 >> 8);-  const SWord32 s1619 = table3[s1618];-  const SWord32 s1620 = s1617 ^ s1619;-  const SWord8  s1621 = (SWord8) s1561;-  const SWord32 s1622 = table4[s1621];-  const SWord32 s1623 = s1620 ^ s1622;-  const SWord32 s1624 = s29 ^ s1623;-  const SWord8  s1625 = (SWord8) s1624;-  const SWord32 s1626 = table4[s1625];-  const SWord32 s1627 = s1612 ^ s1626;-  const SWord32 s1628 = s32 ^ s1627;-  const SWord8  s1629 = (SWord8) (s1628 >> 24);-  const SWord32 s1630 = table1[s1629];-  const SWord8  s1631 = (SWord8) (s1594 >> 24);-  const SWord32 s1632 = table1[s1631];-  const SWord8  s1633 = (SWord8) (s1609 >> 16);-  const SWord32 s1634 = table2[s1633];-  const SWord32 s1635 = s1632 ^ s1634;-  const SWord8  s1636 = (SWord8) (s1624 >> 8);-  const SWord32 s1637 = table3[s1636];-  const SWord32 s1638 = s1635 ^ s1637;-  const SWord8  s1639 = (SWord8) s1580;-  const SWord32 s1640 = table4[s1639];-  const SWord32 s1641 = s1638 ^ s1640;-  const SWord32 s1642 = s35 ^ s1641;-  const SWord8  s1643 = (SWord8) (s1642 >> 16);-  const SWord32 s1644 = table2[s1643];-  const SWord32 s1645 = s1630 ^ s1644;-  const SWord8  s1646 = (SWord8) (s1609 >> 24);-  const SWord32 s1647 = table1[s1646];-  const SWord8  s1648 = (SWord8) (s1624 >> 16);-  const SWord32 s1649 = table2[s1648];-  const SWord32 s1650 = s1647 ^ s1649;-  const SWord8  s1651 = (SWord8) (s1580 >> 8);-  const SWord32 s1652 = table3[s1651];-  const SWord32 s1653 = s1650 ^ s1652;-  const SWord8  s1654 = (SWord8) s1594;-  const SWord32 s1655 = table4[s1654];-  const SWord32 s1656 = s1653 ^ s1655;-  const SWord32 s1657 = s34 ^ s1656;-  const SWord8  s1658 = (SWord8) (s1657 >> 8);-  const SWord32 s1659 = table3[s1658];-  const SWord32 s1660 = s1645 ^ s1659;-  const SWord8  s1661 = (SWord8) (s1624 >> 24);-  const SWord32 s1662 = table1[s1661];-  const SWord8  s1663 = (SWord8) (s1580 >> 16);-  const SWord32 s1664 = table2[s1663];-  const SWord32 s1665 = s1662 ^ s1664;-  const SWord8  s1666 = (SWord8) (s1594 >> 8);-  const SWord32 s1667 = table3[s1666];-  const SWord32 s1668 = s1665 ^ s1667;-  const SWord8  s1669 = (SWord8) s1609;-  const SWord32 s1670 = table4[s1669];-  const SWord32 s1671 = s1668 ^ s1670;-  const SWord32 s1672 = s33 ^ s1671;-  const SWord8  s1673 = (SWord8) s1672;-  const SWord32 s1674 = table4[s1673];-  const SWord32 s1675 = s1660 ^ s1674;-  const SWord32 s1676 = s36 ^ s1675;-  const SWord8  s1677 = (SWord8) (s1676 >> 24);-  const SWord32 s1678 = table1[s1677];-  const SWord8  s1679 = (SWord8) (s1642 >> 24);-  const SWord32 s1680 = table1[s1679];-  const SWord8  s1681 = (SWord8) (s1657 >> 16);-  const SWord32 s1682 = table2[s1681];-  const SWord32 s1683 = s1680 ^ s1682;-  const SWord8  s1684 = (SWord8) (s1672 >> 8);-  const SWord32 s1685 = table3[s1684];-  const SWord32 s1686 = s1683 ^ s1685;-  const SWord8  s1687 = (SWord8) s1628;-  const SWord32 s1688 = table4[s1687];-  const SWord32 s1689 = s1686 ^ s1688;-  const SWord32 s1690 = s39 ^ s1689;-  const SWord8  s1691 = (SWord8) (s1690 >> 16);-  const SWord32 s1692 = table2[s1691];-  const SWord32 s1693 = s1678 ^ s1692;-  const SWord8  s1694 = (SWord8) (s1657 >> 24);-  const SWord32 s1695 = table1[s1694];-  const SWord8  s1696 = (SWord8) (s1672 >> 16);-  const SWord32 s1697 = table2[s1696];-  const SWord32 s1698 = s1695 ^ s1697;-  const SWord8  s1699 = (SWord8) (s1628 >> 8);-  const SWord32 s1700 = table3[s1699];-  const SWord32 s1701 = s1698 ^ s1700;-  const SWord8  s1702 = (SWord8) s1642;-  const SWord32 s1703 = table4[s1702];-  const SWord32 s1704 = s1701 ^ s1703;-  const SWord32 s1705 = s38 ^ s1704;-  const SWord8  s1706 = (SWord8) (s1705 >> 8);-  const SWord32 s1707 = table3[s1706];-  const SWord32 s1708 = s1693 ^ s1707;-  const SWord8  s1709 = (SWord8) (s1672 >> 24);-  const SWord32 s1710 = table1[s1709];-  const SWord8  s1711 = (SWord8) (s1628 >> 16);-  const SWord32 s1712 = table2[s1711];-  const SWord32 s1713 = s1710 ^ s1712;-  const SWord8  s1714 = (SWord8) (s1642 >> 8);-  const SWord32 s1715 = table3[s1714];-  const SWord32 s1716 = s1713 ^ s1715;-  const SWord8  s1717 = (SWord8) s1657;-  const SWord32 s1718 = table4[s1717];-  const SWord32 s1719 = s1716 ^ s1718;-  const SWord32 s1720 = s37 ^ s1719;-  const SWord8  s1721 = (SWord8) s1720;-  const SWord32 s1722 = table4[s1721];-  const SWord32 s1723 = s1708 ^ s1722;-  const SWord32 s1724 = s40 ^ s1723;-  const SWord8  s1725 = (SWord8) (s1724 >> 24);-  const SWord8  s1726 = table0[s1725];-  const SWord8  s1727 = (SWord8) (s1690 >> 24);-  const SWord32 s1728 = table1[s1727];-  const SWord8  s1729 = (SWord8) (s1705 >> 16);-  const SWord32 s1730 = table2[s1729];-  const SWord32 s1731 = s1728 ^ s1730;-  const SWord8  s1732 = (SWord8) (s1720 >> 8);-  const SWord32 s1733 = table3[s1732];-  const SWord32 s1734 = s1731 ^ s1733;-  const SWord8  s1735 = (SWord8) s1676;-  const SWord32 s1736 = table4[s1735];-  const SWord32 s1737 = s1734 ^ s1736;-  const SWord32 s1738 = s43 ^ s1737;-  const SWord8  s1739 = (SWord8) (s1738 >> 16);-  const SWord8  s1740 = table0[s1739];-  const SWord16 s1741 = (((SWord16) s1726) << 8) | ((SWord16) s1740);-  const SWord8  s1742 = (SWord8) (s1705 >> 24);-  const SWord32 s1743 = table1[s1742];-  const SWord8  s1744 = (SWord8) (s1720 >> 16);-  const SWord32 s1745 = table2[s1744];-  const SWord32 s1746 = s1743 ^ s1745;-  const SWord8  s1747 = (SWord8) (s1676 >> 8);-  const SWord32 s1748 = table3[s1747];-  const SWord32 s1749 = s1746 ^ s1748;-  const SWord8  s1750 = (SWord8) s1690;-  const SWord32 s1751 = table4[s1750];-  const SWord32 s1752 = s1749 ^ s1751;-  const SWord32 s1753 = s42 ^ s1752;-  const SWord8  s1754 = (SWord8) (s1753 >> 8);-  const SWord8  s1755 = table0[s1754];-  const SWord8  s1756 = (SWord8) (s1720 >> 24);-  const SWord32 s1757 = table1[s1756];-  const SWord8  s1758 = (SWord8) (s1676 >> 16);-  const SWord32 s1759 = table2[s1758];-  const SWord32 s1760 = s1757 ^ s1759;-  const SWord8  s1761 = (SWord8) (s1690 >> 8);-  const SWord32 s1762 = table3[s1761];-  const SWord32 s1763 = s1760 ^ s1762;-  const SWord8  s1764 = (SWord8) s1705;-  const SWord32 s1765 = table4[s1764];-  const SWord32 s1766 = s1763 ^ s1765;-  const SWord32 s1767 = s41 ^ s1766;-  const SWord8  s1768 = (SWord8) s1767;-  const SWord8  s1769 = table0[s1768];-  const SWord16 s1770 = (((SWord16) s1755) << 8) | ((SWord16) s1769);-  const SWord32 s1771 = (((SWord32) s1741) << 16) | ((SWord32) s1770);-  const SWord32 s1772 = s44 ^ s1771;-  const SWord8  s1773 = (SWord8) (s1767 >> 24);-  const SWord8  s1774 = table0[s1773];-  const SWord8  s1775 = (SWord8) (s1724 >> 16);-  const SWord8  s1776 = table0[s1775];-  const SWord16 s1777 = (((SWord16) s1774) << 8) | ((SWord16) s1776);-  const SWord8  s1778 = (SWord8) (s1738 >> 8);-  const SWord8  s1779 = table0[s1778];-  const SWord8  s1780 = (SWord8) s1753;-  const SWord8  s1781 = table0[s1780];-  const SWord16 s1782 = (((SWord16) s1779) << 8) | ((SWord16) s1781);-  const SWord32 s1783 = (((SWord32) s1777) << 16) | ((SWord32) s1782);-  const SWord32 s1784 = s45 ^ s1783;-  const SWord8  s1785 = (SWord8) (s1753 >> 24);-  const SWord8  s1786 = table0[s1785];-  const SWord8  s1787 = (SWord8) (s1767 >> 16);-  const SWord8  s1788 = table0[s1787];-  const SWord16 s1789 = (((SWord16) s1786) << 8) | ((SWord16) s1788);-  const SWord8  s1790 = (SWord8) (s1724 >> 8);-  const SWord8  s1791 = table0[s1790];-  const SWord8  s1792 = (SWord8) s1738;-  const SWord8  s1793 = table0[s1792];-  const SWord16 s1794 = (((SWord16) s1791) << 8) | ((SWord16) s1793);-  const SWord32 s1795 = (((SWord32) s1789) << 16) | ((SWord32) s1794);-  const SWord32 s1796 = s46 ^ s1795;-  const SWord8  s1797 = (SWord8) (s1738 >> 24);-  const SWord8  s1798 = table0[s1797];-  const SWord8  s1799 = (SWord8) (s1753 >> 16);-  const SWord8  s1800 = table0[s1799];-  const SWord16 s1801 = (((SWord16) s1798) << 8) | ((SWord16) s1800);-  const SWord8  s1802 = (SWord8) (s1767 >> 8);-  const SWord8  s1803 = table0[s1802];-  const SWord8  s1804 = (SWord8) s1724;-  const SWord8  s1805 = table0[s1804];-  const SWord16 s1806 = (((SWord16) s1803) << 8) | ((SWord16) s1805);-  const SWord32 s1807 = (((SWord32) s1801) << 16) | ((SWord32) s1806);-  const SWord32 s1808 = s47 ^ s1807;--  pt[0] = s1772;-  pt[1] = s1784;-  pt[2] = s1796;-  pt[3] = s1808;-}-== END: "aes128BlockDecrypt.c" ==================-== BEGIN: "aes128InvKeySchedule.c" ================-/* File: "aes128InvKeySchedule.c". Automatically generated by SBV. Do not edit! */--#include "aes128Lib.h"--void aes128InvKeySchedule(const SWord32 *key, SWord32 *decKS)-{-  const SWord32 s0 = key[0];-  const SWord32 s1 = key[1];-  const SWord32 s2 = key[2];-  const SWord32 s3 = key[3];-  static const SWord8 table0[] = {-       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,-      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,-      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,-      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,-       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,-      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,-       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,-       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,-       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,-      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,-       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,-      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,-      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,-      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,-       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,-       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,-      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,-      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,-      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,-      104,  65, 153,  45,  15, 176,  84, 187,  22-  };-  const SWord32 s260 = s2 ^ s3;-  const SWord32 s261 = (s260 << 8) | (s260 >> 24);-  const SWord8  s262 = (SWord8) (s261 >> 24);-  const SWord8  s263 = table0[s262];-  const SWord8  s264 = 54 ^ s263;-  const SWord8  s265 = (SWord8) (s261 >> 16);-  const SWord8  s266 = table0[s265];-  const SWord16 s267 = (((SWord16) s264) << 8) | ((SWord16) s266);-  const SWord8  s268 = (SWord8) (s261 >> 8);-  const SWord8  s269 = table0[s268];-  const SWord8  s270 = (SWord8) s261;-  const SWord8  s271 = table0[s270];-  const SWord16 s272 = (((SWord16) s269) << 8) | ((SWord16) s271);-  const SWord32 s273 = (((SWord32) s267) << 16) | ((SWord32) s272);-  const SWord32 s274 = s0 ^ s273;-  const SWord32 s275 = s0 ^ s1;-  const SWord32 s276 = s1 ^ s2;-  const SWord32 s277 = s260 ^ s276;-  const SWord32 s278 = (s277 << 8) | (s277 >> 24);-  const SWord8  s279 = (SWord8) (s278 >> 24);-  const SWord8  s280 = table0[s279];-  const SWord8  s281 = 27 ^ s280;-  const SWord8  s282 = (SWord8) (s278 >> 16);-  const SWord8  s283 = table0[s282];-  const SWord16 s284 = (((SWord16) s281) << 8) | ((SWord16) s283);-  const SWord8  s285 = (SWord8) (s278 >> 8);-  const SWord8  s286 = table0[s285];-  const SWord8  s287 = (SWord8) s278;-  const SWord8  s288 = table0[s287];-  const SWord16 s289 = (((SWord16) s286) << 8) | ((SWord16) s288);-  const SWord32 s290 = (((SWord32) s284) << 16) | ((SWord32) s289);-  const SWord32 s291 = s274 ^ s290;-  const SWord32 s292 = s274 ^ s275;-  const SWord32 s293 = s275 ^ s276;-  const SWord32 s294 = s277 ^ s293;-  const SWord32 s295 = (s294 << 8) | (s294 >> 24);-  const SWord8  s296 = (SWord8) (s295 >> 24);-  const SWord8  s297 = table0[s296];-  const SWord8  s298 = 128 ^ s297;-  const SWord8  s299 = (SWord8) (s295 >> 16);-  const SWord8  s300 = table0[s299];-  const SWord16 s301 = (((SWord16) s298) << 8) | ((SWord16) s300);-  const SWord8  s302 = (SWord8) (s295 >> 8);-  const SWord8  s303 = table0[s302];-  const SWord8  s304 = (SWord8) s295;-  const SWord8  s305 = table0[s304];-  const SWord16 s306 = (((SWord16) s303) << 8) | ((SWord16) s305);-  const SWord32 s307 = (((SWord32) s301) << 16) | ((SWord32) s306);-  const SWord32 s308 = s291 ^ s307;-  const SWord32 s309 = s291 ^ s292;-  const SWord32 s310 = s292 ^ s293;-  const SWord32 s311 = s294 ^ s310;-  const SWord32 s312 = (s311 << 8) | (s311 >> 24);-  const SWord8  s313 = (SWord8) (s312 >> 24);-  const SWord8  s314 = table0[s313];-  const SWord8  s315 = 64 ^ s314;-  const SWord8  s316 = (SWord8) (s312 >> 16);-  const SWord8  s317 = table0[s316];-  const SWord16 s318 = (((SWord16) s315) << 8) | ((SWord16) s317);-  const SWord8  s319 = (SWord8) (s312 >> 8);-  const SWord8  s320 = table0[s319];-  const SWord8  s321 = (SWord8) s312;-  const SWord8  s322 = table0[s321];-  const SWord16 s323 = (((SWord16) s320) << 8) | ((SWord16) s322);-  const SWord32 s324 = (((SWord32) s318) << 16) | ((SWord32) s323);-  const SWord32 s325 = s308 ^ s324;-  const SWord32 s326 = s308 ^ s309;-  const SWord32 s327 = s309 ^ s310;-  const SWord32 s328 = s311 ^ s327;-  const SWord32 s329 = (s328 << 8) | (s328 >> 24);-  const SWord8  s330 = (SWord8) (s329 >> 24);-  const SWord8  s331 = table0[s330];-  const SWord8  s332 = 32 ^ s331;-  const SWord8  s333 = (SWord8) (s329 >> 16);-  const SWord8  s334 = table0[s333];-  const SWord16 s335 = (((SWord16) s332) << 8) | ((SWord16) s334);-  const SWord8  s336 = (SWord8) (s329 >> 8);-  const SWord8  s337 = table0[s336];-  const SWord8  s338 = (SWord8) s329;-  const SWord8  s339 = table0[s338];-  const SWord16 s340 = (((SWord16) s337) << 8) | ((SWord16) s339);-  const SWord32 s341 = (((SWord32) s335) << 16) | ((SWord32) s340);-  const SWord32 s342 = s325 ^ s341;-  const SWord32 s343 = s325 ^ s326;-  const SWord32 s344 = s326 ^ s327;-  const SWord32 s345 = s328 ^ s344;-  const SWord32 s346 = (s345 << 8) | (s345 >> 24);-  const SWord8  s347 = (SWord8) (s346 >> 24);-  const SWord8  s348 = table0[s347];-  const SWord8  s349 = 16 ^ s348;-  const SWord8  s350 = (SWord8) (s346 >> 16);-  const SWord8  s351 = table0[s350];-  const SWord16 s352 = (((SWord16) s349) << 8) | ((SWord16) s351);-  const SWord8  s353 = (SWord8) (s346 >> 8);-  const SWord8  s354 = table0[s353];-  const SWord8  s355 = (SWord8) s346;-  const SWord8  s356 = table0[s355];-  const SWord16 s357 = (((SWord16) s354) << 8) | ((SWord16) s356);-  const SWord32 s358 = (((SWord32) s352) << 16) | ((SWord32) s357);-  const SWord32 s359 = s342 ^ s358;-  const SWord32 s360 = s342 ^ s343;-  const SWord32 s361 = s343 ^ s344;-  const SWord32 s362 = s345 ^ s361;-  const SWord32 s363 = (s362 << 8) | (s362 >> 24);-  const SWord8  s364 = (SWord8) (s363 >> 24);-  const SWord8  s365 = table0[s364];-  const SWord8  s366 = 8 ^ s365;-  const SWord8  s367 = (SWord8) (s363 >> 16);-  const SWord8  s368 = table0[s367];-  const SWord16 s369 = (((SWord16) s366) << 8) | ((SWord16) s368);-  const SWord8  s370 = (SWord8) (s363 >> 8);-  const SWord8  s371 = table0[s370];-  const SWord8  s372 = (SWord8) s363;-  const SWord8  s373 = table0[s372];-  const SWord16 s374 = (((SWord16) s371) << 8) | ((SWord16) s373);-  const SWord32 s375 = (((SWord32) s369) << 16) | ((SWord32) s374);-  const SWord32 s376 = s359 ^ s375;-  const SWord32 s377 = s359 ^ s360;-  const SWord32 s378 = s360 ^ s361;-  const SWord32 s379 = s362 ^ s378;-  const SWord32 s380 = (s379 << 8) | (s379 >> 24);-  const SWord8  s381 = (SWord8) (s380 >> 24);-  const SWord8  s382 = table0[s381];-  const SWord8  s383 = 4 ^ s382;-  const SWord8  s384 = (SWord8) (s380 >> 16);-  const SWord8  s385 = table0[s384];-  const SWord16 s386 = (((SWord16) s383) << 8) | ((SWord16) s385);-  const SWord8  s387 = (SWord8) (s380 >> 8);-  const SWord8  s388 = table0[s387];-  const SWord8  s389 = (SWord8) s380;-  const SWord8  s390 = table0[s389];-  const SWord16 s391 = (((SWord16) s388) << 8) | ((SWord16) s390);-  const SWord32 s392 = (((SWord32) s386) << 16) | ((SWord32) s391);-  const SWord32 s393 = s376 ^ s392;-  const SWord32 s394 = s376 ^ s377;-  const SWord32 s395 = s377 ^ s378;-  const SWord32 s396 = s379 ^ s395;-  const SWord32 s397 = (s396 << 8) | (s396 >> 24);-  const SWord8  s398 = (SWord8) (s397 >> 24);-  const SWord8  s399 = table0[s398];-  const SWord8  s400 = 2 ^ s399;-  const SWord8  s401 = (SWord8) (s397 >> 16);-  const SWord8  s402 = table0[s401];-  const SWord16 s403 = (((SWord16) s400) << 8) | ((SWord16) s402);-  const SWord8  s404 = (SWord8) (s397 >> 8);-  const SWord8  s405 = table0[s404];-  const SWord8  s406 = (SWord8) s397;-  const SWord8  s407 = table0[s406];-  const SWord16 s408 = (((SWord16) s405) << 8) | ((SWord16) s407);-  const SWord32 s409 = (((SWord32) s403) << 16) | ((SWord32) s408);-  const SWord32 s410 = s393 ^ s409;-  const SWord32 s411 = s393 ^ s394;-  const SWord32 s412 = s394 ^ s395;-  const SWord32 s413 = s396 ^ s412;-  const SWord32 s414 = (s413 << 8) | (s413 >> 24);-  const SWord8  s415 = (SWord8) (s414 >> 24);-  const SWord8  s416 = table0[s415];-  const SWord8  s417 = 1 ^ s416;-  const SWord8  s418 = (SWord8) (s414 >> 16);-  const SWord8  s419 = table0[s418];-  const SWord16 s420 = (((SWord16) s417) << 8) | ((SWord16) s419);-  const SWord8  s421 = (SWord8) (s414 >> 8);-  const SWord8  s422 = table0[s421];-  const SWord8  s423 = (SWord8) s414;-  const SWord8  s424 = table0[s423];-  const SWord16 s425 = (((SWord16) s422) << 8) | ((SWord16) s424);-  const SWord32 s426 = (((SWord32) s420) << 16) | ((SWord32) s425);-  const SWord32 s427 = s410 ^ s426;-  const SWord32 s428 = s410 ^ s411;-  const SWord32 s429 = s411 ^ s412;--  decKS[0] = s0;-  decKS[1] = s1;-  decKS[2] = s2;-  decKS[3] = s3;-  decKS[4] = s274;-  decKS[5] = s275;-  decKS[6] = s276;-  decKS[7] = s260;-  decKS[8] = s291;-  decKS[9] = s292;-  decKS[10] = s293;-  decKS[11] = s277;-  decKS[12] = s308;-  decKS[13] = s309;-  decKS[14] = s310;-  decKS[15] = s294;-  decKS[16] = s325;-  decKS[17] = s326;-  decKS[18] = s327;-  decKS[19] = s311;-  decKS[20] = s342;-  decKS[21] = s343;-  decKS[22] = s344;-  decKS[23] = s328;-  decKS[24] = s359;-  decKS[25] = s360;-  decKS[26] = s361;-  decKS[27] = s345;-  decKS[28] = s376;-  decKS[29] = s377;-  decKS[30] = s378;-  decKS[31] = s362;-  decKS[32] = s393;-  decKS[33] = s394;-  decKS[34] = s395;-  decKS[35] = s379;-  decKS[36] = s410;-  decKS[37] = s411;-  decKS[38] = s412;-  decKS[39] = s396;-  decKS[40] = s427;-  decKS[41] = s428;-  decKS[42] = s429;-  decKS[43] = s413;-}-== END: "aes128InvKeySchedule.c" ==================-== BEGIN: "aes128OTFDecrypt.c" ================-/* File: "aes128OTFDecrypt.c". Automatically generated by SBV. Do not edit! */--#include "aes128Lib.h"--void aes128OTFDecrypt(const SWord32 *ct, const SWord32 *xkey,-                      SWord32 *pt)-{-  const SWord32 s0 = ct[0];-  const SWord32 s1 = ct[1];-  const SWord32 s2 = ct[2];-  const SWord32 s3 = ct[3];-  const SWord32 s4 = xkey[0];-  const SWord32 s5 = xkey[1];-  const SWord32 s6 = xkey[2];-  const SWord32 s7 = xkey[3];-  const SWord32 s8 = xkey[4];-  const SWord32 s9 = xkey[5];-  const SWord32 s10 = xkey[6];-  const SWord32 s11 = xkey[7];-  const SWord32 s12 = xkey[8];-  const SWord32 s13 = xkey[9];-  const SWord32 s14 = xkey[10];-  const SWord32 s15 = xkey[11];-  const SWord32 s16 = xkey[12];-  const SWord32 s17 = xkey[13];-  const SWord32 s18 = xkey[14];-  const SWord32 s19 = xkey[15];-  const SWord32 s20 = xkey[16];-  const SWord32 s21 = xkey[17];-  const SWord32 s22 = xkey[18];-  const SWord32 s23 = xkey[19];-  const SWord32 s24 = xkey[20];-  const SWord32 s25 = xkey[21];-  const SWord32 s26 = xkey[22];-  const SWord32 s27 = xkey[23];-  const SWord32 s28 = xkey[24];-  const SWord32 s29 = xkey[25];-  const SWord32 s30 = xkey[26];-  const SWord32 s31 = xkey[27];-  const SWord32 s32 = xkey[28];-  const SWord32 s33 = xkey[29];-  const SWord32 s34 = xkey[30];-  const SWord32 s35 = xkey[31];-  const SWord32 s36 = xkey[32];-  const SWord32 s37 = xkey[33];-  const SWord32 s38 = xkey[34];-  const SWord32 s39 = xkey[35];-  const SWord32 s40 = xkey[36];-  const SWord32 s41 = xkey[37];-  const SWord32 s42 = xkey[38];-  const SWord32 s43 = xkey[39];-  const SWord32 s44 = xkey[40];-  const SWord32 s45 = xkey[41];-  const SWord32 s46 = xkey[42];-  const SWord32 s47 = xkey[43];-  static const SWord8 table0[] = {-       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,-      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,-       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,-       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,-       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,-      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,-      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,-       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,-      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,-       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,-       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,-      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,-       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,-      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,-      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,-       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,-       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,-      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,-      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,-       38, 225, 105,  20,  99,  85,  33,  12, 125-  };-  static const SWord32 table1[] = {-      0x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL,-      0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL,-      0x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL,-      0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL,-      0xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL,-      0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL,-      0x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL,-      0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL,-      0xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL,-      0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL,-      0xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL,-      0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL,-      0x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL,-      0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL,-      0x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL,-      0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL,-      0xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL,-      0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL,-      0xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL,-      0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL,-      0x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL,-      0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL,-      0x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL,-      0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL,-      0x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL,-      0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL,-      0x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL,-      0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL,-      0x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL,-      0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL,-      0xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL,-      0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL,-      0x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL,-      0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL,-      0x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL,-      0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL,-      0xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL,-      0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL,-      0xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL,-      0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL,-      0x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL,-      0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL,-      0xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL,-      0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL,-      0x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL,-      0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL,-      0x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL,-      0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL,-      0xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL,-      0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL,-      0x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL,-      0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL,-      0x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL,-      0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL,-      0x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL,-      0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL,-      0x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL,-      0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL,-      0x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL,-      0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL,-      0xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL,-      0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL,-      0xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL,-      0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL-  };-  static const SWord32 table2[] = {-      0x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL,-      0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL,-      0x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL,-      0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL,-      0xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL,-      0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL,-      0xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL,-      0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL,-      0x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL,-      0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL,-      0x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL,-      0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL,-      0xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL,-      0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL,-      0x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL,-      0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL,-      0xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL,-      0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL,-      0xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL,-      0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL,-      0x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL,-      0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL,-      0x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL,-      0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL,-      0x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL,-      0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL,-      0xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL,-      0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL,-      0x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL,-      0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL,-      0x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL,-      0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL,-      0xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL,-      0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL,-      0xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL,-      0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL,-      0x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL,-      0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL,-      0x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL,-      0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL,-      0x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL,-      0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL,-      0xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL,-      0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL,-      0x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL,-      0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL,-      0x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL,-      0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL,-      0x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL,-      0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL,-      0x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL,-      0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL,-      0xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL,-      0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL,-      0xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL,-      0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL,-      0x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL,-      0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL,-      0x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL,-      0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL,-      0xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL,-      0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL,-      0x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL,-      0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL-  };-  static const SWord32 table3[] = {-      0x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL,-      0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL,-      0x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL,-      0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL,-      0xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL,-      0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL,-      0xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL,-      0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL,-      0xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL,-      0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL,-      0xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL,-      0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL,-      0x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL,-      0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL,-      0x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL,-      0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL,-      0x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL,-      0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL,-      0x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL,-      0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL,-      0xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL,-      0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL,-      0xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL,-      0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL,-      0xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL,-      0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL,-      0xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL,-      0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL,-      0x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL,-      0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL,-      0x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL,-      0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL,-      0xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL,-      0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL,-      0xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL,-      0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL,-      0x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL,-      0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL,-      0x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL,-      0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL,-      0x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL,-      0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL,-      0x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL,-      0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL,-      0xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL,-      0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL,-      0xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL,-      0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL,-      0xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL,-      0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL,-      0xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL,-      0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL,-      0x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL,-      0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL,-      0x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL,-      0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL,-      0x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL,-      0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL,-      0x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL,-      0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL,-      0xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL,-      0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL,-      0xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL,-      0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL-  };-  static const SWord32 table4[] = {-      0x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL,-      0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL,-      0x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL,-      0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL,-      0x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL,-      0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL,-      0xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL,-      0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL,-      0x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL,-      0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL,-      0x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL,-      0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL,-      0xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL,-      0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL,-      0xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL,-      0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL,-      0x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL,-      0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL,-      0x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL,-      0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL,-      0xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL,-      0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL,-      0xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL,-      0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL,-      0x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL,-      0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL,-      0x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL,-      0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL,-      0xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL,-      0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL,-      0x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL,-      0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL,-      0xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL,-      0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL,-      0xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL,-      0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL,-      0x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL,-      0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL,-      0x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL,-      0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL,-      0xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL,-      0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL,-      0x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL,-      0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL,-      0x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL,-      0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL,-      0x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL,-      0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL,-      0x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL,-      0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL,-      0xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL,-      0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL,-      0x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL,-      0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL,-      0x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL,-      0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL,-      0xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL,-      0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL,-      0xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL,-      0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL,-      0x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL,-      0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL,-      0x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL,-      0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL-  };-  const SWord32 s560 = s0 ^ s4;-  const SWord8  s561 = (SWord8) (s560 >> 24);-  const SWord8  s562 = table0[s561];-  const SWord8  s563 = (SWord8) (s8 >> 24);-  const SWord8  s564 = s562 ^ s563;-  const SWord32 s565 = table1[s564];-  const SWord32 s821 = s3 ^ s7;-  const SWord8  s822 = (SWord8) (s821 >> 16);-  const SWord8  s823 = table0[s822];-  const SWord8  s824 = (SWord8) (s8 >> 16);-  const SWord8  s825 = s823 ^ s824;-  const SWord32 s826 = table2[s825];-  const SWord32 s827 = s565 ^ s826;-  const SWord32 s1083 = s2 ^ s6;-  const SWord8  s1084 = (SWord8) (s1083 >> 8);-  const SWord8  s1085 = table0[s1084];-  const SWord8  s1086 = (SWord8) (s8 >> 8);-  const SWord8  s1087 = s1085 ^ s1086;-  const SWord32 s1088 = table3[s1087];-  const SWord32 s1089 = s827 ^ s1088;-  const SWord32 s1345 = s1 ^ s5;-  const SWord8  s1346 = (SWord8) s1345;-  const SWord8  s1347 = table0[s1346];-  const SWord8  s1348 = (SWord8) s8;-  const SWord8  s1349 = s1347 ^ s1348;-  const SWord32 s1350 = table4[s1349];-  const SWord32 s1351 = s1089 ^ s1350;-  const SWord8  s1352 = (SWord8) (s1351 >> 24);-  const SWord8  s1353 = table0[s1352];-  const SWord8  s1354 = (SWord8) (s12 >> 24);-  const SWord8  s1355 = s1353 ^ s1354;-  const SWord32 s1356 = table1[s1355];-  const SWord8  s1357 = (SWord8) (s821 >> 24);-  const SWord8  s1358 = table0[s1357];-  const SWord8  s1359 = (SWord8) (s11 >> 24);-  const SWord8  s1360 = s1358 ^ s1359;-  const SWord32 s1361 = table1[s1360];-  const SWord8  s1362 = (SWord8) (s1083 >> 16);-  const SWord8  s1363 = table0[s1362];-  const SWord8  s1364 = (SWord8) (s11 >> 16);-  const SWord8  s1365 = s1363 ^ s1364;-  const SWord32 s1366 = table2[s1365];-  const SWord32 s1367 = s1361 ^ s1366;-  const SWord8  s1368 = (SWord8) (s1345 >> 8);-  const SWord8  s1369 = table0[s1368];-  const SWord8  s1370 = (SWord8) (s11 >> 8);-  const SWord8  s1371 = s1369 ^ s1370;-  const SWord32 s1372 = table3[s1371];-  const SWord32 s1373 = s1367 ^ s1372;-  const SWord8  s1374 = (SWord8) s560;-  const SWord8  s1375 = table0[s1374];-  const SWord8  s1376 = (SWord8) s11;-  const SWord8  s1377 = s1375 ^ s1376;-  const SWord32 s1378 = table4[s1377];-  const SWord32 s1379 = s1373 ^ s1378;-  const SWord8  s1380 = (SWord8) (s1379 >> 16);-  const SWord8  s1381 = table0[s1380];-  const SWord8  s1382 = (SWord8) (s12 >> 16);-  const SWord8  s1383 = s1381 ^ s1382;-  const SWord32 s1384 = table2[s1383];-  const SWord32 s1385 = s1356 ^ s1384;-  const SWord8  s1386 = (SWord8) (s1083 >> 24);-  const SWord8  s1387 = table0[s1386];-  const SWord8  s1388 = (SWord8) (s10 >> 24);-  const SWord8  s1389 = s1387 ^ s1388;-  const SWord32 s1390 = table1[s1389];-  const SWord8  s1391 = (SWord8) (s1345 >> 16);-  const SWord8  s1392 = table0[s1391];-  const SWord8  s1393 = (SWord8) (s10 >> 16);-  const SWord8  s1394 = s1392 ^ s1393;-  const SWord32 s1395 = table2[s1394];-  const SWord32 s1396 = s1390 ^ s1395;-  const SWord8  s1397 = (SWord8) (s560 >> 8);-  const SWord8  s1398 = table0[s1397];-  const SWord8  s1399 = (SWord8) (s10 >> 8);-  const SWord8  s1400 = s1398 ^ s1399;-  const SWord32 s1401 = table3[s1400];-  const SWord32 s1402 = s1396 ^ s1401;-  const SWord8  s1403 = (SWord8) s821;-  const SWord8  s1404 = table0[s1403];-  const SWord8  s1405 = (SWord8) s10;-  const SWord8  s1406 = s1404 ^ s1405;-  const SWord32 s1407 = table4[s1406];-  const SWord32 s1408 = s1402 ^ s1407;-  const SWord8  s1409 = (SWord8) (s1408 >> 8);-  const SWord8  s1410 = table0[s1409];-  const SWord8  s1411 = (SWord8) (s12 >> 8);-  const SWord8  s1412 = s1410 ^ s1411;-  const SWord32 s1413 = table3[s1412];-  const SWord32 s1414 = s1385 ^ s1413;-  const SWord8  s1415 = (SWord8) (s1345 >> 24);-  const SWord8  s1416 = table0[s1415];-  const SWord8  s1417 = (SWord8) (s9 >> 24);-  const SWord8  s1418 = s1416 ^ s1417;-  const SWord32 s1419 = table1[s1418];-  const SWord8  s1420 = (SWord8) (s560 >> 16);-  const SWord8  s1421 = table0[s1420];-  const SWord8  s1422 = (SWord8) (s9 >> 16);-  const SWord8  s1423 = s1421 ^ s1422;-  const SWord32 s1424 = table2[s1423];-  const SWord32 s1425 = s1419 ^ s1424;-  const SWord8  s1426 = (SWord8) (s821 >> 8);-  const SWord8  s1427 = table0[s1426];-  const SWord8  s1428 = (SWord8) (s9 >> 8);-  const SWord8  s1429 = s1427 ^ s1428;-  const SWord32 s1430 = table3[s1429];-  const SWord32 s1431 = s1425 ^ s1430;-  const SWord8  s1432 = (SWord8) s1083;-  const SWord8  s1433 = table0[s1432];-  const SWord8  s1434 = (SWord8) s9;-  const SWord8  s1435 = s1433 ^ s1434;-  const SWord32 s1436 = table4[s1435];-  const SWord32 s1437 = s1431 ^ s1436;-  const SWord8  s1438 = (SWord8) s1437;-  const SWord8  s1439 = table0[s1438];-  const SWord8  s1440 = (SWord8) s12;-  const SWord8  s1441 = s1439 ^ s1440;-  const SWord32 s1442 = table4[s1441];-  const SWord32 s1443 = s1414 ^ s1442;-  const SWord8  s1444 = (SWord8) (s1443 >> 24);-  const SWord8  s1445 = table0[s1444];-  const SWord8  s1446 = (SWord8) (s16 >> 24);-  const SWord8  s1447 = s1445 ^ s1446;-  const SWord32 s1448 = table1[s1447];-  const SWord8  s1449 = (SWord8) (s1379 >> 24);-  const SWord8  s1450 = table0[s1449];-  const SWord8  s1451 = (SWord8) (s15 >> 24);-  const SWord8  s1452 = s1450 ^ s1451;-  const SWord32 s1453 = table1[s1452];-  const SWord8  s1454 = (SWord8) (s1408 >> 16);-  const SWord8  s1455 = table0[s1454];-  const SWord8  s1456 = (SWord8) (s15 >> 16);-  const SWord8  s1457 = s1455 ^ s1456;-  const SWord32 s1458 = table2[s1457];-  const SWord32 s1459 = s1453 ^ s1458;-  const SWord8  s1460 = (SWord8) (s1437 >> 8);-  const SWord8  s1461 = table0[s1460];-  const SWord8  s1462 = (SWord8) (s15 >> 8);-  const SWord8  s1463 = s1461 ^ s1462;-  const SWord32 s1464 = table3[s1463];-  const SWord32 s1465 = s1459 ^ s1464;-  const SWord8  s1466 = (SWord8) s1351;-  const SWord8  s1467 = table0[s1466];-  const SWord8  s1468 = (SWord8) s15;-  const SWord8  s1469 = s1467 ^ s1468;-  const SWord32 s1470 = table4[s1469];-  const SWord32 s1471 = s1465 ^ s1470;-  const SWord8  s1472 = (SWord8) (s1471 >> 16);-  const SWord8  s1473 = table0[s1472];-  const SWord8  s1474 = (SWord8) (s16 >> 16);-  const SWord8  s1475 = s1473 ^ s1474;-  const SWord32 s1476 = table2[s1475];-  const SWord32 s1477 = s1448 ^ s1476;-  const SWord8  s1478 = (SWord8) (s1408 >> 24);-  const SWord8  s1479 = table0[s1478];-  const SWord8  s1480 = (SWord8) (s14 >> 24);-  const SWord8  s1481 = s1479 ^ s1480;-  const SWord32 s1482 = table1[s1481];-  const SWord8  s1483 = (SWord8) (s1437 >> 16);-  const SWord8  s1484 = table0[s1483];-  const SWord8  s1485 = (SWord8) (s14 >> 16);-  const SWord8  s1486 = s1484 ^ s1485;-  const SWord32 s1487 = table2[s1486];-  const SWord32 s1488 = s1482 ^ s1487;-  const SWord8  s1489 = (SWord8) (s1351 >> 8);-  const SWord8  s1490 = table0[s1489];-  const SWord8  s1491 = (SWord8) (s14 >> 8);-  const SWord8  s1492 = s1490 ^ s1491;-  const SWord32 s1493 = table3[s1492];-  const SWord32 s1494 = s1488 ^ s1493;-  const SWord8  s1495 = (SWord8) s1379;-  const SWord8  s1496 = table0[s1495];-  const SWord8  s1497 = (SWord8) s14;-  const SWord8  s1498 = s1496 ^ s1497;-  const SWord32 s1499 = table4[s1498];-  const SWord32 s1500 = s1494 ^ s1499;-  const SWord8  s1501 = (SWord8) (s1500 >> 8);-  const SWord8  s1502 = table0[s1501];-  const SWord8  s1503 = (SWord8) (s16 >> 8);-  const SWord8  s1504 = s1502 ^ s1503;-  const SWord32 s1505 = table3[s1504];-  const SWord32 s1506 = s1477 ^ s1505;-  const SWord8  s1507 = (SWord8) (s1437 >> 24);-  const SWord8  s1508 = table0[s1507];-  const SWord8  s1509 = (SWord8) (s13 >> 24);-  const SWord8  s1510 = s1508 ^ s1509;-  const SWord32 s1511 = table1[s1510];-  const SWord8  s1512 = (SWord8) (s1351 >> 16);-  const SWord8  s1513 = table0[s1512];-  const SWord8  s1514 = (SWord8) (s13 >> 16);-  const SWord8  s1515 = s1513 ^ s1514;-  const SWord32 s1516 = table2[s1515];-  const SWord32 s1517 = s1511 ^ s1516;-  const SWord8  s1518 = (SWord8) (s1379 >> 8);-  const SWord8  s1519 = table0[s1518];-  const SWord8  s1520 = (SWord8) (s13 >> 8);-  const SWord8  s1521 = s1519 ^ s1520;-  const SWord32 s1522 = table3[s1521];-  const SWord32 s1523 = s1517 ^ s1522;-  const SWord8  s1524 = (SWord8) s1408;-  const SWord8  s1525 = table0[s1524];-  const SWord8  s1526 = (SWord8) s13;-  const SWord8  s1527 = s1525 ^ s1526;-  const SWord32 s1528 = table4[s1527];-  const SWord32 s1529 = s1523 ^ s1528;-  const SWord8  s1530 = (SWord8) s1529;-  const SWord8  s1531 = table0[s1530];-  const SWord8  s1532 = (SWord8) s16;-  const SWord8  s1533 = s1531 ^ s1532;-  const SWord32 s1534 = table4[s1533];-  const SWord32 s1535 = s1506 ^ s1534;-  const SWord8  s1536 = (SWord8) (s1535 >> 24);-  const SWord8  s1537 = table0[s1536];-  const SWord8  s1538 = (SWord8) (s20 >> 24);-  const SWord8  s1539 = s1537 ^ s1538;-  const SWord32 s1540 = table1[s1539];-  const SWord8  s1541 = (SWord8) (s1471 >> 24);-  const SWord8  s1542 = table0[s1541];-  const SWord8  s1543 = (SWord8) (s19 >> 24);-  const SWord8  s1544 = s1542 ^ s1543;-  const SWord32 s1545 = table1[s1544];-  const SWord8  s1546 = (SWord8) (s1500 >> 16);-  const SWord8  s1547 = table0[s1546];-  const SWord8  s1548 = (SWord8) (s19 >> 16);-  const SWord8  s1549 = s1547 ^ s1548;-  const SWord32 s1550 = table2[s1549];-  const SWord32 s1551 = s1545 ^ s1550;-  const SWord8  s1552 = (SWord8) (s1529 >> 8);-  const SWord8  s1553 = table0[s1552];-  const SWord8  s1554 = (SWord8) (s19 >> 8);-  const SWord8  s1555 = s1553 ^ s1554;-  const SWord32 s1556 = table3[s1555];-  const SWord32 s1557 = s1551 ^ s1556;-  const SWord8  s1558 = (SWord8) s1443;-  const SWord8  s1559 = table0[s1558];-  const SWord8  s1560 = (SWord8) s19;-  const SWord8  s1561 = s1559 ^ s1560;-  const SWord32 s1562 = table4[s1561];-  const SWord32 s1563 = s1557 ^ s1562;-  const SWord8  s1564 = (SWord8) (s1563 >> 16);-  const SWord8  s1565 = table0[s1564];-  const SWord8  s1566 = (SWord8) (s20 >> 16);-  const SWord8  s1567 = s1565 ^ s1566;-  const SWord32 s1568 = table2[s1567];-  const SWord32 s1569 = s1540 ^ s1568;-  const SWord8  s1570 = (SWord8) (s1500 >> 24);-  const SWord8  s1571 = table0[s1570];-  const SWord8  s1572 = (SWord8) (s18 >> 24);-  const SWord8  s1573 = s1571 ^ s1572;-  const SWord32 s1574 = table1[s1573];-  const SWord8  s1575 = (SWord8) (s1529 >> 16);-  const SWord8  s1576 = table0[s1575];-  const SWord8  s1577 = (SWord8) (s18 >> 16);-  const SWord8  s1578 = s1576 ^ s1577;-  const SWord32 s1579 = table2[s1578];-  const SWord32 s1580 = s1574 ^ s1579;-  const SWord8  s1581 = (SWord8) (s1443 >> 8);-  const SWord8  s1582 = table0[s1581];-  const SWord8  s1583 = (SWord8) (s18 >> 8);-  const SWord8  s1584 = s1582 ^ s1583;-  const SWord32 s1585 = table3[s1584];-  const SWord32 s1586 = s1580 ^ s1585;-  const SWord8  s1587 = (SWord8) s1471;-  const SWord8  s1588 = table0[s1587];-  const SWord8  s1589 = (SWord8) s18;-  const SWord8  s1590 = s1588 ^ s1589;-  const SWord32 s1591 = table4[s1590];-  const SWord32 s1592 = s1586 ^ s1591;-  const SWord8  s1593 = (SWord8) (s1592 >> 8);-  const SWord8  s1594 = table0[s1593];-  const SWord8  s1595 = (SWord8) (s20 >> 8);-  const SWord8  s1596 = s1594 ^ s1595;-  const SWord32 s1597 = table3[s1596];-  const SWord32 s1598 = s1569 ^ s1597;-  const SWord8  s1599 = (SWord8) (s1529 >> 24);-  const SWord8  s1600 = table0[s1599];-  const SWord8  s1601 = (SWord8) (s17 >> 24);-  const SWord8  s1602 = s1600 ^ s1601;-  const SWord32 s1603 = table1[s1602];-  const SWord8  s1604 = (SWord8) (s1443 >> 16);-  const SWord8  s1605 = table0[s1604];-  const SWord8  s1606 = (SWord8) (s17 >> 16);-  const SWord8  s1607 = s1605 ^ s1606;-  const SWord32 s1608 = table2[s1607];-  const SWord32 s1609 = s1603 ^ s1608;-  const SWord8  s1610 = (SWord8) (s1471 >> 8);-  const SWord8  s1611 = table0[s1610];-  const SWord8  s1612 = (SWord8) (s17 >> 8);-  const SWord8  s1613 = s1611 ^ s1612;-  const SWord32 s1614 = table3[s1613];-  const SWord32 s1615 = s1609 ^ s1614;-  const SWord8  s1616 = (SWord8) s1500;-  const SWord8  s1617 = table0[s1616];-  const SWord8  s1618 = (SWord8) s17;-  const SWord8  s1619 = s1617 ^ s1618;-  const SWord32 s1620 = table4[s1619];-  const SWord32 s1621 = s1615 ^ s1620;-  const SWord8  s1622 = (SWord8) s1621;-  const SWord8  s1623 = table0[s1622];-  const SWord8  s1624 = (SWord8) s20;-  const SWord8  s1625 = s1623 ^ s1624;-  const SWord32 s1626 = table4[s1625];-  const SWord32 s1627 = s1598 ^ s1626;-  const SWord8  s1628 = (SWord8) (s1627 >> 24);-  const SWord8  s1629 = table0[s1628];-  const SWord8  s1630 = (SWord8) (s24 >> 24);-  const SWord8  s1631 = s1629 ^ s1630;-  const SWord32 s1632 = table1[s1631];-  const SWord8  s1633 = (SWord8) (s1563 >> 24);-  const SWord8  s1634 = table0[s1633];-  const SWord8  s1635 = (SWord8) (s23 >> 24);-  const SWord8  s1636 = s1634 ^ s1635;-  const SWord32 s1637 = table1[s1636];-  const SWord8  s1638 = (SWord8) (s1592 >> 16);-  const SWord8  s1639 = table0[s1638];-  const SWord8  s1640 = (SWord8) (s23 >> 16);-  const SWord8  s1641 = s1639 ^ s1640;-  const SWord32 s1642 = table2[s1641];-  const SWord32 s1643 = s1637 ^ s1642;-  const SWord8  s1644 = (SWord8) (s1621 >> 8);-  const SWord8  s1645 = table0[s1644];-  const SWord8  s1646 = (SWord8) (s23 >> 8);-  const SWord8  s1647 = s1645 ^ s1646;-  const SWord32 s1648 = table3[s1647];-  const SWord32 s1649 = s1643 ^ s1648;-  const SWord8  s1650 = (SWord8) s1535;-  const SWord8  s1651 = table0[s1650];-  const SWord8  s1652 = (SWord8) s23;-  const SWord8  s1653 = s1651 ^ s1652;-  const SWord32 s1654 = table4[s1653];-  const SWord32 s1655 = s1649 ^ s1654;-  const SWord8  s1656 = (SWord8) (s1655 >> 16);-  const SWord8  s1657 = table0[s1656];-  const SWord8  s1658 = (SWord8) (s24 >> 16);-  const SWord8  s1659 = s1657 ^ s1658;-  const SWord32 s1660 = table2[s1659];-  const SWord32 s1661 = s1632 ^ s1660;-  const SWord8  s1662 = (SWord8) (s1592 >> 24);-  const SWord8  s1663 = table0[s1662];-  const SWord8  s1664 = (SWord8) (s22 >> 24);-  const SWord8  s1665 = s1663 ^ s1664;-  const SWord32 s1666 = table1[s1665];-  const SWord8  s1667 = (SWord8) (s1621 >> 16);-  const SWord8  s1668 = table0[s1667];-  const SWord8  s1669 = (SWord8) (s22 >> 16);-  const SWord8  s1670 = s1668 ^ s1669;-  const SWord32 s1671 = table2[s1670];-  const SWord32 s1672 = s1666 ^ s1671;-  const SWord8  s1673 = (SWord8) (s1535 >> 8);-  const SWord8  s1674 = table0[s1673];-  const SWord8  s1675 = (SWord8) (s22 >> 8);-  const SWord8  s1676 = s1674 ^ s1675;-  const SWord32 s1677 = table3[s1676];-  const SWord32 s1678 = s1672 ^ s1677;-  const SWord8  s1679 = (SWord8) s1563;-  const SWord8  s1680 = table0[s1679];-  const SWord8  s1681 = (SWord8) s22;-  const SWord8  s1682 = s1680 ^ s1681;-  const SWord32 s1683 = table4[s1682];-  const SWord32 s1684 = s1678 ^ s1683;-  const SWord8  s1685 = (SWord8) (s1684 >> 8);-  const SWord8  s1686 = table0[s1685];-  const SWord8  s1687 = (SWord8) (s24 >> 8);-  const SWord8  s1688 = s1686 ^ s1687;-  const SWord32 s1689 = table3[s1688];-  const SWord32 s1690 = s1661 ^ s1689;-  const SWord8  s1691 = (SWord8) (s1621 >> 24);-  const SWord8  s1692 = table0[s1691];-  const SWord8  s1693 = (SWord8) (s21 >> 24);-  const SWord8  s1694 = s1692 ^ s1693;-  const SWord32 s1695 = table1[s1694];-  const SWord8  s1696 = (SWord8) (s1535 >> 16);-  const SWord8  s1697 = table0[s1696];-  const SWord8  s1698 = (SWord8) (s21 >> 16);-  const SWord8  s1699 = s1697 ^ s1698;-  const SWord32 s1700 = table2[s1699];-  const SWord32 s1701 = s1695 ^ s1700;-  const SWord8  s1702 = (SWord8) (s1563 >> 8);-  const SWord8  s1703 = table0[s1702];-  const SWord8  s1704 = (SWord8) (s21 >> 8);-  const SWord8  s1705 = s1703 ^ s1704;-  const SWord32 s1706 = table3[s1705];-  const SWord32 s1707 = s1701 ^ s1706;-  const SWord8  s1708 = (SWord8) s1592;-  const SWord8  s1709 = table0[s1708];-  const SWord8  s1710 = (SWord8) s21;-  const SWord8  s1711 = s1709 ^ s1710;-  const SWord32 s1712 = table4[s1711];-  const SWord32 s1713 = s1707 ^ s1712;-  const SWord8  s1714 = (SWord8) s1713;-  const SWord8  s1715 = table0[s1714];-  const SWord8  s1716 = (SWord8) s24;-  const SWord8  s1717 = s1715 ^ s1716;-  const SWord32 s1718 = table4[s1717];-  const SWord32 s1719 = s1690 ^ s1718;-  const SWord8  s1720 = (SWord8) (s1719 >> 24);-  const SWord8  s1721 = table0[s1720];-  const SWord8  s1722 = (SWord8) (s28 >> 24);-  const SWord8  s1723 = s1721 ^ s1722;-  const SWord32 s1724 = table1[s1723];-  const SWord8  s1725 = (SWord8) (s1655 >> 24);-  const SWord8  s1726 = table0[s1725];-  const SWord8  s1727 = (SWord8) (s27 >> 24);-  const SWord8  s1728 = s1726 ^ s1727;-  const SWord32 s1729 = table1[s1728];-  const SWord8  s1730 = (SWord8) (s1684 >> 16);-  const SWord8  s1731 = table0[s1730];-  const SWord8  s1732 = (SWord8) (s27 >> 16);-  const SWord8  s1733 = s1731 ^ s1732;-  const SWord32 s1734 = table2[s1733];-  const SWord32 s1735 = s1729 ^ s1734;-  const SWord8  s1736 = (SWord8) (s1713 >> 8);-  const SWord8  s1737 = table0[s1736];-  const SWord8  s1738 = (SWord8) (s27 >> 8);-  const SWord8  s1739 = s1737 ^ s1738;-  const SWord32 s1740 = table3[s1739];-  const SWord32 s1741 = s1735 ^ s1740;-  const SWord8  s1742 = (SWord8) s1627;-  const SWord8  s1743 = table0[s1742];-  const SWord8  s1744 = (SWord8) s27;-  const SWord8  s1745 = s1743 ^ s1744;-  const SWord32 s1746 = table4[s1745];-  const SWord32 s1747 = s1741 ^ s1746;-  const SWord8  s1748 = (SWord8) (s1747 >> 16);-  const SWord8  s1749 = table0[s1748];-  const SWord8  s1750 = (SWord8) (s28 >> 16);-  const SWord8  s1751 = s1749 ^ s1750;-  const SWord32 s1752 = table2[s1751];-  const SWord32 s1753 = s1724 ^ s1752;-  const SWord8  s1754 = (SWord8) (s1684 >> 24);-  const SWord8  s1755 = table0[s1754];-  const SWord8  s1756 = (SWord8) (s26 >> 24);-  const SWord8  s1757 = s1755 ^ s1756;-  const SWord32 s1758 = table1[s1757];-  const SWord8  s1759 = (SWord8) (s1713 >> 16);-  const SWord8  s1760 = table0[s1759];-  const SWord8  s1761 = (SWord8) (s26 >> 16);-  const SWord8  s1762 = s1760 ^ s1761;-  const SWord32 s1763 = table2[s1762];-  const SWord32 s1764 = s1758 ^ s1763;-  const SWord8  s1765 = (SWord8) (s1627 >> 8);-  const SWord8  s1766 = table0[s1765];-  const SWord8  s1767 = (SWord8) (s26 >> 8);-  const SWord8  s1768 = s1766 ^ s1767;-  const SWord32 s1769 = table3[s1768];-  const SWord32 s1770 = s1764 ^ s1769;-  const SWord8  s1771 = (SWord8) s1655;-  const SWord8  s1772 = table0[s1771];-  const SWord8  s1773 = (SWord8) s26;-  const SWord8  s1774 = s1772 ^ s1773;-  const SWord32 s1775 = table4[s1774];-  const SWord32 s1776 = s1770 ^ s1775;-  const SWord8  s1777 = (SWord8) (s1776 >> 8);-  const SWord8  s1778 = table0[s1777];-  const SWord8  s1779 = (SWord8) (s28 >> 8);-  const SWord8  s1780 = s1778 ^ s1779;-  const SWord32 s1781 = table3[s1780];-  const SWord32 s1782 = s1753 ^ s1781;-  const SWord8  s1783 = (SWord8) (s1713 >> 24);-  const SWord8  s1784 = table0[s1783];-  const SWord8  s1785 = (SWord8) (s25 >> 24);-  const SWord8  s1786 = s1784 ^ s1785;-  const SWord32 s1787 = table1[s1786];-  const SWord8  s1788 = (SWord8) (s1627 >> 16);-  const SWord8  s1789 = table0[s1788];-  const SWord8  s1790 = (SWord8) (s25 >> 16);-  const SWord8  s1791 = s1789 ^ s1790;-  const SWord32 s1792 = table2[s1791];-  const SWord32 s1793 = s1787 ^ s1792;-  const SWord8  s1794 = (SWord8) (s1655 >> 8);-  const SWord8  s1795 = table0[s1794];-  const SWord8  s1796 = (SWord8) (s25 >> 8);-  const SWord8  s1797 = s1795 ^ s1796;-  const SWord32 s1798 = table3[s1797];-  const SWord32 s1799 = s1793 ^ s1798;-  const SWord8  s1800 = (SWord8) s1684;-  const SWord8  s1801 = table0[s1800];-  const SWord8  s1802 = (SWord8) s25;-  const SWord8  s1803 = s1801 ^ s1802;-  const SWord32 s1804 = table4[s1803];-  const SWord32 s1805 = s1799 ^ s1804;-  const SWord8  s1806 = (SWord8) s1805;-  const SWord8  s1807 = table0[s1806];-  const SWord8  s1808 = (SWord8) s28;-  const SWord8  s1809 = s1807 ^ s1808;-  const SWord32 s1810 = table4[s1809];-  const SWord32 s1811 = s1782 ^ s1810;-  const SWord8  s1812 = (SWord8) (s1811 >> 24);-  const SWord8  s1813 = table0[s1812];-  const SWord8  s1814 = (SWord8) (s32 >> 24);-  const SWord8  s1815 = s1813 ^ s1814;-  const SWord32 s1816 = table1[s1815];-  const SWord8  s1817 = (SWord8) (s1747 >> 24);-  const SWord8  s1818 = table0[s1817];-  const SWord8  s1819 = (SWord8) (s31 >> 24);-  const SWord8  s1820 = s1818 ^ s1819;-  const SWord32 s1821 = table1[s1820];-  const SWord8  s1822 = (SWord8) (s1776 >> 16);-  const SWord8  s1823 = table0[s1822];-  const SWord8  s1824 = (SWord8) (s31 >> 16);-  const SWord8  s1825 = s1823 ^ s1824;-  const SWord32 s1826 = table2[s1825];-  const SWord32 s1827 = s1821 ^ s1826;-  const SWord8  s1828 = (SWord8) (s1805 >> 8);-  const SWord8  s1829 = table0[s1828];-  const SWord8  s1830 = (SWord8) (s31 >> 8);-  const SWord8  s1831 = s1829 ^ s1830;-  const SWord32 s1832 = table3[s1831];-  const SWord32 s1833 = s1827 ^ s1832;-  const SWord8  s1834 = (SWord8) s1719;-  const SWord8  s1835 = table0[s1834];-  const SWord8  s1836 = (SWord8) s31;-  const SWord8  s1837 = s1835 ^ s1836;-  const SWord32 s1838 = table4[s1837];-  const SWord32 s1839 = s1833 ^ s1838;-  const SWord8  s1840 = (SWord8) (s1839 >> 16);-  const SWord8  s1841 = table0[s1840];-  const SWord8  s1842 = (SWord8) (s32 >> 16);-  const SWord8  s1843 = s1841 ^ s1842;-  const SWord32 s1844 = table2[s1843];-  const SWord32 s1845 = s1816 ^ s1844;-  const SWord8  s1846 = (SWord8) (s1776 >> 24);-  const SWord8  s1847 = table0[s1846];-  const SWord8  s1848 = (SWord8) (s30 >> 24);-  const SWord8  s1849 = s1847 ^ s1848;-  const SWord32 s1850 = table1[s1849];-  const SWord8  s1851 = (SWord8) (s1805 >> 16);-  const SWord8  s1852 = table0[s1851];-  const SWord8  s1853 = (SWord8) (s30 >> 16);-  const SWord8  s1854 = s1852 ^ s1853;-  const SWord32 s1855 = table2[s1854];-  const SWord32 s1856 = s1850 ^ s1855;-  const SWord8  s1857 = (SWord8) (s1719 >> 8);-  const SWord8  s1858 = table0[s1857];-  const SWord8  s1859 = (SWord8) (s30 >> 8);-  const SWord8  s1860 = s1858 ^ s1859;-  const SWord32 s1861 = table3[s1860];-  const SWord32 s1862 = s1856 ^ s1861;-  const SWord8  s1863 = (SWord8) s1747;-  const SWord8  s1864 = table0[s1863];-  const SWord8  s1865 = (SWord8) s30;-  const SWord8  s1866 = s1864 ^ s1865;-  const SWord32 s1867 = table4[s1866];-  const SWord32 s1868 = s1862 ^ s1867;-  const SWord8  s1869 = (SWord8) (s1868 >> 8);-  const SWord8  s1870 = table0[s1869];-  const SWord8  s1871 = (SWord8) (s32 >> 8);-  const SWord8  s1872 = s1870 ^ s1871;-  const SWord32 s1873 = table3[s1872];-  const SWord32 s1874 = s1845 ^ s1873;-  const SWord8  s1875 = (SWord8) (s1805 >> 24);-  const SWord8  s1876 = table0[s1875];-  const SWord8  s1877 = (SWord8) (s29 >> 24);-  const SWord8  s1878 = s1876 ^ s1877;-  const SWord32 s1879 = table1[s1878];-  const SWord8  s1880 = (SWord8) (s1719 >> 16);-  const SWord8  s1881 = table0[s1880];-  const SWord8  s1882 = (SWord8) (s29 >> 16);-  const SWord8  s1883 = s1881 ^ s1882;-  const SWord32 s1884 = table2[s1883];-  const SWord32 s1885 = s1879 ^ s1884;-  const SWord8  s1886 = (SWord8) (s1747 >> 8);-  const SWord8  s1887 = table0[s1886];-  const SWord8  s1888 = (SWord8) (s29 >> 8);-  const SWord8  s1889 = s1887 ^ s1888;-  const SWord32 s1890 = table3[s1889];-  const SWord32 s1891 = s1885 ^ s1890;-  const SWord8  s1892 = (SWord8) s1776;-  const SWord8  s1893 = table0[s1892];-  const SWord8  s1894 = (SWord8) s29;-  const SWord8  s1895 = s1893 ^ s1894;-  const SWord32 s1896 = table4[s1895];-  const SWord32 s1897 = s1891 ^ s1896;-  const SWord8  s1898 = (SWord8) s1897;-  const SWord8  s1899 = table0[s1898];-  const SWord8  s1900 = (SWord8) s32;-  const SWord8  s1901 = s1899 ^ s1900;-  const SWord32 s1902 = table4[s1901];-  const SWord32 s1903 = s1874 ^ s1902;-  const SWord8  s1904 = (SWord8) (s1903 >> 24);-  const SWord8  s1905 = table0[s1904];-  const SWord8  s1906 = (SWord8) (s36 >> 24);-  const SWord8  s1907 = s1905 ^ s1906;-  const SWord32 s1908 = table1[s1907];-  const SWord8  s1909 = (SWord8) (s1839 >> 24);-  const SWord8  s1910 = table0[s1909];-  const SWord8  s1911 = (SWord8) (s35 >> 24);-  const SWord8  s1912 = s1910 ^ s1911;-  const SWord32 s1913 = table1[s1912];-  const SWord8  s1914 = (SWord8) (s1868 >> 16);-  const SWord8  s1915 = table0[s1914];-  const SWord8  s1916 = (SWord8) (s35 >> 16);-  const SWord8  s1917 = s1915 ^ s1916;-  const SWord32 s1918 = table2[s1917];-  const SWord32 s1919 = s1913 ^ s1918;-  const SWord8  s1920 = (SWord8) (s1897 >> 8);-  const SWord8  s1921 = table0[s1920];-  const SWord8  s1922 = (SWord8) (s35 >> 8);-  const SWord8  s1923 = s1921 ^ s1922;-  const SWord32 s1924 = table3[s1923];-  const SWord32 s1925 = s1919 ^ s1924;-  const SWord8  s1926 = (SWord8) s1811;-  const SWord8  s1927 = table0[s1926];-  const SWord8  s1928 = (SWord8) s35;-  const SWord8  s1929 = s1927 ^ s1928;-  const SWord32 s1930 = table4[s1929];-  const SWord32 s1931 = s1925 ^ s1930;-  const SWord8  s1932 = (SWord8) (s1931 >> 16);-  const SWord8  s1933 = table0[s1932];-  const SWord8  s1934 = (SWord8) (s36 >> 16);-  const SWord8  s1935 = s1933 ^ s1934;-  const SWord32 s1936 = table2[s1935];-  const SWord32 s1937 = s1908 ^ s1936;-  const SWord8  s1938 = (SWord8) (s1868 >> 24);-  const SWord8  s1939 = table0[s1938];-  const SWord8  s1940 = (SWord8) (s34 >> 24);-  const SWord8  s1941 = s1939 ^ s1940;-  const SWord32 s1942 = table1[s1941];-  const SWord8  s1943 = (SWord8) (s1897 >> 16);-  const SWord8  s1944 = table0[s1943];-  const SWord8  s1945 = (SWord8) (s34 >> 16);-  const SWord8  s1946 = s1944 ^ s1945;-  const SWord32 s1947 = table2[s1946];-  const SWord32 s1948 = s1942 ^ s1947;-  const SWord8  s1949 = (SWord8) (s1811 >> 8);-  const SWord8  s1950 = table0[s1949];-  const SWord8  s1951 = (SWord8) (s34 >> 8);-  const SWord8  s1952 = s1950 ^ s1951;-  const SWord32 s1953 = table3[s1952];-  const SWord32 s1954 = s1948 ^ s1953;-  const SWord8  s1955 = (SWord8) s1839;-  const SWord8  s1956 = table0[s1955];-  const SWord8  s1957 = (SWord8) s34;-  const SWord8  s1958 = s1956 ^ s1957;-  const SWord32 s1959 = table4[s1958];-  const SWord32 s1960 = s1954 ^ s1959;-  const SWord8  s1961 = (SWord8) (s1960 >> 8);-  const SWord8  s1962 = table0[s1961];-  const SWord8  s1963 = (SWord8) (s36 >> 8);-  const SWord8  s1964 = s1962 ^ s1963;-  const SWord32 s1965 = table3[s1964];-  const SWord32 s1966 = s1937 ^ s1965;-  const SWord8  s1967 = (SWord8) (s1897 >> 24);-  const SWord8  s1968 = table0[s1967];-  const SWord8  s1969 = (SWord8) (s33 >> 24);-  const SWord8  s1970 = s1968 ^ s1969;-  const SWord32 s1971 = table1[s1970];-  const SWord8  s1972 = (SWord8) (s1811 >> 16);-  const SWord8  s1973 = table0[s1972];-  const SWord8  s1974 = (SWord8) (s33 >> 16);-  const SWord8  s1975 = s1973 ^ s1974;-  const SWord32 s1976 = table2[s1975];-  const SWord32 s1977 = s1971 ^ s1976;-  const SWord8  s1978 = (SWord8) (s1839 >> 8);-  const SWord8  s1979 = table0[s1978];-  const SWord8  s1980 = (SWord8) (s33 >> 8);-  const SWord8  s1981 = s1979 ^ s1980;-  const SWord32 s1982 = table3[s1981];-  const SWord32 s1983 = s1977 ^ s1982;-  const SWord8  s1984 = (SWord8) s1868;-  const SWord8  s1985 = table0[s1984];-  const SWord8  s1986 = (SWord8) s33;-  const SWord8  s1987 = s1985 ^ s1986;-  const SWord32 s1988 = table4[s1987];-  const SWord32 s1989 = s1983 ^ s1988;-  const SWord8  s1990 = (SWord8) s1989;-  const SWord8  s1991 = table0[s1990];-  const SWord8  s1992 = (SWord8) s36;-  const SWord8  s1993 = s1991 ^ s1992;-  const SWord32 s1994 = table4[s1993];-  const SWord32 s1995 = s1966 ^ s1994;-  const SWord8  s1996 = (SWord8) (s1995 >> 24);-  const SWord8  s1997 = table0[s1996];-  const SWord8  s1998 = (SWord8) (s40 >> 24);-  const SWord8  s1999 = s1997 ^ s1998;-  const SWord32 s2000 = table1[s1999];-  const SWord8  s2001 = (SWord8) (s1931 >> 24);-  const SWord8  s2002 = table0[s2001];-  const SWord8  s2003 = (SWord8) (s39 >> 24);-  const SWord8  s2004 = s2002 ^ s2003;-  const SWord32 s2005 = table1[s2004];-  const SWord8  s2006 = (SWord8) (s1960 >> 16);-  const SWord8  s2007 = table0[s2006];-  const SWord8  s2008 = (SWord8) (s39 >> 16);-  const SWord8  s2009 = s2007 ^ s2008;-  const SWord32 s2010 = table2[s2009];-  const SWord32 s2011 = s2005 ^ s2010;-  const SWord8  s2012 = (SWord8) (s1989 >> 8);-  const SWord8  s2013 = table0[s2012];-  const SWord8  s2014 = (SWord8) (s39 >> 8);-  const SWord8  s2015 = s2013 ^ s2014;-  const SWord32 s2016 = table3[s2015];-  const SWord32 s2017 = s2011 ^ s2016;-  const SWord8  s2018 = (SWord8) s1903;-  const SWord8  s2019 = table0[s2018];-  const SWord8  s2020 = (SWord8) s39;-  const SWord8  s2021 = s2019 ^ s2020;-  const SWord32 s2022 = table4[s2021];-  const SWord32 s2023 = s2017 ^ s2022;-  const SWord8  s2024 = (SWord8) (s2023 >> 16);-  const SWord8  s2025 = table0[s2024];-  const SWord8  s2026 = (SWord8) (s40 >> 16);-  const SWord8  s2027 = s2025 ^ s2026;-  const SWord32 s2028 = table2[s2027];-  const SWord32 s2029 = s2000 ^ s2028;-  const SWord8  s2030 = (SWord8) (s1960 >> 24);-  const SWord8  s2031 = table0[s2030];-  const SWord8  s2032 = (SWord8) (s38 >> 24);-  const SWord8  s2033 = s2031 ^ s2032;-  const SWord32 s2034 = table1[s2033];-  const SWord8  s2035 = (SWord8) (s1989 >> 16);-  const SWord8  s2036 = table0[s2035];-  const SWord8  s2037 = (SWord8) (s38 >> 16);-  const SWord8  s2038 = s2036 ^ s2037;-  const SWord32 s2039 = table2[s2038];-  const SWord32 s2040 = s2034 ^ s2039;-  const SWord8  s2041 = (SWord8) (s1903 >> 8);-  const SWord8  s2042 = table0[s2041];-  const SWord8  s2043 = (SWord8) (s38 >> 8);-  const SWord8  s2044 = s2042 ^ s2043;-  const SWord32 s2045 = table3[s2044];-  const SWord32 s2046 = s2040 ^ s2045;-  const SWord8  s2047 = (SWord8) s1931;-  const SWord8  s2048 = table0[s2047];-  const SWord8  s2049 = (SWord8) s38;-  const SWord8  s2050 = s2048 ^ s2049;-  const SWord32 s2051 = table4[s2050];-  const SWord32 s2052 = s2046 ^ s2051;-  const SWord8  s2053 = (SWord8) (s2052 >> 8);-  const SWord8  s2054 = table0[s2053];-  const SWord8  s2055 = (SWord8) (s40 >> 8);-  const SWord8  s2056 = s2054 ^ s2055;-  const SWord32 s2057 = table3[s2056];-  const SWord32 s2058 = s2029 ^ s2057;-  const SWord8  s2059 = (SWord8) (s1989 >> 24);-  const SWord8  s2060 = table0[s2059];-  const SWord8  s2061 = (SWord8) (s37 >> 24);-  const SWord8  s2062 = s2060 ^ s2061;-  const SWord32 s2063 = table1[s2062];-  const SWord8  s2064 = (SWord8) (s1903 >> 16);-  const SWord8  s2065 = table0[s2064];-  const SWord8  s2066 = (SWord8) (s37 >> 16);-  const SWord8  s2067 = s2065 ^ s2066;-  const SWord32 s2068 = table2[s2067];-  const SWord32 s2069 = s2063 ^ s2068;-  const SWord8  s2070 = (SWord8) (s1931 >> 8);-  const SWord8  s2071 = table0[s2070];-  const SWord8  s2072 = (SWord8) (s37 >> 8);-  const SWord8  s2073 = s2071 ^ s2072;-  const SWord32 s2074 = table3[s2073];-  const SWord32 s2075 = s2069 ^ s2074;-  const SWord8  s2076 = (SWord8) s1960;-  const SWord8  s2077 = table0[s2076];-  const SWord8  s2078 = (SWord8) s37;-  const SWord8  s2079 = s2077 ^ s2078;-  const SWord32 s2080 = table4[s2079];-  const SWord32 s2081 = s2075 ^ s2080;-  const SWord8  s2082 = (SWord8) s2081;-  const SWord8  s2083 = table0[s2082];-  const SWord8  s2084 = (SWord8) s40;-  const SWord8  s2085 = s2083 ^ s2084;-  const SWord32 s2086 = table4[s2085];-  const SWord32 s2087 = s2058 ^ s2086;-  const SWord8  s2088 = (SWord8) (s2087 >> 24);-  const SWord8  s2089 = table0[s2088];-  const SWord8  s2090 = (SWord8) (s2023 >> 24);-  const SWord8  s2091 = table0[s2090];-  const SWord8  s2092 = (SWord8) (s43 >> 24);-  const SWord8  s2093 = s2091 ^ s2092;-  const SWord32 s2094 = table1[s2093];-  const SWord8  s2095 = (SWord8) (s2052 >> 16);-  const SWord8  s2096 = table0[s2095];-  const SWord8  s2097 = (SWord8) (s43 >> 16);-  const SWord8  s2098 = s2096 ^ s2097;-  const SWord32 s2099 = table2[s2098];-  const SWord32 s2100 = s2094 ^ s2099;-  const SWord8  s2101 = (SWord8) (s2081 >> 8);-  const SWord8  s2102 = table0[s2101];-  const SWord8  s2103 = (SWord8) (s43 >> 8);-  const SWord8  s2104 = s2102 ^ s2103;-  const SWord32 s2105 = table3[s2104];-  const SWord32 s2106 = s2100 ^ s2105;-  const SWord8  s2107 = (SWord8) s1995;-  const SWord8  s2108 = table0[s2107];-  const SWord8  s2109 = (SWord8) s43;-  const SWord8  s2110 = s2108 ^ s2109;-  const SWord32 s2111 = table4[s2110];-  const SWord32 s2112 = s2106 ^ s2111;-  const SWord8  s2113 = (SWord8) (s2112 >> 16);-  const SWord8  s2114 = table0[s2113];-  const SWord16 s2115 = (((SWord16) s2089) << 8) | ((SWord16) s2114);-  const SWord8  s2116 = (SWord8) (s2052 >> 24);-  const SWord8  s2117 = table0[s2116];-  const SWord8  s2118 = (SWord8) (s42 >> 24);-  const SWord8  s2119 = s2117 ^ s2118;-  const SWord32 s2120 = table1[s2119];-  const SWord8  s2121 = (SWord8) (s2081 >> 16);-  const SWord8  s2122 = table0[s2121];-  const SWord8  s2123 = (SWord8) (s42 >> 16);-  const SWord8  s2124 = s2122 ^ s2123;-  const SWord32 s2125 = table2[s2124];-  const SWord32 s2126 = s2120 ^ s2125;-  const SWord8  s2127 = (SWord8) (s1995 >> 8);-  const SWord8  s2128 = table0[s2127];-  const SWord8  s2129 = (SWord8) (s42 >> 8);-  const SWord8  s2130 = s2128 ^ s2129;-  const SWord32 s2131 = table3[s2130];-  const SWord32 s2132 = s2126 ^ s2131;-  const SWord8  s2133 = (SWord8) s2023;-  const SWord8  s2134 = table0[s2133];-  const SWord8  s2135 = (SWord8) s42;-  const SWord8  s2136 = s2134 ^ s2135;-  const SWord32 s2137 = table4[s2136];-  const SWord32 s2138 = s2132 ^ s2137;-  const SWord8  s2139 = (SWord8) (s2138 >> 8);-  const SWord8  s2140 = table0[s2139];-  const SWord8  s2141 = (SWord8) (s2081 >> 24);-  const SWord8  s2142 = table0[s2141];-  const SWord8  s2143 = (SWord8) (s41 >> 24);-  const SWord8  s2144 = s2142 ^ s2143;-  const SWord32 s2145 = table1[s2144];-  const SWord8  s2146 = (SWord8) (s1995 >> 16);-  const SWord8  s2147 = table0[s2146];-  const SWord8  s2148 = (SWord8) (s41 >> 16);-  const SWord8  s2149 = s2147 ^ s2148;-  const SWord32 s2150 = table2[s2149];-  const SWord32 s2151 = s2145 ^ s2150;-  const SWord8  s2152 = (SWord8) (s2023 >> 8);-  const SWord8  s2153 = table0[s2152];-  const SWord8  s2154 = (SWord8) (s41 >> 8);-  const SWord8  s2155 = s2153 ^ s2154;-  const SWord32 s2156 = table3[s2155];-  const SWord32 s2157 = s2151 ^ s2156;-  const SWord8  s2158 = (SWord8) s2052;-  const SWord8  s2159 = table0[s2158];-  const SWord8  s2160 = (SWord8) s41;-  const SWord8  s2161 = s2159 ^ s2160;-  const SWord32 s2162 = table4[s2161];-  const SWord32 s2163 = s2157 ^ s2162;-  const SWord8  s2164 = (SWord8) s2163;-  const SWord8  s2165 = table0[s2164];-  const SWord16 s2166 = (((SWord16) s2140) << 8) | ((SWord16) s2165);-  const SWord32 s2167 = (((SWord32) s2115) << 16) | ((SWord32) s2166);-  const SWord32 s2168 = s44 ^ s2167;-  const SWord8  s2169 = (SWord8) (s2163 >> 24);-  const SWord8  s2170 = table0[s2169];-  const SWord8  s2171 = (SWord8) (s2087 >> 16);-  const SWord8  s2172 = table0[s2171];-  const SWord16 s2173 = (((SWord16) s2170) << 8) | ((SWord16) s2172);-  const SWord8  s2174 = (SWord8) (s2112 >> 8);-  const SWord8  s2175 = table0[s2174];-  const SWord8  s2176 = (SWord8) s2138;-  const SWord8  s2177 = table0[s2176];-  const SWord16 s2178 = (((SWord16) s2175) << 8) | ((SWord16) s2177);-  const SWord32 s2179 = (((SWord32) s2173) << 16) | ((SWord32) s2178);-  const SWord32 s2180 = s45 ^ s2179;-  const SWord8  s2181 = (SWord8) (s2138 >> 24);-  const SWord8  s2182 = table0[s2181];-  const SWord8  s2183 = (SWord8) (s2163 >> 16);-  const SWord8  s2184 = table0[s2183];-  const SWord16 s2185 = (((SWord16) s2182) << 8) | ((SWord16) s2184);-  const SWord8  s2186 = (SWord8) (s2087 >> 8);-  const SWord8  s2187 = table0[s2186];-  const SWord8  s2188 = (SWord8) s2112;-  const SWord8  s2189 = table0[s2188];-  const SWord16 s2190 = (((SWord16) s2187) << 8) | ((SWord16) s2189);-  const SWord32 s2191 = (((SWord32) s2185) << 16) | ((SWord32) s2190);-  const SWord32 s2192 = s46 ^ s2191;-  const SWord8  s2193 = (SWord8) (s2112 >> 24);-  const SWord8  s2194 = table0[s2193];-  const SWord8  s2195 = (SWord8) (s2138 >> 16);-  const SWord8  s2196 = table0[s2195];-  const SWord16 s2197 = (((SWord16) s2194) << 8) | ((SWord16) s2196);-  const SWord8  s2198 = (SWord8) (s2163 >> 8);-  const SWord8  s2199 = table0[s2198];-  const SWord8  s2200 = (SWord8) s2087;-  const SWord8  s2201 = table0[s2200];-  const SWord16 s2202 = (((SWord16) s2199) << 8) | ((SWord16) s2201);-  const SWord32 s2203 = (((SWord32) s2197) << 16) | ((SWord32) s2202);-  const SWord32 s2204 = s47 ^ s2203;--  pt[0] = s2168;-  pt[1] = s2180;-  pt[2] = s2192;-  pt[3] = s2204;-}-== END: "aes128OTFDecrypt.c" ==================-== BEGIN: "aes128Lib.h" ================-/* Header file for aes128Lib. Automatically generated by SBV. Do not edit! */--#ifndef __aes128Lib__HEADER_INCLUDED__-#define __aes128Lib__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* Entry point prototypes: */-void aes128KeySchedule(const SWord32 *key, SWord32 *encKS,-                       SWord32 *decKS);-void aes128BlockEncrypt(const SWord32 *pt, const SWord32 *xkey,-                        SWord32 *ct);-void aes128BlockDecrypt(const SWord32 *ct, const SWord32 *xkey,-                        SWord32 *pt);-void aes128InvKeySchedule(const SWord32 *key, SWord32 *decKS);-void aes128OTFDecrypt(const SWord32 *ct, const SWord32 *xkey,-                      SWord32 *pt);--#endif /* __aes128Lib__HEADER_INCLUDED__ */-== END: "aes128Lib.h" ==================-== BEGIN: "aes128Lib_driver.c" ================-/* Example driver program for aes128Lib. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "aes128Lib.h"--void aes128KeySchedule_driver(void)-{-  const SWord32 key[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array key:\n");-  int key_ctr;-  for(key_ctr = 0; key_ctr < 4 ; ++key_ctr)-    printf("  key[%1d] = 0x%08"PRIx32"UL\n", key_ctr ,key[key_ctr]);--  SWord32 encKS[44];-  SWord32 decKS[44];--  aes128KeySchedule(key, encKS, decKS);--  printf("aes128KeySchedule(key, encKS, decKS) ->\n");-  int encKS_ctr;-  for(encKS_ctr = 0; encKS_ctr < 44 ; ++encKS_ctr)-    printf("  encKS[%2d] = 0x%08"PRIx32"UL\n", encKS_ctr ,encKS[encKS_ctr]);-  int decKS_ctr;-  for(decKS_ctr = 0; decKS_ctr < 44 ; ++decKS_ctr)-    printf("  decKS[%2d] = 0x%08"PRIx32"UL\n", decKS_ctr ,decKS[decKS_ctr]);-}--void aes128BlockEncrypt_driver(void)-{-  const SWord32 pt[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array pt:\n");-  int pt_ctr;-  for(pt_ctr = 0; pt_ctr < 4 ; ++pt_ctr)-    printf("  pt[%1d] = 0x%08"PRIx32"UL\n", pt_ctr ,pt[pt_ctr]);--  const SWord32 xkey[44] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array xkey:\n");-  int xkey_ctr;-  for(xkey_ctr = 0; xkey_ctr < 44 ; ++xkey_ctr)-    printf("  xkey[%2d] = 0x%08"PRIx32"UL\n", xkey_ctr ,xkey[xkey_ctr]);--  SWord32 ct[4];--  aes128BlockEncrypt(pt, xkey, ct);--  printf("aes128BlockEncrypt(pt, xkey, ct) ->\n");-  int ct_ctr;-  for(ct_ctr = 0; ct_ctr < 4 ; ++ct_ctr)-    printf("  ct[%1d] = 0x%08"PRIx32"UL\n", ct_ctr ,ct[ct_ctr]);-}--void aes128BlockDecrypt_driver(void)-{-  const SWord32 ct[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array ct:\n");-  int ct_ctr;-  for(ct_ctr = 0; ct_ctr < 4 ; ++ct_ctr)-    printf("  ct[%1d] = 0x%08"PRIx32"UL\n", ct_ctr ,ct[ct_ctr]);--  const SWord32 xkey[44] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array xkey:\n");-  int xkey_ctr;-  for(xkey_ctr = 0; xkey_ctr < 44 ; ++xkey_ctr)-    printf("  xkey[%2d] = 0x%08"PRIx32"UL\n", xkey_ctr ,xkey[xkey_ctr]);--  SWord32 pt[4];--  aes128BlockDecrypt(ct, xkey, pt);--  printf("aes128BlockDecrypt(ct, xkey, pt) ->\n");-  int pt_ctr;-  for(pt_ctr = 0; pt_ctr < 4 ; ++pt_ctr)-    printf("  pt[%1d] = 0x%08"PRIx32"UL\n", pt_ctr ,pt[pt_ctr]);-}--void aes128InvKeySchedule_driver(void)-{-  const SWord32 key[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array key:\n");-  int key_ctr;-  for(key_ctr = 0; key_ctr < 4 ; ++key_ctr)-    printf("  key[%1d] = 0x%08"PRIx32"UL\n", key_ctr ,key[key_ctr]);--  SWord32 decKS[44];--  aes128InvKeySchedule(key, decKS);--  printf("aes128InvKeySchedule(key, decKS) ->\n");-  int decKS_ctr;-  for(decKS_ctr = 0; decKS_ctr < 44 ; ++decKS_ctr)-    printf("  decKS[%2d] = 0x%08"PRIx32"UL\n", decKS_ctr ,decKS[decKS_ctr]);-}--void aes128OTFDecrypt_driver(void)-{-  const SWord32 ct[4] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array ct:\n");-  int ct_ctr;-  for(ct_ctr = 0; ct_ctr < 4 ; ++ct_ctr)-    printf("  ct[%1d] = 0x%08"PRIx32"UL\n", ct_ctr ,ct[ct_ctr]);--  const SWord32 xkey[44] = {-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,-      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL-  };--  printf("Contents of input array xkey:\n");-  int xkey_ctr;-  for(xkey_ctr = 0; xkey_ctr < 44 ; ++xkey_ctr)-    printf("  xkey[%2d] = 0x%08"PRIx32"UL\n", xkey_ctr ,xkey[xkey_ctr]);--  SWord32 pt[4];--  aes128OTFDecrypt(ct, xkey, pt);--  printf("aes128OTFDecrypt(ct, xkey, pt) ->\n");-  int pt_ctr;-  for(pt_ctr = 0; pt_ctr < 4 ; ++pt_ctr)-    printf("  pt[%1d] = 0x%08"PRIx32"UL\n", pt_ctr ,pt[pt_ctr]);-}--int main(void)-{-  printf("====================================\n");-  printf("** Driver run for aes128KeySchedule:\n");-  printf("====================================\n");-  aes128KeySchedule_driver();--  printf("=====================================\n");-  printf("** Driver run for aes128BlockEncrypt:\n");-  printf("=====================================\n");-  aes128BlockEncrypt_driver();--  printf("=====================================\n");-  printf("** Driver run for aes128BlockDecrypt:\n");-  printf("=====================================\n");-  aes128BlockDecrypt_driver();--  printf("=======================================\n");-  printf("** Driver run for aes128InvKeySchedule:\n");-  printf("=======================================\n");-  aes128InvKeySchedule_driver();--  printf("===================================\n");-  printf("** Driver run for aes128OTFDecrypt:\n");-  printf("===================================\n");-  aes128OTFDecrypt_driver();--  return 0;-}-== END: "aes128Lib_driver.c" ==================-== BEGIN: "Makefile" ================-# Makefile for aes128Lib. Automatically generated by SBV. Do not edit!--# include any user-defined .mk file in the current directory.--include *.mk--CC?=gcc-CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer-AR?=ar-ARFLAGS?=cr--all: aes128Lib.a aes128Lib_driver--aes128Lib.a: aes128KeySchedule.o aes128BlockEncrypt.o aes128BlockDecrypt.o aes128InvKeySchedule.o aes128OTFDecrypt.o-	${AR} ${ARFLAGS} $@ $^--aes128Lib_driver: aes128Lib_driver.c aes128Lib.h-	${CC} ${CCFLAGS} $< -o $@ aes128Lib.a--aes128KeySchedule.o: aes128KeySchedule.c aes128Lib.h-	${CC} ${CCFLAGS} -c $< -o $@--aes128BlockEncrypt.o: aes128BlockEncrypt.c aes128Lib.h-	${CC} ${CCFLAGS} -c $< -o $@--aes128BlockDecrypt.o: aes128BlockDecrypt.c aes128Lib.h-	${CC} ${CCFLAGS} -c $< -o $@--aes128InvKeySchedule.o: aes128InvKeySchedule.c aes128Lib.h-	${CC} ${CCFLAGS} -c $< -o $@--aes128OTFDecrypt.o: aes128OTFDecrypt.c aes128Lib.h-	${CC} ${CCFLAGS} -c $< -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f aes128Lib.a aes128Lib_driver+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotl(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) << amount) | (((uint64_t) (SWord32) a) >> (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotr(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) >> amount) | (((uint64_t) (SWord32) a) << (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128KeySchedule(const SWord32 *sbv_input_0,+                       SWord32 *sbv_output_0, SWord32 *sbv_output_1)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s260 = sbv_bv_u32_rotl(s3, 8);+  const SWord8  s261 = sbv_bv_extract_u32_31_24_u8(s260);+  const SWord8  s264 = sbv_bv_extract_u32_23_16_u8(s260);+  const SWord8  s267 = sbv_bv_extract_u32_15_8_u8(s260);+  const SWord8  s269 = sbv_bv_extract_u32_7_0_u8(s260);+        SWord8  s262;+        SWord8  s263;+        SWord8  s265;+        SWord16 s266;+        SWord8  s268;+        SWord8  s270;+        SWord16 s271;+        SWord32 s272;+        SWord32 s273;+        SWord32 s274;+        SWord32 s275;+        SWord32 s276;+        SWord32 s277;+        SWord8  s278;+        SWord8  s279;+        SWord8  s280;+        SWord8  s281;+        SWord8  s282;+        SWord16 s283;+        SWord8  s284;+        SWord8  s285;+        SWord8  s286;+        SWord8  s287;+        SWord16 s288;+        SWord32 s289;+        SWord32 s290;+        SWord32 s291;+        SWord32 s292;+        SWord32 s293;+        SWord32 s294;+        SWord8  s295;+        SWord8  s296;+        SWord8  s297;+        SWord8  s298;+        SWord8  s299;+        SWord16 s300;+        SWord8  s301;+        SWord8  s302;+        SWord8  s303;+        SWord8  s304;+        SWord16 s305;+        SWord32 s306;+        SWord32 s307;+        SWord32 s308;+        SWord32 s309;+        SWord32 s310;+        SWord32 s311;+        SWord8  s312;+        SWord8  s313;+        SWord8  s314;+        SWord8  s315;+        SWord8  s316;+        SWord16 s317;+        SWord8  s318;+        SWord8  s319;+        SWord8  s320;+        SWord8  s321;+        SWord16 s322;+        SWord32 s323;+        SWord32 s324;+        SWord32 s325;+        SWord32 s326;+        SWord32 s327;+        SWord32 s328;+        SWord8  s329;+        SWord8  s330;+        SWord8  s331;+        SWord8  s332;+        SWord8  s333;+        SWord16 s334;+        SWord8  s335;+        SWord8  s336;+        SWord8  s337;+        SWord8  s338;+        SWord16 s339;+        SWord32 s340;+        SWord32 s341;+        SWord32 s342;+        SWord32 s343;+        SWord32 s344;+        SWord32 s345;+        SWord8  s346;+        SWord8  s347;+        SWord8  s348;+        SWord8  s349;+        SWord8  s350;+        SWord16 s351;+        SWord8  s352;+        SWord8  s353;+        SWord8  s354;+        SWord8  s355;+        SWord16 s356;+        SWord32 s357;+        SWord32 s358;+        SWord32 s359;+        SWord32 s360;+        SWord32 s361;+        SWord32 s362;+        SWord8  s363;+        SWord8  s364;+        SWord8  s365;+        SWord8  s366;+        SWord8  s367;+        SWord16 s368;+        SWord8  s369;+        SWord8  s370;+        SWord8  s371;+        SWord8  s372;+        SWord16 s373;+        SWord32 s374;+        SWord32 s375;+        SWord32 s376;+        SWord32 s377;+        SWord32 s378;+        SWord32 s379;+        SWord8  s380;+        SWord8  s381;+        SWord8  s382;+        SWord8  s383;+        SWord8  s384;+        SWord16 s385;+        SWord8  s386;+        SWord8  s387;+        SWord8  s388;+        SWord8  s389;+        SWord16 s390;+        SWord32 s391;+        SWord32 s392;+        SWord32 s393;+        SWord32 s394;+        SWord32 s395;+        SWord32 s396;+        SWord8  s397;+        SWord8  s398;+        SWord8  s399;+        SWord8  s400;+        SWord8  s401;+        SWord16 s402;+        SWord8  s403;+        SWord8  s404;+        SWord8  s405;+        SWord8  s406;+        SWord16 s407;+        SWord32 s408;+        SWord32 s409;+        SWord32 s410;+        SWord32 s411;+        SWord32 s412;+        SWord32 s413;+        SWord8  s414;+        SWord8  s415;+        SWord8  s416;+        SWord8  s417;+        SWord8  s418;+        SWord16 s419;+        SWord8  s420;+        SWord8  s421;+        SWord8  s422;+        SWord8  s423;+        SWord16 s424;+        SWord32 s425;+        SWord32 s426;+        SWord32 s427;+        SWord32 s428;+        SWord32 s429;+        SWord8  s430;+        SWord8  s431;+        SWord8  s432;+        SWord8  s433;+        SWord8  s434;+        SWord8  s435;+        SWord8  s436;+        SWord8  s437;+        SWord8  s438;+        SWord8  s439;+        SWord8  s440;+        SWord8  s441;+        SWord8  s442;+        SWord8  s443;+        SWord8  s444;+        SWord8  s445;+        SWord8  s446;+        SWord8  s447;+        SWord16 s448;+        SWord8  s449;+        SWord8  s450;+        SWord8  s451;+        SWord8  s452;+        SWord8  s453;+        SWord8  s454;+        SWord8  s455;+        SWord8  s456;+        SWord8  s457;+        SWord8  s458;+        SWord8  s459;+        SWord8  s460;+        SWord8  s461;+        SWord8  s462;+        SWord16 s463;+        SWord32 s464;+        SWord8  s465;+        SWord8  s466;+        SWord8  s467;+        SWord8  s468;+        SWord8  s469;+        SWord8  s470;+        SWord8  s471;+        SWord8  s472;+        SWord8  s473;+        SWord8  s474;+        SWord8  s475;+        SWord8  s476;+        SWord8  s477;+        SWord8  s478;+        SWord8  s479;+        SWord8  s480;+        SWord8  s481;+        SWord8  s482;+        SWord16 s483;+        SWord8  s484;+        SWord8  s485;+        SWord8  s486;+        SWord8  s487;+        SWord8  s488;+        SWord8  s489;+        SWord8  s490;+        SWord8  s491;+        SWord8  s492;+        SWord8  s493;+        SWord8  s494;+        SWord8  s495;+        SWord8  s496;+        SWord8  s497;+        SWord16 s498;+        SWord32 s499;+        SWord8  s500;+        SWord8  s501;+        SWord8  s502;+        SWord8  s503;+        SWord8  s504;+        SWord8  s505;+        SWord8  s506;+        SWord8  s507;+        SWord8  s508;+        SWord8  s509;+        SWord8  s510;+        SWord8  s511;+        SWord8  s512;+        SWord8  s513;+        SWord8  s514;+        SWord8  s515;+        SWord8  s516;+        SWord8  s517;+        SWord16 s518;+        SWord8  s519;+        SWord8  s520;+        SWord8  s521;+        SWord8  s522;+        SWord8  s523;+        SWord8  s524;+        SWord8  s525;+        SWord8  s526;+        SWord8  s527;+        SWord8  s528;+        SWord8  s529;+        SWord8  s530;+        SWord8  s531;+        SWord8  s532;+        SWord16 s533;+        SWord32 s534;+        SWord8  s535;+        SWord8  s536;+        SWord8  s537;+        SWord8  s538;+        SWord8  s539;+        SWord8  s540;+        SWord8  s541;+        SWord8  s542;+        SWord8  s543;+        SWord8  s544;+        SWord8  s545;+        SWord8  s546;+        SWord8  s547;+        SWord8  s548;+        SWord8  s549;+        SWord8  s550;+        SWord8  s551;+        SWord8  s552;+        SWord16 s553;+        SWord8  s554;+        SWord8  s555;+        SWord8  s556;+        SWord8  s557;+        SWord8  s558;+        SWord8  s559;+        SWord8  s560;+        SWord8  s561;+        SWord8  s562;+        SWord8  s563;+        SWord8  s564;+        SWord8  s565;+        SWord8  s566;+        SWord8  s567;+        SWord16 s568;+        SWord32 s569;+        SWord8  s570;+        SWord8  s571;+        SWord8  s572;+        SWord8  s573;+        SWord8  s574;+        SWord8  s575;+        SWord8  s576;+        SWord8  s577;+        SWord8  s578;+        SWord8  s579;+        SWord8  s580;+        SWord8  s581;+        SWord8  s582;+        SWord8  s583;+        SWord8  s584;+        SWord8  s585;+        SWord8  s586;+        SWord8  s587;+        SWord16 s588;+        SWord8  s589;+        SWord8  s590;+        SWord8  s591;+        SWord8  s592;+        SWord8  s593;+        SWord8  s594;+        SWord8  s595;+        SWord8  s596;+        SWord8  s597;+        SWord8  s598;+        SWord8  s599;+        SWord8  s600;+        SWord8  s601;+        SWord8  s602;+        SWord16 s603;+        SWord32 s604;+        SWord8  s605;+        SWord8  s606;+        SWord8  s607;+        SWord8  s608;+        SWord8  s609;+        SWord8  s610;+        SWord8  s611;+        SWord8  s612;+        SWord8  s613;+        SWord8  s614;+        SWord8  s615;+        SWord8  s616;+        SWord8  s617;+        SWord8  s618;+        SWord8  s619;+        SWord8  s620;+        SWord8  s621;+        SWord8  s622;+        SWord16 s623;+        SWord8  s624;+        SWord8  s625;+        SWord8  s626;+        SWord8  s627;+        SWord8  s628;+        SWord8  s629;+        SWord8  s630;+        SWord8  s631;+        SWord8  s632;+        SWord8  s633;+        SWord8  s634;+        SWord8  s635;+        SWord8  s636;+        SWord8  s637;+        SWord16 s638;+        SWord32 s639;+        SWord8  s640;+        SWord8  s641;+        SWord8  s642;+        SWord8  s643;+        SWord8  s644;+        SWord8  s645;+        SWord8  s646;+        SWord8  s647;+        SWord8  s648;+        SWord8  s649;+        SWord8  s650;+        SWord8  s651;+        SWord8  s652;+        SWord8  s653;+        SWord8  s654;+        SWord8  s655;+        SWord8  s656;+        SWord8  s657;+        SWord16 s658;+        SWord8  s659;+        SWord8  s660;+        SWord8  s661;+        SWord8  s662;+        SWord8  s663;+        SWord8  s664;+        SWord8  s665;+        SWord8  s666;+        SWord8  s667;+        SWord8  s668;+        SWord8  s669;+        SWord8  s670;+        SWord8  s671;+        SWord8  s672;+        SWord16 s673;+        SWord32 s674;+        SWord8  s675;+        SWord8  s676;+        SWord8  s677;+        SWord8  s678;+        SWord8  s679;+        SWord8  s680;+        SWord8  s681;+        SWord8  s682;+        SWord8  s683;+        SWord8  s684;+        SWord8  s685;+        SWord8  s686;+        SWord8  s687;+        SWord8  s688;+        SWord8  s689;+        SWord8  s690;+        SWord8  s691;+        SWord8  s692;+        SWord16 s693;+        SWord8  s694;+        SWord8  s695;+        SWord8  s696;+        SWord8  s697;+        SWord8  s698;+        SWord8  s699;+        SWord8  s700;+        SWord8  s701;+        SWord8  s702;+        SWord8  s703;+        SWord8  s704;+        SWord8  s705;+        SWord8  s706;+        SWord8  s707;+        SWord16 s708;+        SWord32 s709;+        SWord8  s710;+        SWord8  s711;+        SWord8  s712;+        SWord8  s713;+        SWord8  s714;+        SWord8  s715;+        SWord8  s716;+        SWord8  s717;+        SWord8  s718;+        SWord8  s719;+        SWord8  s720;+        SWord8  s721;+        SWord8  s722;+        SWord8  s723;+        SWord8  s724;+        SWord8  s725;+        SWord8  s726;+        SWord8  s727;+        SWord16 s728;+        SWord8  s729;+        SWord8  s730;+        SWord8  s731;+        SWord8  s732;+        SWord8  s733;+        SWord8  s734;+        SWord8  s735;+        SWord8  s736;+        SWord8  s737;+        SWord8  s738;+        SWord8  s739;+        SWord8  s740;+        SWord8  s741;+        SWord8  s742;+        SWord16 s743;+        SWord32 s744;+        SWord8  s745;+        SWord8  s746;+        SWord8  s747;+        SWord8  s748;+        SWord8  s749;+        SWord8  s750;+        SWord8  s751;+        SWord8  s752;+        SWord8  s753;+        SWord8  s754;+        SWord8  s755;+        SWord8  s756;+        SWord8  s757;+        SWord8  s758;+        SWord8  s759;+        SWord8  s760;+        SWord8  s761;+        SWord8  s762;+        SWord16 s763;+        SWord8  s764;+        SWord8  s765;+        SWord8  s766;+        SWord8  s767;+        SWord8  s768;+        SWord8  s769;+        SWord8  s770;+        SWord8  s771;+        SWord8  s772;+        SWord8  s773;+        SWord8  s774;+        SWord8  s775;+        SWord8  s776;+        SWord8  s777;+        SWord16 s778;+        SWord32 s779;+        SWord8  s780;+        SWord8  s781;+        SWord8  s782;+        SWord8  s783;+        SWord8  s784;+        SWord8  s785;+        SWord8  s786;+        SWord8  s787;+        SWord8  s788;+        SWord8  s789;+        SWord8  s790;+        SWord8  s791;+        SWord8  s792;+        SWord8  s793;+        SWord8  s794;+        SWord8  s795;+        SWord8  s796;+        SWord8  s797;+        SWord16 s798;+        SWord8  s799;+        SWord8  s800;+        SWord8  s801;+        SWord8  s802;+        SWord8  s803;+        SWord8  s804;+        SWord8  s805;+        SWord8  s806;+        SWord8  s807;+        SWord8  s808;+        SWord8  s809;+        SWord8  s810;+        SWord8  s811;+        SWord8  s812;+        SWord16 s813;+        SWord32 s814;+        SWord8  s815;+        SWord8  s816;+        SWord8  s817;+        SWord8  s818;+        SWord8  s819;+        SWord8  s820;+        SWord8  s821;+        SWord8  s822;+        SWord8  s823;+        SWord8  s824;+        SWord8  s825;+        SWord8  s826;+        SWord8  s827;+        SWord8  s828;+        SWord8  s829;+        SWord8  s830;+        SWord8  s831;+        SWord8  s832;+        SWord16 s833;+        SWord8  s834;+        SWord8  s835;+        SWord8  s836;+        SWord8  s837;+        SWord8  s838;+        SWord8  s839;+        SWord8  s840;+        SWord8  s841;+        SWord8  s842;+        SWord8  s843;+        SWord8  s844;+        SWord8  s845;+        SWord8  s846;+        SWord8  s847;+        SWord16 s848;+        SWord32 s849;+        SWord8  s850;+        SWord8  s851;+        SWord8  s852;+        SWord8  s853;+        SWord8  s854;+        SWord8  s855;+        SWord8  s856;+        SWord8  s857;+        SWord8  s858;+        SWord8  s859;+        SWord8  s860;+        SWord8  s861;+        SWord8  s862;+        SWord8  s863;+        SWord8  s864;+        SWord8  s865;+        SWord8  s866;+        SWord8  s867;+        SWord16 s868;+        SWord8  s869;+        SWord8  s870;+        SWord8  s871;+        SWord8  s872;+        SWord8  s873;+        SWord8  s874;+        SWord8  s875;+        SWord8  s876;+        SWord8  s877;+        SWord8  s878;+        SWord8  s879;+        SWord8  s880;+        SWord8  s881;+        SWord8  s882;+        SWord16 s883;+        SWord32 s884;+        SWord8  s885;+        SWord8  s886;+        SWord8  s887;+        SWord8  s888;+        SWord8  s889;+        SWord8  s890;+        SWord8  s891;+        SWord8  s892;+        SWord8  s893;+        SWord8  s894;+        SWord8  s895;+        SWord8  s896;+        SWord8  s897;+        SWord8  s898;+        SWord8  s899;+        SWord8  s900;+        SWord8  s901;+        SWord8  s902;+        SWord16 s903;+        SWord8  s904;+        SWord8  s905;+        SWord8  s906;+        SWord8  s907;+        SWord8  s908;+        SWord8  s909;+        SWord8  s910;+        SWord8  s911;+        SWord8  s912;+        SWord8  s913;+        SWord8  s914;+        SWord8  s915;+        SWord8  s916;+        SWord8  s917;+        SWord16 s918;+        SWord32 s919;+        SWord8  s920;+        SWord8  s921;+        SWord8  s922;+        SWord8  s923;+        SWord8  s924;+        SWord8  s925;+        SWord8  s926;+        SWord8  s927;+        SWord8  s928;+        SWord8  s929;+        SWord8  s930;+        SWord8  s931;+        SWord8  s932;+        SWord8  s933;+        SWord8  s934;+        SWord8  s935;+        SWord8  s936;+        SWord8  s937;+        SWord16 s938;+        SWord8  s939;+        SWord8  s940;+        SWord8  s941;+        SWord8  s942;+        SWord8  s943;+        SWord8  s944;+        SWord8  s945;+        SWord8  s946;+        SWord8  s947;+        SWord8  s948;+        SWord8  s949;+        SWord8  s950;+        SWord8  s951;+        SWord8  s952;+        SWord16 s953;+        SWord32 s954;+        SWord8  s955;+        SWord8  s956;+        SWord8  s957;+        SWord8  s958;+        SWord8  s959;+        SWord8  s960;+        SWord8  s961;+        SWord8  s962;+        SWord8  s963;+        SWord8  s964;+        SWord8  s965;+        SWord8  s966;+        SWord8  s967;+        SWord8  s968;+        SWord8  s969;+        SWord8  s970;+        SWord8  s971;+        SWord8  s972;+        SWord16 s973;+        SWord8  s974;+        SWord8  s975;+        SWord8  s976;+        SWord8  s977;+        SWord8  s978;+        SWord8  s979;+        SWord8  s980;+        SWord8  s981;+        SWord8  s982;+        SWord8  s983;+        SWord8  s984;+        SWord8  s985;+        SWord8  s986;+        SWord8  s987;+        SWord16 s988;+        SWord32 s989;+        SWord8  s990;+        SWord8  s991;+        SWord8  s992;+        SWord8  s993;+        SWord8  s994;+        SWord8  s995;+        SWord8  s996;+        SWord8  s997;+        SWord8  s998;+        SWord8  s999;+        SWord8  s1000;+        SWord8  s1001;+        SWord8  s1002;+        SWord8  s1003;+        SWord8  s1004;+        SWord8  s1005;+        SWord8  s1006;+        SWord8  s1007;+        SWord16 s1008;+        SWord8  s1009;+        SWord8  s1010;+        SWord8  s1011;+        SWord8  s1012;+        SWord8  s1013;+        SWord8  s1014;+        SWord8  s1015;+        SWord8  s1016;+        SWord8  s1017;+        SWord8  s1018;+        SWord8  s1019;+        SWord8  s1020;+        SWord8  s1021;+        SWord8  s1022;+        SWord16 s1023;+        SWord32 s1024;+        SWord8  s1025;+        SWord8  s1026;+        SWord8  s1027;+        SWord8  s1028;+        SWord8  s1029;+        SWord8  s1030;+        SWord8  s1031;+        SWord8  s1032;+        SWord8  s1033;+        SWord8  s1034;+        SWord8  s1035;+        SWord8  s1036;+        SWord8  s1037;+        SWord8  s1038;+        SWord8  s1039;+        SWord8  s1040;+        SWord8  s1041;+        SWord8  s1042;+        SWord16 s1043;+        SWord8  s1044;+        SWord8  s1045;+        SWord8  s1046;+        SWord8  s1047;+        SWord8  s1048;+        SWord8  s1049;+        SWord8  s1050;+        SWord8  s1051;+        SWord8  s1052;+        SWord8  s1053;+        SWord8  s1054;+        SWord8  s1055;+        SWord8  s1056;+        SWord8  s1057;+        SWord16 s1058;+        SWord32 s1059;+        SWord8  s1060;+        SWord8  s1061;+        SWord8  s1062;+        SWord8  s1063;+        SWord8  s1064;+        SWord8  s1065;+        SWord8  s1066;+        SWord8  s1067;+        SWord8  s1068;+        SWord8  s1069;+        SWord8  s1070;+        SWord8  s1071;+        SWord8  s1072;+        SWord8  s1073;+        SWord8  s1074;+        SWord8  s1075;+        SWord8  s1076;+        SWord8  s1077;+        SWord16 s1078;+        SWord8  s1079;+        SWord8  s1080;+        SWord8  s1081;+        SWord8  s1082;+        SWord8  s1083;+        SWord8  s1084;+        SWord8  s1085;+        SWord8  s1086;+        SWord8  s1087;+        SWord8  s1088;+        SWord8  s1089;+        SWord8  s1090;+        SWord8  s1091;+        SWord8  s1092;+        SWord16 s1093;+        SWord32 s1094;+        SWord8  s1095;+        SWord8  s1096;+        SWord8  s1097;+        SWord8  s1098;+        SWord8  s1099;+        SWord8  s1100;+        SWord8  s1101;+        SWord8  s1102;+        SWord8  s1103;+        SWord8  s1104;+        SWord8  s1105;+        SWord8  s1106;+        SWord8  s1107;+        SWord8  s1108;+        SWord8  s1109;+        SWord8  s1110;+        SWord8  s1111;+        SWord8  s1112;+        SWord16 s1113;+        SWord8  s1114;+        SWord8  s1115;+        SWord8  s1116;+        SWord8  s1117;+        SWord8  s1118;+        SWord8  s1119;+        SWord8  s1120;+        SWord8  s1121;+        SWord8  s1122;+        SWord8  s1123;+        SWord8  s1124;+        SWord8  s1125;+        SWord8  s1126;+        SWord8  s1127;+        SWord16 s1128;+        SWord32 s1129;+        SWord8  s1130;+        SWord8  s1131;+        SWord8  s1132;+        SWord8  s1133;+        SWord8  s1134;+        SWord8  s1135;+        SWord8  s1136;+        SWord8  s1137;+        SWord8  s1138;+        SWord8  s1139;+        SWord8  s1140;+        SWord8  s1141;+        SWord8  s1142;+        SWord8  s1143;+        SWord8  s1144;+        SWord8  s1145;+        SWord8  s1146;+        SWord8  s1147;+        SWord16 s1148;+        SWord8  s1149;+        SWord8  s1150;+        SWord8  s1151;+        SWord8  s1152;+        SWord8  s1153;+        SWord8  s1154;+        SWord8  s1155;+        SWord8  s1156;+        SWord8  s1157;+        SWord8  s1158;+        SWord8  s1159;+        SWord8  s1160;+        SWord8  s1161;+        SWord8  s1162;+        SWord16 s1163;+        SWord32 s1164;+        SWord8  s1165;+        SWord8  s1166;+        SWord8  s1167;+        SWord8  s1168;+        SWord8  s1169;+        SWord8  s1170;+        SWord8  s1171;+        SWord8  s1172;+        SWord8  s1173;+        SWord8  s1174;+        SWord8  s1175;+        SWord8  s1176;+        SWord8  s1177;+        SWord8  s1178;+        SWord8  s1179;+        SWord8  s1180;+        SWord8  s1181;+        SWord8  s1182;+        SWord16 s1183;+        SWord8  s1184;+        SWord8  s1185;+        SWord8  s1186;+        SWord8  s1187;+        SWord8  s1188;+        SWord8  s1189;+        SWord8  s1190;+        SWord8  s1191;+        SWord8  s1192;+        SWord8  s1193;+        SWord8  s1194;+        SWord8  s1195;+        SWord8  s1196;+        SWord8  s1197;+        SWord16 s1198;+        SWord32 s1199;+        SWord8  s1200;+        SWord8  s1201;+        SWord8  s1202;+        SWord8  s1203;+        SWord8  s1204;+        SWord8  s1205;+        SWord8  s1206;+        SWord8  s1207;+        SWord8  s1208;+        SWord8  s1209;+        SWord8  s1210;+        SWord8  s1211;+        SWord8  s1212;+        SWord8  s1213;+        SWord8  s1214;+        SWord8  s1215;+        SWord8  s1216;+        SWord8  s1217;+        SWord16 s1218;+        SWord8  s1219;+        SWord8  s1220;+        SWord8  s1221;+        SWord8  s1222;+        SWord8  s1223;+        SWord8  s1224;+        SWord8  s1225;+        SWord8  s1226;+        SWord8  s1227;+        SWord8  s1228;+        SWord8  s1229;+        SWord8  s1230;+        SWord8  s1231;+        SWord8  s1232;+        SWord16 s1233;+        SWord32 s1234;+        SWord8  s1235;+        SWord8  s1236;+        SWord8  s1237;+        SWord8  s1238;+        SWord8  s1239;+        SWord8  s1240;+        SWord8  s1241;+        SWord8  s1242;+        SWord8  s1243;+        SWord8  s1244;+        SWord8  s1245;+        SWord8  s1246;+        SWord8  s1247;+        SWord8  s1248;+        SWord8  s1249;+        SWord8  s1250;+        SWord8  s1251;+        SWord8  s1252;+        SWord16 s1253;+        SWord8  s1254;+        SWord8  s1255;+        SWord8  s1256;+        SWord8  s1257;+        SWord8  s1258;+        SWord8  s1259;+        SWord8  s1260;+        SWord8  s1261;+        SWord8  s1262;+        SWord8  s1263;+        SWord8  s1264;+        SWord8  s1265;+        SWord8  s1266;+        SWord8  s1267;+        SWord16 s1268;+        SWord32 s1269;+        SWord8  s1270;+        SWord8  s1271;+        SWord8  s1272;+        SWord8  s1273;+        SWord8  s1274;+        SWord8  s1275;+        SWord8  s1276;+        SWord8  s1277;+        SWord8  s1278;+        SWord8  s1279;+        SWord8  s1280;+        SWord8  s1281;+        SWord8  s1282;+        SWord8  s1283;+        SWord8  s1284;+        SWord8  s1285;+        SWord8  s1286;+        SWord8  s1287;+        SWord16 s1288;+        SWord8  s1289;+        SWord8  s1290;+        SWord8  s1291;+        SWord8  s1292;+        SWord8  s1293;+        SWord8  s1294;+        SWord8  s1295;+        SWord8  s1296;+        SWord8  s1297;+        SWord8  s1298;+        SWord8  s1299;+        SWord8  s1300;+        SWord8  s1301;+        SWord8  s1302;+        SWord16 s1303;+        SWord32 s1304;+        SWord8  s1305;+        SWord8  s1306;+        SWord8  s1307;+        SWord8  s1308;+        SWord8  s1309;+        SWord8  s1310;+        SWord8  s1311;+        SWord8  s1312;+        SWord8  s1313;+        SWord8  s1314;+        SWord8  s1315;+        SWord8  s1316;+        SWord8  s1317;+        SWord8  s1318;+        SWord8  s1319;+        SWord8  s1320;+        SWord8  s1321;+        SWord8  s1322;+        SWord16 s1323;+        SWord8  s1324;+        SWord8  s1325;+        SWord8  s1326;+        SWord8  s1327;+        SWord8  s1328;+        SWord8  s1329;+        SWord8  s1330;+        SWord8  s1331;+        SWord8  s1332;+        SWord8  s1333;+        SWord8  s1334;+        SWord8  s1335;+        SWord8  s1336;+        SWord8  s1337;+        SWord16 s1338;+        SWord32 s1339;+        SWord8  s1340;+        SWord8  s1341;+        SWord8  s1342;+        SWord8  s1343;+        SWord8  s1344;+        SWord8  s1345;+        SWord8  s1346;+        SWord8  s1347;+        SWord8  s1348;+        SWord8  s1349;+        SWord8  s1350;+        SWord8  s1351;+        SWord8  s1352;+        SWord8  s1353;+        SWord8  s1354;+        SWord8  s1355;+        SWord8  s1356;+        SWord8  s1357;+        SWord16 s1358;+        SWord8  s1359;+        SWord8  s1360;+        SWord8  s1361;+        SWord8  s1362;+        SWord8  s1363;+        SWord8  s1364;+        SWord8  s1365;+        SWord8  s1366;+        SWord8  s1367;+        SWord8  s1368;+        SWord8  s1369;+        SWord8  s1370;+        SWord8  s1371;+        SWord8  s1372;+        SWord16 s1373;+        SWord32 s1374;+        SWord8  s1375;+        SWord8  s1376;+        SWord8  s1377;+        SWord8  s1378;+        SWord8  s1379;+        SWord8  s1380;+        SWord8  s1381;+        SWord8  s1382;+        SWord8  s1383;+        SWord8  s1384;+        SWord8  s1385;+        SWord8  s1386;+        SWord8  s1387;+        SWord8  s1388;+        SWord8  s1389;+        SWord8  s1390;+        SWord8  s1391;+        SWord8  s1392;+        SWord16 s1393;+        SWord8  s1394;+        SWord8  s1395;+        SWord8  s1396;+        SWord8  s1397;+        SWord8  s1398;+        SWord8  s1399;+        SWord8  s1400;+        SWord8  s1401;+        SWord8  s1402;+        SWord8  s1403;+        SWord8  s1404;+        SWord8  s1405;+        SWord8  s1406;+        SWord8  s1407;+        SWord16 s1408;+        SWord32 s1409;+        SWord8  s1410;+        SWord8  s1411;+        SWord8  s1412;+        SWord8  s1413;+        SWord8  s1414;+        SWord8  s1415;+        SWord8  s1416;+        SWord8  s1417;+        SWord8  s1418;+        SWord8  s1419;+        SWord8  s1420;+        SWord8  s1421;+        SWord8  s1422;+        SWord8  s1423;+        SWord8  s1424;+        SWord8  s1425;+        SWord8  s1426;+        SWord8  s1427;+        SWord16 s1428;+        SWord8  s1429;+        SWord8  s1430;+        SWord8  s1431;+        SWord8  s1432;+        SWord8  s1433;+        SWord8  s1434;+        SWord8  s1435;+        SWord8  s1436;+        SWord8  s1437;+        SWord8  s1438;+        SWord8  s1439;+        SWord8  s1440;+        SWord8  s1441;+        SWord8  s1442;+        SWord16 s1443;+        SWord32 s1444;+        SWord8  s1445;+        SWord8  s1446;+        SWord8  s1447;+        SWord8  s1448;+        SWord8  s1449;+        SWord8  s1450;+        SWord8  s1451;+        SWord8  s1452;+        SWord8  s1453;+        SWord8  s1454;+        SWord8  s1455;+        SWord8  s1456;+        SWord8  s1457;+        SWord8  s1458;+        SWord8  s1459;+        SWord8  s1460;+        SWord8  s1461;+        SWord8  s1462;+        SWord16 s1463;+        SWord8  s1464;+        SWord8  s1465;+        SWord8  s1466;+        SWord8  s1467;+        SWord8  s1468;+        SWord8  s1469;+        SWord8  s1470;+        SWord8  s1471;+        SWord8  s1472;+        SWord8  s1473;+        SWord8  s1474;+        SWord8  s1475;+        SWord8  s1476;+        SWord8  s1477;+        SWord16 s1478;+        SWord32 s1479;+        SWord8  s1480;+        SWord8  s1481;+        SWord8  s1482;+        SWord8  s1483;+        SWord8  s1484;+        SWord8  s1485;+        SWord8  s1486;+        SWord8  s1487;+        SWord8  s1488;+        SWord8  s1489;+        SWord8  s1490;+        SWord8  s1491;+        SWord8  s1492;+        SWord8  s1493;+        SWord8  s1494;+        SWord8  s1495;+        SWord8  s1496;+        SWord8  s1497;+        SWord16 s1498;+        SWord8  s1499;+        SWord8  s1500;+        SWord8  s1501;+        SWord8  s1502;+        SWord8  s1503;+        SWord8  s1504;+        SWord8  s1505;+        SWord8  s1506;+        SWord8  s1507;+        SWord8  s1508;+        SWord8  s1509;+        SWord8  s1510;+        SWord8  s1511;+        SWord8  s1512;+        SWord16 s1513;+        SWord32 s1514;+        SWord8  s1515;+        SWord8  s1516;+        SWord8  s1517;+        SWord8  s1518;+        SWord8  s1519;+        SWord8  s1520;+        SWord8  s1521;+        SWord8  s1522;+        SWord8  s1523;+        SWord8  s1524;+        SWord8  s1525;+        SWord8  s1526;+        SWord8  s1527;+        SWord8  s1528;+        SWord8  s1529;+        SWord8  s1530;+        SWord8  s1531;+        SWord8  s1532;+        SWord16 s1533;+        SWord8  s1534;+        SWord8  s1535;+        SWord8  s1536;+        SWord8  s1537;+        SWord8  s1538;+        SWord8  s1539;+        SWord8  s1540;+        SWord8  s1541;+        SWord8  s1542;+        SWord8  s1543;+        SWord8  s1544;+        SWord8  s1545;+        SWord8  s1546;+        SWord8  s1547;+        SWord16 s1548;+        SWord32 s1549;+        SWord8  s1550;+        SWord8  s1551;+        SWord8  s1552;+        SWord8  s1553;+        SWord8  s1554;+        SWord8  s1555;+        SWord8  s1556;+        SWord8  s1557;+        SWord8  s1558;+        SWord8  s1559;+        SWord8  s1560;+        SWord8  s1561;+        SWord8  s1562;+        SWord8  s1563;+        SWord8  s1564;+        SWord8  s1565;+        SWord8  s1566;+        SWord8  s1567;+        SWord16 s1568;+        SWord8  s1569;+        SWord8  s1570;+        SWord8  s1571;+        SWord8  s1572;+        SWord8  s1573;+        SWord8  s1574;+        SWord8  s1575;+        SWord8  s1576;+        SWord8  s1577;+        SWord8  s1578;+        SWord8  s1579;+        SWord8  s1580;+        SWord8  s1581;+        SWord8  s1582;+        SWord16 s1583;+        SWord32 s1584;+        SWord8  s1585;+        SWord8  s1586;+        SWord8  s1587;+        SWord8  s1588;+        SWord8  s1589;+        SWord8  s1590;+        SWord8  s1591;+        SWord8  s1592;+        SWord8  s1593;+        SWord8  s1594;+        SWord8  s1595;+        SWord8  s1596;+        SWord8  s1597;+        SWord8  s1598;+        SWord8  s1599;+        SWord8  s1600;+        SWord8  s1601;+        SWord8  s1602;+        SWord16 s1603;+        SWord8  s1604;+        SWord8  s1605;+        SWord8  s1606;+        SWord8  s1607;+        SWord8  s1608;+        SWord8  s1609;+        SWord8  s1610;+        SWord8  s1611;+        SWord8  s1612;+        SWord8  s1613;+        SWord8  s1614;+        SWord8  s1615;+        SWord8  s1616;+        SWord8  s1617;+        SWord16 s1618;+        SWord32 s1619;+        SWord8  s1620;+        SWord8  s1621;+        SWord8  s1622;+        SWord8  s1623;+        SWord8  s1624;+        SWord8  s1625;+        SWord8  s1626;+        SWord8  s1627;+        SWord8  s1628;+        SWord8  s1629;+        SWord8  s1630;+        SWord8  s1631;+        SWord8  s1632;+        SWord8  s1633;+        SWord8  s1634;+        SWord8  s1635;+        SWord8  s1636;+        SWord8  s1637;+        SWord16 s1638;+        SWord8  s1639;+        SWord8  s1640;+        SWord8  s1641;+        SWord8  s1642;+        SWord8  s1643;+        SWord8  s1644;+        SWord8  s1645;+        SWord8  s1646;+        SWord8  s1647;+        SWord8  s1648;+        SWord8  s1649;+        SWord8  s1650;+        SWord8  s1651;+        SWord8  s1652;+        SWord16 s1653;+        SWord32 s1654;+        SWord8  s1655;+        SWord8  s1656;+        SWord8  s1657;+        SWord8  s1658;+        SWord8  s1659;+        SWord8  s1660;+        SWord8  s1661;+        SWord8  s1662;+        SWord8  s1663;+        SWord8  s1664;+        SWord8  s1665;+        SWord8  s1666;+        SWord8  s1667;+        SWord8  s1668;+        SWord8  s1669;+        SWord8  s1670;+        SWord8  s1671;+        SWord8  s1672;+        SWord16 s1673;+        SWord8  s1674;+        SWord8  s1675;+        SWord8  s1676;+        SWord8  s1677;+        SWord8  s1678;+        SWord8  s1679;+        SWord8  s1680;+        SWord8  s1681;+        SWord8  s1682;+        SWord8  s1683;+        SWord8  s1684;+        SWord8  s1685;+        SWord8  s1686;+        SWord8  s1687;+        SWord16 s1688;+        SWord32 s1689;+  static const SWord8 table0[] = {+       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,+      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,+      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,+      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,+       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,+      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,+       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,+       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,+       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,+      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,+       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,+      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,+      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,+      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,+       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,+       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,+      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,+      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,+      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,+      104,  65, 153,  45,  15, 176,  84, 187,  22+  };+  s262 = table0[s261];+  s263 = 1 ^ s262;+  s265 = table0[s264];+  s266 = sbv_bv_join_u8_u8_u16(s263, s265);+  s268 = table0[s267];+  s270 = table0[s269];+  s271 = sbv_bv_join_u8_u8_u16(s268, s270);+  s272 = sbv_bv_join_u16_u16_u32(s266, s271);+  s273 = s0 ^ s272;+  s274 = s1 ^ s273;+  s275 = s2 ^ s274;+  s276 = s3 ^ s275;+  s277 = sbv_bv_u32_rotl(s276, 8);+  s278 = sbv_bv_extract_u32_31_24_u8(s277);+  s279 = table0[s278];+  s280 = 2 ^ s279;+  s281 = sbv_bv_extract_u32_23_16_u8(s277);+  s282 = table0[s281];+  s283 = sbv_bv_join_u8_u8_u16(s280, s282);+  s284 = sbv_bv_extract_u32_15_8_u8(s277);+  s285 = table0[s284];+  s286 = sbv_bv_extract_u32_7_0_u8(s277);+  s287 = table0[s286];+  s288 = sbv_bv_join_u8_u8_u16(s285, s287);+  s289 = sbv_bv_join_u16_u16_u32(s283, s288);+  s290 = s273 ^ s289;+  s291 = s274 ^ s290;+  s292 = s275 ^ s291;+  s293 = s276 ^ s292;+  s294 = sbv_bv_u32_rotl(s293, 8);+  s295 = sbv_bv_extract_u32_31_24_u8(s294);+  s296 = table0[s295];+  s297 = 4 ^ s296;+  s298 = sbv_bv_extract_u32_23_16_u8(s294);+  s299 = table0[s298];+  s300 = sbv_bv_join_u8_u8_u16(s297, s299);+  s301 = sbv_bv_extract_u32_15_8_u8(s294);+  s302 = table0[s301];+  s303 = sbv_bv_extract_u32_7_0_u8(s294);+  s304 = table0[s303];+  s305 = sbv_bv_join_u8_u8_u16(s302, s304);+  s306 = sbv_bv_join_u16_u16_u32(s300, s305);+  s307 = s290 ^ s306;+  s308 = s291 ^ s307;+  s309 = s292 ^ s308;+  s310 = s293 ^ s309;+  s311 = sbv_bv_u32_rotl(s310, 8);+  s312 = sbv_bv_extract_u32_31_24_u8(s311);+  s313 = table0[s312];+  s314 = 8 ^ s313;+  s315 = sbv_bv_extract_u32_23_16_u8(s311);+  s316 = table0[s315];+  s317 = sbv_bv_join_u8_u8_u16(s314, s316);+  s318 = sbv_bv_extract_u32_15_8_u8(s311);+  s319 = table0[s318];+  s320 = sbv_bv_extract_u32_7_0_u8(s311);+  s321 = table0[s320];+  s322 = sbv_bv_join_u8_u8_u16(s319, s321);+  s323 = sbv_bv_join_u16_u16_u32(s317, s322);+  s324 = s307 ^ s323;+  s325 = s308 ^ s324;+  s326 = s309 ^ s325;+  s327 = s310 ^ s326;+  s328 = sbv_bv_u32_rotl(s327, 8);+  s329 = sbv_bv_extract_u32_31_24_u8(s328);+  s330 = table0[s329];+  s331 = 16 ^ s330;+  s332 = sbv_bv_extract_u32_23_16_u8(s328);+  s333 = table0[s332];+  s334 = sbv_bv_join_u8_u8_u16(s331, s333);+  s335 = sbv_bv_extract_u32_15_8_u8(s328);+  s336 = table0[s335];+  s337 = sbv_bv_extract_u32_7_0_u8(s328);+  s338 = table0[s337];+  s339 = sbv_bv_join_u8_u8_u16(s336, s338);+  s340 = sbv_bv_join_u16_u16_u32(s334, s339);+  s341 = s324 ^ s340;+  s342 = s325 ^ s341;+  s343 = s326 ^ s342;+  s344 = s327 ^ s343;+  s345 = sbv_bv_u32_rotl(s344, 8);+  s346 = sbv_bv_extract_u32_31_24_u8(s345);+  s347 = table0[s346];+  s348 = 32 ^ s347;+  s349 = sbv_bv_extract_u32_23_16_u8(s345);+  s350 = table0[s349];+  s351 = sbv_bv_join_u8_u8_u16(s348, s350);+  s352 = sbv_bv_extract_u32_15_8_u8(s345);+  s353 = table0[s352];+  s354 = sbv_bv_extract_u32_7_0_u8(s345);+  s355 = table0[s354];+  s356 = sbv_bv_join_u8_u8_u16(s353, s355);+  s357 = sbv_bv_join_u16_u16_u32(s351, s356);+  s358 = s341 ^ s357;+  s359 = s342 ^ s358;+  s360 = s343 ^ s359;+  s361 = s344 ^ s360;+  s362 = sbv_bv_u32_rotl(s361, 8);+  s363 = sbv_bv_extract_u32_31_24_u8(s362);+  s364 = table0[s363];+  s365 = 64 ^ s364;+  s366 = sbv_bv_extract_u32_23_16_u8(s362);+  s367 = table0[s366];+  s368 = sbv_bv_join_u8_u8_u16(s365, s367);+  s369 = sbv_bv_extract_u32_15_8_u8(s362);+  s370 = table0[s369];+  s371 = sbv_bv_extract_u32_7_0_u8(s362);+  s372 = table0[s371];+  s373 = sbv_bv_join_u8_u8_u16(s370, s372);+  s374 = sbv_bv_join_u16_u16_u32(s368, s373);+  s375 = s358 ^ s374;+  s376 = s359 ^ s375;+  s377 = s360 ^ s376;+  s378 = s361 ^ s377;+  s379 = sbv_bv_u32_rotl(s378, 8);+  s380 = sbv_bv_extract_u32_31_24_u8(s379);+  s381 = table0[s380];+  s382 = 128 ^ s381;+  s383 = sbv_bv_extract_u32_23_16_u8(s379);+  s384 = table0[s383];+  s385 = sbv_bv_join_u8_u8_u16(s382, s384);+  s386 = sbv_bv_extract_u32_15_8_u8(s379);+  s387 = table0[s386];+  s388 = sbv_bv_extract_u32_7_0_u8(s379);+  s389 = table0[s388];+  s390 = sbv_bv_join_u8_u8_u16(s387, s389);+  s391 = sbv_bv_join_u16_u16_u32(s385, s390);+  s392 = s375 ^ s391;+  s393 = s376 ^ s392;+  s394 = s377 ^ s393;+  s395 = s378 ^ s394;+  s396 = sbv_bv_u32_rotl(s395, 8);+  s397 = sbv_bv_extract_u32_31_24_u8(s396);+  s398 = table0[s397];+  s399 = 27 ^ s398;+  s400 = sbv_bv_extract_u32_23_16_u8(s396);+  s401 = table0[s400];+  s402 = sbv_bv_join_u8_u8_u16(s399, s401);+  s403 = sbv_bv_extract_u32_15_8_u8(s396);+  s404 = table0[s403];+  s405 = sbv_bv_extract_u32_7_0_u8(s396);+  s406 = table0[s405];+  s407 = sbv_bv_join_u8_u8_u16(s404, s406);+  s408 = sbv_bv_join_u16_u16_u32(s402, s407);+  s409 = s392 ^ s408;+  s410 = s393 ^ s409;+  s411 = s394 ^ s410;+  s412 = s395 ^ s411;+  s413 = sbv_bv_u32_rotl(s412, 8);+  s414 = sbv_bv_extract_u32_31_24_u8(s413);+  s415 = table0[s414];+  s416 = 54 ^ s415;+  s417 = sbv_bv_extract_u32_23_16_u8(s413);+  s418 = table0[s417];+  s419 = sbv_bv_join_u8_u8_u16(s416, s418);+  s420 = sbv_bv_extract_u32_15_8_u8(s413);+  s421 = table0[s420];+  s422 = sbv_bv_extract_u32_7_0_u8(s413);+  s423 = table0[s422];+  s424 = sbv_bv_join_u8_u8_u16(s421, s423);+  s425 = sbv_bv_join_u16_u16_u32(s419, s424);+  s426 = s409 ^ s425;+  s427 = s410 ^ s426;+  s428 = s411 ^ s427;+  s429 = s412 ^ s428;+  s430 = sbv_bv_extract_u32_31_24_u8(s409);+  static const SWord8 table1[] = {+        0,  14,  28,  18,  56,  54,  36,  42, 112, 126, 108,  98,  72,+       70,  84,  90, 224, 238, 252, 242, 216, 214, 196, 202, 144, 158,+      140, 130, 168, 166, 180, 186, 219, 213, 199, 201, 227, 237, 255,+      241, 171, 165, 183, 185, 147, 157, 143, 129,  59,  53,  39,  41,+        3,  13,  31,  17,  75,  69,  87,  89, 115, 125, 111,  97, 173,+      163, 177, 191, 149, 155, 137, 135, 221, 211, 193, 207, 229, 235,+      249, 247,  77,  67,  81,  95, 117, 123, 105, 103,  61,  51,  33,+       47,   5,  11,  25,  23, 118, 120, 106, 100,  78,  64,  82,  92,+        6,   8,  26,  20,  62,  48,  34,  44, 150, 152, 138, 132, 174,+      160, 178, 188, 230, 232, 250, 244, 222, 208, 194, 204,  65,  79,+       93,  83, 121, 119, 101, 107,  49,  63,  45,  35,   9,   7,  21,+       27, 161, 175, 189, 179, 153, 151, 133, 139, 209, 223, 205, 195,+      233, 231, 245, 251, 154, 148, 134, 136, 162, 172, 190, 176, 234,+      228, 246, 248, 210, 220, 206, 192, 122, 116, 102, 104,  66,  76,+       94,  80,  10,   4,  22,  24,  50,  60,  46,  32, 236, 226, 240,+      254, 212, 218, 200, 198, 156, 146, 128, 142, 164, 170, 184, 182,+       12,   2,  16,  30,  52,  58,  40,  38, 124, 114,  96, 110,  68,+       74,  88,  86,  55,  57,  43,  37,  15,   1,  19,  29,  71,  73,+       91,  85, 127, 113,  99, 109, 215, 217, 203, 197, 239, 225, 243,+      253, 167, 169, 187, 181, 159, 145, 131, 141+  };+  s431 = table1[s430];+  s432 = sbv_bv_extract_u32_23_16_u8(s409);+  static const SWord8 table2[] = {+        0,  11,  22,  29,  44,  39,  58,  49,  88,  83,  78,  69, 116,+      127,  98, 105, 176, 187, 166, 173, 156, 151, 138, 129, 232, 227,+      254, 245, 196, 207, 210, 217, 123, 112, 109, 102,  87,  92,  65,+       74,  35,  40,  53,  62,  15,   4,  25,  18, 203, 192, 221, 214,+      231, 236, 241, 250, 147, 152, 133, 142, 191, 180, 169, 162, 246,+      253, 224, 235, 218, 209, 204, 199, 174, 165, 184, 179, 130, 137,+      148, 159,  70,  77,  80,  91, 106,  97, 124, 119,  30,  21,   8,+        3,  50,  57,  36,  47, 141, 134, 155, 144, 161, 170, 183, 188,+      213, 222, 195, 200, 249, 242, 239, 228,  61,  54,  43,  32,  17,+       26,   7,  12, 101, 110, 115, 120,  73,  66,  95,  84, 247, 252,+      225, 234, 219, 208, 205, 198, 175, 164, 185, 178, 131, 136, 149,+      158,  71,  76,  81,  90, 107,  96, 125, 118,  31,  20,   9,   2,+       51,  56,  37,  46, 140, 135, 154, 145, 160, 171, 182, 189, 212,+      223, 194, 201, 248, 243, 238, 229,  60,  55,  42,  33,  16,  27,+        6,  13, 100, 111, 114, 121,  72,  67,  94,  85,   1,  10,  23,+       28,  45,  38,  59,  48,  89,  82,  79,  68, 117, 126,  99, 104,+      177, 186, 167, 172, 157, 150, 139, 128, 233, 226, 255, 244, 197,+      206, 211, 216, 122, 113, 108, 103,  86,  93,  64,  75,  34,  41,+       52,  63,  14,   5,  24,  19, 202, 193, 220, 215, 230, 237, 240,+      251, 146, 153, 132, 143, 190, 181, 168, 163+  };+  s433 = table2[s432];+  s434 = sbv_bv_extract_u32_15_8_u8(s409);+  static const SWord8 table3[] = {+        0,  13,  26,  23,  52,  57,  46,  35, 104, 101, 114, 127,  92,+       81,  70,  75, 208, 221, 202, 199, 228, 233, 254, 243, 184, 181,+      162, 175, 140, 129, 150, 155, 187, 182, 161, 172, 143, 130, 149,+      152, 211, 222, 201, 196, 231, 234, 253, 240, 107, 102, 113, 124,+       95,  82,  69,  72,   3,  14,  25,  20,  55,  58,  45,  32, 109,+       96, 119, 122,  89,  84,  67,  78,   5,   8,  31,  18,  49,  60,+       43,  38, 189, 176, 167, 170, 137, 132, 147, 158, 213, 216, 207,+      194, 225, 236, 251, 246, 214, 219, 204, 193, 226, 239, 248, 245,+      190, 179, 164, 169, 138, 135, 144, 157,   6,  11,  28,  17,  50,+       63,  40,  37, 110,  99, 116, 121,  90,  87,  64,  77, 218, 215,+      192, 205, 238, 227, 244, 249, 178, 191, 168, 165, 134, 139, 156,+      145,  10,   7,  16,  29,  62,  51,  36,  41,  98, 111, 120, 117,+       86,  91,  76,  65,  97, 108, 123, 118,  85,  88,  79,  66,   9,+        4,  19,  30,  61,  48,  39,  42, 177, 188, 171, 166, 133, 136,+      159, 146, 217, 212, 195, 206, 237, 224, 247, 250, 183, 186, 173,+      160, 131, 142, 153, 148, 223, 210, 197, 200, 235, 230, 241, 252,+      103, 106, 125, 112,  83,  94,  73,  68,  15,   2,  21,  24,  59,+       54,  33,  44,  12,   1,  22,  27,  56,  53,  34,  47, 100, 105,+      126, 115,  80,  93,  74,  71, 220, 209, 198, 203, 232, 229, 242,+      255, 180, 185, 174, 163, 128, 141, 154, 151+  };+  s435 = table3[s434];+  s436 = sbv_bv_extract_u32_7_0_u8(s409);+  static const SWord8 table4[] = {+        0,   9,  18,  27,  36,  45,  54,  63,  72,  65,  90,  83, 108,+      101, 126, 119, 144, 153, 130, 139, 180, 189, 166, 175, 216, 209,+      202, 195, 252, 245, 238, 231,  59,  50,  41,  32,  31,  22,  13,+        4, 115, 122,  97, 104,  87,  94,  69,  76, 171, 162, 185, 176,+      143, 134, 157, 148, 227, 234, 241, 248, 199, 206, 213, 220, 118,+      127, 100, 109,  82,  91,  64,  73,  62,  55,  44,  37,  26,  19,+        8,   1, 230, 239, 244, 253, 194, 203, 208, 217, 174, 167, 188,+      181, 138, 131, 152, 145,  77,  68,  95,  86, 105,  96, 123, 114,+        5,  12,  23,  30,  33,  40,  51,  58, 221, 212, 207, 198, 249,+      240, 235, 226, 149, 156, 135, 142, 177, 184, 163, 170, 236, 229,+      254, 247, 200, 193, 218, 211, 164, 173, 182, 191, 128, 137, 146,+      155, 124, 117, 110, 103,  88,  81,  74,  67,  52,  61,  38,  47,+       16,  25,   2,  11, 215, 222, 197, 204, 243, 250, 225, 232, 159,+      150, 141, 132, 187, 178, 169, 160,  71,  78,  85,  92,  99, 106,+      113, 120,  15,   6,  29,  20,  43,  34,  57,  48, 154, 147, 136,+      129, 190, 183, 172, 165, 210, 219, 192, 201, 246, 255, 228, 237,+       10,   3,  24,  17,  46,  39,  60,  53,  66,  75,  80,  89, 102,+      111, 116, 125, 161, 168, 179, 186, 133, 140, 151, 158, 233, 224,+      251, 242, 205, 196, 223, 214,  49,  56,  35,  42,  21,  28,   7,+       14, 121, 112, 107,  98,  93,  84,  79,  70+  };+  s437 = table4[s436];+  s438 = s435 ^ s437;+  s439 = s433 ^ s438;+  s440 = s431 ^ s439;+  s441 = table4[s430];+  s442 = table1[s432];+  s443 = table2[s434];+  s444 = table3[s436];+  s445 = s443 ^ s444;+  s446 = s442 ^ s445;+  s447 = s441 ^ s446;+  s448 = sbv_bv_join_u8_u8_u16(s440, s447);+  s449 = table3[s430];+  s450 = table4[s432];+  s451 = table1[s434];+  s452 = table2[s436];+  s453 = s451 ^ s452;+  s454 = s450 ^ s453;+  s455 = s449 ^ s454;+  s456 = table2[s430];+  s457 = table3[s432];+  s458 = table4[s434];+  s459 = table1[s436];+  s460 = s458 ^ s459;+  s461 = s457 ^ s460;+  s462 = s456 ^ s461;+  s463 = sbv_bv_join_u8_u8_u16(s455, s462);+  s464 = sbv_bv_join_u16_u16_u32(s448, s463);+  s465 = sbv_bv_extract_u32_31_24_u8(s410);+  s466 = table1[s465];+  s467 = sbv_bv_extract_u32_23_16_u8(s410);+  s468 = table2[s467];+  s469 = sbv_bv_extract_u32_15_8_u8(s410);+  s470 = table3[s469];+  s471 = sbv_bv_extract_u32_7_0_u8(s410);+  s472 = table4[s471];+  s473 = s470 ^ s472;+  s474 = s468 ^ s473;+  s475 = s466 ^ s474;+  s476 = table4[s465];+  s477 = table1[s467];+  s478 = table2[s469];+  s479 = table3[s471];+  s480 = s478 ^ s479;+  s481 = s477 ^ s480;+  s482 = s476 ^ s481;+  s483 = sbv_bv_join_u8_u8_u16(s475, s482);+  s484 = table3[s465];+  s485 = table4[s467];+  s486 = table1[s469];+  s487 = table2[s471];+  s488 = s486 ^ s487;+  s489 = s485 ^ s488;+  s490 = s484 ^ s489;+  s491 = table2[s465];+  s492 = table3[s467];+  s493 = table4[s469];+  s494 = table1[s471];+  s495 = s493 ^ s494;+  s496 = s492 ^ s495;+  s497 = s491 ^ s496;+  s498 = sbv_bv_join_u8_u8_u16(s490, s497);+  s499 = sbv_bv_join_u16_u16_u32(s483, s498);+  s500 = sbv_bv_extract_u32_31_24_u8(s411);+  s501 = table1[s500];+  s502 = sbv_bv_extract_u32_23_16_u8(s411);+  s503 = table2[s502];+  s504 = sbv_bv_extract_u32_15_8_u8(s411);+  s505 = table3[s504];+  s506 = sbv_bv_extract_u32_7_0_u8(s411);+  s507 = table4[s506];+  s508 = s505 ^ s507;+  s509 = s503 ^ s508;+  s510 = s501 ^ s509;+  s511 = table4[s500];+  s512 = table1[s502];+  s513 = table2[s504];+  s514 = table3[s506];+  s515 = s513 ^ s514;+  s516 = s512 ^ s515;+  s517 = s511 ^ s516;+  s518 = sbv_bv_join_u8_u8_u16(s510, s517);+  s519 = table3[s500];+  s520 = table4[s502];+  s521 = table1[s504];+  s522 = table2[s506];+  s523 = s521 ^ s522;+  s524 = s520 ^ s523;+  s525 = s519 ^ s524;+  s526 = table2[s500];+  s527 = table3[s502];+  s528 = table4[s504];+  s529 = table1[s506];+  s530 = s528 ^ s529;+  s531 = s527 ^ s530;+  s532 = s526 ^ s531;+  s533 = sbv_bv_join_u8_u8_u16(s525, s532);+  s534 = sbv_bv_join_u16_u16_u32(s518, s533);+  s535 = sbv_bv_extract_u32_31_24_u8(s412);+  s536 = table1[s535];+  s537 = sbv_bv_extract_u32_23_16_u8(s412);+  s538 = table2[s537];+  s539 = sbv_bv_extract_u32_15_8_u8(s412);+  s540 = table3[s539];+  s541 = sbv_bv_extract_u32_7_0_u8(s412);+  s542 = table4[s541];+  s543 = s540 ^ s542;+  s544 = s538 ^ s543;+  s545 = s536 ^ s544;+  s546 = table4[s535];+  s547 = table1[s537];+  s548 = table2[s539];+  s549 = table3[s541];+  s550 = s548 ^ s549;+  s551 = s547 ^ s550;+  s552 = s546 ^ s551;+  s553 = sbv_bv_join_u8_u8_u16(s545, s552);+  s554 = table3[s535];+  s555 = table4[s537];+  s556 = table1[s539];+  s557 = table2[s541];+  s558 = s556 ^ s557;+  s559 = s555 ^ s558;+  s560 = s554 ^ s559;+  s561 = table2[s535];+  s562 = table3[s537];+  s563 = table4[s539];+  s564 = table1[s541];+  s565 = s563 ^ s564;+  s566 = s562 ^ s565;+  s567 = s561 ^ s566;+  s568 = sbv_bv_join_u8_u8_u16(s560, s567);+  s569 = sbv_bv_join_u16_u16_u32(s553, s568);+  s570 = sbv_bv_extract_u32_31_24_u8(s392);+  s571 = table1[s570];+  s572 = sbv_bv_extract_u32_23_16_u8(s392);+  s573 = table2[s572];+  s574 = sbv_bv_extract_u32_15_8_u8(s392);+  s575 = table3[s574];+  s576 = sbv_bv_extract_u32_7_0_u8(s392);+  s577 = table4[s576];+  s578 = s575 ^ s577;+  s579 = s573 ^ s578;+  s580 = s571 ^ s579;+  s581 = table4[s570];+  s582 = table1[s572];+  s583 = table2[s574];+  s584 = table3[s576];+  s585 = s583 ^ s584;+  s586 = s582 ^ s585;+  s587 = s581 ^ s586;+  s588 = sbv_bv_join_u8_u8_u16(s580, s587);+  s589 = table3[s570];+  s590 = table4[s572];+  s591 = table1[s574];+  s592 = table2[s576];+  s593 = s591 ^ s592;+  s594 = s590 ^ s593;+  s595 = s589 ^ s594;+  s596 = table2[s570];+  s597 = table3[s572];+  s598 = table4[s574];+  s599 = table1[s576];+  s600 = s598 ^ s599;+  s601 = s597 ^ s600;+  s602 = s596 ^ s601;+  s603 = sbv_bv_join_u8_u8_u16(s595, s602);+  s604 = sbv_bv_join_u16_u16_u32(s588, s603);+  s605 = sbv_bv_extract_u32_31_24_u8(s393);+  s606 = table1[s605];+  s607 = sbv_bv_extract_u32_23_16_u8(s393);+  s608 = table2[s607];+  s609 = sbv_bv_extract_u32_15_8_u8(s393);+  s610 = table3[s609];+  s611 = sbv_bv_extract_u32_7_0_u8(s393);+  s612 = table4[s611];+  s613 = s610 ^ s612;+  s614 = s608 ^ s613;+  s615 = s606 ^ s614;+  s616 = table4[s605];+  s617 = table1[s607];+  s618 = table2[s609];+  s619 = table3[s611];+  s620 = s618 ^ s619;+  s621 = s617 ^ s620;+  s622 = s616 ^ s621;+  s623 = sbv_bv_join_u8_u8_u16(s615, s622);+  s624 = table3[s605];+  s625 = table4[s607];+  s626 = table1[s609];+  s627 = table2[s611];+  s628 = s626 ^ s627;+  s629 = s625 ^ s628;+  s630 = s624 ^ s629;+  s631 = table2[s605];+  s632 = table3[s607];+  s633 = table4[s609];+  s634 = table1[s611];+  s635 = s633 ^ s634;+  s636 = s632 ^ s635;+  s637 = s631 ^ s636;+  s638 = sbv_bv_join_u8_u8_u16(s630, s637);+  s639 = sbv_bv_join_u16_u16_u32(s623, s638);+  s640 = sbv_bv_extract_u32_31_24_u8(s394);+  s641 = table1[s640];+  s642 = sbv_bv_extract_u32_23_16_u8(s394);+  s643 = table2[s642];+  s644 = sbv_bv_extract_u32_15_8_u8(s394);+  s645 = table3[s644];+  s646 = sbv_bv_extract_u32_7_0_u8(s394);+  s647 = table4[s646];+  s648 = s645 ^ s647;+  s649 = s643 ^ s648;+  s650 = s641 ^ s649;+  s651 = table4[s640];+  s652 = table1[s642];+  s653 = table2[s644];+  s654 = table3[s646];+  s655 = s653 ^ s654;+  s656 = s652 ^ s655;+  s657 = s651 ^ s656;+  s658 = sbv_bv_join_u8_u8_u16(s650, s657);+  s659 = table3[s640];+  s660 = table4[s642];+  s661 = table1[s644];+  s662 = table2[s646];+  s663 = s661 ^ s662;+  s664 = s660 ^ s663;+  s665 = s659 ^ s664;+  s666 = table2[s640];+  s667 = table3[s642];+  s668 = table4[s644];+  s669 = table1[s646];+  s670 = s668 ^ s669;+  s671 = s667 ^ s670;+  s672 = s666 ^ s671;+  s673 = sbv_bv_join_u8_u8_u16(s665, s672);+  s674 = sbv_bv_join_u16_u16_u32(s658, s673);+  s675 = sbv_bv_extract_u32_31_24_u8(s395);+  s676 = table1[s675];+  s677 = sbv_bv_extract_u32_23_16_u8(s395);+  s678 = table2[s677];+  s679 = sbv_bv_extract_u32_15_8_u8(s395);+  s680 = table3[s679];+  s681 = sbv_bv_extract_u32_7_0_u8(s395);+  s682 = table4[s681];+  s683 = s680 ^ s682;+  s684 = s678 ^ s683;+  s685 = s676 ^ s684;+  s686 = table4[s675];+  s687 = table1[s677];+  s688 = table2[s679];+  s689 = table3[s681];+  s690 = s688 ^ s689;+  s691 = s687 ^ s690;+  s692 = s686 ^ s691;+  s693 = sbv_bv_join_u8_u8_u16(s685, s692);+  s694 = table3[s675];+  s695 = table4[s677];+  s696 = table1[s679];+  s697 = table2[s681];+  s698 = s696 ^ s697;+  s699 = s695 ^ s698;+  s700 = s694 ^ s699;+  s701 = table2[s675];+  s702 = table3[s677];+  s703 = table4[s679];+  s704 = table1[s681];+  s705 = s703 ^ s704;+  s706 = s702 ^ s705;+  s707 = s701 ^ s706;+  s708 = sbv_bv_join_u8_u8_u16(s700, s707);+  s709 = sbv_bv_join_u16_u16_u32(s693, s708);+  s710 = sbv_bv_extract_u32_31_24_u8(s375);+  s711 = table1[s710];+  s712 = sbv_bv_extract_u32_23_16_u8(s375);+  s713 = table2[s712];+  s714 = sbv_bv_extract_u32_15_8_u8(s375);+  s715 = table3[s714];+  s716 = sbv_bv_extract_u32_7_0_u8(s375);+  s717 = table4[s716];+  s718 = s715 ^ s717;+  s719 = s713 ^ s718;+  s720 = s711 ^ s719;+  s721 = table4[s710];+  s722 = table1[s712];+  s723 = table2[s714];+  s724 = table3[s716];+  s725 = s723 ^ s724;+  s726 = s722 ^ s725;+  s727 = s721 ^ s726;+  s728 = sbv_bv_join_u8_u8_u16(s720, s727);+  s729 = table3[s710];+  s730 = table4[s712];+  s731 = table1[s714];+  s732 = table2[s716];+  s733 = s731 ^ s732;+  s734 = s730 ^ s733;+  s735 = s729 ^ s734;+  s736 = table2[s710];+  s737 = table3[s712];+  s738 = table4[s714];+  s739 = table1[s716];+  s740 = s738 ^ s739;+  s741 = s737 ^ s740;+  s742 = s736 ^ s741;+  s743 = sbv_bv_join_u8_u8_u16(s735, s742);+  s744 = sbv_bv_join_u16_u16_u32(s728, s743);+  s745 = sbv_bv_extract_u32_31_24_u8(s376);+  s746 = table1[s745];+  s747 = sbv_bv_extract_u32_23_16_u8(s376);+  s748 = table2[s747];+  s749 = sbv_bv_extract_u32_15_8_u8(s376);+  s750 = table3[s749];+  s751 = sbv_bv_extract_u32_7_0_u8(s376);+  s752 = table4[s751];+  s753 = s750 ^ s752;+  s754 = s748 ^ s753;+  s755 = s746 ^ s754;+  s756 = table4[s745];+  s757 = table1[s747];+  s758 = table2[s749];+  s759 = table3[s751];+  s760 = s758 ^ s759;+  s761 = s757 ^ s760;+  s762 = s756 ^ s761;+  s763 = sbv_bv_join_u8_u8_u16(s755, s762);+  s764 = table3[s745];+  s765 = table4[s747];+  s766 = table1[s749];+  s767 = table2[s751];+  s768 = s766 ^ s767;+  s769 = s765 ^ s768;+  s770 = s764 ^ s769;+  s771 = table2[s745];+  s772 = table3[s747];+  s773 = table4[s749];+  s774 = table1[s751];+  s775 = s773 ^ s774;+  s776 = s772 ^ s775;+  s777 = s771 ^ s776;+  s778 = sbv_bv_join_u8_u8_u16(s770, s777);+  s779 = sbv_bv_join_u16_u16_u32(s763, s778);+  s780 = sbv_bv_extract_u32_31_24_u8(s377);+  s781 = table1[s780];+  s782 = sbv_bv_extract_u32_23_16_u8(s377);+  s783 = table2[s782];+  s784 = sbv_bv_extract_u32_15_8_u8(s377);+  s785 = table3[s784];+  s786 = sbv_bv_extract_u32_7_0_u8(s377);+  s787 = table4[s786];+  s788 = s785 ^ s787;+  s789 = s783 ^ s788;+  s790 = s781 ^ s789;+  s791 = table4[s780];+  s792 = table1[s782];+  s793 = table2[s784];+  s794 = table3[s786];+  s795 = s793 ^ s794;+  s796 = s792 ^ s795;+  s797 = s791 ^ s796;+  s798 = sbv_bv_join_u8_u8_u16(s790, s797);+  s799 = table3[s780];+  s800 = table4[s782];+  s801 = table1[s784];+  s802 = table2[s786];+  s803 = s801 ^ s802;+  s804 = s800 ^ s803;+  s805 = s799 ^ s804;+  s806 = table2[s780];+  s807 = table3[s782];+  s808 = table4[s784];+  s809 = table1[s786];+  s810 = s808 ^ s809;+  s811 = s807 ^ s810;+  s812 = s806 ^ s811;+  s813 = sbv_bv_join_u8_u8_u16(s805, s812);+  s814 = sbv_bv_join_u16_u16_u32(s798, s813);+  s815 = sbv_bv_extract_u32_31_24_u8(s378);+  s816 = table1[s815];+  s817 = sbv_bv_extract_u32_23_16_u8(s378);+  s818 = table2[s817];+  s819 = sbv_bv_extract_u32_15_8_u8(s378);+  s820 = table3[s819];+  s821 = sbv_bv_extract_u32_7_0_u8(s378);+  s822 = table4[s821];+  s823 = s820 ^ s822;+  s824 = s818 ^ s823;+  s825 = s816 ^ s824;+  s826 = table4[s815];+  s827 = table1[s817];+  s828 = table2[s819];+  s829 = table3[s821];+  s830 = s828 ^ s829;+  s831 = s827 ^ s830;+  s832 = s826 ^ s831;+  s833 = sbv_bv_join_u8_u8_u16(s825, s832);+  s834 = table3[s815];+  s835 = table4[s817];+  s836 = table1[s819];+  s837 = table2[s821];+  s838 = s836 ^ s837;+  s839 = s835 ^ s838;+  s840 = s834 ^ s839;+  s841 = table2[s815];+  s842 = table3[s817];+  s843 = table4[s819];+  s844 = table1[s821];+  s845 = s843 ^ s844;+  s846 = s842 ^ s845;+  s847 = s841 ^ s846;+  s848 = sbv_bv_join_u8_u8_u16(s840, s847);+  s849 = sbv_bv_join_u16_u16_u32(s833, s848);+  s850 = sbv_bv_extract_u32_31_24_u8(s358);+  s851 = table1[s850];+  s852 = sbv_bv_extract_u32_23_16_u8(s358);+  s853 = table2[s852];+  s854 = sbv_bv_extract_u32_15_8_u8(s358);+  s855 = table3[s854];+  s856 = sbv_bv_extract_u32_7_0_u8(s358);+  s857 = table4[s856];+  s858 = s855 ^ s857;+  s859 = s853 ^ s858;+  s860 = s851 ^ s859;+  s861 = table4[s850];+  s862 = table1[s852];+  s863 = table2[s854];+  s864 = table3[s856];+  s865 = s863 ^ s864;+  s866 = s862 ^ s865;+  s867 = s861 ^ s866;+  s868 = sbv_bv_join_u8_u8_u16(s860, s867);+  s869 = table3[s850];+  s870 = table4[s852];+  s871 = table1[s854];+  s872 = table2[s856];+  s873 = s871 ^ s872;+  s874 = s870 ^ s873;+  s875 = s869 ^ s874;+  s876 = table2[s850];+  s877 = table3[s852];+  s878 = table4[s854];+  s879 = table1[s856];+  s880 = s878 ^ s879;+  s881 = s877 ^ s880;+  s882 = s876 ^ s881;+  s883 = sbv_bv_join_u8_u8_u16(s875, s882);+  s884 = sbv_bv_join_u16_u16_u32(s868, s883);+  s885 = sbv_bv_extract_u32_31_24_u8(s359);+  s886 = table1[s885];+  s887 = sbv_bv_extract_u32_23_16_u8(s359);+  s888 = table2[s887];+  s889 = sbv_bv_extract_u32_15_8_u8(s359);+  s890 = table3[s889];+  s891 = sbv_bv_extract_u32_7_0_u8(s359);+  s892 = table4[s891];+  s893 = s890 ^ s892;+  s894 = s888 ^ s893;+  s895 = s886 ^ s894;+  s896 = table4[s885];+  s897 = table1[s887];+  s898 = table2[s889];+  s899 = table3[s891];+  s900 = s898 ^ s899;+  s901 = s897 ^ s900;+  s902 = s896 ^ s901;+  s903 = sbv_bv_join_u8_u8_u16(s895, s902);+  s904 = table3[s885];+  s905 = table4[s887];+  s906 = table1[s889];+  s907 = table2[s891];+  s908 = s906 ^ s907;+  s909 = s905 ^ s908;+  s910 = s904 ^ s909;+  s911 = table2[s885];+  s912 = table3[s887];+  s913 = table4[s889];+  s914 = table1[s891];+  s915 = s913 ^ s914;+  s916 = s912 ^ s915;+  s917 = s911 ^ s916;+  s918 = sbv_bv_join_u8_u8_u16(s910, s917);+  s919 = sbv_bv_join_u16_u16_u32(s903, s918);+  s920 = sbv_bv_extract_u32_31_24_u8(s360);+  s921 = table1[s920];+  s922 = sbv_bv_extract_u32_23_16_u8(s360);+  s923 = table2[s922];+  s924 = sbv_bv_extract_u32_15_8_u8(s360);+  s925 = table3[s924];+  s926 = sbv_bv_extract_u32_7_0_u8(s360);+  s927 = table4[s926];+  s928 = s925 ^ s927;+  s929 = s923 ^ s928;+  s930 = s921 ^ s929;+  s931 = table4[s920];+  s932 = table1[s922];+  s933 = table2[s924];+  s934 = table3[s926];+  s935 = s933 ^ s934;+  s936 = s932 ^ s935;+  s937 = s931 ^ s936;+  s938 = sbv_bv_join_u8_u8_u16(s930, s937);+  s939 = table3[s920];+  s940 = table4[s922];+  s941 = table1[s924];+  s942 = table2[s926];+  s943 = s941 ^ s942;+  s944 = s940 ^ s943;+  s945 = s939 ^ s944;+  s946 = table2[s920];+  s947 = table3[s922];+  s948 = table4[s924];+  s949 = table1[s926];+  s950 = s948 ^ s949;+  s951 = s947 ^ s950;+  s952 = s946 ^ s951;+  s953 = sbv_bv_join_u8_u8_u16(s945, s952);+  s954 = sbv_bv_join_u16_u16_u32(s938, s953);+  s955 = sbv_bv_extract_u32_31_24_u8(s361);+  s956 = table1[s955];+  s957 = sbv_bv_extract_u32_23_16_u8(s361);+  s958 = table2[s957];+  s959 = sbv_bv_extract_u32_15_8_u8(s361);+  s960 = table3[s959];+  s961 = sbv_bv_extract_u32_7_0_u8(s361);+  s962 = table4[s961];+  s963 = s960 ^ s962;+  s964 = s958 ^ s963;+  s965 = s956 ^ s964;+  s966 = table4[s955];+  s967 = table1[s957];+  s968 = table2[s959];+  s969 = table3[s961];+  s970 = s968 ^ s969;+  s971 = s967 ^ s970;+  s972 = s966 ^ s971;+  s973 = sbv_bv_join_u8_u8_u16(s965, s972);+  s974 = table3[s955];+  s975 = table4[s957];+  s976 = table1[s959];+  s977 = table2[s961];+  s978 = s976 ^ s977;+  s979 = s975 ^ s978;+  s980 = s974 ^ s979;+  s981 = table2[s955];+  s982 = table3[s957];+  s983 = table4[s959];+  s984 = table1[s961];+  s985 = s983 ^ s984;+  s986 = s982 ^ s985;+  s987 = s981 ^ s986;+  s988 = sbv_bv_join_u8_u8_u16(s980, s987);+  s989 = sbv_bv_join_u16_u16_u32(s973, s988);+  s990 = sbv_bv_extract_u32_31_24_u8(s341);+  s991 = table1[s990];+  s992 = sbv_bv_extract_u32_23_16_u8(s341);+  s993 = table2[s992];+  s994 = sbv_bv_extract_u32_15_8_u8(s341);+  s995 = table3[s994];+  s996 = sbv_bv_extract_u32_7_0_u8(s341);+  s997 = table4[s996];+  s998 = s995 ^ s997;+  s999 = s993 ^ s998;+  s1000 = s991 ^ s999;+  s1001 = table4[s990];+  s1002 = table1[s992];+  s1003 = table2[s994];+  s1004 = table3[s996];+  s1005 = s1003 ^ s1004;+  s1006 = s1002 ^ s1005;+  s1007 = s1001 ^ s1006;+  s1008 = sbv_bv_join_u8_u8_u16(s1000, s1007);+  s1009 = table3[s990];+  s1010 = table4[s992];+  s1011 = table1[s994];+  s1012 = table2[s996];+  s1013 = s1011 ^ s1012;+  s1014 = s1010 ^ s1013;+  s1015 = s1009 ^ s1014;+  s1016 = table2[s990];+  s1017 = table3[s992];+  s1018 = table4[s994];+  s1019 = table1[s996];+  s1020 = s1018 ^ s1019;+  s1021 = s1017 ^ s1020;+  s1022 = s1016 ^ s1021;+  s1023 = sbv_bv_join_u8_u8_u16(s1015, s1022);+  s1024 = sbv_bv_join_u16_u16_u32(s1008, s1023);+  s1025 = sbv_bv_extract_u32_31_24_u8(s342);+  s1026 = table1[s1025];+  s1027 = sbv_bv_extract_u32_23_16_u8(s342);+  s1028 = table2[s1027];+  s1029 = sbv_bv_extract_u32_15_8_u8(s342);+  s1030 = table3[s1029];+  s1031 = sbv_bv_extract_u32_7_0_u8(s342);+  s1032 = table4[s1031];+  s1033 = s1030 ^ s1032;+  s1034 = s1028 ^ s1033;+  s1035 = s1026 ^ s1034;+  s1036 = table4[s1025];+  s1037 = table1[s1027];+  s1038 = table2[s1029];+  s1039 = table3[s1031];+  s1040 = s1038 ^ s1039;+  s1041 = s1037 ^ s1040;+  s1042 = s1036 ^ s1041;+  s1043 = sbv_bv_join_u8_u8_u16(s1035, s1042);+  s1044 = table3[s1025];+  s1045 = table4[s1027];+  s1046 = table1[s1029];+  s1047 = table2[s1031];+  s1048 = s1046 ^ s1047;+  s1049 = s1045 ^ s1048;+  s1050 = s1044 ^ s1049;+  s1051 = table2[s1025];+  s1052 = table3[s1027];+  s1053 = table4[s1029];+  s1054 = table1[s1031];+  s1055 = s1053 ^ s1054;+  s1056 = s1052 ^ s1055;+  s1057 = s1051 ^ s1056;+  s1058 = sbv_bv_join_u8_u8_u16(s1050, s1057);+  s1059 = sbv_bv_join_u16_u16_u32(s1043, s1058);+  s1060 = sbv_bv_extract_u32_31_24_u8(s343);+  s1061 = table1[s1060];+  s1062 = sbv_bv_extract_u32_23_16_u8(s343);+  s1063 = table2[s1062];+  s1064 = sbv_bv_extract_u32_15_8_u8(s343);+  s1065 = table3[s1064];+  s1066 = sbv_bv_extract_u32_7_0_u8(s343);+  s1067 = table4[s1066];+  s1068 = s1065 ^ s1067;+  s1069 = s1063 ^ s1068;+  s1070 = s1061 ^ s1069;+  s1071 = table4[s1060];+  s1072 = table1[s1062];+  s1073 = table2[s1064];+  s1074 = table3[s1066];+  s1075 = s1073 ^ s1074;+  s1076 = s1072 ^ s1075;+  s1077 = s1071 ^ s1076;+  s1078 = sbv_bv_join_u8_u8_u16(s1070, s1077);+  s1079 = table3[s1060];+  s1080 = table4[s1062];+  s1081 = table1[s1064];+  s1082 = table2[s1066];+  s1083 = s1081 ^ s1082;+  s1084 = s1080 ^ s1083;+  s1085 = s1079 ^ s1084;+  s1086 = table2[s1060];+  s1087 = table3[s1062];+  s1088 = table4[s1064];+  s1089 = table1[s1066];+  s1090 = s1088 ^ s1089;+  s1091 = s1087 ^ s1090;+  s1092 = s1086 ^ s1091;+  s1093 = sbv_bv_join_u8_u8_u16(s1085, s1092);+  s1094 = sbv_bv_join_u16_u16_u32(s1078, s1093);+  s1095 = sbv_bv_extract_u32_31_24_u8(s344);+  s1096 = table1[s1095];+  s1097 = sbv_bv_extract_u32_23_16_u8(s344);+  s1098 = table2[s1097];+  s1099 = sbv_bv_extract_u32_15_8_u8(s344);+  s1100 = table3[s1099];+  s1101 = sbv_bv_extract_u32_7_0_u8(s344);+  s1102 = table4[s1101];+  s1103 = s1100 ^ s1102;+  s1104 = s1098 ^ s1103;+  s1105 = s1096 ^ s1104;+  s1106 = table4[s1095];+  s1107 = table1[s1097];+  s1108 = table2[s1099];+  s1109 = table3[s1101];+  s1110 = s1108 ^ s1109;+  s1111 = s1107 ^ s1110;+  s1112 = s1106 ^ s1111;+  s1113 = sbv_bv_join_u8_u8_u16(s1105, s1112);+  s1114 = table3[s1095];+  s1115 = table4[s1097];+  s1116 = table1[s1099];+  s1117 = table2[s1101];+  s1118 = s1116 ^ s1117;+  s1119 = s1115 ^ s1118;+  s1120 = s1114 ^ s1119;+  s1121 = table2[s1095];+  s1122 = table3[s1097];+  s1123 = table4[s1099];+  s1124 = table1[s1101];+  s1125 = s1123 ^ s1124;+  s1126 = s1122 ^ s1125;+  s1127 = s1121 ^ s1126;+  s1128 = sbv_bv_join_u8_u8_u16(s1120, s1127);+  s1129 = sbv_bv_join_u16_u16_u32(s1113, s1128);+  s1130 = sbv_bv_extract_u32_31_24_u8(s324);+  s1131 = table1[s1130];+  s1132 = sbv_bv_extract_u32_23_16_u8(s324);+  s1133 = table2[s1132];+  s1134 = sbv_bv_extract_u32_15_8_u8(s324);+  s1135 = table3[s1134];+  s1136 = sbv_bv_extract_u32_7_0_u8(s324);+  s1137 = table4[s1136];+  s1138 = s1135 ^ s1137;+  s1139 = s1133 ^ s1138;+  s1140 = s1131 ^ s1139;+  s1141 = table4[s1130];+  s1142 = table1[s1132];+  s1143 = table2[s1134];+  s1144 = table3[s1136];+  s1145 = s1143 ^ s1144;+  s1146 = s1142 ^ s1145;+  s1147 = s1141 ^ s1146;+  s1148 = sbv_bv_join_u8_u8_u16(s1140, s1147);+  s1149 = table3[s1130];+  s1150 = table4[s1132];+  s1151 = table1[s1134];+  s1152 = table2[s1136];+  s1153 = s1151 ^ s1152;+  s1154 = s1150 ^ s1153;+  s1155 = s1149 ^ s1154;+  s1156 = table2[s1130];+  s1157 = table3[s1132];+  s1158 = table4[s1134];+  s1159 = table1[s1136];+  s1160 = s1158 ^ s1159;+  s1161 = s1157 ^ s1160;+  s1162 = s1156 ^ s1161;+  s1163 = sbv_bv_join_u8_u8_u16(s1155, s1162);+  s1164 = sbv_bv_join_u16_u16_u32(s1148, s1163);+  s1165 = sbv_bv_extract_u32_31_24_u8(s325);+  s1166 = table1[s1165];+  s1167 = sbv_bv_extract_u32_23_16_u8(s325);+  s1168 = table2[s1167];+  s1169 = sbv_bv_extract_u32_15_8_u8(s325);+  s1170 = table3[s1169];+  s1171 = sbv_bv_extract_u32_7_0_u8(s325);+  s1172 = table4[s1171];+  s1173 = s1170 ^ s1172;+  s1174 = s1168 ^ s1173;+  s1175 = s1166 ^ s1174;+  s1176 = table4[s1165];+  s1177 = table1[s1167];+  s1178 = table2[s1169];+  s1179 = table3[s1171];+  s1180 = s1178 ^ s1179;+  s1181 = s1177 ^ s1180;+  s1182 = s1176 ^ s1181;+  s1183 = sbv_bv_join_u8_u8_u16(s1175, s1182);+  s1184 = table3[s1165];+  s1185 = table4[s1167];+  s1186 = table1[s1169];+  s1187 = table2[s1171];+  s1188 = s1186 ^ s1187;+  s1189 = s1185 ^ s1188;+  s1190 = s1184 ^ s1189;+  s1191 = table2[s1165];+  s1192 = table3[s1167];+  s1193 = table4[s1169];+  s1194 = table1[s1171];+  s1195 = s1193 ^ s1194;+  s1196 = s1192 ^ s1195;+  s1197 = s1191 ^ s1196;+  s1198 = sbv_bv_join_u8_u8_u16(s1190, s1197);+  s1199 = sbv_bv_join_u16_u16_u32(s1183, s1198);+  s1200 = sbv_bv_extract_u32_31_24_u8(s326);+  s1201 = table1[s1200];+  s1202 = sbv_bv_extract_u32_23_16_u8(s326);+  s1203 = table2[s1202];+  s1204 = sbv_bv_extract_u32_15_8_u8(s326);+  s1205 = table3[s1204];+  s1206 = sbv_bv_extract_u32_7_0_u8(s326);+  s1207 = table4[s1206];+  s1208 = s1205 ^ s1207;+  s1209 = s1203 ^ s1208;+  s1210 = s1201 ^ s1209;+  s1211 = table4[s1200];+  s1212 = table1[s1202];+  s1213 = table2[s1204];+  s1214 = table3[s1206];+  s1215 = s1213 ^ s1214;+  s1216 = s1212 ^ s1215;+  s1217 = s1211 ^ s1216;+  s1218 = sbv_bv_join_u8_u8_u16(s1210, s1217);+  s1219 = table3[s1200];+  s1220 = table4[s1202];+  s1221 = table1[s1204];+  s1222 = table2[s1206];+  s1223 = s1221 ^ s1222;+  s1224 = s1220 ^ s1223;+  s1225 = s1219 ^ s1224;+  s1226 = table2[s1200];+  s1227 = table3[s1202];+  s1228 = table4[s1204];+  s1229 = table1[s1206];+  s1230 = s1228 ^ s1229;+  s1231 = s1227 ^ s1230;+  s1232 = s1226 ^ s1231;+  s1233 = sbv_bv_join_u8_u8_u16(s1225, s1232);+  s1234 = sbv_bv_join_u16_u16_u32(s1218, s1233);+  s1235 = sbv_bv_extract_u32_31_24_u8(s327);+  s1236 = table1[s1235];+  s1237 = sbv_bv_extract_u32_23_16_u8(s327);+  s1238 = table2[s1237];+  s1239 = sbv_bv_extract_u32_15_8_u8(s327);+  s1240 = table3[s1239];+  s1241 = sbv_bv_extract_u32_7_0_u8(s327);+  s1242 = table4[s1241];+  s1243 = s1240 ^ s1242;+  s1244 = s1238 ^ s1243;+  s1245 = s1236 ^ s1244;+  s1246 = table4[s1235];+  s1247 = table1[s1237];+  s1248 = table2[s1239];+  s1249 = table3[s1241];+  s1250 = s1248 ^ s1249;+  s1251 = s1247 ^ s1250;+  s1252 = s1246 ^ s1251;+  s1253 = sbv_bv_join_u8_u8_u16(s1245, s1252);+  s1254 = table3[s1235];+  s1255 = table4[s1237];+  s1256 = table1[s1239];+  s1257 = table2[s1241];+  s1258 = s1256 ^ s1257;+  s1259 = s1255 ^ s1258;+  s1260 = s1254 ^ s1259;+  s1261 = table2[s1235];+  s1262 = table3[s1237];+  s1263 = table4[s1239];+  s1264 = table1[s1241];+  s1265 = s1263 ^ s1264;+  s1266 = s1262 ^ s1265;+  s1267 = s1261 ^ s1266;+  s1268 = sbv_bv_join_u8_u8_u16(s1260, s1267);+  s1269 = sbv_bv_join_u16_u16_u32(s1253, s1268);+  s1270 = sbv_bv_extract_u32_31_24_u8(s307);+  s1271 = table1[s1270];+  s1272 = sbv_bv_extract_u32_23_16_u8(s307);+  s1273 = table2[s1272];+  s1274 = sbv_bv_extract_u32_15_8_u8(s307);+  s1275 = table3[s1274];+  s1276 = sbv_bv_extract_u32_7_0_u8(s307);+  s1277 = table4[s1276];+  s1278 = s1275 ^ s1277;+  s1279 = s1273 ^ s1278;+  s1280 = s1271 ^ s1279;+  s1281 = table4[s1270];+  s1282 = table1[s1272];+  s1283 = table2[s1274];+  s1284 = table3[s1276];+  s1285 = s1283 ^ s1284;+  s1286 = s1282 ^ s1285;+  s1287 = s1281 ^ s1286;+  s1288 = sbv_bv_join_u8_u8_u16(s1280, s1287);+  s1289 = table3[s1270];+  s1290 = table4[s1272];+  s1291 = table1[s1274];+  s1292 = table2[s1276];+  s1293 = s1291 ^ s1292;+  s1294 = s1290 ^ s1293;+  s1295 = s1289 ^ s1294;+  s1296 = table2[s1270];+  s1297 = table3[s1272];+  s1298 = table4[s1274];+  s1299 = table1[s1276];+  s1300 = s1298 ^ s1299;+  s1301 = s1297 ^ s1300;+  s1302 = s1296 ^ s1301;+  s1303 = sbv_bv_join_u8_u8_u16(s1295, s1302);+  s1304 = sbv_bv_join_u16_u16_u32(s1288, s1303);+  s1305 = sbv_bv_extract_u32_31_24_u8(s308);+  s1306 = table1[s1305];+  s1307 = sbv_bv_extract_u32_23_16_u8(s308);+  s1308 = table2[s1307];+  s1309 = sbv_bv_extract_u32_15_8_u8(s308);+  s1310 = table3[s1309];+  s1311 = sbv_bv_extract_u32_7_0_u8(s308);+  s1312 = table4[s1311];+  s1313 = s1310 ^ s1312;+  s1314 = s1308 ^ s1313;+  s1315 = s1306 ^ s1314;+  s1316 = table4[s1305];+  s1317 = table1[s1307];+  s1318 = table2[s1309];+  s1319 = table3[s1311];+  s1320 = s1318 ^ s1319;+  s1321 = s1317 ^ s1320;+  s1322 = s1316 ^ s1321;+  s1323 = sbv_bv_join_u8_u8_u16(s1315, s1322);+  s1324 = table3[s1305];+  s1325 = table4[s1307];+  s1326 = table1[s1309];+  s1327 = table2[s1311];+  s1328 = s1326 ^ s1327;+  s1329 = s1325 ^ s1328;+  s1330 = s1324 ^ s1329;+  s1331 = table2[s1305];+  s1332 = table3[s1307];+  s1333 = table4[s1309];+  s1334 = table1[s1311];+  s1335 = s1333 ^ s1334;+  s1336 = s1332 ^ s1335;+  s1337 = s1331 ^ s1336;+  s1338 = sbv_bv_join_u8_u8_u16(s1330, s1337);+  s1339 = sbv_bv_join_u16_u16_u32(s1323, s1338);+  s1340 = sbv_bv_extract_u32_31_24_u8(s309);+  s1341 = table1[s1340];+  s1342 = sbv_bv_extract_u32_23_16_u8(s309);+  s1343 = table2[s1342];+  s1344 = sbv_bv_extract_u32_15_8_u8(s309);+  s1345 = table3[s1344];+  s1346 = sbv_bv_extract_u32_7_0_u8(s309);+  s1347 = table4[s1346];+  s1348 = s1345 ^ s1347;+  s1349 = s1343 ^ s1348;+  s1350 = s1341 ^ s1349;+  s1351 = table4[s1340];+  s1352 = table1[s1342];+  s1353 = table2[s1344];+  s1354 = table3[s1346];+  s1355 = s1353 ^ s1354;+  s1356 = s1352 ^ s1355;+  s1357 = s1351 ^ s1356;+  s1358 = sbv_bv_join_u8_u8_u16(s1350, s1357);+  s1359 = table3[s1340];+  s1360 = table4[s1342];+  s1361 = table1[s1344];+  s1362 = table2[s1346];+  s1363 = s1361 ^ s1362;+  s1364 = s1360 ^ s1363;+  s1365 = s1359 ^ s1364;+  s1366 = table2[s1340];+  s1367 = table3[s1342];+  s1368 = table4[s1344];+  s1369 = table1[s1346];+  s1370 = s1368 ^ s1369;+  s1371 = s1367 ^ s1370;+  s1372 = s1366 ^ s1371;+  s1373 = sbv_bv_join_u8_u8_u16(s1365, s1372);+  s1374 = sbv_bv_join_u16_u16_u32(s1358, s1373);+  s1375 = sbv_bv_extract_u32_31_24_u8(s310);+  s1376 = table1[s1375];+  s1377 = sbv_bv_extract_u32_23_16_u8(s310);+  s1378 = table2[s1377];+  s1379 = sbv_bv_extract_u32_15_8_u8(s310);+  s1380 = table3[s1379];+  s1381 = sbv_bv_extract_u32_7_0_u8(s310);+  s1382 = table4[s1381];+  s1383 = s1380 ^ s1382;+  s1384 = s1378 ^ s1383;+  s1385 = s1376 ^ s1384;+  s1386 = table4[s1375];+  s1387 = table1[s1377];+  s1388 = table2[s1379];+  s1389 = table3[s1381];+  s1390 = s1388 ^ s1389;+  s1391 = s1387 ^ s1390;+  s1392 = s1386 ^ s1391;+  s1393 = sbv_bv_join_u8_u8_u16(s1385, s1392);+  s1394 = table3[s1375];+  s1395 = table4[s1377];+  s1396 = table1[s1379];+  s1397 = table2[s1381];+  s1398 = s1396 ^ s1397;+  s1399 = s1395 ^ s1398;+  s1400 = s1394 ^ s1399;+  s1401 = table2[s1375];+  s1402 = table3[s1377];+  s1403 = table4[s1379];+  s1404 = table1[s1381];+  s1405 = s1403 ^ s1404;+  s1406 = s1402 ^ s1405;+  s1407 = s1401 ^ s1406;+  s1408 = sbv_bv_join_u8_u8_u16(s1400, s1407);+  s1409 = sbv_bv_join_u16_u16_u32(s1393, s1408);+  s1410 = sbv_bv_extract_u32_31_24_u8(s290);+  s1411 = table1[s1410];+  s1412 = sbv_bv_extract_u32_23_16_u8(s290);+  s1413 = table2[s1412];+  s1414 = sbv_bv_extract_u32_15_8_u8(s290);+  s1415 = table3[s1414];+  s1416 = sbv_bv_extract_u32_7_0_u8(s290);+  s1417 = table4[s1416];+  s1418 = s1415 ^ s1417;+  s1419 = s1413 ^ s1418;+  s1420 = s1411 ^ s1419;+  s1421 = table4[s1410];+  s1422 = table1[s1412];+  s1423 = table2[s1414];+  s1424 = table3[s1416];+  s1425 = s1423 ^ s1424;+  s1426 = s1422 ^ s1425;+  s1427 = s1421 ^ s1426;+  s1428 = sbv_bv_join_u8_u8_u16(s1420, s1427);+  s1429 = table3[s1410];+  s1430 = table4[s1412];+  s1431 = table1[s1414];+  s1432 = table2[s1416];+  s1433 = s1431 ^ s1432;+  s1434 = s1430 ^ s1433;+  s1435 = s1429 ^ s1434;+  s1436 = table2[s1410];+  s1437 = table3[s1412];+  s1438 = table4[s1414];+  s1439 = table1[s1416];+  s1440 = s1438 ^ s1439;+  s1441 = s1437 ^ s1440;+  s1442 = s1436 ^ s1441;+  s1443 = sbv_bv_join_u8_u8_u16(s1435, s1442);+  s1444 = sbv_bv_join_u16_u16_u32(s1428, s1443);+  s1445 = sbv_bv_extract_u32_31_24_u8(s291);+  s1446 = table1[s1445];+  s1447 = sbv_bv_extract_u32_23_16_u8(s291);+  s1448 = table2[s1447];+  s1449 = sbv_bv_extract_u32_15_8_u8(s291);+  s1450 = table3[s1449];+  s1451 = sbv_bv_extract_u32_7_0_u8(s291);+  s1452 = table4[s1451];+  s1453 = s1450 ^ s1452;+  s1454 = s1448 ^ s1453;+  s1455 = s1446 ^ s1454;+  s1456 = table4[s1445];+  s1457 = table1[s1447];+  s1458 = table2[s1449];+  s1459 = table3[s1451];+  s1460 = s1458 ^ s1459;+  s1461 = s1457 ^ s1460;+  s1462 = s1456 ^ s1461;+  s1463 = sbv_bv_join_u8_u8_u16(s1455, s1462);+  s1464 = table3[s1445];+  s1465 = table4[s1447];+  s1466 = table1[s1449];+  s1467 = table2[s1451];+  s1468 = s1466 ^ s1467;+  s1469 = s1465 ^ s1468;+  s1470 = s1464 ^ s1469;+  s1471 = table2[s1445];+  s1472 = table3[s1447];+  s1473 = table4[s1449];+  s1474 = table1[s1451];+  s1475 = s1473 ^ s1474;+  s1476 = s1472 ^ s1475;+  s1477 = s1471 ^ s1476;+  s1478 = sbv_bv_join_u8_u8_u16(s1470, s1477);+  s1479 = sbv_bv_join_u16_u16_u32(s1463, s1478);+  s1480 = sbv_bv_extract_u32_31_24_u8(s292);+  s1481 = table1[s1480];+  s1482 = sbv_bv_extract_u32_23_16_u8(s292);+  s1483 = table2[s1482];+  s1484 = sbv_bv_extract_u32_15_8_u8(s292);+  s1485 = table3[s1484];+  s1486 = sbv_bv_extract_u32_7_0_u8(s292);+  s1487 = table4[s1486];+  s1488 = s1485 ^ s1487;+  s1489 = s1483 ^ s1488;+  s1490 = s1481 ^ s1489;+  s1491 = table4[s1480];+  s1492 = table1[s1482];+  s1493 = table2[s1484];+  s1494 = table3[s1486];+  s1495 = s1493 ^ s1494;+  s1496 = s1492 ^ s1495;+  s1497 = s1491 ^ s1496;+  s1498 = sbv_bv_join_u8_u8_u16(s1490, s1497);+  s1499 = table3[s1480];+  s1500 = table4[s1482];+  s1501 = table1[s1484];+  s1502 = table2[s1486];+  s1503 = s1501 ^ s1502;+  s1504 = s1500 ^ s1503;+  s1505 = s1499 ^ s1504;+  s1506 = table2[s1480];+  s1507 = table3[s1482];+  s1508 = table4[s1484];+  s1509 = table1[s1486];+  s1510 = s1508 ^ s1509;+  s1511 = s1507 ^ s1510;+  s1512 = s1506 ^ s1511;+  s1513 = sbv_bv_join_u8_u8_u16(s1505, s1512);+  s1514 = sbv_bv_join_u16_u16_u32(s1498, s1513);+  s1515 = sbv_bv_extract_u32_31_24_u8(s293);+  s1516 = table1[s1515];+  s1517 = sbv_bv_extract_u32_23_16_u8(s293);+  s1518 = table2[s1517];+  s1519 = sbv_bv_extract_u32_15_8_u8(s293);+  s1520 = table3[s1519];+  s1521 = sbv_bv_extract_u32_7_0_u8(s293);+  s1522 = table4[s1521];+  s1523 = s1520 ^ s1522;+  s1524 = s1518 ^ s1523;+  s1525 = s1516 ^ s1524;+  s1526 = table4[s1515];+  s1527 = table1[s1517];+  s1528 = table2[s1519];+  s1529 = table3[s1521];+  s1530 = s1528 ^ s1529;+  s1531 = s1527 ^ s1530;+  s1532 = s1526 ^ s1531;+  s1533 = sbv_bv_join_u8_u8_u16(s1525, s1532);+  s1534 = table3[s1515];+  s1535 = table4[s1517];+  s1536 = table1[s1519];+  s1537 = table2[s1521];+  s1538 = s1536 ^ s1537;+  s1539 = s1535 ^ s1538;+  s1540 = s1534 ^ s1539;+  s1541 = table2[s1515];+  s1542 = table3[s1517];+  s1543 = table4[s1519];+  s1544 = table1[s1521];+  s1545 = s1543 ^ s1544;+  s1546 = s1542 ^ s1545;+  s1547 = s1541 ^ s1546;+  s1548 = sbv_bv_join_u8_u8_u16(s1540, s1547);+  s1549 = sbv_bv_join_u16_u16_u32(s1533, s1548);+  s1550 = sbv_bv_extract_u32_31_24_u8(s273);+  s1551 = table1[s1550];+  s1552 = sbv_bv_extract_u32_23_16_u8(s273);+  s1553 = table2[s1552];+  s1554 = sbv_bv_extract_u32_15_8_u8(s273);+  s1555 = table3[s1554];+  s1556 = sbv_bv_extract_u32_7_0_u8(s273);+  s1557 = table4[s1556];+  s1558 = s1555 ^ s1557;+  s1559 = s1553 ^ s1558;+  s1560 = s1551 ^ s1559;+  s1561 = table4[s1550];+  s1562 = table1[s1552];+  s1563 = table2[s1554];+  s1564 = table3[s1556];+  s1565 = s1563 ^ s1564;+  s1566 = s1562 ^ s1565;+  s1567 = s1561 ^ s1566;+  s1568 = sbv_bv_join_u8_u8_u16(s1560, s1567);+  s1569 = table3[s1550];+  s1570 = table4[s1552];+  s1571 = table1[s1554];+  s1572 = table2[s1556];+  s1573 = s1571 ^ s1572;+  s1574 = s1570 ^ s1573;+  s1575 = s1569 ^ s1574;+  s1576 = table2[s1550];+  s1577 = table3[s1552];+  s1578 = table4[s1554];+  s1579 = table1[s1556];+  s1580 = s1578 ^ s1579;+  s1581 = s1577 ^ s1580;+  s1582 = s1576 ^ s1581;+  s1583 = sbv_bv_join_u8_u8_u16(s1575, s1582);+  s1584 = sbv_bv_join_u16_u16_u32(s1568, s1583);+  s1585 = sbv_bv_extract_u32_31_24_u8(s274);+  s1586 = table1[s1585];+  s1587 = sbv_bv_extract_u32_23_16_u8(s274);+  s1588 = table2[s1587];+  s1589 = sbv_bv_extract_u32_15_8_u8(s274);+  s1590 = table3[s1589];+  s1591 = sbv_bv_extract_u32_7_0_u8(s274);+  s1592 = table4[s1591];+  s1593 = s1590 ^ s1592;+  s1594 = s1588 ^ s1593;+  s1595 = s1586 ^ s1594;+  s1596 = table4[s1585];+  s1597 = table1[s1587];+  s1598 = table2[s1589];+  s1599 = table3[s1591];+  s1600 = s1598 ^ s1599;+  s1601 = s1597 ^ s1600;+  s1602 = s1596 ^ s1601;+  s1603 = sbv_bv_join_u8_u8_u16(s1595, s1602);+  s1604 = table3[s1585];+  s1605 = table4[s1587];+  s1606 = table1[s1589];+  s1607 = table2[s1591];+  s1608 = s1606 ^ s1607;+  s1609 = s1605 ^ s1608;+  s1610 = s1604 ^ s1609;+  s1611 = table2[s1585];+  s1612 = table3[s1587];+  s1613 = table4[s1589];+  s1614 = table1[s1591];+  s1615 = s1613 ^ s1614;+  s1616 = s1612 ^ s1615;+  s1617 = s1611 ^ s1616;+  s1618 = sbv_bv_join_u8_u8_u16(s1610, s1617);+  s1619 = sbv_bv_join_u16_u16_u32(s1603, s1618);+  s1620 = sbv_bv_extract_u32_31_24_u8(s275);+  s1621 = table1[s1620];+  s1622 = sbv_bv_extract_u32_23_16_u8(s275);+  s1623 = table2[s1622];+  s1624 = sbv_bv_extract_u32_15_8_u8(s275);+  s1625 = table3[s1624];+  s1626 = sbv_bv_extract_u32_7_0_u8(s275);+  s1627 = table4[s1626];+  s1628 = s1625 ^ s1627;+  s1629 = s1623 ^ s1628;+  s1630 = s1621 ^ s1629;+  s1631 = table4[s1620];+  s1632 = table1[s1622];+  s1633 = table2[s1624];+  s1634 = table3[s1626];+  s1635 = s1633 ^ s1634;+  s1636 = s1632 ^ s1635;+  s1637 = s1631 ^ s1636;+  s1638 = sbv_bv_join_u8_u8_u16(s1630, s1637);+  s1639 = table3[s1620];+  s1640 = table4[s1622];+  s1641 = table1[s1624];+  s1642 = table2[s1626];+  s1643 = s1641 ^ s1642;+  s1644 = s1640 ^ s1643;+  s1645 = s1639 ^ s1644;+  s1646 = table2[s1620];+  s1647 = table3[s1622];+  s1648 = table4[s1624];+  s1649 = table1[s1626];+  s1650 = s1648 ^ s1649;+  s1651 = s1647 ^ s1650;+  s1652 = s1646 ^ s1651;+  s1653 = sbv_bv_join_u8_u8_u16(s1645, s1652);+  s1654 = sbv_bv_join_u16_u16_u32(s1638, s1653);+  s1655 = sbv_bv_extract_u32_31_24_u8(s276);+  s1656 = table1[s1655];+  s1657 = sbv_bv_extract_u32_23_16_u8(s276);+  s1658 = table2[s1657];+  s1659 = sbv_bv_extract_u32_15_8_u8(s276);+  s1660 = table3[s1659];+  s1661 = sbv_bv_extract_u32_7_0_u8(s276);+  s1662 = table4[s1661];+  s1663 = s1660 ^ s1662;+  s1664 = s1658 ^ s1663;+  s1665 = s1656 ^ s1664;+  s1666 = table4[s1655];+  s1667 = table1[s1657];+  s1668 = table2[s1659];+  s1669 = table3[s1661];+  s1670 = s1668 ^ s1669;+  s1671 = s1667 ^ s1670;+  s1672 = s1666 ^ s1671;+  s1673 = sbv_bv_join_u8_u8_u16(s1665, s1672);+  s1674 = table3[s1655];+  s1675 = table4[s1657];+  s1676 = table1[s1659];+  s1677 = table2[s1661];+  s1678 = s1676 ^ s1677;+  s1679 = s1675 ^ s1678;+  s1680 = s1674 ^ s1679;+  s1681 = table2[s1655];+  s1682 = table3[s1657];+  s1683 = table4[s1659];+  s1684 = table1[s1661];+  s1685 = s1683 ^ s1684;+  s1686 = s1682 ^ s1685;+  s1687 = s1681 ^ s1686;+  s1688 = sbv_bv_join_u8_u8_u16(s1680, s1687);+  s1689 = sbv_bv_join_u16_u16_u32(s1673, s1688);++  sbv_output_0[0] = s0;+  sbv_output_0[1] = s1;+  sbv_output_0[2] = s2;+  sbv_output_0[3] = s3;+  sbv_output_0[4] = s273;+  sbv_output_0[5] = s274;+  sbv_output_0[6] = s275;+  sbv_output_0[7] = s276;+  sbv_output_0[8] = s290;+  sbv_output_0[9] = s291;+  sbv_output_0[10] = s292;+  sbv_output_0[11] = s293;+  sbv_output_0[12] = s307;+  sbv_output_0[13] = s308;+  sbv_output_0[14] = s309;+  sbv_output_0[15] = s310;+  sbv_output_0[16] = s324;+  sbv_output_0[17] = s325;+  sbv_output_0[18] = s326;+  sbv_output_0[19] = s327;+  sbv_output_0[20] = s341;+  sbv_output_0[21] = s342;+  sbv_output_0[22] = s343;+  sbv_output_0[23] = s344;+  sbv_output_0[24] = s358;+  sbv_output_0[25] = s359;+  sbv_output_0[26] = s360;+  sbv_output_0[27] = s361;+  sbv_output_0[28] = s375;+  sbv_output_0[29] = s376;+  sbv_output_0[30] = s377;+  sbv_output_0[31] = s378;+  sbv_output_0[32] = s392;+  sbv_output_0[33] = s393;+  sbv_output_0[34] = s394;+  sbv_output_0[35] = s395;+  sbv_output_0[36] = s409;+  sbv_output_0[37] = s410;+  sbv_output_0[38] = s411;+  sbv_output_0[39] = s412;+  sbv_output_0[40] = s426;+  sbv_output_0[41] = s427;+  sbv_output_0[42] = s428;+  sbv_output_0[43] = s429;+  sbv_output_1[0] = s426;+  sbv_output_1[1] = s427;+  sbv_output_1[2] = s428;+  sbv_output_1[3] = s429;+  sbv_output_1[4] = s464;+  sbv_output_1[5] = s499;+  sbv_output_1[6] = s534;+  sbv_output_1[7] = s569;+  sbv_output_1[8] = s604;+  sbv_output_1[9] = s639;+  sbv_output_1[10] = s674;+  sbv_output_1[11] = s709;+  sbv_output_1[12] = s744;+  sbv_output_1[13] = s779;+  sbv_output_1[14] = s814;+  sbv_output_1[15] = s849;+  sbv_output_1[16] = s884;+  sbv_output_1[17] = s919;+  sbv_output_1[18] = s954;+  sbv_output_1[19] = s989;+  sbv_output_1[20] = s1024;+  sbv_output_1[21] = s1059;+  sbv_output_1[22] = s1094;+  sbv_output_1[23] = s1129;+  sbv_output_1[24] = s1164;+  sbv_output_1[25] = s1199;+  sbv_output_1[26] = s1234;+  sbv_output_1[27] = s1269;+  sbv_output_1[28] = s1304;+  sbv_output_1[29] = s1339;+  sbv_output_1[30] = s1374;+  sbv_output_1[31] = s1409;+  sbv_output_1[32] = s1444;+  sbv_output_1[33] = s1479;+  sbv_output_1[34] = s1514;+  sbv_output_1[35] = s1549;+  sbv_output_1[36] = s1584;+  sbv_output_1[37] = s1619;+  sbv_output_1[38] = s1654;+  sbv_output_1[39] = s1689;+  sbv_output_1[40] = s0;+  sbv_output_1[41] = s1;+  sbv_output_1[42] = s2;+  sbv_output_1[43] = s3;+}+== END: "aes128KeySchedule.c" ==================+== BEGIN: "aes128BlockEncrypt.c" ================+/* File: "aes128BlockEncrypt.c". Automatically generated by SBV. Do not edit! */++#include "aes128Lib.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128BlockEncrypt(const SWord32 *sbv_input_0,+                        const SWord32 *sbv_input_1, SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s4 = sbv_input_1[0];+  const SWord32 s5 = sbv_input_1[1];+  const SWord32 s6 = sbv_input_1[2];+  const SWord32 s7 = sbv_input_1[3];+  const SWord32 s8 = sbv_input_1[4];+  const SWord32 s9 = sbv_input_1[5];+  const SWord32 s10 = sbv_input_1[6];+  const SWord32 s11 = sbv_input_1[7];+  const SWord32 s12 = sbv_input_1[8];+  const SWord32 s13 = sbv_input_1[9];+  const SWord32 s14 = sbv_input_1[10];+  const SWord32 s15 = sbv_input_1[11];+  const SWord32 s16 = sbv_input_1[12];+  const SWord32 s17 = sbv_input_1[13];+  const SWord32 s18 = sbv_input_1[14];+  const SWord32 s19 = sbv_input_1[15];+  const SWord32 s20 = sbv_input_1[16];+  const SWord32 s21 = sbv_input_1[17];+  const SWord32 s22 = sbv_input_1[18];+  const SWord32 s23 = sbv_input_1[19];+  const SWord32 s24 = sbv_input_1[20];+  const SWord32 s25 = sbv_input_1[21];+  const SWord32 s26 = sbv_input_1[22];+  const SWord32 s27 = sbv_input_1[23];+  const SWord32 s28 = sbv_input_1[24];+  const SWord32 s29 = sbv_input_1[25];+  const SWord32 s30 = sbv_input_1[26];+  const SWord32 s31 = sbv_input_1[27];+  const SWord32 s32 = sbv_input_1[28];+  const SWord32 s33 = sbv_input_1[29];+  const SWord32 s34 = sbv_input_1[30];+  const SWord32 s35 = sbv_input_1[31];+  const SWord32 s36 = sbv_input_1[32];+  const SWord32 s37 = sbv_input_1[33];+  const SWord32 s38 = sbv_input_1[34];+  const SWord32 s39 = sbv_input_1[35];+  const SWord32 s40 = sbv_input_1[36];+  const SWord32 s41 = sbv_input_1[37];+  const SWord32 s42 = sbv_input_1[38];+  const SWord32 s43 = sbv_input_1[39];+  const SWord32 s44 = sbv_input_1[40];+  const SWord32 s45 = sbv_input_1[41];+  const SWord32 s46 = sbv_input_1[42];+  const SWord32 s47 = sbv_input_1[43];+  const SWord32 s560 = s0 ^ s4;+  const SWord8  s561 = sbv_bv_extract_u32_31_24_u8(s560);+  const SWord32 s818 = s1 ^ s5;+  const SWord8  s819 = sbv_bv_extract_u32_23_16_u8(s818);+  const SWord32 s1077 = s2 ^ s6;+  const SWord8  s1078 = sbv_bv_extract_u32_15_8_u8(s1077);+  const SWord32 s1336 = s3 ^ s7;+  const SWord8  s1337 = sbv_bv_extract_u32_7_0_u8(s1336);+  const SWord8  s1343 = sbv_bv_extract_u32_31_24_u8(s818);+  const SWord8  s1345 = sbv_bv_extract_u32_23_16_u8(s1077);+  const SWord8  s1348 = sbv_bv_extract_u32_15_8_u8(s1336);+  const SWord8  s1351 = sbv_bv_extract_u32_7_0_u8(s560);+  const SWord8  s1358 = sbv_bv_extract_u32_31_24_u8(s1077);+  const SWord8  s1360 = sbv_bv_extract_u32_23_16_u8(s1336);+  const SWord8  s1363 = sbv_bv_extract_u32_15_8_u8(s560);+  const SWord8  s1366 = sbv_bv_extract_u32_7_0_u8(s818);+  const SWord8  s1373 = sbv_bv_extract_u32_31_24_u8(s1336);+  const SWord8  s1375 = sbv_bv_extract_u32_23_16_u8(s560);+  const SWord8  s1378 = sbv_bv_extract_u32_15_8_u8(s818);+  const SWord8  s1381 = sbv_bv_extract_u32_7_0_u8(s1077);+        SWord32 s562;+        SWord32 s820;+        SWord32 s821;+        SWord32 s1079;+        SWord32 s1080;+        SWord32 s1338;+        SWord32 s1339;+        SWord32 s1340;+        SWord8  s1341;+        SWord32 s1342;+        SWord32 s1344;+        SWord32 s1346;+        SWord32 s1347;+        SWord32 s1349;+        SWord32 s1350;+        SWord32 s1352;+        SWord32 s1353;+        SWord32 s1354;+        SWord8  s1355;+        SWord32 s1356;+        SWord32 s1357;+        SWord32 s1359;+        SWord32 s1361;+        SWord32 s1362;+        SWord32 s1364;+        SWord32 s1365;+        SWord32 s1367;+        SWord32 s1368;+        SWord32 s1369;+        SWord8  s1370;+        SWord32 s1371;+        SWord32 s1372;+        SWord32 s1374;+        SWord32 s1376;+        SWord32 s1377;+        SWord32 s1379;+        SWord32 s1380;+        SWord32 s1382;+        SWord32 s1383;+        SWord32 s1384;+        SWord8  s1385;+        SWord32 s1386;+        SWord32 s1387;+        SWord32 s1388;+        SWord8  s1389;+        SWord32 s1390;+        SWord8  s1391;+        SWord32 s1392;+        SWord8  s1393;+        SWord32 s1394;+        SWord32 s1395;+        SWord8  s1396;+        SWord32 s1397;+        SWord32 s1398;+        SWord8  s1399;+        SWord32 s1400;+        SWord32 s1401;+        SWord32 s1402;+        SWord8  s1403;+        SWord32 s1404;+        SWord32 s1405;+        SWord8  s1406;+        SWord32 s1407;+        SWord8  s1408;+        SWord32 s1409;+        SWord32 s1410;+        SWord8  s1411;+        SWord32 s1412;+        SWord32 s1413;+        SWord8  s1414;+        SWord32 s1415;+        SWord32 s1416;+        SWord32 s1417;+        SWord8  s1418;+        SWord32 s1419;+        SWord32 s1420;+        SWord8  s1421;+        SWord32 s1422;+        SWord8  s1423;+        SWord32 s1424;+        SWord32 s1425;+        SWord8  s1426;+        SWord32 s1427;+        SWord32 s1428;+        SWord8  s1429;+        SWord32 s1430;+        SWord32 s1431;+        SWord32 s1432;+        SWord8  s1433;+        SWord32 s1434;+        SWord32 s1435;+        SWord32 s1436;+        SWord8  s1437;+        SWord32 s1438;+        SWord8  s1439;+        SWord32 s1440;+        SWord8  s1441;+        SWord32 s1442;+        SWord32 s1443;+        SWord8  s1444;+        SWord32 s1445;+        SWord32 s1446;+        SWord8  s1447;+        SWord32 s1448;+        SWord32 s1449;+        SWord32 s1450;+        SWord8  s1451;+        SWord32 s1452;+        SWord32 s1453;+        SWord8  s1454;+        SWord32 s1455;+        SWord8  s1456;+        SWord32 s1457;+        SWord32 s1458;+        SWord8  s1459;+        SWord32 s1460;+        SWord32 s1461;+        SWord8  s1462;+        SWord32 s1463;+        SWord32 s1464;+        SWord32 s1465;+        SWord8  s1466;+        SWord32 s1467;+        SWord32 s1468;+        SWord8  s1469;+        SWord32 s1470;+        SWord8  s1471;+        SWord32 s1472;+        SWord32 s1473;+        SWord8  s1474;+        SWord32 s1475;+        SWord32 s1476;+        SWord8  s1477;+        SWord32 s1478;+        SWord32 s1479;+        SWord32 s1480;+        SWord8  s1481;+        SWord32 s1482;+        SWord32 s1483;+        SWord32 s1484;+        SWord8  s1485;+        SWord32 s1486;+        SWord8  s1487;+        SWord32 s1488;+        SWord8  s1489;+        SWord32 s1490;+        SWord32 s1491;+        SWord8  s1492;+        SWord32 s1493;+        SWord32 s1494;+        SWord8  s1495;+        SWord32 s1496;+        SWord32 s1497;+        SWord32 s1498;+        SWord8  s1499;+        SWord32 s1500;+        SWord32 s1501;+        SWord8  s1502;+        SWord32 s1503;+        SWord8  s1504;+        SWord32 s1505;+        SWord32 s1506;+        SWord8  s1507;+        SWord32 s1508;+        SWord32 s1509;+        SWord8  s1510;+        SWord32 s1511;+        SWord32 s1512;+        SWord32 s1513;+        SWord8  s1514;+        SWord32 s1515;+        SWord32 s1516;+        SWord8  s1517;+        SWord32 s1518;+        SWord8  s1519;+        SWord32 s1520;+        SWord32 s1521;+        SWord8  s1522;+        SWord32 s1523;+        SWord32 s1524;+        SWord8  s1525;+        SWord32 s1526;+        SWord32 s1527;+        SWord32 s1528;+        SWord8  s1529;+        SWord32 s1530;+        SWord32 s1531;+        SWord32 s1532;+        SWord8  s1533;+        SWord32 s1534;+        SWord8  s1535;+        SWord32 s1536;+        SWord8  s1537;+        SWord32 s1538;+        SWord32 s1539;+        SWord8  s1540;+        SWord32 s1541;+        SWord32 s1542;+        SWord8  s1543;+        SWord32 s1544;+        SWord32 s1545;+        SWord32 s1546;+        SWord8  s1547;+        SWord32 s1548;+        SWord32 s1549;+        SWord8  s1550;+        SWord32 s1551;+        SWord8  s1552;+        SWord32 s1553;+        SWord32 s1554;+        SWord8  s1555;+        SWord32 s1556;+        SWord32 s1557;+        SWord8  s1558;+        SWord32 s1559;+        SWord32 s1560;+        SWord32 s1561;+        SWord8  s1562;+        SWord32 s1563;+        SWord32 s1564;+        SWord8  s1565;+        SWord32 s1566;+        SWord8  s1567;+        SWord32 s1568;+        SWord32 s1569;+        SWord8  s1570;+        SWord32 s1571;+        SWord32 s1572;+        SWord8  s1573;+        SWord32 s1574;+        SWord32 s1575;+        SWord32 s1576;+        SWord8  s1577;+        SWord32 s1578;+        SWord32 s1579;+        SWord32 s1580;+        SWord8  s1581;+        SWord32 s1582;+        SWord8  s1583;+        SWord32 s1584;+        SWord8  s1585;+        SWord32 s1586;+        SWord32 s1587;+        SWord8  s1588;+        SWord32 s1589;+        SWord32 s1590;+        SWord8  s1591;+        SWord32 s1592;+        SWord32 s1593;+        SWord32 s1594;+        SWord8  s1595;+        SWord32 s1596;+        SWord32 s1597;+        SWord8  s1598;+        SWord32 s1599;+        SWord8  s1600;+        SWord32 s1601;+        SWord32 s1602;+        SWord8  s1603;+        SWord32 s1604;+        SWord32 s1605;+        SWord8  s1606;+        SWord32 s1607;+        SWord32 s1608;+        SWord32 s1609;+        SWord8  s1610;+        SWord32 s1611;+        SWord32 s1612;+        SWord8  s1613;+        SWord32 s1614;+        SWord8  s1615;+        SWord32 s1616;+        SWord32 s1617;+        SWord8  s1618;+        SWord32 s1619;+        SWord32 s1620;+        SWord8  s1621;+        SWord32 s1622;+        SWord32 s1623;+        SWord32 s1624;+        SWord8  s1625;+        SWord32 s1626;+        SWord32 s1627;+        SWord32 s1628;+        SWord8  s1629;+        SWord32 s1630;+        SWord8  s1631;+        SWord32 s1632;+        SWord8  s1633;+        SWord32 s1634;+        SWord32 s1635;+        SWord8  s1636;+        SWord32 s1637;+        SWord32 s1638;+        SWord8  s1639;+        SWord32 s1640;+        SWord32 s1641;+        SWord32 s1642;+        SWord8  s1643;+        SWord32 s1644;+        SWord32 s1645;+        SWord8  s1646;+        SWord32 s1647;+        SWord8  s1648;+        SWord32 s1649;+        SWord32 s1650;+        SWord8  s1651;+        SWord32 s1652;+        SWord32 s1653;+        SWord8  s1654;+        SWord32 s1655;+        SWord32 s1656;+        SWord32 s1657;+        SWord8  s1658;+        SWord32 s1659;+        SWord32 s1660;+        SWord8  s1661;+        SWord32 s1662;+        SWord8  s1663;+        SWord32 s1664;+        SWord32 s1665;+        SWord8  s1666;+        SWord32 s1667;+        SWord32 s1668;+        SWord8  s1669;+        SWord32 s1670;+        SWord32 s1671;+        SWord32 s1672;+        SWord8  s1673;+        SWord32 s1674;+        SWord32 s1675;+        SWord32 s1676;+        SWord8  s1677;+        SWord32 s1678;+        SWord8  s1679;+        SWord32 s1680;+        SWord8  s1681;+        SWord32 s1682;+        SWord32 s1683;+        SWord8  s1684;+        SWord32 s1685;+        SWord32 s1686;+        SWord8  s1687;+        SWord32 s1688;+        SWord32 s1689;+        SWord32 s1690;+        SWord8  s1691;+        SWord32 s1692;+        SWord32 s1693;+        SWord8  s1694;+        SWord32 s1695;+        SWord8  s1696;+        SWord32 s1697;+        SWord32 s1698;+        SWord8  s1699;+        SWord32 s1700;+        SWord32 s1701;+        SWord8  s1702;+        SWord32 s1703;+        SWord32 s1704;+        SWord32 s1705;+        SWord8  s1706;+        SWord32 s1707;+        SWord32 s1708;+        SWord8  s1709;+        SWord32 s1710;+        SWord8  s1711;+        SWord32 s1712;+        SWord32 s1713;+        SWord8  s1714;+        SWord32 s1715;+        SWord32 s1716;+        SWord8  s1717;+        SWord32 s1718;+        SWord32 s1719;+        SWord32 s1720;+        SWord8  s1721;+        SWord32 s1722;+        SWord32 s1723;+        SWord32 s1724;+        SWord8  s1725;+        SWord8  s1726;+        SWord8  s1727;+        SWord32 s1728;+        SWord8  s1729;+        SWord32 s1730;+        SWord32 s1731;+        SWord8  s1732;+        SWord32 s1733;+        SWord32 s1734;+        SWord8  s1735;+        SWord32 s1736;+        SWord32 s1737;+        SWord32 s1738;+        SWord8  s1739;+        SWord8  s1740;+        SWord16 s1741;+        SWord8  s1742;+        SWord32 s1743;+        SWord8  s1744;+        SWord32 s1745;+        SWord32 s1746;+        SWord8  s1747;+        SWord32 s1748;+        SWord32 s1749;+        SWord8  s1750;+        SWord32 s1751;+        SWord32 s1752;+        SWord32 s1753;+        SWord8  s1754;+        SWord8  s1755;+        SWord8  s1756;+        SWord32 s1757;+        SWord8  s1758;+        SWord32 s1759;+        SWord32 s1760;+        SWord8  s1761;+        SWord32 s1762;+        SWord32 s1763;+        SWord8  s1764;+        SWord32 s1765;+        SWord32 s1766;+        SWord32 s1767;+        SWord8  s1768;+        SWord8  s1769;+        SWord16 s1770;+        SWord32 s1771;+        SWord32 s1772;+        SWord8  s1773;+        SWord8  s1774;+        SWord8  s1775;+        SWord8  s1776;+        SWord16 s1777;+        SWord8  s1778;+        SWord8  s1779;+        SWord8  s1780;+        SWord8  s1781;+        SWord16 s1782;+        SWord32 s1783;+        SWord32 s1784;+        SWord8  s1785;+        SWord8  s1786;+        SWord8  s1787;+        SWord8  s1788;+        SWord16 s1789;+        SWord8  s1790;+        SWord8  s1791;+        SWord8  s1792;+        SWord8  s1793;+        SWord16 s1794;+        SWord32 s1795;+        SWord32 s1796;+        SWord8  s1797;+        SWord8  s1798;+        SWord8  s1799;+        SWord8  s1800;+        SWord16 s1801;+        SWord8  s1802;+        SWord8  s1803;+        SWord8  s1804;+        SWord8  s1805;+        SWord16 s1806;+        SWord32 s1807;+        SWord32 s1808;+  static const SWord32 table1[] = {+      0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,+      0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,+      0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,+      0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,+      0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,+      0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,+      0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,+      0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,+      0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,+      0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,+      0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,+      0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,+      0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,+      0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,+      0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,+      0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,+      0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,+      0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,+      0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,+      0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,+      0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,+      0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,+      0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,+      0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,+      0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,+      0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,+      0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,+      0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,+      0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,+      0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,+      0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,+      0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,+      0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,+      0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,+      0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,+      0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,+      0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,+      0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,+      0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,+      0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,+      0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,+      0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,+      0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,+      0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,+      0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,+      0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,+      0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,+      0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,+      0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,+      0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,+      0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,+      0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,+      0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,+      0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,+      0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,+      0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,+      0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,+      0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,+      0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,+      0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,+      0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,+      0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,+      0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,+      0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL+  };+  s562 = table1[s561];+  static const SWord32 table2[] = {+      0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,+      0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,+      0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,+      0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,+      0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,+      0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,+      0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,+      0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,+      0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,+      0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,+      0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,+      0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,+      0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,+      0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,+      0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,+      0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,+      0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,+      0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,+      0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,+      0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,+      0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,+      0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,+      0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,+      0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,+      0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,+      0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,+      0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,+      0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,+      0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,+      0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,+      0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,+      0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,+      0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,+      0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,+      0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,+      0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,+      0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,+      0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,+      0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,+      0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,+      0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,+      0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,+      0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,+      0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,+      0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,+      0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,+      0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,+      0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,+      0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,+      0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,+      0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,+      0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,+      0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,+      0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,+      0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,+      0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,+      0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,+      0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,+      0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,+      0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,+      0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,+      0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,+      0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,+      0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL+  };+  s820 = table2[s819];+  s821 = s562 ^ s820;+  static const SWord32 table3[] = {+      0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,+      0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,+      0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,+      0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,+      0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,+      0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,+      0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,+      0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,+      0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,+      0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,+      0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,+      0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,+      0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,+      0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,+      0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,+      0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,+      0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,+      0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,+      0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,+      0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,+      0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,+      0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,+      0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,+      0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,+      0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,+      0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,+      0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,+      0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,+      0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,+      0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,+      0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,+      0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,+      0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,+      0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,+      0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,+      0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,+      0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,+      0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,+      0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,+      0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,+      0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,+      0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,+      0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,+      0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,+      0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,+      0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,+      0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,+      0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,+      0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,+      0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,+      0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,+      0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,+      0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,+      0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,+      0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,+      0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,+      0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,+      0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,+      0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,+      0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,+      0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,+      0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,+      0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,+      0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL+  };+  s1079 = table3[s1078];+  s1080 = s821 ^ s1079;+  static const SWord32 table4[] = {+      0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,+      0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,+      0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,+      0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,+      0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,+      0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,+      0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,+      0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,+      0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,+      0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,+      0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,+      0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,+      0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,+      0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,+      0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,+      0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,+      0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,+      0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,+      0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,+      0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,+      0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,+      0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,+      0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,+      0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,+      0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,+      0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,+      0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,+      0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,+      0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,+      0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,+      0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,+      0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,+      0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,+      0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,+      0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,+      0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,+      0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,+      0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,+      0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,+      0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,+      0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,+      0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,+      0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,+      0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,+      0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,+      0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,+      0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,+      0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,+      0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,+      0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,+      0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,+      0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,+      0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,+      0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,+      0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,+      0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,+      0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,+      0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,+      0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,+      0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,+      0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,+      0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,+      0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,+      0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL+  };+  s1338 = table4[s1337];+  s1339 = s1080 ^ s1338;+  s1340 = s8 ^ s1339;+  s1341 = sbv_bv_extract_u32_31_24_u8(s1340);+  s1342 = table1[s1341];+  s1344 = table1[s1343];+  s1346 = table2[s1345];+  s1347 = s1344 ^ s1346;+  s1349 = table3[s1348];+  s1350 = s1347 ^ s1349;+  s1352 = table4[s1351];+  s1353 = s1350 ^ s1352;+  s1354 = s9 ^ s1353;+  s1355 = sbv_bv_extract_u32_23_16_u8(s1354);+  s1356 = table2[s1355];+  s1357 = s1342 ^ s1356;+  s1359 = table1[s1358];+  s1361 = table2[s1360];+  s1362 = s1359 ^ s1361;+  s1364 = table3[s1363];+  s1365 = s1362 ^ s1364;+  s1367 = table4[s1366];+  s1368 = s1365 ^ s1367;+  s1369 = s10 ^ s1368;+  s1370 = sbv_bv_extract_u32_15_8_u8(s1369);+  s1371 = table3[s1370];+  s1372 = s1357 ^ s1371;+  s1374 = table1[s1373];+  s1376 = table2[s1375];+  s1377 = s1374 ^ s1376;+  s1379 = table3[s1378];+  s1380 = s1377 ^ s1379;+  s1382 = table4[s1381];+  s1383 = s1380 ^ s1382;+  s1384 = s11 ^ s1383;+  s1385 = sbv_bv_extract_u32_7_0_u8(s1384);+  s1386 = table4[s1385];+  s1387 = s1372 ^ s1386;+  s1388 = s12 ^ s1387;+  s1389 = sbv_bv_extract_u32_31_24_u8(s1388);+  s1390 = table1[s1389];+  s1391 = sbv_bv_extract_u32_31_24_u8(s1354);+  s1392 = table1[s1391];+  s1393 = sbv_bv_extract_u32_23_16_u8(s1369);+  s1394 = table2[s1393];+  s1395 = s1392 ^ s1394;+  s1396 = sbv_bv_extract_u32_15_8_u8(s1384);+  s1397 = table3[s1396];+  s1398 = s1395 ^ s1397;+  s1399 = sbv_bv_extract_u32_7_0_u8(s1340);+  s1400 = table4[s1399];+  s1401 = s1398 ^ s1400;+  s1402 = s13 ^ s1401;+  s1403 = sbv_bv_extract_u32_23_16_u8(s1402);+  s1404 = table2[s1403];+  s1405 = s1390 ^ s1404;+  s1406 = sbv_bv_extract_u32_31_24_u8(s1369);+  s1407 = table1[s1406];+  s1408 = sbv_bv_extract_u32_23_16_u8(s1384);+  s1409 = table2[s1408];+  s1410 = s1407 ^ s1409;+  s1411 = sbv_bv_extract_u32_15_8_u8(s1340);+  s1412 = table3[s1411];+  s1413 = s1410 ^ s1412;+  s1414 = sbv_bv_extract_u32_7_0_u8(s1354);+  s1415 = table4[s1414];+  s1416 = s1413 ^ s1415;+  s1417 = s14 ^ s1416;+  s1418 = sbv_bv_extract_u32_15_8_u8(s1417);+  s1419 = table3[s1418];+  s1420 = s1405 ^ s1419;+  s1421 = sbv_bv_extract_u32_31_24_u8(s1384);+  s1422 = table1[s1421];+  s1423 = sbv_bv_extract_u32_23_16_u8(s1340);+  s1424 = table2[s1423];+  s1425 = s1422 ^ s1424;+  s1426 = sbv_bv_extract_u32_15_8_u8(s1354);+  s1427 = table3[s1426];+  s1428 = s1425 ^ s1427;+  s1429 = sbv_bv_extract_u32_7_0_u8(s1369);+  s1430 = table4[s1429];+  s1431 = s1428 ^ s1430;+  s1432 = s15 ^ s1431;+  s1433 = sbv_bv_extract_u32_7_0_u8(s1432);+  s1434 = table4[s1433];+  s1435 = s1420 ^ s1434;+  s1436 = s16 ^ s1435;+  s1437 = sbv_bv_extract_u32_31_24_u8(s1436);+  s1438 = table1[s1437];+  s1439 = sbv_bv_extract_u32_31_24_u8(s1402);+  s1440 = table1[s1439];+  s1441 = sbv_bv_extract_u32_23_16_u8(s1417);+  s1442 = table2[s1441];+  s1443 = s1440 ^ s1442;+  s1444 = sbv_bv_extract_u32_15_8_u8(s1432);+  s1445 = table3[s1444];+  s1446 = s1443 ^ s1445;+  s1447 = sbv_bv_extract_u32_7_0_u8(s1388);+  s1448 = table4[s1447];+  s1449 = s1446 ^ s1448;+  s1450 = s17 ^ s1449;+  s1451 = sbv_bv_extract_u32_23_16_u8(s1450);+  s1452 = table2[s1451];+  s1453 = s1438 ^ s1452;+  s1454 = sbv_bv_extract_u32_31_24_u8(s1417);+  s1455 = table1[s1454];+  s1456 = sbv_bv_extract_u32_23_16_u8(s1432);+  s1457 = table2[s1456];+  s1458 = s1455 ^ s1457;+  s1459 = sbv_bv_extract_u32_15_8_u8(s1388);+  s1460 = table3[s1459];+  s1461 = s1458 ^ s1460;+  s1462 = sbv_bv_extract_u32_7_0_u8(s1402);+  s1463 = table4[s1462];+  s1464 = s1461 ^ s1463;+  s1465 = s18 ^ s1464;+  s1466 = sbv_bv_extract_u32_15_8_u8(s1465);+  s1467 = table3[s1466];+  s1468 = s1453 ^ s1467;+  s1469 = sbv_bv_extract_u32_31_24_u8(s1432);+  s1470 = table1[s1469];+  s1471 = sbv_bv_extract_u32_23_16_u8(s1388);+  s1472 = table2[s1471];+  s1473 = s1470 ^ s1472;+  s1474 = sbv_bv_extract_u32_15_8_u8(s1402);+  s1475 = table3[s1474];+  s1476 = s1473 ^ s1475;+  s1477 = sbv_bv_extract_u32_7_0_u8(s1417);+  s1478 = table4[s1477];+  s1479 = s1476 ^ s1478;+  s1480 = s19 ^ s1479;+  s1481 = sbv_bv_extract_u32_7_0_u8(s1480);+  s1482 = table4[s1481];+  s1483 = s1468 ^ s1482;+  s1484 = s20 ^ s1483;+  s1485 = sbv_bv_extract_u32_31_24_u8(s1484);+  s1486 = table1[s1485];+  s1487 = sbv_bv_extract_u32_31_24_u8(s1450);+  s1488 = table1[s1487];+  s1489 = sbv_bv_extract_u32_23_16_u8(s1465);+  s1490 = table2[s1489];+  s1491 = s1488 ^ s1490;+  s1492 = sbv_bv_extract_u32_15_8_u8(s1480);+  s1493 = table3[s1492];+  s1494 = s1491 ^ s1493;+  s1495 = sbv_bv_extract_u32_7_0_u8(s1436);+  s1496 = table4[s1495];+  s1497 = s1494 ^ s1496;+  s1498 = s21 ^ s1497;+  s1499 = sbv_bv_extract_u32_23_16_u8(s1498);+  s1500 = table2[s1499];+  s1501 = s1486 ^ s1500;+  s1502 = sbv_bv_extract_u32_31_24_u8(s1465);+  s1503 = table1[s1502];+  s1504 = sbv_bv_extract_u32_23_16_u8(s1480);+  s1505 = table2[s1504];+  s1506 = s1503 ^ s1505;+  s1507 = sbv_bv_extract_u32_15_8_u8(s1436);+  s1508 = table3[s1507];+  s1509 = s1506 ^ s1508;+  s1510 = sbv_bv_extract_u32_7_0_u8(s1450);+  s1511 = table4[s1510];+  s1512 = s1509 ^ s1511;+  s1513 = s22 ^ s1512;+  s1514 = sbv_bv_extract_u32_15_8_u8(s1513);+  s1515 = table3[s1514];+  s1516 = s1501 ^ s1515;+  s1517 = sbv_bv_extract_u32_31_24_u8(s1480);+  s1518 = table1[s1517];+  s1519 = sbv_bv_extract_u32_23_16_u8(s1436);+  s1520 = table2[s1519];+  s1521 = s1518 ^ s1520;+  s1522 = sbv_bv_extract_u32_15_8_u8(s1450);+  s1523 = table3[s1522];+  s1524 = s1521 ^ s1523;+  s1525 = sbv_bv_extract_u32_7_0_u8(s1465);+  s1526 = table4[s1525];+  s1527 = s1524 ^ s1526;+  s1528 = s23 ^ s1527;+  s1529 = sbv_bv_extract_u32_7_0_u8(s1528);+  s1530 = table4[s1529];+  s1531 = s1516 ^ s1530;+  s1532 = s24 ^ s1531;+  s1533 = sbv_bv_extract_u32_31_24_u8(s1532);+  s1534 = table1[s1533];+  s1535 = sbv_bv_extract_u32_31_24_u8(s1498);+  s1536 = table1[s1535];+  s1537 = sbv_bv_extract_u32_23_16_u8(s1513);+  s1538 = table2[s1537];+  s1539 = s1536 ^ s1538;+  s1540 = sbv_bv_extract_u32_15_8_u8(s1528);+  s1541 = table3[s1540];+  s1542 = s1539 ^ s1541;+  s1543 = sbv_bv_extract_u32_7_0_u8(s1484);+  s1544 = table4[s1543];+  s1545 = s1542 ^ s1544;+  s1546 = s25 ^ s1545;+  s1547 = sbv_bv_extract_u32_23_16_u8(s1546);+  s1548 = table2[s1547];+  s1549 = s1534 ^ s1548;+  s1550 = sbv_bv_extract_u32_31_24_u8(s1513);+  s1551 = table1[s1550];+  s1552 = sbv_bv_extract_u32_23_16_u8(s1528);+  s1553 = table2[s1552];+  s1554 = s1551 ^ s1553;+  s1555 = sbv_bv_extract_u32_15_8_u8(s1484);+  s1556 = table3[s1555];+  s1557 = s1554 ^ s1556;+  s1558 = sbv_bv_extract_u32_7_0_u8(s1498);+  s1559 = table4[s1558];+  s1560 = s1557 ^ s1559;+  s1561 = s26 ^ s1560;+  s1562 = sbv_bv_extract_u32_15_8_u8(s1561);+  s1563 = table3[s1562];+  s1564 = s1549 ^ s1563;+  s1565 = sbv_bv_extract_u32_31_24_u8(s1528);+  s1566 = table1[s1565];+  s1567 = sbv_bv_extract_u32_23_16_u8(s1484);+  s1568 = table2[s1567];+  s1569 = s1566 ^ s1568;+  s1570 = sbv_bv_extract_u32_15_8_u8(s1498);+  s1571 = table3[s1570];+  s1572 = s1569 ^ s1571;+  s1573 = sbv_bv_extract_u32_7_0_u8(s1513);+  s1574 = table4[s1573];+  s1575 = s1572 ^ s1574;+  s1576 = s27 ^ s1575;+  s1577 = sbv_bv_extract_u32_7_0_u8(s1576);+  s1578 = table4[s1577];+  s1579 = s1564 ^ s1578;+  s1580 = s28 ^ s1579;+  s1581 = sbv_bv_extract_u32_31_24_u8(s1580);+  s1582 = table1[s1581];+  s1583 = sbv_bv_extract_u32_31_24_u8(s1546);+  s1584 = table1[s1583];+  s1585 = sbv_bv_extract_u32_23_16_u8(s1561);+  s1586 = table2[s1585];+  s1587 = s1584 ^ s1586;+  s1588 = sbv_bv_extract_u32_15_8_u8(s1576);+  s1589 = table3[s1588];+  s1590 = s1587 ^ s1589;+  s1591 = sbv_bv_extract_u32_7_0_u8(s1532);+  s1592 = table4[s1591];+  s1593 = s1590 ^ s1592;+  s1594 = s29 ^ s1593;+  s1595 = sbv_bv_extract_u32_23_16_u8(s1594);+  s1596 = table2[s1595];+  s1597 = s1582 ^ s1596;+  s1598 = sbv_bv_extract_u32_31_24_u8(s1561);+  s1599 = table1[s1598];+  s1600 = sbv_bv_extract_u32_23_16_u8(s1576);+  s1601 = table2[s1600];+  s1602 = s1599 ^ s1601;+  s1603 = sbv_bv_extract_u32_15_8_u8(s1532);+  s1604 = table3[s1603];+  s1605 = s1602 ^ s1604;+  s1606 = sbv_bv_extract_u32_7_0_u8(s1546);+  s1607 = table4[s1606];+  s1608 = s1605 ^ s1607;+  s1609 = s30 ^ s1608;+  s1610 = sbv_bv_extract_u32_15_8_u8(s1609);+  s1611 = table3[s1610];+  s1612 = s1597 ^ s1611;+  s1613 = sbv_bv_extract_u32_31_24_u8(s1576);+  s1614 = table1[s1613];+  s1615 = sbv_bv_extract_u32_23_16_u8(s1532);+  s1616 = table2[s1615];+  s1617 = s1614 ^ s1616;+  s1618 = sbv_bv_extract_u32_15_8_u8(s1546);+  s1619 = table3[s1618];+  s1620 = s1617 ^ s1619;+  s1621 = sbv_bv_extract_u32_7_0_u8(s1561);+  s1622 = table4[s1621];+  s1623 = s1620 ^ s1622;+  s1624 = s31 ^ s1623;+  s1625 = sbv_bv_extract_u32_7_0_u8(s1624);+  s1626 = table4[s1625];+  s1627 = s1612 ^ s1626;+  s1628 = s32 ^ s1627;+  s1629 = sbv_bv_extract_u32_31_24_u8(s1628);+  s1630 = table1[s1629];+  s1631 = sbv_bv_extract_u32_31_24_u8(s1594);+  s1632 = table1[s1631];+  s1633 = sbv_bv_extract_u32_23_16_u8(s1609);+  s1634 = table2[s1633];+  s1635 = s1632 ^ s1634;+  s1636 = sbv_bv_extract_u32_15_8_u8(s1624);+  s1637 = table3[s1636];+  s1638 = s1635 ^ s1637;+  s1639 = sbv_bv_extract_u32_7_0_u8(s1580);+  s1640 = table4[s1639];+  s1641 = s1638 ^ s1640;+  s1642 = s33 ^ s1641;+  s1643 = sbv_bv_extract_u32_23_16_u8(s1642);+  s1644 = table2[s1643];+  s1645 = s1630 ^ s1644;+  s1646 = sbv_bv_extract_u32_31_24_u8(s1609);+  s1647 = table1[s1646];+  s1648 = sbv_bv_extract_u32_23_16_u8(s1624);+  s1649 = table2[s1648];+  s1650 = s1647 ^ s1649;+  s1651 = sbv_bv_extract_u32_15_8_u8(s1580);+  s1652 = table3[s1651];+  s1653 = s1650 ^ s1652;+  s1654 = sbv_bv_extract_u32_7_0_u8(s1594);+  s1655 = table4[s1654];+  s1656 = s1653 ^ s1655;+  s1657 = s34 ^ s1656;+  s1658 = sbv_bv_extract_u32_15_8_u8(s1657);+  s1659 = table3[s1658];+  s1660 = s1645 ^ s1659;+  s1661 = sbv_bv_extract_u32_31_24_u8(s1624);+  s1662 = table1[s1661];+  s1663 = sbv_bv_extract_u32_23_16_u8(s1580);+  s1664 = table2[s1663];+  s1665 = s1662 ^ s1664;+  s1666 = sbv_bv_extract_u32_15_8_u8(s1594);+  s1667 = table3[s1666];+  s1668 = s1665 ^ s1667;+  s1669 = sbv_bv_extract_u32_7_0_u8(s1609);+  s1670 = table4[s1669];+  s1671 = s1668 ^ s1670;+  s1672 = s35 ^ s1671;+  s1673 = sbv_bv_extract_u32_7_0_u8(s1672);+  s1674 = table4[s1673];+  s1675 = s1660 ^ s1674;+  s1676 = s36 ^ s1675;+  s1677 = sbv_bv_extract_u32_31_24_u8(s1676);+  s1678 = table1[s1677];+  s1679 = sbv_bv_extract_u32_31_24_u8(s1642);+  s1680 = table1[s1679];+  s1681 = sbv_bv_extract_u32_23_16_u8(s1657);+  s1682 = table2[s1681];+  s1683 = s1680 ^ s1682;+  s1684 = sbv_bv_extract_u32_15_8_u8(s1672);+  s1685 = table3[s1684];+  s1686 = s1683 ^ s1685;+  s1687 = sbv_bv_extract_u32_7_0_u8(s1628);+  s1688 = table4[s1687];+  s1689 = s1686 ^ s1688;+  s1690 = s37 ^ s1689;+  s1691 = sbv_bv_extract_u32_23_16_u8(s1690);+  s1692 = table2[s1691];+  s1693 = s1678 ^ s1692;+  s1694 = sbv_bv_extract_u32_31_24_u8(s1657);+  s1695 = table1[s1694];+  s1696 = sbv_bv_extract_u32_23_16_u8(s1672);+  s1697 = table2[s1696];+  s1698 = s1695 ^ s1697;+  s1699 = sbv_bv_extract_u32_15_8_u8(s1628);+  s1700 = table3[s1699];+  s1701 = s1698 ^ s1700;+  s1702 = sbv_bv_extract_u32_7_0_u8(s1642);+  s1703 = table4[s1702];+  s1704 = s1701 ^ s1703;+  s1705 = s38 ^ s1704;+  s1706 = sbv_bv_extract_u32_15_8_u8(s1705);+  s1707 = table3[s1706];+  s1708 = s1693 ^ s1707;+  s1709 = sbv_bv_extract_u32_31_24_u8(s1672);+  s1710 = table1[s1709];+  s1711 = sbv_bv_extract_u32_23_16_u8(s1628);+  s1712 = table2[s1711];+  s1713 = s1710 ^ s1712;+  s1714 = sbv_bv_extract_u32_15_8_u8(s1642);+  s1715 = table3[s1714];+  s1716 = s1713 ^ s1715;+  s1717 = sbv_bv_extract_u32_7_0_u8(s1657);+  s1718 = table4[s1717];+  s1719 = s1716 ^ s1718;+  s1720 = s39 ^ s1719;+  s1721 = sbv_bv_extract_u32_7_0_u8(s1720);+  s1722 = table4[s1721];+  s1723 = s1708 ^ s1722;+  s1724 = s40 ^ s1723;+  s1725 = sbv_bv_extract_u32_31_24_u8(s1724);+  static const SWord8 table0[] = {+       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,+      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,+      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,+      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,+       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,+      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,+       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,+       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,+       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,+      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,+       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,+      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,+      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,+      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,+       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,+       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,+      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,+      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,+      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,+      104,  65, 153,  45,  15, 176,  84, 187,  22+  };+  s1726 = table0[s1725];+  s1727 = sbv_bv_extract_u32_31_24_u8(s1690);+  s1728 = table1[s1727];+  s1729 = sbv_bv_extract_u32_23_16_u8(s1705);+  s1730 = table2[s1729];+  s1731 = s1728 ^ s1730;+  s1732 = sbv_bv_extract_u32_15_8_u8(s1720);+  s1733 = table3[s1732];+  s1734 = s1731 ^ s1733;+  s1735 = sbv_bv_extract_u32_7_0_u8(s1676);+  s1736 = table4[s1735];+  s1737 = s1734 ^ s1736;+  s1738 = s41 ^ s1737;+  s1739 = sbv_bv_extract_u32_23_16_u8(s1738);+  s1740 = table0[s1739];+  s1741 = sbv_bv_join_u8_u8_u16(s1726, s1740);+  s1742 = sbv_bv_extract_u32_31_24_u8(s1705);+  s1743 = table1[s1742];+  s1744 = sbv_bv_extract_u32_23_16_u8(s1720);+  s1745 = table2[s1744];+  s1746 = s1743 ^ s1745;+  s1747 = sbv_bv_extract_u32_15_8_u8(s1676);+  s1748 = table3[s1747];+  s1749 = s1746 ^ s1748;+  s1750 = sbv_bv_extract_u32_7_0_u8(s1690);+  s1751 = table4[s1750];+  s1752 = s1749 ^ s1751;+  s1753 = s42 ^ s1752;+  s1754 = sbv_bv_extract_u32_15_8_u8(s1753);+  s1755 = table0[s1754];+  s1756 = sbv_bv_extract_u32_31_24_u8(s1720);+  s1757 = table1[s1756];+  s1758 = sbv_bv_extract_u32_23_16_u8(s1676);+  s1759 = table2[s1758];+  s1760 = s1757 ^ s1759;+  s1761 = sbv_bv_extract_u32_15_8_u8(s1690);+  s1762 = table3[s1761];+  s1763 = s1760 ^ s1762;+  s1764 = sbv_bv_extract_u32_7_0_u8(s1705);+  s1765 = table4[s1764];+  s1766 = s1763 ^ s1765;+  s1767 = s43 ^ s1766;+  s1768 = sbv_bv_extract_u32_7_0_u8(s1767);+  s1769 = table0[s1768];+  s1770 = sbv_bv_join_u8_u8_u16(s1755, s1769);+  s1771 = sbv_bv_join_u16_u16_u32(s1741, s1770);+  s1772 = s44 ^ s1771;+  s1773 = sbv_bv_extract_u32_31_24_u8(s1738);+  s1774 = table0[s1773];+  s1775 = sbv_bv_extract_u32_23_16_u8(s1753);+  s1776 = table0[s1775];+  s1777 = sbv_bv_join_u8_u8_u16(s1774, s1776);+  s1778 = sbv_bv_extract_u32_15_8_u8(s1767);+  s1779 = table0[s1778];+  s1780 = sbv_bv_extract_u32_7_0_u8(s1724);+  s1781 = table0[s1780];+  s1782 = sbv_bv_join_u8_u8_u16(s1779, s1781);+  s1783 = sbv_bv_join_u16_u16_u32(s1777, s1782);+  s1784 = s45 ^ s1783;+  s1785 = sbv_bv_extract_u32_31_24_u8(s1753);+  s1786 = table0[s1785];+  s1787 = sbv_bv_extract_u32_23_16_u8(s1767);+  s1788 = table0[s1787];+  s1789 = sbv_bv_join_u8_u8_u16(s1786, s1788);+  s1790 = sbv_bv_extract_u32_15_8_u8(s1724);+  s1791 = table0[s1790];+  s1792 = sbv_bv_extract_u32_7_0_u8(s1738);+  s1793 = table0[s1792];+  s1794 = sbv_bv_join_u8_u8_u16(s1791, s1793);+  s1795 = sbv_bv_join_u16_u16_u32(s1789, s1794);+  s1796 = s46 ^ s1795;+  s1797 = sbv_bv_extract_u32_31_24_u8(s1767);+  s1798 = table0[s1797];+  s1799 = sbv_bv_extract_u32_23_16_u8(s1724);+  s1800 = table0[s1799];+  s1801 = sbv_bv_join_u8_u8_u16(s1798, s1800);+  s1802 = sbv_bv_extract_u32_15_8_u8(s1738);+  s1803 = table0[s1802];+  s1804 = sbv_bv_extract_u32_7_0_u8(s1753);+  s1805 = table0[s1804];+  s1806 = sbv_bv_join_u8_u8_u16(s1803, s1805);+  s1807 = sbv_bv_join_u16_u16_u32(s1801, s1806);+  s1808 = s47 ^ s1807;++  sbv_output_0[0] = s1772;+  sbv_output_0[1] = s1784;+  sbv_output_0[2] = s1796;+  sbv_output_0[3] = s1808;+}+== END: "aes128BlockEncrypt.c" ==================+== BEGIN: "aes128BlockDecrypt.c" ================+/* File: "aes128BlockDecrypt.c". Automatically generated by SBV. Do not edit! */++#include "aes128Lib.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128BlockDecrypt(const SWord32 *sbv_input_0,+                        const SWord32 *sbv_input_1, SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s4 = sbv_input_1[0];+  const SWord32 s5 = sbv_input_1[1];+  const SWord32 s6 = sbv_input_1[2];+  const SWord32 s7 = sbv_input_1[3];+  const SWord32 s8 = sbv_input_1[4];+  const SWord32 s9 = sbv_input_1[5];+  const SWord32 s10 = sbv_input_1[6];+  const SWord32 s11 = sbv_input_1[7];+  const SWord32 s12 = sbv_input_1[8];+  const SWord32 s13 = sbv_input_1[9];+  const SWord32 s14 = sbv_input_1[10];+  const SWord32 s15 = sbv_input_1[11];+  const SWord32 s16 = sbv_input_1[12];+  const SWord32 s17 = sbv_input_1[13];+  const SWord32 s18 = sbv_input_1[14];+  const SWord32 s19 = sbv_input_1[15];+  const SWord32 s20 = sbv_input_1[16];+  const SWord32 s21 = sbv_input_1[17];+  const SWord32 s22 = sbv_input_1[18];+  const SWord32 s23 = sbv_input_1[19];+  const SWord32 s24 = sbv_input_1[20];+  const SWord32 s25 = sbv_input_1[21];+  const SWord32 s26 = sbv_input_1[22];+  const SWord32 s27 = sbv_input_1[23];+  const SWord32 s28 = sbv_input_1[24];+  const SWord32 s29 = sbv_input_1[25];+  const SWord32 s30 = sbv_input_1[26];+  const SWord32 s31 = sbv_input_1[27];+  const SWord32 s32 = sbv_input_1[28];+  const SWord32 s33 = sbv_input_1[29];+  const SWord32 s34 = sbv_input_1[30];+  const SWord32 s35 = sbv_input_1[31];+  const SWord32 s36 = sbv_input_1[32];+  const SWord32 s37 = sbv_input_1[33];+  const SWord32 s38 = sbv_input_1[34];+  const SWord32 s39 = sbv_input_1[35];+  const SWord32 s40 = sbv_input_1[36];+  const SWord32 s41 = sbv_input_1[37];+  const SWord32 s42 = sbv_input_1[38];+  const SWord32 s43 = sbv_input_1[39];+  const SWord32 s44 = sbv_input_1[40];+  const SWord32 s45 = sbv_input_1[41];+  const SWord32 s46 = sbv_input_1[42];+  const SWord32 s47 = sbv_input_1[43];+  const SWord32 s560 = s0 ^ s4;+  const SWord8  s561 = sbv_bv_extract_u32_31_24_u8(s560);+  const SWord32 s818 = s3 ^ s7;+  const SWord8  s819 = sbv_bv_extract_u32_23_16_u8(s818);+  const SWord32 s1077 = s2 ^ s6;+  const SWord8  s1078 = sbv_bv_extract_u32_15_8_u8(s1077);+  const SWord32 s1336 = s1 ^ s5;+  const SWord8  s1337 = sbv_bv_extract_u32_7_0_u8(s1336);+  const SWord8  s1343 = sbv_bv_extract_u32_31_24_u8(s818);+  const SWord8  s1345 = sbv_bv_extract_u32_23_16_u8(s1077);+  const SWord8  s1348 = sbv_bv_extract_u32_15_8_u8(s1336);+  const SWord8  s1351 = sbv_bv_extract_u32_7_0_u8(s560);+  const SWord8  s1358 = sbv_bv_extract_u32_31_24_u8(s1077);+  const SWord8  s1360 = sbv_bv_extract_u32_23_16_u8(s1336);+  const SWord8  s1363 = sbv_bv_extract_u32_15_8_u8(s560);+  const SWord8  s1366 = sbv_bv_extract_u32_7_0_u8(s818);+  const SWord8  s1373 = sbv_bv_extract_u32_31_24_u8(s1336);+  const SWord8  s1375 = sbv_bv_extract_u32_23_16_u8(s560);+  const SWord8  s1378 = sbv_bv_extract_u32_15_8_u8(s818);+  const SWord8  s1381 = sbv_bv_extract_u32_7_0_u8(s1077);+        SWord32 s562;+        SWord32 s820;+        SWord32 s821;+        SWord32 s1079;+        SWord32 s1080;+        SWord32 s1338;+        SWord32 s1339;+        SWord32 s1340;+        SWord8  s1341;+        SWord32 s1342;+        SWord32 s1344;+        SWord32 s1346;+        SWord32 s1347;+        SWord32 s1349;+        SWord32 s1350;+        SWord32 s1352;+        SWord32 s1353;+        SWord32 s1354;+        SWord8  s1355;+        SWord32 s1356;+        SWord32 s1357;+        SWord32 s1359;+        SWord32 s1361;+        SWord32 s1362;+        SWord32 s1364;+        SWord32 s1365;+        SWord32 s1367;+        SWord32 s1368;+        SWord32 s1369;+        SWord8  s1370;+        SWord32 s1371;+        SWord32 s1372;+        SWord32 s1374;+        SWord32 s1376;+        SWord32 s1377;+        SWord32 s1379;+        SWord32 s1380;+        SWord32 s1382;+        SWord32 s1383;+        SWord32 s1384;+        SWord8  s1385;+        SWord32 s1386;+        SWord32 s1387;+        SWord32 s1388;+        SWord8  s1389;+        SWord32 s1390;+        SWord8  s1391;+        SWord32 s1392;+        SWord8  s1393;+        SWord32 s1394;+        SWord32 s1395;+        SWord8  s1396;+        SWord32 s1397;+        SWord32 s1398;+        SWord8  s1399;+        SWord32 s1400;+        SWord32 s1401;+        SWord32 s1402;+        SWord8  s1403;+        SWord32 s1404;+        SWord32 s1405;+        SWord8  s1406;+        SWord32 s1407;+        SWord8  s1408;+        SWord32 s1409;+        SWord32 s1410;+        SWord8  s1411;+        SWord32 s1412;+        SWord32 s1413;+        SWord8  s1414;+        SWord32 s1415;+        SWord32 s1416;+        SWord32 s1417;+        SWord8  s1418;+        SWord32 s1419;+        SWord32 s1420;+        SWord8  s1421;+        SWord32 s1422;+        SWord8  s1423;+        SWord32 s1424;+        SWord32 s1425;+        SWord8  s1426;+        SWord32 s1427;+        SWord32 s1428;+        SWord8  s1429;+        SWord32 s1430;+        SWord32 s1431;+        SWord32 s1432;+        SWord8  s1433;+        SWord32 s1434;+        SWord32 s1435;+        SWord32 s1436;+        SWord8  s1437;+        SWord32 s1438;+        SWord8  s1439;+        SWord32 s1440;+        SWord8  s1441;+        SWord32 s1442;+        SWord32 s1443;+        SWord8  s1444;+        SWord32 s1445;+        SWord32 s1446;+        SWord8  s1447;+        SWord32 s1448;+        SWord32 s1449;+        SWord32 s1450;+        SWord8  s1451;+        SWord32 s1452;+        SWord32 s1453;+        SWord8  s1454;+        SWord32 s1455;+        SWord8  s1456;+        SWord32 s1457;+        SWord32 s1458;+        SWord8  s1459;+        SWord32 s1460;+        SWord32 s1461;+        SWord8  s1462;+        SWord32 s1463;+        SWord32 s1464;+        SWord32 s1465;+        SWord8  s1466;+        SWord32 s1467;+        SWord32 s1468;+        SWord8  s1469;+        SWord32 s1470;+        SWord8  s1471;+        SWord32 s1472;+        SWord32 s1473;+        SWord8  s1474;+        SWord32 s1475;+        SWord32 s1476;+        SWord8  s1477;+        SWord32 s1478;+        SWord32 s1479;+        SWord32 s1480;+        SWord8  s1481;+        SWord32 s1482;+        SWord32 s1483;+        SWord32 s1484;+        SWord8  s1485;+        SWord32 s1486;+        SWord8  s1487;+        SWord32 s1488;+        SWord8  s1489;+        SWord32 s1490;+        SWord32 s1491;+        SWord8  s1492;+        SWord32 s1493;+        SWord32 s1494;+        SWord8  s1495;+        SWord32 s1496;+        SWord32 s1497;+        SWord32 s1498;+        SWord8  s1499;+        SWord32 s1500;+        SWord32 s1501;+        SWord8  s1502;+        SWord32 s1503;+        SWord8  s1504;+        SWord32 s1505;+        SWord32 s1506;+        SWord8  s1507;+        SWord32 s1508;+        SWord32 s1509;+        SWord8  s1510;+        SWord32 s1511;+        SWord32 s1512;+        SWord32 s1513;+        SWord8  s1514;+        SWord32 s1515;+        SWord32 s1516;+        SWord8  s1517;+        SWord32 s1518;+        SWord8  s1519;+        SWord32 s1520;+        SWord32 s1521;+        SWord8  s1522;+        SWord32 s1523;+        SWord32 s1524;+        SWord8  s1525;+        SWord32 s1526;+        SWord32 s1527;+        SWord32 s1528;+        SWord8  s1529;+        SWord32 s1530;+        SWord32 s1531;+        SWord32 s1532;+        SWord8  s1533;+        SWord32 s1534;+        SWord8  s1535;+        SWord32 s1536;+        SWord8  s1537;+        SWord32 s1538;+        SWord32 s1539;+        SWord8  s1540;+        SWord32 s1541;+        SWord32 s1542;+        SWord8  s1543;+        SWord32 s1544;+        SWord32 s1545;+        SWord32 s1546;+        SWord8  s1547;+        SWord32 s1548;+        SWord32 s1549;+        SWord8  s1550;+        SWord32 s1551;+        SWord8  s1552;+        SWord32 s1553;+        SWord32 s1554;+        SWord8  s1555;+        SWord32 s1556;+        SWord32 s1557;+        SWord8  s1558;+        SWord32 s1559;+        SWord32 s1560;+        SWord32 s1561;+        SWord8  s1562;+        SWord32 s1563;+        SWord32 s1564;+        SWord8  s1565;+        SWord32 s1566;+        SWord8  s1567;+        SWord32 s1568;+        SWord32 s1569;+        SWord8  s1570;+        SWord32 s1571;+        SWord32 s1572;+        SWord8  s1573;+        SWord32 s1574;+        SWord32 s1575;+        SWord32 s1576;+        SWord8  s1577;+        SWord32 s1578;+        SWord32 s1579;+        SWord32 s1580;+        SWord8  s1581;+        SWord32 s1582;+        SWord8  s1583;+        SWord32 s1584;+        SWord8  s1585;+        SWord32 s1586;+        SWord32 s1587;+        SWord8  s1588;+        SWord32 s1589;+        SWord32 s1590;+        SWord8  s1591;+        SWord32 s1592;+        SWord32 s1593;+        SWord32 s1594;+        SWord8  s1595;+        SWord32 s1596;+        SWord32 s1597;+        SWord8  s1598;+        SWord32 s1599;+        SWord8  s1600;+        SWord32 s1601;+        SWord32 s1602;+        SWord8  s1603;+        SWord32 s1604;+        SWord32 s1605;+        SWord8  s1606;+        SWord32 s1607;+        SWord32 s1608;+        SWord32 s1609;+        SWord8  s1610;+        SWord32 s1611;+        SWord32 s1612;+        SWord8  s1613;+        SWord32 s1614;+        SWord8  s1615;+        SWord32 s1616;+        SWord32 s1617;+        SWord8  s1618;+        SWord32 s1619;+        SWord32 s1620;+        SWord8  s1621;+        SWord32 s1622;+        SWord32 s1623;+        SWord32 s1624;+        SWord8  s1625;+        SWord32 s1626;+        SWord32 s1627;+        SWord32 s1628;+        SWord8  s1629;+        SWord32 s1630;+        SWord8  s1631;+        SWord32 s1632;+        SWord8  s1633;+        SWord32 s1634;+        SWord32 s1635;+        SWord8  s1636;+        SWord32 s1637;+        SWord32 s1638;+        SWord8  s1639;+        SWord32 s1640;+        SWord32 s1641;+        SWord32 s1642;+        SWord8  s1643;+        SWord32 s1644;+        SWord32 s1645;+        SWord8  s1646;+        SWord32 s1647;+        SWord8  s1648;+        SWord32 s1649;+        SWord32 s1650;+        SWord8  s1651;+        SWord32 s1652;+        SWord32 s1653;+        SWord8  s1654;+        SWord32 s1655;+        SWord32 s1656;+        SWord32 s1657;+        SWord8  s1658;+        SWord32 s1659;+        SWord32 s1660;+        SWord8  s1661;+        SWord32 s1662;+        SWord8  s1663;+        SWord32 s1664;+        SWord32 s1665;+        SWord8  s1666;+        SWord32 s1667;+        SWord32 s1668;+        SWord8  s1669;+        SWord32 s1670;+        SWord32 s1671;+        SWord32 s1672;+        SWord8  s1673;+        SWord32 s1674;+        SWord32 s1675;+        SWord32 s1676;+        SWord8  s1677;+        SWord32 s1678;+        SWord8  s1679;+        SWord32 s1680;+        SWord8  s1681;+        SWord32 s1682;+        SWord32 s1683;+        SWord8  s1684;+        SWord32 s1685;+        SWord32 s1686;+        SWord8  s1687;+        SWord32 s1688;+        SWord32 s1689;+        SWord32 s1690;+        SWord8  s1691;+        SWord32 s1692;+        SWord32 s1693;+        SWord8  s1694;+        SWord32 s1695;+        SWord8  s1696;+        SWord32 s1697;+        SWord32 s1698;+        SWord8  s1699;+        SWord32 s1700;+        SWord32 s1701;+        SWord8  s1702;+        SWord32 s1703;+        SWord32 s1704;+        SWord32 s1705;+        SWord8  s1706;+        SWord32 s1707;+        SWord32 s1708;+        SWord8  s1709;+        SWord32 s1710;+        SWord8  s1711;+        SWord32 s1712;+        SWord32 s1713;+        SWord8  s1714;+        SWord32 s1715;+        SWord32 s1716;+        SWord8  s1717;+        SWord32 s1718;+        SWord32 s1719;+        SWord32 s1720;+        SWord8  s1721;+        SWord32 s1722;+        SWord32 s1723;+        SWord32 s1724;+        SWord8  s1725;+        SWord8  s1726;+        SWord8  s1727;+        SWord32 s1728;+        SWord8  s1729;+        SWord32 s1730;+        SWord32 s1731;+        SWord8  s1732;+        SWord32 s1733;+        SWord32 s1734;+        SWord8  s1735;+        SWord32 s1736;+        SWord32 s1737;+        SWord32 s1738;+        SWord8  s1739;+        SWord8  s1740;+        SWord16 s1741;+        SWord8  s1742;+        SWord32 s1743;+        SWord8  s1744;+        SWord32 s1745;+        SWord32 s1746;+        SWord8  s1747;+        SWord32 s1748;+        SWord32 s1749;+        SWord8  s1750;+        SWord32 s1751;+        SWord32 s1752;+        SWord32 s1753;+        SWord8  s1754;+        SWord8  s1755;+        SWord8  s1756;+        SWord32 s1757;+        SWord8  s1758;+        SWord32 s1759;+        SWord32 s1760;+        SWord8  s1761;+        SWord32 s1762;+        SWord32 s1763;+        SWord8  s1764;+        SWord32 s1765;+        SWord32 s1766;+        SWord32 s1767;+        SWord8  s1768;+        SWord8  s1769;+        SWord16 s1770;+        SWord32 s1771;+        SWord32 s1772;+        SWord8  s1773;+        SWord8  s1774;+        SWord8  s1775;+        SWord8  s1776;+        SWord16 s1777;+        SWord8  s1778;+        SWord8  s1779;+        SWord8  s1780;+        SWord8  s1781;+        SWord16 s1782;+        SWord32 s1783;+        SWord32 s1784;+        SWord8  s1785;+        SWord8  s1786;+        SWord8  s1787;+        SWord8  s1788;+        SWord16 s1789;+        SWord8  s1790;+        SWord8  s1791;+        SWord8  s1792;+        SWord8  s1793;+        SWord16 s1794;+        SWord32 s1795;+        SWord32 s1796;+        SWord8  s1797;+        SWord8  s1798;+        SWord8  s1799;+        SWord8  s1800;+        SWord16 s1801;+        SWord8  s1802;+        SWord8  s1803;+        SWord8  s1804;+        SWord8  s1805;+        SWord16 s1806;+        SWord32 s1807;+        SWord32 s1808;+  static const SWord32 table1[] = {+      0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,+      0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,+      0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,+      0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,+      0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,+      0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,+      0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,+      0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,+      0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,+      0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,+      0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,+      0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,+      0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,+      0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,+      0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,+      0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,+      0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,+      0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,+      0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,+      0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,+      0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,+      0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,+      0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,+      0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,+      0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,+      0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,+      0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,+      0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,+      0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,+      0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,+      0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,+      0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,+      0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,+      0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,+      0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,+      0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,+      0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,+      0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,+      0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,+      0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,+      0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,+      0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,+      0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,+      0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,+      0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,+      0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,+      0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,+      0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,+      0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,+      0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,+      0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,+      0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,+      0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,+      0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,+      0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,+      0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,+      0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,+      0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,+      0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,+      0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,+      0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,+      0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,+      0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,+      0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL+  };+  s562 = table1[s561];+  static const SWord32 table2[] = {+      0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,+      0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,+      0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,+      0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,+      0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,+      0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,+      0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,+      0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,+      0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,+      0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,+      0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,+      0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,+      0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,+      0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,+      0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,+      0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,+      0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,+      0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,+      0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,+      0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,+      0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,+      0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,+      0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,+      0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,+      0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,+      0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,+      0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,+      0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,+      0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,+      0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,+      0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,+      0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,+      0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,+      0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,+      0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,+      0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,+      0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,+      0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,+      0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,+      0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,+      0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,+      0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,+      0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,+      0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,+      0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,+      0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,+      0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,+      0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,+      0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,+      0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,+      0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,+      0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,+      0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,+      0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,+      0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,+      0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,+      0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,+      0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,+      0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,+      0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,+      0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,+      0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,+      0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,+      0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL+  };+  s820 = table2[s819];+  s821 = s562 ^ s820;+  static const SWord32 table3[] = {+      0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,+      0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,+      0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,+      0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,+      0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,+      0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,+      0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,+      0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,+      0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,+      0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,+      0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,+      0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,+      0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,+      0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,+      0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,+      0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,+      0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,+      0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,+      0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,+      0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,+      0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,+      0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,+      0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,+      0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,+      0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,+      0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,+      0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,+      0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,+      0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,+      0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,+      0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,+      0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,+      0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,+      0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,+      0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,+      0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,+      0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,+      0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,+      0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,+      0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,+      0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,+      0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,+      0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,+      0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,+      0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,+      0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,+      0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,+      0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,+      0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,+      0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,+      0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,+      0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,+      0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,+      0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,+      0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,+      0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,+      0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,+      0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,+      0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,+      0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,+      0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,+      0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,+      0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,+      0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL+  };+  s1079 = table3[s1078];+  s1080 = s821 ^ s1079;+  static const SWord32 table4[] = {+      0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,+      0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,+      0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,+      0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,+      0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,+      0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,+      0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,+      0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,+      0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,+      0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,+      0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,+      0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,+      0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,+      0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,+      0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,+      0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,+      0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,+      0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,+      0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,+      0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,+      0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,+      0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,+      0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,+      0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,+      0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,+      0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,+      0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,+      0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,+      0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,+      0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,+      0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,+      0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,+      0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,+      0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,+      0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,+      0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,+      0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,+      0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,+      0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,+      0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,+      0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,+      0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,+      0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,+      0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,+      0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,+      0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,+      0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,+      0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,+      0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,+      0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,+      0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,+      0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,+      0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,+      0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,+      0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,+      0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,+      0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,+      0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,+      0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,+      0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,+      0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,+      0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,+      0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,+      0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL+  };+  s1338 = table4[s1337];+  s1339 = s1080 ^ s1338;+  s1340 = s8 ^ s1339;+  s1341 = sbv_bv_extract_u32_31_24_u8(s1340);+  s1342 = table1[s1341];+  s1344 = table1[s1343];+  s1346 = table2[s1345];+  s1347 = s1344 ^ s1346;+  s1349 = table3[s1348];+  s1350 = s1347 ^ s1349;+  s1352 = table4[s1351];+  s1353 = s1350 ^ s1352;+  s1354 = s11 ^ s1353;+  s1355 = sbv_bv_extract_u32_23_16_u8(s1354);+  s1356 = table2[s1355];+  s1357 = s1342 ^ s1356;+  s1359 = table1[s1358];+  s1361 = table2[s1360];+  s1362 = s1359 ^ s1361;+  s1364 = table3[s1363];+  s1365 = s1362 ^ s1364;+  s1367 = table4[s1366];+  s1368 = s1365 ^ s1367;+  s1369 = s10 ^ s1368;+  s1370 = sbv_bv_extract_u32_15_8_u8(s1369);+  s1371 = table3[s1370];+  s1372 = s1357 ^ s1371;+  s1374 = table1[s1373];+  s1376 = table2[s1375];+  s1377 = s1374 ^ s1376;+  s1379 = table3[s1378];+  s1380 = s1377 ^ s1379;+  s1382 = table4[s1381];+  s1383 = s1380 ^ s1382;+  s1384 = s9 ^ s1383;+  s1385 = sbv_bv_extract_u32_7_0_u8(s1384);+  s1386 = table4[s1385];+  s1387 = s1372 ^ s1386;+  s1388 = s12 ^ s1387;+  s1389 = sbv_bv_extract_u32_31_24_u8(s1388);+  s1390 = table1[s1389];+  s1391 = sbv_bv_extract_u32_31_24_u8(s1354);+  s1392 = table1[s1391];+  s1393 = sbv_bv_extract_u32_23_16_u8(s1369);+  s1394 = table2[s1393];+  s1395 = s1392 ^ s1394;+  s1396 = sbv_bv_extract_u32_15_8_u8(s1384);+  s1397 = table3[s1396];+  s1398 = s1395 ^ s1397;+  s1399 = sbv_bv_extract_u32_7_0_u8(s1340);+  s1400 = table4[s1399];+  s1401 = s1398 ^ s1400;+  s1402 = s15 ^ s1401;+  s1403 = sbv_bv_extract_u32_23_16_u8(s1402);+  s1404 = table2[s1403];+  s1405 = s1390 ^ s1404;+  s1406 = sbv_bv_extract_u32_31_24_u8(s1369);+  s1407 = table1[s1406];+  s1408 = sbv_bv_extract_u32_23_16_u8(s1384);+  s1409 = table2[s1408];+  s1410 = s1407 ^ s1409;+  s1411 = sbv_bv_extract_u32_15_8_u8(s1340);+  s1412 = table3[s1411];+  s1413 = s1410 ^ s1412;+  s1414 = sbv_bv_extract_u32_7_0_u8(s1354);+  s1415 = table4[s1414];+  s1416 = s1413 ^ s1415;+  s1417 = s14 ^ s1416;+  s1418 = sbv_bv_extract_u32_15_8_u8(s1417);+  s1419 = table3[s1418];+  s1420 = s1405 ^ s1419;+  s1421 = sbv_bv_extract_u32_31_24_u8(s1384);+  s1422 = table1[s1421];+  s1423 = sbv_bv_extract_u32_23_16_u8(s1340);+  s1424 = table2[s1423];+  s1425 = s1422 ^ s1424;+  s1426 = sbv_bv_extract_u32_15_8_u8(s1354);+  s1427 = table3[s1426];+  s1428 = s1425 ^ s1427;+  s1429 = sbv_bv_extract_u32_7_0_u8(s1369);+  s1430 = table4[s1429];+  s1431 = s1428 ^ s1430;+  s1432 = s13 ^ s1431;+  s1433 = sbv_bv_extract_u32_7_0_u8(s1432);+  s1434 = table4[s1433];+  s1435 = s1420 ^ s1434;+  s1436 = s16 ^ s1435;+  s1437 = sbv_bv_extract_u32_31_24_u8(s1436);+  s1438 = table1[s1437];+  s1439 = sbv_bv_extract_u32_31_24_u8(s1402);+  s1440 = table1[s1439];+  s1441 = sbv_bv_extract_u32_23_16_u8(s1417);+  s1442 = table2[s1441];+  s1443 = s1440 ^ s1442;+  s1444 = sbv_bv_extract_u32_15_8_u8(s1432);+  s1445 = table3[s1444];+  s1446 = s1443 ^ s1445;+  s1447 = sbv_bv_extract_u32_7_0_u8(s1388);+  s1448 = table4[s1447];+  s1449 = s1446 ^ s1448;+  s1450 = s19 ^ s1449;+  s1451 = sbv_bv_extract_u32_23_16_u8(s1450);+  s1452 = table2[s1451];+  s1453 = s1438 ^ s1452;+  s1454 = sbv_bv_extract_u32_31_24_u8(s1417);+  s1455 = table1[s1454];+  s1456 = sbv_bv_extract_u32_23_16_u8(s1432);+  s1457 = table2[s1456];+  s1458 = s1455 ^ s1457;+  s1459 = sbv_bv_extract_u32_15_8_u8(s1388);+  s1460 = table3[s1459];+  s1461 = s1458 ^ s1460;+  s1462 = sbv_bv_extract_u32_7_0_u8(s1402);+  s1463 = table4[s1462];+  s1464 = s1461 ^ s1463;+  s1465 = s18 ^ s1464;+  s1466 = sbv_bv_extract_u32_15_8_u8(s1465);+  s1467 = table3[s1466];+  s1468 = s1453 ^ s1467;+  s1469 = sbv_bv_extract_u32_31_24_u8(s1432);+  s1470 = table1[s1469];+  s1471 = sbv_bv_extract_u32_23_16_u8(s1388);+  s1472 = table2[s1471];+  s1473 = s1470 ^ s1472;+  s1474 = sbv_bv_extract_u32_15_8_u8(s1402);+  s1475 = table3[s1474];+  s1476 = s1473 ^ s1475;+  s1477 = sbv_bv_extract_u32_7_0_u8(s1417);+  s1478 = table4[s1477];+  s1479 = s1476 ^ s1478;+  s1480 = s17 ^ s1479;+  s1481 = sbv_bv_extract_u32_7_0_u8(s1480);+  s1482 = table4[s1481];+  s1483 = s1468 ^ s1482;+  s1484 = s20 ^ s1483;+  s1485 = sbv_bv_extract_u32_31_24_u8(s1484);+  s1486 = table1[s1485];+  s1487 = sbv_bv_extract_u32_31_24_u8(s1450);+  s1488 = table1[s1487];+  s1489 = sbv_bv_extract_u32_23_16_u8(s1465);+  s1490 = table2[s1489];+  s1491 = s1488 ^ s1490;+  s1492 = sbv_bv_extract_u32_15_8_u8(s1480);+  s1493 = table3[s1492];+  s1494 = s1491 ^ s1493;+  s1495 = sbv_bv_extract_u32_7_0_u8(s1436);+  s1496 = table4[s1495];+  s1497 = s1494 ^ s1496;+  s1498 = s23 ^ s1497;+  s1499 = sbv_bv_extract_u32_23_16_u8(s1498);+  s1500 = table2[s1499];+  s1501 = s1486 ^ s1500;+  s1502 = sbv_bv_extract_u32_31_24_u8(s1465);+  s1503 = table1[s1502];+  s1504 = sbv_bv_extract_u32_23_16_u8(s1480);+  s1505 = table2[s1504];+  s1506 = s1503 ^ s1505;+  s1507 = sbv_bv_extract_u32_15_8_u8(s1436);+  s1508 = table3[s1507];+  s1509 = s1506 ^ s1508;+  s1510 = sbv_bv_extract_u32_7_0_u8(s1450);+  s1511 = table4[s1510];+  s1512 = s1509 ^ s1511;+  s1513 = s22 ^ s1512;+  s1514 = sbv_bv_extract_u32_15_8_u8(s1513);+  s1515 = table3[s1514];+  s1516 = s1501 ^ s1515;+  s1517 = sbv_bv_extract_u32_31_24_u8(s1480);+  s1518 = table1[s1517];+  s1519 = sbv_bv_extract_u32_23_16_u8(s1436);+  s1520 = table2[s1519];+  s1521 = s1518 ^ s1520;+  s1522 = sbv_bv_extract_u32_15_8_u8(s1450);+  s1523 = table3[s1522];+  s1524 = s1521 ^ s1523;+  s1525 = sbv_bv_extract_u32_7_0_u8(s1465);+  s1526 = table4[s1525];+  s1527 = s1524 ^ s1526;+  s1528 = s21 ^ s1527;+  s1529 = sbv_bv_extract_u32_7_0_u8(s1528);+  s1530 = table4[s1529];+  s1531 = s1516 ^ s1530;+  s1532 = s24 ^ s1531;+  s1533 = sbv_bv_extract_u32_31_24_u8(s1532);+  s1534 = table1[s1533];+  s1535 = sbv_bv_extract_u32_31_24_u8(s1498);+  s1536 = table1[s1535];+  s1537 = sbv_bv_extract_u32_23_16_u8(s1513);+  s1538 = table2[s1537];+  s1539 = s1536 ^ s1538;+  s1540 = sbv_bv_extract_u32_15_8_u8(s1528);+  s1541 = table3[s1540];+  s1542 = s1539 ^ s1541;+  s1543 = sbv_bv_extract_u32_7_0_u8(s1484);+  s1544 = table4[s1543];+  s1545 = s1542 ^ s1544;+  s1546 = s27 ^ s1545;+  s1547 = sbv_bv_extract_u32_23_16_u8(s1546);+  s1548 = table2[s1547];+  s1549 = s1534 ^ s1548;+  s1550 = sbv_bv_extract_u32_31_24_u8(s1513);+  s1551 = table1[s1550];+  s1552 = sbv_bv_extract_u32_23_16_u8(s1528);+  s1553 = table2[s1552];+  s1554 = s1551 ^ s1553;+  s1555 = sbv_bv_extract_u32_15_8_u8(s1484);+  s1556 = table3[s1555];+  s1557 = s1554 ^ s1556;+  s1558 = sbv_bv_extract_u32_7_0_u8(s1498);+  s1559 = table4[s1558];+  s1560 = s1557 ^ s1559;+  s1561 = s26 ^ s1560;+  s1562 = sbv_bv_extract_u32_15_8_u8(s1561);+  s1563 = table3[s1562];+  s1564 = s1549 ^ s1563;+  s1565 = sbv_bv_extract_u32_31_24_u8(s1528);+  s1566 = table1[s1565];+  s1567 = sbv_bv_extract_u32_23_16_u8(s1484);+  s1568 = table2[s1567];+  s1569 = s1566 ^ s1568;+  s1570 = sbv_bv_extract_u32_15_8_u8(s1498);+  s1571 = table3[s1570];+  s1572 = s1569 ^ s1571;+  s1573 = sbv_bv_extract_u32_7_0_u8(s1513);+  s1574 = table4[s1573];+  s1575 = s1572 ^ s1574;+  s1576 = s25 ^ s1575;+  s1577 = sbv_bv_extract_u32_7_0_u8(s1576);+  s1578 = table4[s1577];+  s1579 = s1564 ^ s1578;+  s1580 = s28 ^ s1579;+  s1581 = sbv_bv_extract_u32_31_24_u8(s1580);+  s1582 = table1[s1581];+  s1583 = sbv_bv_extract_u32_31_24_u8(s1546);+  s1584 = table1[s1583];+  s1585 = sbv_bv_extract_u32_23_16_u8(s1561);+  s1586 = table2[s1585];+  s1587 = s1584 ^ s1586;+  s1588 = sbv_bv_extract_u32_15_8_u8(s1576);+  s1589 = table3[s1588];+  s1590 = s1587 ^ s1589;+  s1591 = sbv_bv_extract_u32_7_0_u8(s1532);+  s1592 = table4[s1591];+  s1593 = s1590 ^ s1592;+  s1594 = s31 ^ s1593;+  s1595 = sbv_bv_extract_u32_23_16_u8(s1594);+  s1596 = table2[s1595];+  s1597 = s1582 ^ s1596;+  s1598 = sbv_bv_extract_u32_31_24_u8(s1561);+  s1599 = table1[s1598];+  s1600 = sbv_bv_extract_u32_23_16_u8(s1576);+  s1601 = table2[s1600];+  s1602 = s1599 ^ s1601;+  s1603 = sbv_bv_extract_u32_15_8_u8(s1532);+  s1604 = table3[s1603];+  s1605 = s1602 ^ s1604;+  s1606 = sbv_bv_extract_u32_7_0_u8(s1546);+  s1607 = table4[s1606];+  s1608 = s1605 ^ s1607;+  s1609 = s30 ^ s1608;+  s1610 = sbv_bv_extract_u32_15_8_u8(s1609);+  s1611 = table3[s1610];+  s1612 = s1597 ^ s1611;+  s1613 = sbv_bv_extract_u32_31_24_u8(s1576);+  s1614 = table1[s1613];+  s1615 = sbv_bv_extract_u32_23_16_u8(s1532);+  s1616 = table2[s1615];+  s1617 = s1614 ^ s1616;+  s1618 = sbv_bv_extract_u32_15_8_u8(s1546);+  s1619 = table3[s1618];+  s1620 = s1617 ^ s1619;+  s1621 = sbv_bv_extract_u32_7_0_u8(s1561);+  s1622 = table4[s1621];+  s1623 = s1620 ^ s1622;+  s1624 = s29 ^ s1623;+  s1625 = sbv_bv_extract_u32_7_0_u8(s1624);+  s1626 = table4[s1625];+  s1627 = s1612 ^ s1626;+  s1628 = s32 ^ s1627;+  s1629 = sbv_bv_extract_u32_31_24_u8(s1628);+  s1630 = table1[s1629];+  s1631 = sbv_bv_extract_u32_31_24_u8(s1594);+  s1632 = table1[s1631];+  s1633 = sbv_bv_extract_u32_23_16_u8(s1609);+  s1634 = table2[s1633];+  s1635 = s1632 ^ s1634;+  s1636 = sbv_bv_extract_u32_15_8_u8(s1624);+  s1637 = table3[s1636];+  s1638 = s1635 ^ s1637;+  s1639 = sbv_bv_extract_u32_7_0_u8(s1580);+  s1640 = table4[s1639];+  s1641 = s1638 ^ s1640;+  s1642 = s35 ^ s1641;+  s1643 = sbv_bv_extract_u32_23_16_u8(s1642);+  s1644 = table2[s1643];+  s1645 = s1630 ^ s1644;+  s1646 = sbv_bv_extract_u32_31_24_u8(s1609);+  s1647 = table1[s1646];+  s1648 = sbv_bv_extract_u32_23_16_u8(s1624);+  s1649 = table2[s1648];+  s1650 = s1647 ^ s1649;+  s1651 = sbv_bv_extract_u32_15_8_u8(s1580);+  s1652 = table3[s1651];+  s1653 = s1650 ^ s1652;+  s1654 = sbv_bv_extract_u32_7_0_u8(s1594);+  s1655 = table4[s1654];+  s1656 = s1653 ^ s1655;+  s1657 = s34 ^ s1656;+  s1658 = sbv_bv_extract_u32_15_8_u8(s1657);+  s1659 = table3[s1658];+  s1660 = s1645 ^ s1659;+  s1661 = sbv_bv_extract_u32_31_24_u8(s1624);+  s1662 = table1[s1661];+  s1663 = sbv_bv_extract_u32_23_16_u8(s1580);+  s1664 = table2[s1663];+  s1665 = s1662 ^ s1664;+  s1666 = sbv_bv_extract_u32_15_8_u8(s1594);+  s1667 = table3[s1666];+  s1668 = s1665 ^ s1667;+  s1669 = sbv_bv_extract_u32_7_0_u8(s1609);+  s1670 = table4[s1669];+  s1671 = s1668 ^ s1670;+  s1672 = s33 ^ s1671;+  s1673 = sbv_bv_extract_u32_7_0_u8(s1672);+  s1674 = table4[s1673];+  s1675 = s1660 ^ s1674;+  s1676 = s36 ^ s1675;+  s1677 = sbv_bv_extract_u32_31_24_u8(s1676);+  s1678 = table1[s1677];+  s1679 = sbv_bv_extract_u32_31_24_u8(s1642);+  s1680 = table1[s1679];+  s1681 = sbv_bv_extract_u32_23_16_u8(s1657);+  s1682 = table2[s1681];+  s1683 = s1680 ^ s1682;+  s1684 = sbv_bv_extract_u32_15_8_u8(s1672);+  s1685 = table3[s1684];+  s1686 = s1683 ^ s1685;+  s1687 = sbv_bv_extract_u32_7_0_u8(s1628);+  s1688 = table4[s1687];+  s1689 = s1686 ^ s1688;+  s1690 = s39 ^ s1689;+  s1691 = sbv_bv_extract_u32_23_16_u8(s1690);+  s1692 = table2[s1691];+  s1693 = s1678 ^ s1692;+  s1694 = sbv_bv_extract_u32_31_24_u8(s1657);+  s1695 = table1[s1694];+  s1696 = sbv_bv_extract_u32_23_16_u8(s1672);+  s1697 = table2[s1696];+  s1698 = s1695 ^ s1697;+  s1699 = sbv_bv_extract_u32_15_8_u8(s1628);+  s1700 = table3[s1699];+  s1701 = s1698 ^ s1700;+  s1702 = sbv_bv_extract_u32_7_0_u8(s1642);+  s1703 = table4[s1702];+  s1704 = s1701 ^ s1703;+  s1705 = s38 ^ s1704;+  s1706 = sbv_bv_extract_u32_15_8_u8(s1705);+  s1707 = table3[s1706];+  s1708 = s1693 ^ s1707;+  s1709 = sbv_bv_extract_u32_31_24_u8(s1672);+  s1710 = table1[s1709];+  s1711 = sbv_bv_extract_u32_23_16_u8(s1628);+  s1712 = table2[s1711];+  s1713 = s1710 ^ s1712;+  s1714 = sbv_bv_extract_u32_15_8_u8(s1642);+  s1715 = table3[s1714];+  s1716 = s1713 ^ s1715;+  s1717 = sbv_bv_extract_u32_7_0_u8(s1657);+  s1718 = table4[s1717];+  s1719 = s1716 ^ s1718;+  s1720 = s37 ^ s1719;+  s1721 = sbv_bv_extract_u32_7_0_u8(s1720);+  s1722 = table4[s1721];+  s1723 = s1708 ^ s1722;+  s1724 = s40 ^ s1723;+  s1725 = sbv_bv_extract_u32_31_24_u8(s1724);+  static const SWord8 table0[] = {+       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,+      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,+       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,+       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,+       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,+      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,+      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,+       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,+      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,+       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,+       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,+      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,+       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,+      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,+      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,+       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,+       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,+      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,+      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,+       38, 225, 105,  20,  99,  85,  33,  12, 125+  };+  s1726 = table0[s1725];+  s1727 = sbv_bv_extract_u32_31_24_u8(s1690);+  s1728 = table1[s1727];+  s1729 = sbv_bv_extract_u32_23_16_u8(s1705);+  s1730 = table2[s1729];+  s1731 = s1728 ^ s1730;+  s1732 = sbv_bv_extract_u32_15_8_u8(s1720);+  s1733 = table3[s1732];+  s1734 = s1731 ^ s1733;+  s1735 = sbv_bv_extract_u32_7_0_u8(s1676);+  s1736 = table4[s1735];+  s1737 = s1734 ^ s1736;+  s1738 = s43 ^ s1737;+  s1739 = sbv_bv_extract_u32_23_16_u8(s1738);+  s1740 = table0[s1739];+  s1741 = sbv_bv_join_u8_u8_u16(s1726, s1740);+  s1742 = sbv_bv_extract_u32_31_24_u8(s1705);+  s1743 = table1[s1742];+  s1744 = sbv_bv_extract_u32_23_16_u8(s1720);+  s1745 = table2[s1744];+  s1746 = s1743 ^ s1745;+  s1747 = sbv_bv_extract_u32_15_8_u8(s1676);+  s1748 = table3[s1747];+  s1749 = s1746 ^ s1748;+  s1750 = sbv_bv_extract_u32_7_0_u8(s1690);+  s1751 = table4[s1750];+  s1752 = s1749 ^ s1751;+  s1753 = s42 ^ s1752;+  s1754 = sbv_bv_extract_u32_15_8_u8(s1753);+  s1755 = table0[s1754];+  s1756 = sbv_bv_extract_u32_31_24_u8(s1720);+  s1757 = table1[s1756];+  s1758 = sbv_bv_extract_u32_23_16_u8(s1676);+  s1759 = table2[s1758];+  s1760 = s1757 ^ s1759;+  s1761 = sbv_bv_extract_u32_15_8_u8(s1690);+  s1762 = table3[s1761];+  s1763 = s1760 ^ s1762;+  s1764 = sbv_bv_extract_u32_7_0_u8(s1705);+  s1765 = table4[s1764];+  s1766 = s1763 ^ s1765;+  s1767 = s41 ^ s1766;+  s1768 = sbv_bv_extract_u32_7_0_u8(s1767);+  s1769 = table0[s1768];+  s1770 = sbv_bv_join_u8_u8_u16(s1755, s1769);+  s1771 = sbv_bv_join_u16_u16_u32(s1741, s1770);+  s1772 = s44 ^ s1771;+  s1773 = sbv_bv_extract_u32_31_24_u8(s1767);+  s1774 = table0[s1773];+  s1775 = sbv_bv_extract_u32_23_16_u8(s1724);+  s1776 = table0[s1775];+  s1777 = sbv_bv_join_u8_u8_u16(s1774, s1776);+  s1778 = sbv_bv_extract_u32_15_8_u8(s1738);+  s1779 = table0[s1778];+  s1780 = sbv_bv_extract_u32_7_0_u8(s1753);+  s1781 = table0[s1780];+  s1782 = sbv_bv_join_u8_u8_u16(s1779, s1781);+  s1783 = sbv_bv_join_u16_u16_u32(s1777, s1782);+  s1784 = s45 ^ s1783;+  s1785 = sbv_bv_extract_u32_31_24_u8(s1753);+  s1786 = table0[s1785];+  s1787 = sbv_bv_extract_u32_23_16_u8(s1767);+  s1788 = table0[s1787];+  s1789 = sbv_bv_join_u8_u8_u16(s1786, s1788);+  s1790 = sbv_bv_extract_u32_15_8_u8(s1724);+  s1791 = table0[s1790];+  s1792 = sbv_bv_extract_u32_7_0_u8(s1738);+  s1793 = table0[s1792];+  s1794 = sbv_bv_join_u8_u8_u16(s1791, s1793);+  s1795 = sbv_bv_join_u16_u16_u32(s1789, s1794);+  s1796 = s46 ^ s1795;+  s1797 = sbv_bv_extract_u32_31_24_u8(s1738);+  s1798 = table0[s1797];+  s1799 = sbv_bv_extract_u32_23_16_u8(s1753);+  s1800 = table0[s1799];+  s1801 = sbv_bv_join_u8_u8_u16(s1798, s1800);+  s1802 = sbv_bv_extract_u32_15_8_u8(s1767);+  s1803 = table0[s1802];+  s1804 = sbv_bv_extract_u32_7_0_u8(s1724);+  s1805 = table0[s1804];+  s1806 = sbv_bv_join_u8_u8_u16(s1803, s1805);+  s1807 = sbv_bv_join_u16_u16_u32(s1801, s1806);+  s1808 = s47 ^ s1807;++  sbv_output_0[0] = s1772;+  sbv_output_0[1] = s1784;+  sbv_output_0[2] = s1796;+  sbv_output_0[3] = s1808;+}+== END: "aes128BlockDecrypt.c" ==================+== BEGIN: "aes128InvKeySchedule.c" ================+/* File: "aes128InvKeySchedule.c". Automatically generated by SBV. Do not edit! */++#include "aes128Lib.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotl(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) << amount) | (((uint64_t) (SWord32) a) >> (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotr(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) >> amount) | (((uint64_t) (SWord32) a) << (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128InvKeySchedule(const SWord32 *sbv_input_0,+                          SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s260 = s2 ^ s3;+  const SWord32 s261 = sbv_bv_u32_rotl(s260, 8);+  const SWord8  s262 = sbv_bv_extract_u32_31_24_u8(s261);+  const SWord8  s265 = sbv_bv_extract_u32_23_16_u8(s261);+  const SWord8  s268 = sbv_bv_extract_u32_15_8_u8(s261);+  const SWord8  s270 = sbv_bv_extract_u32_7_0_u8(s261);+  const SWord32 s275 = s0 ^ s1;+  const SWord32 s276 = s1 ^ s2;+  const SWord32 s277 = s260 ^ s276;+  const SWord32 s278 = sbv_bv_u32_rotl(s277, 8);+  const SWord8  s279 = sbv_bv_extract_u32_31_24_u8(s278);+  const SWord8  s282 = sbv_bv_extract_u32_23_16_u8(s278);+  const SWord8  s285 = sbv_bv_extract_u32_15_8_u8(s278);+  const SWord8  s287 = sbv_bv_extract_u32_7_0_u8(s278);+  const SWord32 s293 = s275 ^ s276;+  const SWord32 s294 = s277 ^ s293;+  const SWord32 s295 = sbv_bv_u32_rotl(s294, 8);+  const SWord8  s296 = sbv_bv_extract_u32_31_24_u8(s295);+  const SWord8  s299 = sbv_bv_extract_u32_23_16_u8(s295);+  const SWord8  s302 = sbv_bv_extract_u32_15_8_u8(s295);+  const SWord8  s304 = sbv_bv_extract_u32_7_0_u8(s295);+        SWord8  s263;+        SWord8  s264;+        SWord8  s266;+        SWord16 s267;+        SWord8  s269;+        SWord8  s271;+        SWord16 s272;+        SWord32 s273;+        SWord32 s274;+        SWord8  s280;+        SWord8  s281;+        SWord8  s283;+        SWord16 s284;+        SWord8  s286;+        SWord8  s288;+        SWord16 s289;+        SWord32 s290;+        SWord32 s291;+        SWord32 s292;+        SWord8  s297;+        SWord8  s298;+        SWord8  s300;+        SWord16 s301;+        SWord8  s303;+        SWord8  s305;+        SWord16 s306;+        SWord32 s307;+        SWord32 s308;+        SWord32 s309;+        SWord32 s310;+        SWord32 s311;+        SWord32 s312;+        SWord8  s313;+        SWord8  s314;+        SWord8  s315;+        SWord8  s316;+        SWord8  s317;+        SWord16 s318;+        SWord8  s319;+        SWord8  s320;+        SWord8  s321;+        SWord8  s322;+        SWord16 s323;+        SWord32 s324;+        SWord32 s325;+        SWord32 s326;+        SWord32 s327;+        SWord32 s328;+        SWord32 s329;+        SWord8  s330;+        SWord8  s331;+        SWord8  s332;+        SWord8  s333;+        SWord8  s334;+        SWord16 s335;+        SWord8  s336;+        SWord8  s337;+        SWord8  s338;+        SWord8  s339;+        SWord16 s340;+        SWord32 s341;+        SWord32 s342;+        SWord32 s343;+        SWord32 s344;+        SWord32 s345;+        SWord32 s346;+        SWord8  s347;+        SWord8  s348;+        SWord8  s349;+        SWord8  s350;+        SWord8  s351;+        SWord16 s352;+        SWord8  s353;+        SWord8  s354;+        SWord8  s355;+        SWord8  s356;+        SWord16 s357;+        SWord32 s358;+        SWord32 s359;+        SWord32 s360;+        SWord32 s361;+        SWord32 s362;+        SWord32 s363;+        SWord8  s364;+        SWord8  s365;+        SWord8  s366;+        SWord8  s367;+        SWord8  s368;+        SWord16 s369;+        SWord8  s370;+        SWord8  s371;+        SWord8  s372;+        SWord8  s373;+        SWord16 s374;+        SWord32 s375;+        SWord32 s376;+        SWord32 s377;+        SWord32 s378;+        SWord32 s379;+        SWord32 s380;+        SWord8  s381;+        SWord8  s382;+        SWord8  s383;+        SWord8  s384;+        SWord8  s385;+        SWord16 s386;+        SWord8  s387;+        SWord8  s388;+        SWord8  s389;+        SWord8  s390;+        SWord16 s391;+        SWord32 s392;+        SWord32 s393;+        SWord32 s394;+        SWord32 s395;+        SWord32 s396;+        SWord32 s397;+        SWord8  s398;+        SWord8  s399;+        SWord8  s400;+        SWord8  s401;+        SWord8  s402;+        SWord16 s403;+        SWord8  s404;+        SWord8  s405;+        SWord8  s406;+        SWord8  s407;+        SWord16 s408;+        SWord32 s409;+        SWord32 s410;+        SWord32 s411;+        SWord32 s412;+        SWord32 s413;+        SWord32 s414;+        SWord8  s415;+        SWord8  s416;+        SWord8  s417;+        SWord8  s418;+        SWord8  s419;+        SWord16 s420;+        SWord8  s421;+        SWord8  s422;+        SWord8  s423;+        SWord8  s424;+        SWord16 s425;+        SWord32 s426;+        SWord32 s427;+        SWord32 s428;+        SWord32 s429;+  static const SWord8 table0[] = {+       99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254,+      215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212,+      162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247,+      204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,+       24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9,+      131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,+       47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,+       57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,+       69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146,+      157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,+       19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25,+      115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20,+      222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194,+      211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,+       78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,+       46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,+      112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,+      193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30,+      135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66,+      104,  65, 153,  45,  15, 176,  84, 187,  22+  };+  s263 = table0[s262];+  s264 = 54 ^ s263;+  s266 = table0[s265];+  s267 = sbv_bv_join_u8_u8_u16(s264, s266);+  s269 = table0[s268];+  s271 = table0[s270];+  s272 = sbv_bv_join_u8_u8_u16(s269, s271);+  s273 = sbv_bv_join_u16_u16_u32(s267, s272);+  s274 = s0 ^ s273;+  s280 = table0[s279];+  s281 = 27 ^ s280;+  s283 = table0[s282];+  s284 = sbv_bv_join_u8_u8_u16(s281, s283);+  s286 = table0[s285];+  s288 = table0[s287];+  s289 = sbv_bv_join_u8_u8_u16(s286, s288);+  s290 = sbv_bv_join_u16_u16_u32(s284, s289);+  s291 = s274 ^ s290;+  s292 = s274 ^ s275;+  s297 = table0[s296];+  s298 = 128 ^ s297;+  s300 = table0[s299];+  s301 = sbv_bv_join_u8_u8_u16(s298, s300);+  s303 = table0[s302];+  s305 = table0[s304];+  s306 = sbv_bv_join_u8_u8_u16(s303, s305);+  s307 = sbv_bv_join_u16_u16_u32(s301, s306);+  s308 = s291 ^ s307;+  s309 = s291 ^ s292;+  s310 = s292 ^ s293;+  s311 = s294 ^ s310;+  s312 = sbv_bv_u32_rotl(s311, 8);+  s313 = sbv_bv_extract_u32_31_24_u8(s312);+  s314 = table0[s313];+  s315 = 64 ^ s314;+  s316 = sbv_bv_extract_u32_23_16_u8(s312);+  s317 = table0[s316];+  s318 = sbv_bv_join_u8_u8_u16(s315, s317);+  s319 = sbv_bv_extract_u32_15_8_u8(s312);+  s320 = table0[s319];+  s321 = sbv_bv_extract_u32_7_0_u8(s312);+  s322 = table0[s321];+  s323 = sbv_bv_join_u8_u8_u16(s320, s322);+  s324 = sbv_bv_join_u16_u16_u32(s318, s323);+  s325 = s308 ^ s324;+  s326 = s308 ^ s309;+  s327 = s309 ^ s310;+  s328 = s311 ^ s327;+  s329 = sbv_bv_u32_rotl(s328, 8);+  s330 = sbv_bv_extract_u32_31_24_u8(s329);+  s331 = table0[s330];+  s332 = 32 ^ s331;+  s333 = sbv_bv_extract_u32_23_16_u8(s329);+  s334 = table0[s333];+  s335 = sbv_bv_join_u8_u8_u16(s332, s334);+  s336 = sbv_bv_extract_u32_15_8_u8(s329);+  s337 = table0[s336];+  s338 = sbv_bv_extract_u32_7_0_u8(s329);+  s339 = table0[s338];+  s340 = sbv_bv_join_u8_u8_u16(s337, s339);+  s341 = sbv_bv_join_u16_u16_u32(s335, s340);+  s342 = s325 ^ s341;+  s343 = s325 ^ s326;+  s344 = s326 ^ s327;+  s345 = s328 ^ s344;+  s346 = sbv_bv_u32_rotl(s345, 8);+  s347 = sbv_bv_extract_u32_31_24_u8(s346);+  s348 = table0[s347];+  s349 = 16 ^ s348;+  s350 = sbv_bv_extract_u32_23_16_u8(s346);+  s351 = table0[s350];+  s352 = sbv_bv_join_u8_u8_u16(s349, s351);+  s353 = sbv_bv_extract_u32_15_8_u8(s346);+  s354 = table0[s353];+  s355 = sbv_bv_extract_u32_7_0_u8(s346);+  s356 = table0[s355];+  s357 = sbv_bv_join_u8_u8_u16(s354, s356);+  s358 = sbv_bv_join_u16_u16_u32(s352, s357);+  s359 = s342 ^ s358;+  s360 = s342 ^ s343;+  s361 = s343 ^ s344;+  s362 = s345 ^ s361;+  s363 = sbv_bv_u32_rotl(s362, 8);+  s364 = sbv_bv_extract_u32_31_24_u8(s363);+  s365 = table0[s364];+  s366 = 8 ^ s365;+  s367 = sbv_bv_extract_u32_23_16_u8(s363);+  s368 = table0[s367];+  s369 = sbv_bv_join_u8_u8_u16(s366, s368);+  s370 = sbv_bv_extract_u32_15_8_u8(s363);+  s371 = table0[s370];+  s372 = sbv_bv_extract_u32_7_0_u8(s363);+  s373 = table0[s372];+  s374 = sbv_bv_join_u8_u8_u16(s371, s373);+  s375 = sbv_bv_join_u16_u16_u32(s369, s374);+  s376 = s359 ^ s375;+  s377 = s359 ^ s360;+  s378 = s360 ^ s361;+  s379 = s362 ^ s378;+  s380 = sbv_bv_u32_rotl(s379, 8);+  s381 = sbv_bv_extract_u32_31_24_u8(s380);+  s382 = table0[s381];+  s383 = 4 ^ s382;+  s384 = sbv_bv_extract_u32_23_16_u8(s380);+  s385 = table0[s384];+  s386 = sbv_bv_join_u8_u8_u16(s383, s385);+  s387 = sbv_bv_extract_u32_15_8_u8(s380);+  s388 = table0[s387];+  s389 = sbv_bv_extract_u32_7_0_u8(s380);+  s390 = table0[s389];+  s391 = sbv_bv_join_u8_u8_u16(s388, s390);+  s392 = sbv_bv_join_u16_u16_u32(s386, s391);+  s393 = s376 ^ s392;+  s394 = s376 ^ s377;+  s395 = s377 ^ s378;+  s396 = s379 ^ s395;+  s397 = sbv_bv_u32_rotl(s396, 8);+  s398 = sbv_bv_extract_u32_31_24_u8(s397);+  s399 = table0[s398];+  s400 = 2 ^ s399;+  s401 = sbv_bv_extract_u32_23_16_u8(s397);+  s402 = table0[s401];+  s403 = sbv_bv_join_u8_u8_u16(s400, s402);+  s404 = sbv_bv_extract_u32_15_8_u8(s397);+  s405 = table0[s404];+  s406 = sbv_bv_extract_u32_7_0_u8(s397);+  s407 = table0[s406];+  s408 = sbv_bv_join_u8_u8_u16(s405, s407);+  s409 = sbv_bv_join_u16_u16_u32(s403, s408);+  s410 = s393 ^ s409;+  s411 = s393 ^ s394;+  s412 = s394 ^ s395;+  s413 = s396 ^ s412;+  s414 = sbv_bv_u32_rotl(s413, 8);+  s415 = sbv_bv_extract_u32_31_24_u8(s414);+  s416 = table0[s415];+  s417 = 1 ^ s416;+  s418 = sbv_bv_extract_u32_23_16_u8(s414);+  s419 = table0[s418];+  s420 = sbv_bv_join_u8_u8_u16(s417, s419);+  s421 = sbv_bv_extract_u32_15_8_u8(s414);+  s422 = table0[s421];+  s423 = sbv_bv_extract_u32_7_0_u8(s414);+  s424 = table0[s423];+  s425 = sbv_bv_join_u8_u8_u16(s422, s424);+  s426 = sbv_bv_join_u16_u16_u32(s420, s425);+  s427 = s410 ^ s426;+  s428 = s410 ^ s411;+  s429 = s411 ^ s412;++  sbv_output_0[0] = s0;+  sbv_output_0[1] = s1;+  sbv_output_0[2] = s2;+  sbv_output_0[3] = s3;+  sbv_output_0[4] = s274;+  sbv_output_0[5] = s275;+  sbv_output_0[6] = s276;+  sbv_output_0[7] = s260;+  sbv_output_0[8] = s291;+  sbv_output_0[9] = s292;+  sbv_output_0[10] = s293;+  sbv_output_0[11] = s277;+  sbv_output_0[12] = s308;+  sbv_output_0[13] = s309;+  sbv_output_0[14] = s310;+  sbv_output_0[15] = s294;+  sbv_output_0[16] = s325;+  sbv_output_0[17] = s326;+  sbv_output_0[18] = s327;+  sbv_output_0[19] = s311;+  sbv_output_0[20] = s342;+  sbv_output_0[21] = s343;+  sbv_output_0[22] = s344;+  sbv_output_0[23] = s328;+  sbv_output_0[24] = s359;+  sbv_output_0[25] = s360;+  sbv_output_0[26] = s361;+  sbv_output_0[27] = s345;+  sbv_output_0[28] = s376;+  sbv_output_0[29] = s377;+  sbv_output_0[30] = s378;+  sbv_output_0[31] = s362;+  sbv_output_0[32] = s393;+  sbv_output_0[33] = s394;+  sbv_output_0[34] = s395;+  sbv_output_0[35] = s379;+  sbv_output_0[36] = s410;+  sbv_output_0[37] = s411;+  sbv_output_0[38] = s412;+  sbv_output_0[39] = s396;+  sbv_output_0[40] = s427;+  sbv_output_0[41] = s428;+  sbv_output_0[42] = s429;+  sbv_output_0[43] = s413;+}+== END: "aes128InvKeySchedule.c" ==================+== BEGIN: "aes128OTFDecrypt.c" ================+/* File: "aes128OTFDecrypt.c". Automatically generated by SBV. Do not edit! */++#include "aes128Lib.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}+++void aes128OTFDecrypt(const SWord32 *sbv_input_0,+                      const SWord32 *sbv_input_1, SWord32 *sbv_output_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+  const SWord32 s3 = sbv_input_0[3];+  const SWord32 s4 = sbv_input_1[0];+  const SWord32 s5 = sbv_input_1[1];+  const SWord32 s6 = sbv_input_1[2];+  const SWord32 s7 = sbv_input_1[3];+  const SWord32 s8 = sbv_input_1[4];+  const SWord32 s9 = sbv_input_1[5];+  const SWord32 s10 = sbv_input_1[6];+  const SWord32 s11 = sbv_input_1[7];+  const SWord32 s12 = sbv_input_1[8];+  const SWord32 s13 = sbv_input_1[9];+  const SWord32 s14 = sbv_input_1[10];+  const SWord32 s15 = sbv_input_1[11];+  const SWord32 s16 = sbv_input_1[12];+  const SWord32 s17 = sbv_input_1[13];+  const SWord32 s18 = sbv_input_1[14];+  const SWord32 s19 = sbv_input_1[15];+  const SWord32 s20 = sbv_input_1[16];+  const SWord32 s21 = sbv_input_1[17];+  const SWord32 s22 = sbv_input_1[18];+  const SWord32 s23 = sbv_input_1[19];+  const SWord32 s24 = sbv_input_1[20];+  const SWord32 s25 = sbv_input_1[21];+  const SWord32 s26 = sbv_input_1[22];+  const SWord32 s27 = sbv_input_1[23];+  const SWord32 s28 = sbv_input_1[24];+  const SWord32 s29 = sbv_input_1[25];+  const SWord32 s30 = sbv_input_1[26];+  const SWord32 s31 = sbv_input_1[27];+  const SWord32 s32 = sbv_input_1[28];+  const SWord32 s33 = sbv_input_1[29];+  const SWord32 s34 = sbv_input_1[30];+  const SWord32 s35 = sbv_input_1[31];+  const SWord32 s36 = sbv_input_1[32];+  const SWord32 s37 = sbv_input_1[33];+  const SWord32 s38 = sbv_input_1[34];+  const SWord32 s39 = sbv_input_1[35];+  const SWord32 s40 = sbv_input_1[36];+  const SWord32 s41 = sbv_input_1[37];+  const SWord32 s42 = sbv_input_1[38];+  const SWord32 s43 = sbv_input_1[39];+  const SWord32 s44 = sbv_input_1[40];+  const SWord32 s45 = sbv_input_1[41];+  const SWord32 s46 = sbv_input_1[42];+  const SWord32 s47 = sbv_input_1[43];+  const SWord32 s560 = s0 ^ s4;+  const SWord8  s561 = sbv_bv_extract_u32_31_24_u8(s560);+  const SWord8  s563 = sbv_bv_extract_u32_31_24_u8(s8);+  const SWord32 s821 = s3 ^ s7;+  const SWord8  s822 = sbv_bv_extract_u32_23_16_u8(s821);+  const SWord8  s824 = sbv_bv_extract_u32_23_16_u8(s8);+  const SWord32 s1083 = s2 ^ s6;+  const SWord8  s1084 = sbv_bv_extract_u32_15_8_u8(s1083);+  const SWord8  s1086 = sbv_bv_extract_u32_15_8_u8(s8);+  const SWord32 s1345 = s1 ^ s5;+  const SWord8  s1346 = sbv_bv_extract_u32_7_0_u8(s1345);+  const SWord8  s1348 = sbv_bv_extract_u32_7_0_u8(s8);+  const SWord8  s1354 = sbv_bv_extract_u32_31_24_u8(s12);+  const SWord8  s1357 = sbv_bv_extract_u32_31_24_u8(s821);+  const SWord8  s1359 = sbv_bv_extract_u32_31_24_u8(s11);+  const SWord8  s1362 = sbv_bv_extract_u32_23_16_u8(s1083);+  const SWord8  s1364 = sbv_bv_extract_u32_23_16_u8(s11);+  const SWord8  s1368 = sbv_bv_extract_u32_15_8_u8(s1345);+  const SWord8  s1370 = sbv_bv_extract_u32_15_8_u8(s11);+  const SWord8  s1374 = sbv_bv_extract_u32_7_0_u8(s560);+  const SWord8  s1376 = sbv_bv_extract_u32_7_0_u8(s11);+  const SWord8  s1382 = sbv_bv_extract_u32_23_16_u8(s12);+  const SWord8  s1386 = sbv_bv_extract_u32_31_24_u8(s1083);+  const SWord8  s1388 = sbv_bv_extract_u32_31_24_u8(s10);+  const SWord8  s1391 = sbv_bv_extract_u32_23_16_u8(s1345);+  const SWord8  s1393 = sbv_bv_extract_u32_23_16_u8(s10);+  const SWord8  s1397 = sbv_bv_extract_u32_15_8_u8(s560);+  const SWord8  s1399 = sbv_bv_extract_u32_15_8_u8(s10);+  const SWord8  s1403 = sbv_bv_extract_u32_7_0_u8(s821);+  const SWord8  s1405 = sbv_bv_extract_u32_7_0_u8(s10);+  const SWord8  s1411 = sbv_bv_extract_u32_15_8_u8(s12);+  const SWord8  s1415 = sbv_bv_extract_u32_31_24_u8(s1345);+  const SWord8  s1417 = sbv_bv_extract_u32_31_24_u8(s9);+  const SWord8  s1420 = sbv_bv_extract_u32_23_16_u8(s560);+  const SWord8  s1422 = sbv_bv_extract_u32_23_16_u8(s9);+  const SWord8  s1426 = sbv_bv_extract_u32_15_8_u8(s821);+  const SWord8  s1428 = sbv_bv_extract_u32_15_8_u8(s9);+  const SWord8  s1432 = sbv_bv_extract_u32_7_0_u8(s1083);+  const SWord8  s1434 = sbv_bv_extract_u32_7_0_u8(s9);+  const SWord8  s1440 = sbv_bv_extract_u32_7_0_u8(s12);+  const SWord8  s1446 = sbv_bv_extract_u32_31_24_u8(s16);+  const SWord8  s1451 = sbv_bv_extract_u32_31_24_u8(s15);+  const SWord8  s1456 = sbv_bv_extract_u32_23_16_u8(s15);+  const SWord8  s1462 = sbv_bv_extract_u32_15_8_u8(s15);+  const SWord8  s1468 = sbv_bv_extract_u32_7_0_u8(s15);+  const SWord8  s1474 = sbv_bv_extract_u32_23_16_u8(s16);+  const SWord8  s1480 = sbv_bv_extract_u32_31_24_u8(s14);+  const SWord8  s1485 = sbv_bv_extract_u32_23_16_u8(s14);+  const SWord8  s1491 = sbv_bv_extract_u32_15_8_u8(s14);+  const SWord8  s1497 = sbv_bv_extract_u32_7_0_u8(s14);+  const SWord8  s1503 = sbv_bv_extract_u32_15_8_u8(s16);+  const SWord8  s1509 = sbv_bv_extract_u32_31_24_u8(s13);+  const SWord8  s1514 = sbv_bv_extract_u32_23_16_u8(s13);+  const SWord8  s1520 = sbv_bv_extract_u32_15_8_u8(s13);+  const SWord8  s1526 = sbv_bv_extract_u32_7_0_u8(s13);+  const SWord8  s1532 = sbv_bv_extract_u32_7_0_u8(s16);+  const SWord8  s1538 = sbv_bv_extract_u32_31_24_u8(s20);+  const SWord8  s1543 = sbv_bv_extract_u32_31_24_u8(s19);+  const SWord8  s1548 = sbv_bv_extract_u32_23_16_u8(s19);+  const SWord8  s1554 = sbv_bv_extract_u32_15_8_u8(s19);+  const SWord8  s1560 = sbv_bv_extract_u32_7_0_u8(s19);+  const SWord8  s1566 = sbv_bv_extract_u32_23_16_u8(s20);+  const SWord8  s1572 = sbv_bv_extract_u32_31_24_u8(s18);+  const SWord8  s1577 = sbv_bv_extract_u32_23_16_u8(s18);+  const SWord8  s1583 = sbv_bv_extract_u32_15_8_u8(s18);+  const SWord8  s1589 = sbv_bv_extract_u32_7_0_u8(s18);+  const SWord8  s1595 = sbv_bv_extract_u32_15_8_u8(s20);+  const SWord8  s1601 = sbv_bv_extract_u32_31_24_u8(s17);+  const SWord8  s1606 = sbv_bv_extract_u32_23_16_u8(s17);+  const SWord8  s1612 = sbv_bv_extract_u32_15_8_u8(s17);+  const SWord8  s1618 = sbv_bv_extract_u32_7_0_u8(s17);+  const SWord8  s1624 = sbv_bv_extract_u32_7_0_u8(s20);+  const SWord8  s1630 = sbv_bv_extract_u32_31_24_u8(s24);+  const SWord8  s1635 = sbv_bv_extract_u32_31_24_u8(s23);+  const SWord8  s1640 = sbv_bv_extract_u32_23_16_u8(s23);+  const SWord8  s1646 = sbv_bv_extract_u32_15_8_u8(s23);+  const SWord8  s1652 = sbv_bv_extract_u32_7_0_u8(s23);+  const SWord8  s1658 = sbv_bv_extract_u32_23_16_u8(s24);+  const SWord8  s1664 = sbv_bv_extract_u32_31_24_u8(s22);+  const SWord8  s1669 = sbv_bv_extract_u32_23_16_u8(s22);+  const SWord8  s1675 = sbv_bv_extract_u32_15_8_u8(s22);+  const SWord8  s1681 = sbv_bv_extract_u32_7_0_u8(s22);+  const SWord8  s1687 = sbv_bv_extract_u32_15_8_u8(s24);+  const SWord8  s1693 = sbv_bv_extract_u32_31_24_u8(s21);+  const SWord8  s1698 = sbv_bv_extract_u32_23_16_u8(s21);+  const SWord8  s1704 = sbv_bv_extract_u32_15_8_u8(s21);+  const SWord8  s1710 = sbv_bv_extract_u32_7_0_u8(s21);+  const SWord8  s1716 = sbv_bv_extract_u32_7_0_u8(s24);+  const SWord8  s1722 = sbv_bv_extract_u32_31_24_u8(s28);+  const SWord8  s1727 = sbv_bv_extract_u32_31_24_u8(s27);+  const SWord8  s1732 = sbv_bv_extract_u32_23_16_u8(s27);+  const SWord8  s1738 = sbv_bv_extract_u32_15_8_u8(s27);+  const SWord8  s1744 = sbv_bv_extract_u32_7_0_u8(s27);+  const SWord8  s1750 = sbv_bv_extract_u32_23_16_u8(s28);+  const SWord8  s1756 = sbv_bv_extract_u32_31_24_u8(s26);+  const SWord8  s1761 = sbv_bv_extract_u32_23_16_u8(s26);+  const SWord8  s1767 = sbv_bv_extract_u32_15_8_u8(s26);+  const SWord8  s1773 = sbv_bv_extract_u32_7_0_u8(s26);+  const SWord8  s1779 = sbv_bv_extract_u32_15_8_u8(s28);+  const SWord8  s1785 = sbv_bv_extract_u32_31_24_u8(s25);+  const SWord8  s1790 = sbv_bv_extract_u32_23_16_u8(s25);+  const SWord8  s1796 = sbv_bv_extract_u32_15_8_u8(s25);+  const SWord8  s1802 = sbv_bv_extract_u32_7_0_u8(s25);+  const SWord8  s1808 = sbv_bv_extract_u32_7_0_u8(s28);+  const SWord8  s1814 = sbv_bv_extract_u32_31_24_u8(s32);+  const SWord8  s1819 = sbv_bv_extract_u32_31_24_u8(s31);+  const SWord8  s1824 = sbv_bv_extract_u32_23_16_u8(s31);+  const SWord8  s1830 = sbv_bv_extract_u32_15_8_u8(s31);+  const SWord8  s1836 = sbv_bv_extract_u32_7_0_u8(s31);+  const SWord8  s1842 = sbv_bv_extract_u32_23_16_u8(s32);+  const SWord8  s1848 = sbv_bv_extract_u32_31_24_u8(s30);+  const SWord8  s1853 = sbv_bv_extract_u32_23_16_u8(s30);+  const SWord8  s1859 = sbv_bv_extract_u32_15_8_u8(s30);+  const SWord8  s1865 = sbv_bv_extract_u32_7_0_u8(s30);+  const SWord8  s1871 = sbv_bv_extract_u32_15_8_u8(s32);+  const SWord8  s1877 = sbv_bv_extract_u32_31_24_u8(s29);+  const SWord8  s1882 = sbv_bv_extract_u32_23_16_u8(s29);+  const SWord8  s1888 = sbv_bv_extract_u32_15_8_u8(s29);+  const SWord8  s1894 = sbv_bv_extract_u32_7_0_u8(s29);+  const SWord8  s1900 = sbv_bv_extract_u32_7_0_u8(s32);+  const SWord8  s1906 = sbv_bv_extract_u32_31_24_u8(s36);+  const SWord8  s1911 = sbv_bv_extract_u32_31_24_u8(s35);+  const SWord8  s1916 = sbv_bv_extract_u32_23_16_u8(s35);+  const SWord8  s1922 = sbv_bv_extract_u32_15_8_u8(s35);+  const SWord8  s1928 = sbv_bv_extract_u32_7_0_u8(s35);+  const SWord8  s1934 = sbv_bv_extract_u32_23_16_u8(s36);+  const SWord8  s1940 = sbv_bv_extract_u32_31_24_u8(s34);+  const SWord8  s1945 = sbv_bv_extract_u32_23_16_u8(s34);+  const SWord8  s1951 = sbv_bv_extract_u32_15_8_u8(s34);+  const SWord8  s1957 = sbv_bv_extract_u32_7_0_u8(s34);+  const SWord8  s1963 = sbv_bv_extract_u32_15_8_u8(s36);+  const SWord8  s1969 = sbv_bv_extract_u32_31_24_u8(s33);+  const SWord8  s1974 = sbv_bv_extract_u32_23_16_u8(s33);+  const SWord8  s1980 = sbv_bv_extract_u32_15_8_u8(s33);+  const SWord8  s1986 = sbv_bv_extract_u32_7_0_u8(s33);+  const SWord8  s1992 = sbv_bv_extract_u32_7_0_u8(s36);+  const SWord8  s1998 = sbv_bv_extract_u32_31_24_u8(s40);+  const SWord8  s2003 = sbv_bv_extract_u32_31_24_u8(s39);+  const SWord8  s2008 = sbv_bv_extract_u32_23_16_u8(s39);+  const SWord8  s2014 = sbv_bv_extract_u32_15_8_u8(s39);+  const SWord8  s2020 = sbv_bv_extract_u32_7_0_u8(s39);+  const SWord8  s2026 = sbv_bv_extract_u32_23_16_u8(s40);+  const SWord8  s2032 = sbv_bv_extract_u32_31_24_u8(s38);+  const SWord8  s2037 = sbv_bv_extract_u32_23_16_u8(s38);+  const SWord8  s2043 = sbv_bv_extract_u32_15_8_u8(s38);+  const SWord8  s2049 = sbv_bv_extract_u32_7_0_u8(s38);+  const SWord8  s2055 = sbv_bv_extract_u32_15_8_u8(s40);+  const SWord8  s2061 = sbv_bv_extract_u32_31_24_u8(s37);+  const SWord8  s2066 = sbv_bv_extract_u32_23_16_u8(s37);+  const SWord8  s2072 = sbv_bv_extract_u32_15_8_u8(s37);+  const SWord8  s2078 = sbv_bv_extract_u32_7_0_u8(s37);+  const SWord8  s2084 = sbv_bv_extract_u32_7_0_u8(s40);+  const SWord8  s2092 = sbv_bv_extract_u32_31_24_u8(s43);+  const SWord8  s2097 = sbv_bv_extract_u32_23_16_u8(s43);+  const SWord8  s2103 = sbv_bv_extract_u32_15_8_u8(s43);+  const SWord8  s2109 = sbv_bv_extract_u32_7_0_u8(s43);+  const SWord8  s2118 = sbv_bv_extract_u32_31_24_u8(s42);+  const SWord8  s2123 = sbv_bv_extract_u32_23_16_u8(s42);+  const SWord8  s2129 = sbv_bv_extract_u32_15_8_u8(s42);+  const SWord8  s2135 = sbv_bv_extract_u32_7_0_u8(s42);+  const SWord8  s2143 = sbv_bv_extract_u32_31_24_u8(s41);+  const SWord8  s2148 = sbv_bv_extract_u32_23_16_u8(s41);+  const SWord8  s2154 = sbv_bv_extract_u32_15_8_u8(s41);+  const SWord8  s2160 = sbv_bv_extract_u32_7_0_u8(s41);+        SWord8  s562;+        SWord8  s564;+        SWord32 s565;+        SWord8  s823;+        SWord8  s825;+        SWord32 s826;+        SWord32 s827;+        SWord8  s1085;+        SWord8  s1087;+        SWord32 s1088;+        SWord32 s1089;+        SWord8  s1347;+        SWord8  s1349;+        SWord32 s1350;+        SWord32 s1351;+        SWord8  s1352;+        SWord8  s1353;+        SWord8  s1355;+        SWord32 s1356;+        SWord8  s1358;+        SWord8  s1360;+        SWord32 s1361;+        SWord8  s1363;+        SWord8  s1365;+        SWord32 s1366;+        SWord32 s1367;+        SWord8  s1369;+        SWord8  s1371;+        SWord32 s1372;+        SWord32 s1373;+        SWord8  s1375;+        SWord8  s1377;+        SWord32 s1378;+        SWord32 s1379;+        SWord8  s1380;+        SWord8  s1381;+        SWord8  s1383;+        SWord32 s1384;+        SWord32 s1385;+        SWord8  s1387;+        SWord8  s1389;+        SWord32 s1390;+        SWord8  s1392;+        SWord8  s1394;+        SWord32 s1395;+        SWord32 s1396;+        SWord8  s1398;+        SWord8  s1400;+        SWord32 s1401;+        SWord32 s1402;+        SWord8  s1404;+        SWord8  s1406;+        SWord32 s1407;+        SWord32 s1408;+        SWord8  s1409;+        SWord8  s1410;+        SWord8  s1412;+        SWord32 s1413;+        SWord32 s1414;+        SWord8  s1416;+        SWord8  s1418;+        SWord32 s1419;+        SWord8  s1421;+        SWord8  s1423;+        SWord32 s1424;+        SWord32 s1425;+        SWord8  s1427;+        SWord8  s1429;+        SWord32 s1430;+        SWord32 s1431;+        SWord8  s1433;+        SWord8  s1435;+        SWord32 s1436;+        SWord32 s1437;+        SWord8  s1438;+        SWord8  s1439;+        SWord8  s1441;+        SWord32 s1442;+        SWord32 s1443;+        SWord8  s1444;+        SWord8  s1445;+        SWord8  s1447;+        SWord32 s1448;+        SWord8  s1449;+        SWord8  s1450;+        SWord8  s1452;+        SWord32 s1453;+        SWord8  s1454;+        SWord8  s1455;+        SWord8  s1457;+        SWord32 s1458;+        SWord32 s1459;+        SWord8  s1460;+        SWord8  s1461;+        SWord8  s1463;+        SWord32 s1464;+        SWord32 s1465;+        SWord8  s1466;+        SWord8  s1467;+        SWord8  s1469;+        SWord32 s1470;+        SWord32 s1471;+        SWord8  s1472;+        SWord8  s1473;+        SWord8  s1475;+        SWord32 s1476;+        SWord32 s1477;+        SWord8  s1478;+        SWord8  s1479;+        SWord8  s1481;+        SWord32 s1482;+        SWord8  s1483;+        SWord8  s1484;+        SWord8  s1486;+        SWord32 s1487;+        SWord32 s1488;+        SWord8  s1489;+        SWord8  s1490;+        SWord8  s1492;+        SWord32 s1493;+        SWord32 s1494;+        SWord8  s1495;+        SWord8  s1496;+        SWord8  s1498;+        SWord32 s1499;+        SWord32 s1500;+        SWord8  s1501;+        SWord8  s1502;+        SWord8  s1504;+        SWord32 s1505;+        SWord32 s1506;+        SWord8  s1507;+        SWord8  s1508;+        SWord8  s1510;+        SWord32 s1511;+        SWord8  s1512;+        SWord8  s1513;+        SWord8  s1515;+        SWord32 s1516;+        SWord32 s1517;+        SWord8  s1518;+        SWord8  s1519;+        SWord8  s1521;+        SWord32 s1522;+        SWord32 s1523;+        SWord8  s1524;+        SWord8  s1525;+        SWord8  s1527;+        SWord32 s1528;+        SWord32 s1529;+        SWord8  s1530;+        SWord8  s1531;+        SWord8  s1533;+        SWord32 s1534;+        SWord32 s1535;+        SWord8  s1536;+        SWord8  s1537;+        SWord8  s1539;+        SWord32 s1540;+        SWord8  s1541;+        SWord8  s1542;+        SWord8  s1544;+        SWord32 s1545;+        SWord8  s1546;+        SWord8  s1547;+        SWord8  s1549;+        SWord32 s1550;+        SWord32 s1551;+        SWord8  s1552;+        SWord8  s1553;+        SWord8  s1555;+        SWord32 s1556;+        SWord32 s1557;+        SWord8  s1558;+        SWord8  s1559;+        SWord8  s1561;+        SWord32 s1562;+        SWord32 s1563;+        SWord8  s1564;+        SWord8  s1565;+        SWord8  s1567;+        SWord32 s1568;+        SWord32 s1569;+        SWord8  s1570;+        SWord8  s1571;+        SWord8  s1573;+        SWord32 s1574;+        SWord8  s1575;+        SWord8  s1576;+        SWord8  s1578;+        SWord32 s1579;+        SWord32 s1580;+        SWord8  s1581;+        SWord8  s1582;+        SWord8  s1584;+        SWord32 s1585;+        SWord32 s1586;+        SWord8  s1587;+        SWord8  s1588;+        SWord8  s1590;+        SWord32 s1591;+        SWord32 s1592;+        SWord8  s1593;+        SWord8  s1594;+        SWord8  s1596;+        SWord32 s1597;+        SWord32 s1598;+        SWord8  s1599;+        SWord8  s1600;+        SWord8  s1602;+        SWord32 s1603;+        SWord8  s1604;+        SWord8  s1605;+        SWord8  s1607;+        SWord32 s1608;+        SWord32 s1609;+        SWord8  s1610;+        SWord8  s1611;+        SWord8  s1613;+        SWord32 s1614;+        SWord32 s1615;+        SWord8  s1616;+        SWord8  s1617;+        SWord8  s1619;+        SWord32 s1620;+        SWord32 s1621;+        SWord8  s1622;+        SWord8  s1623;+        SWord8  s1625;+        SWord32 s1626;+        SWord32 s1627;+        SWord8  s1628;+        SWord8  s1629;+        SWord8  s1631;+        SWord32 s1632;+        SWord8  s1633;+        SWord8  s1634;+        SWord8  s1636;+        SWord32 s1637;+        SWord8  s1638;+        SWord8  s1639;+        SWord8  s1641;+        SWord32 s1642;+        SWord32 s1643;+        SWord8  s1644;+        SWord8  s1645;+        SWord8  s1647;+        SWord32 s1648;+        SWord32 s1649;+        SWord8  s1650;+        SWord8  s1651;+        SWord8  s1653;+        SWord32 s1654;+        SWord32 s1655;+        SWord8  s1656;+        SWord8  s1657;+        SWord8  s1659;+        SWord32 s1660;+        SWord32 s1661;+        SWord8  s1662;+        SWord8  s1663;+        SWord8  s1665;+        SWord32 s1666;+        SWord8  s1667;+        SWord8  s1668;+        SWord8  s1670;+        SWord32 s1671;+        SWord32 s1672;+        SWord8  s1673;+        SWord8  s1674;+        SWord8  s1676;+        SWord32 s1677;+        SWord32 s1678;+        SWord8  s1679;+        SWord8  s1680;+        SWord8  s1682;+        SWord32 s1683;+        SWord32 s1684;+        SWord8  s1685;+        SWord8  s1686;+        SWord8  s1688;+        SWord32 s1689;+        SWord32 s1690;+        SWord8  s1691;+        SWord8  s1692;+        SWord8  s1694;+        SWord32 s1695;+        SWord8  s1696;+        SWord8  s1697;+        SWord8  s1699;+        SWord32 s1700;+        SWord32 s1701;+        SWord8  s1702;+        SWord8  s1703;+        SWord8  s1705;+        SWord32 s1706;+        SWord32 s1707;+        SWord8  s1708;+        SWord8  s1709;+        SWord8  s1711;+        SWord32 s1712;+        SWord32 s1713;+        SWord8  s1714;+        SWord8  s1715;+        SWord8  s1717;+        SWord32 s1718;+        SWord32 s1719;+        SWord8  s1720;+        SWord8  s1721;+        SWord8  s1723;+        SWord32 s1724;+        SWord8  s1725;+        SWord8  s1726;+        SWord8  s1728;+        SWord32 s1729;+        SWord8  s1730;+        SWord8  s1731;+        SWord8  s1733;+        SWord32 s1734;+        SWord32 s1735;+        SWord8  s1736;+        SWord8  s1737;+        SWord8  s1739;+        SWord32 s1740;+        SWord32 s1741;+        SWord8  s1742;+        SWord8  s1743;+        SWord8  s1745;+        SWord32 s1746;+        SWord32 s1747;+        SWord8  s1748;+        SWord8  s1749;+        SWord8  s1751;+        SWord32 s1752;+        SWord32 s1753;+        SWord8  s1754;+        SWord8  s1755;+        SWord8  s1757;+        SWord32 s1758;+        SWord8  s1759;+        SWord8  s1760;+        SWord8  s1762;+        SWord32 s1763;+        SWord32 s1764;+        SWord8  s1765;+        SWord8  s1766;+        SWord8  s1768;+        SWord32 s1769;+        SWord32 s1770;+        SWord8  s1771;+        SWord8  s1772;+        SWord8  s1774;+        SWord32 s1775;+        SWord32 s1776;+        SWord8  s1777;+        SWord8  s1778;+        SWord8  s1780;+        SWord32 s1781;+        SWord32 s1782;+        SWord8  s1783;+        SWord8  s1784;+        SWord8  s1786;+        SWord32 s1787;+        SWord8  s1788;+        SWord8  s1789;+        SWord8  s1791;+        SWord32 s1792;+        SWord32 s1793;+        SWord8  s1794;+        SWord8  s1795;+        SWord8  s1797;+        SWord32 s1798;+        SWord32 s1799;+        SWord8  s1800;+        SWord8  s1801;+        SWord8  s1803;+        SWord32 s1804;+        SWord32 s1805;+        SWord8  s1806;+        SWord8  s1807;+        SWord8  s1809;+        SWord32 s1810;+        SWord32 s1811;+        SWord8  s1812;+        SWord8  s1813;+        SWord8  s1815;+        SWord32 s1816;+        SWord8  s1817;+        SWord8  s1818;+        SWord8  s1820;+        SWord32 s1821;+        SWord8  s1822;+        SWord8  s1823;+        SWord8  s1825;+        SWord32 s1826;+        SWord32 s1827;+        SWord8  s1828;+        SWord8  s1829;+        SWord8  s1831;+        SWord32 s1832;+        SWord32 s1833;+        SWord8  s1834;+        SWord8  s1835;+        SWord8  s1837;+        SWord32 s1838;+        SWord32 s1839;+        SWord8  s1840;+        SWord8  s1841;+        SWord8  s1843;+        SWord32 s1844;+        SWord32 s1845;+        SWord8  s1846;+        SWord8  s1847;+        SWord8  s1849;+        SWord32 s1850;+        SWord8  s1851;+        SWord8  s1852;+        SWord8  s1854;+        SWord32 s1855;+        SWord32 s1856;+        SWord8  s1857;+        SWord8  s1858;+        SWord8  s1860;+        SWord32 s1861;+        SWord32 s1862;+        SWord8  s1863;+        SWord8  s1864;+        SWord8  s1866;+        SWord32 s1867;+        SWord32 s1868;+        SWord8  s1869;+        SWord8  s1870;+        SWord8  s1872;+        SWord32 s1873;+        SWord32 s1874;+        SWord8  s1875;+        SWord8  s1876;+        SWord8  s1878;+        SWord32 s1879;+        SWord8  s1880;+        SWord8  s1881;+        SWord8  s1883;+        SWord32 s1884;+        SWord32 s1885;+        SWord8  s1886;+        SWord8  s1887;+        SWord8  s1889;+        SWord32 s1890;+        SWord32 s1891;+        SWord8  s1892;+        SWord8  s1893;+        SWord8  s1895;+        SWord32 s1896;+        SWord32 s1897;+        SWord8  s1898;+        SWord8  s1899;+        SWord8  s1901;+        SWord32 s1902;+        SWord32 s1903;+        SWord8  s1904;+        SWord8  s1905;+        SWord8  s1907;+        SWord32 s1908;+        SWord8  s1909;+        SWord8  s1910;+        SWord8  s1912;+        SWord32 s1913;+        SWord8  s1914;+        SWord8  s1915;+        SWord8  s1917;+        SWord32 s1918;+        SWord32 s1919;+        SWord8  s1920;+        SWord8  s1921;+        SWord8  s1923;+        SWord32 s1924;+        SWord32 s1925;+        SWord8  s1926;+        SWord8  s1927;+        SWord8  s1929;+        SWord32 s1930;+        SWord32 s1931;+        SWord8  s1932;+        SWord8  s1933;+        SWord8  s1935;+        SWord32 s1936;+        SWord32 s1937;+        SWord8  s1938;+        SWord8  s1939;+        SWord8  s1941;+        SWord32 s1942;+        SWord8  s1943;+        SWord8  s1944;+        SWord8  s1946;+        SWord32 s1947;+        SWord32 s1948;+        SWord8  s1949;+        SWord8  s1950;+        SWord8  s1952;+        SWord32 s1953;+        SWord32 s1954;+        SWord8  s1955;+        SWord8  s1956;+        SWord8  s1958;+        SWord32 s1959;+        SWord32 s1960;+        SWord8  s1961;+        SWord8  s1962;+        SWord8  s1964;+        SWord32 s1965;+        SWord32 s1966;+        SWord8  s1967;+        SWord8  s1968;+        SWord8  s1970;+        SWord32 s1971;+        SWord8  s1972;+        SWord8  s1973;+        SWord8  s1975;+        SWord32 s1976;+        SWord32 s1977;+        SWord8  s1978;+        SWord8  s1979;+        SWord8  s1981;+        SWord32 s1982;+        SWord32 s1983;+        SWord8  s1984;+        SWord8  s1985;+        SWord8  s1987;+        SWord32 s1988;+        SWord32 s1989;+        SWord8  s1990;+        SWord8  s1991;+        SWord8  s1993;+        SWord32 s1994;+        SWord32 s1995;+        SWord8  s1996;+        SWord8  s1997;+        SWord8  s1999;+        SWord32 s2000;+        SWord8  s2001;+        SWord8  s2002;+        SWord8  s2004;+        SWord32 s2005;+        SWord8  s2006;+        SWord8  s2007;+        SWord8  s2009;+        SWord32 s2010;+        SWord32 s2011;+        SWord8  s2012;+        SWord8  s2013;+        SWord8  s2015;+        SWord32 s2016;+        SWord32 s2017;+        SWord8  s2018;+        SWord8  s2019;+        SWord8  s2021;+        SWord32 s2022;+        SWord32 s2023;+        SWord8  s2024;+        SWord8  s2025;+        SWord8  s2027;+        SWord32 s2028;+        SWord32 s2029;+        SWord8  s2030;+        SWord8  s2031;+        SWord8  s2033;+        SWord32 s2034;+        SWord8  s2035;+        SWord8  s2036;+        SWord8  s2038;+        SWord32 s2039;+        SWord32 s2040;+        SWord8  s2041;+        SWord8  s2042;+        SWord8  s2044;+        SWord32 s2045;+        SWord32 s2046;+        SWord8  s2047;+        SWord8  s2048;+        SWord8  s2050;+        SWord32 s2051;+        SWord32 s2052;+        SWord8  s2053;+        SWord8  s2054;+        SWord8  s2056;+        SWord32 s2057;+        SWord32 s2058;+        SWord8  s2059;+        SWord8  s2060;+        SWord8  s2062;+        SWord32 s2063;+        SWord8  s2064;+        SWord8  s2065;+        SWord8  s2067;+        SWord32 s2068;+        SWord32 s2069;+        SWord8  s2070;+        SWord8  s2071;+        SWord8  s2073;+        SWord32 s2074;+        SWord32 s2075;+        SWord8  s2076;+        SWord8  s2077;+        SWord8  s2079;+        SWord32 s2080;+        SWord32 s2081;+        SWord8  s2082;+        SWord8  s2083;+        SWord8  s2085;+        SWord32 s2086;+        SWord32 s2087;+        SWord8  s2088;+        SWord8  s2089;+        SWord8  s2090;+        SWord8  s2091;+        SWord8  s2093;+        SWord32 s2094;+        SWord8  s2095;+        SWord8  s2096;+        SWord8  s2098;+        SWord32 s2099;+        SWord32 s2100;+        SWord8  s2101;+        SWord8  s2102;+        SWord8  s2104;+        SWord32 s2105;+        SWord32 s2106;+        SWord8  s2107;+        SWord8  s2108;+        SWord8  s2110;+        SWord32 s2111;+        SWord32 s2112;+        SWord8  s2113;+        SWord8  s2114;+        SWord16 s2115;+        SWord8  s2116;+        SWord8  s2117;+        SWord8  s2119;+        SWord32 s2120;+        SWord8  s2121;+        SWord8  s2122;+        SWord8  s2124;+        SWord32 s2125;+        SWord32 s2126;+        SWord8  s2127;+        SWord8  s2128;+        SWord8  s2130;+        SWord32 s2131;+        SWord32 s2132;+        SWord8  s2133;+        SWord8  s2134;+        SWord8  s2136;+        SWord32 s2137;+        SWord32 s2138;+        SWord8  s2139;+        SWord8  s2140;+        SWord8  s2141;+        SWord8  s2142;+        SWord8  s2144;+        SWord32 s2145;+        SWord8  s2146;+        SWord8  s2147;+        SWord8  s2149;+        SWord32 s2150;+        SWord32 s2151;+        SWord8  s2152;+        SWord8  s2153;+        SWord8  s2155;+        SWord32 s2156;+        SWord32 s2157;+        SWord8  s2158;+        SWord8  s2159;+        SWord8  s2161;+        SWord32 s2162;+        SWord32 s2163;+        SWord8  s2164;+        SWord8  s2165;+        SWord16 s2166;+        SWord32 s2167;+        SWord32 s2168;+        SWord8  s2169;+        SWord8  s2170;+        SWord8  s2171;+        SWord8  s2172;+        SWord16 s2173;+        SWord8  s2174;+        SWord8  s2175;+        SWord8  s2176;+        SWord8  s2177;+        SWord16 s2178;+        SWord32 s2179;+        SWord32 s2180;+        SWord8  s2181;+        SWord8  s2182;+        SWord8  s2183;+        SWord8  s2184;+        SWord16 s2185;+        SWord8  s2186;+        SWord8  s2187;+        SWord8  s2188;+        SWord8  s2189;+        SWord16 s2190;+        SWord32 s2191;+        SWord32 s2192;+        SWord8  s2193;+        SWord8  s2194;+        SWord8  s2195;+        SWord8  s2196;+        SWord16 s2197;+        SWord8  s2198;+        SWord8  s2199;+        SWord8  s2200;+        SWord8  s2201;+        SWord16 s2202;+        SWord32 s2203;+        SWord32 s2204;+  static const SWord8 table0[] = {+       82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129,+      243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,+       67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,+       61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,+       40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114,+      248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101,+      182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,+       87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10,+      247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,+       63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,+       17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230,+      115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,+       28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111,+      183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210,+      121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,+       51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,+       96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147,+      201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235,+      187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,+       38, 225, 105,  20,  99,  85,  33,  12, 125+  };+  s562 = table0[s561];+  s564 = s562 ^ s563;+  static const SWord32 table1[] = {+      0x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL,+      0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL,+      0x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL,+      0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL,+      0xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL,+      0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL,+      0x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL,+      0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL,+      0xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL,+      0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL,+      0xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL,+      0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL,+      0x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL,+      0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL,+      0x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL,+      0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL,+      0xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL,+      0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL,+      0xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL,+      0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL,+      0x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL,+      0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL,+      0x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL,+      0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL,+      0x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL,+      0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL,+      0x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL,+      0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL,+      0x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL,+      0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL,+      0xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL,+      0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL,+      0x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL,+      0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL,+      0x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL,+      0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL,+      0xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL,+      0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL,+      0xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL,+      0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL,+      0x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL,+      0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL,+      0xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL,+      0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL,+      0x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL,+      0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL,+      0x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL,+      0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL,+      0xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL,+      0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL,+      0x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL,+      0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL,+      0x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL,+      0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL,+      0x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL,+      0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL,+      0x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL,+      0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL,+      0x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL,+      0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL,+      0xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL,+      0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL,+      0xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL,+      0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL+  };+  s565 = table1[s564];+  s823 = table0[s822];+  s825 = s823 ^ s824;+  static const SWord32 table2[] = {+      0x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL,+      0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL,+      0x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL,+      0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL,+      0xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL,+      0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL,+      0xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL,+      0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL,+      0x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL,+      0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL,+      0x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL,+      0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL,+      0xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL,+      0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL,+      0x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL,+      0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL,+      0xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL,+      0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL,+      0xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL,+      0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL,+      0x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL,+      0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL,+      0x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL,+      0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL,+      0x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL,+      0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL,+      0xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL,+      0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL,+      0x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL,+      0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL,+      0x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL,+      0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL,+      0xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL,+      0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL,+      0xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL,+      0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL,+      0x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL,+      0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL,+      0x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL,+      0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL,+      0x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL,+      0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL,+      0xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL,+      0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL,+      0x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL,+      0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL,+      0x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL,+      0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL,+      0x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL,+      0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL,+      0x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL,+      0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL,+      0xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL,+      0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL,+      0xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL,+      0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL,+      0x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL,+      0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL,+      0x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL,+      0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL,+      0xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL,+      0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL,+      0x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL,+      0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL+  };+  s826 = table2[s825];+  s827 = s565 ^ s826;+  s1085 = table0[s1084];+  s1087 = s1085 ^ s1086;+  static const SWord32 table3[] = {+      0x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL,+      0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL,+      0x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL,+      0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL,+      0xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL,+      0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL,+      0xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL,+      0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL,+      0xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL,+      0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL,+      0xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL,+      0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL,+      0x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL,+      0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL,+      0x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL,+      0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL,+      0x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL,+      0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL,+      0x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL,+      0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL,+      0xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL,+      0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL,+      0xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL,+      0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL,+      0xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL,+      0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL,+      0xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL,+      0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL,+      0x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL,+      0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL,+      0x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL,+      0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL,+      0xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL,+      0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL,+      0xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL,+      0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL,+      0x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL,+      0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL,+      0x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL,+      0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL,+      0x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL,+      0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL,+      0x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL,+      0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL,+      0xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL,+      0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL,+      0xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL,+      0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL,+      0xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL,+      0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL,+      0xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL,+      0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL,+      0x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL,+      0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL,+      0x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL,+      0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL,+      0x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL,+      0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL,+      0x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL,+      0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL,+      0xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL,+      0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL,+      0xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL,+      0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL+  };+  s1088 = table3[s1087];+  s1089 = s827 ^ s1088;+  s1347 = table0[s1346];+  s1349 = s1347 ^ s1348;+  static const SWord32 table4[] = {+      0x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL,+      0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL,+      0x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL,+      0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL,+      0x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL,+      0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL,+      0xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL,+      0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL,+      0x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL,+      0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL,+      0x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL,+      0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL,+      0xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL,+      0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL,+      0xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL,+      0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL,+      0x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL,+      0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL,+      0x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL,+      0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL,+      0xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL,+      0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL,+      0xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL,+      0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL,+      0x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL,+      0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL,+      0x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL,+      0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL,+      0xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL,+      0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL,+      0x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL,+      0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL,+      0xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL,+      0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL,+      0xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL,+      0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL,+      0x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL,+      0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL,+      0x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL,+      0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL,+      0xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL,+      0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL,+      0x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL,+      0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL,+      0x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL,+      0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL,+      0x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL,+      0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL,+      0x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL,+      0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL,+      0xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL,+      0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL,+      0x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL,+      0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL,+      0x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL,+      0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL,+      0xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL,+      0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL,+      0xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL,+      0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL,+      0x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL,+      0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL,+      0x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL,+      0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL+  };+  s1350 = table4[s1349];+  s1351 = s1089 ^ s1350;+  s1352 = sbv_bv_extract_u32_31_24_u8(s1351);+  s1353 = table0[s1352];+  s1355 = s1353 ^ s1354;+  s1356 = table1[s1355];+  s1358 = table0[s1357];+  s1360 = s1358 ^ s1359;+  s1361 = table1[s1360];+  s1363 = table0[s1362];+  s1365 = s1363 ^ s1364;+  s1366 = table2[s1365];+  s1367 = s1361 ^ s1366;+  s1369 = table0[s1368];+  s1371 = s1369 ^ s1370;+  s1372 = table3[s1371];+  s1373 = s1367 ^ s1372;+  s1375 = table0[s1374];+  s1377 = s1375 ^ s1376;+  s1378 = table4[s1377];+  s1379 = s1373 ^ s1378;+  s1380 = sbv_bv_extract_u32_23_16_u8(s1379);+  s1381 = table0[s1380];+  s1383 = s1381 ^ s1382;+  s1384 = table2[s1383];+  s1385 = s1356 ^ s1384;+  s1387 = table0[s1386];+  s1389 = s1387 ^ s1388;+  s1390 = table1[s1389];+  s1392 = table0[s1391];+  s1394 = s1392 ^ s1393;+  s1395 = table2[s1394];+  s1396 = s1390 ^ s1395;+  s1398 = table0[s1397];+  s1400 = s1398 ^ s1399;+  s1401 = table3[s1400];+  s1402 = s1396 ^ s1401;+  s1404 = table0[s1403];+  s1406 = s1404 ^ s1405;+  s1407 = table4[s1406];+  s1408 = s1402 ^ s1407;+  s1409 = sbv_bv_extract_u32_15_8_u8(s1408);+  s1410 = table0[s1409];+  s1412 = s1410 ^ s1411;+  s1413 = table3[s1412];+  s1414 = s1385 ^ s1413;+  s1416 = table0[s1415];+  s1418 = s1416 ^ s1417;+  s1419 = table1[s1418];+  s1421 = table0[s1420];+  s1423 = s1421 ^ s1422;+  s1424 = table2[s1423];+  s1425 = s1419 ^ s1424;+  s1427 = table0[s1426];+  s1429 = s1427 ^ s1428;+  s1430 = table3[s1429];+  s1431 = s1425 ^ s1430;+  s1433 = table0[s1432];+  s1435 = s1433 ^ s1434;+  s1436 = table4[s1435];+  s1437 = s1431 ^ s1436;+  s1438 = sbv_bv_extract_u32_7_0_u8(s1437);+  s1439 = table0[s1438];+  s1441 = s1439 ^ s1440;+  s1442 = table4[s1441];+  s1443 = s1414 ^ s1442;+  s1444 = sbv_bv_extract_u32_31_24_u8(s1443);+  s1445 = table0[s1444];+  s1447 = s1445 ^ s1446;+  s1448 = table1[s1447];+  s1449 = sbv_bv_extract_u32_31_24_u8(s1379);+  s1450 = table0[s1449];+  s1452 = s1450 ^ s1451;+  s1453 = table1[s1452];+  s1454 = sbv_bv_extract_u32_23_16_u8(s1408);+  s1455 = table0[s1454];+  s1457 = s1455 ^ s1456;+  s1458 = table2[s1457];+  s1459 = s1453 ^ s1458;+  s1460 = sbv_bv_extract_u32_15_8_u8(s1437);+  s1461 = table0[s1460];+  s1463 = s1461 ^ s1462;+  s1464 = table3[s1463];+  s1465 = s1459 ^ s1464;+  s1466 = sbv_bv_extract_u32_7_0_u8(s1351);+  s1467 = table0[s1466];+  s1469 = s1467 ^ s1468;+  s1470 = table4[s1469];+  s1471 = s1465 ^ s1470;+  s1472 = sbv_bv_extract_u32_23_16_u8(s1471);+  s1473 = table0[s1472];+  s1475 = s1473 ^ s1474;+  s1476 = table2[s1475];+  s1477 = s1448 ^ s1476;+  s1478 = sbv_bv_extract_u32_31_24_u8(s1408);+  s1479 = table0[s1478];+  s1481 = s1479 ^ s1480;+  s1482 = table1[s1481];+  s1483 = sbv_bv_extract_u32_23_16_u8(s1437);+  s1484 = table0[s1483];+  s1486 = s1484 ^ s1485;+  s1487 = table2[s1486];+  s1488 = s1482 ^ s1487;+  s1489 = sbv_bv_extract_u32_15_8_u8(s1351);+  s1490 = table0[s1489];+  s1492 = s1490 ^ s1491;+  s1493 = table3[s1492];+  s1494 = s1488 ^ s1493;+  s1495 = sbv_bv_extract_u32_7_0_u8(s1379);+  s1496 = table0[s1495];+  s1498 = s1496 ^ s1497;+  s1499 = table4[s1498];+  s1500 = s1494 ^ s1499;+  s1501 = sbv_bv_extract_u32_15_8_u8(s1500);+  s1502 = table0[s1501];+  s1504 = s1502 ^ s1503;+  s1505 = table3[s1504];+  s1506 = s1477 ^ s1505;+  s1507 = sbv_bv_extract_u32_31_24_u8(s1437);+  s1508 = table0[s1507];+  s1510 = s1508 ^ s1509;+  s1511 = table1[s1510];+  s1512 = sbv_bv_extract_u32_23_16_u8(s1351);+  s1513 = table0[s1512];+  s1515 = s1513 ^ s1514;+  s1516 = table2[s1515];+  s1517 = s1511 ^ s1516;+  s1518 = sbv_bv_extract_u32_15_8_u8(s1379);+  s1519 = table0[s1518];+  s1521 = s1519 ^ s1520;+  s1522 = table3[s1521];+  s1523 = s1517 ^ s1522;+  s1524 = sbv_bv_extract_u32_7_0_u8(s1408);+  s1525 = table0[s1524];+  s1527 = s1525 ^ s1526;+  s1528 = table4[s1527];+  s1529 = s1523 ^ s1528;+  s1530 = sbv_bv_extract_u32_7_0_u8(s1529);+  s1531 = table0[s1530];+  s1533 = s1531 ^ s1532;+  s1534 = table4[s1533];+  s1535 = s1506 ^ s1534;+  s1536 = sbv_bv_extract_u32_31_24_u8(s1535);+  s1537 = table0[s1536];+  s1539 = s1537 ^ s1538;+  s1540 = table1[s1539];+  s1541 = sbv_bv_extract_u32_31_24_u8(s1471);+  s1542 = table0[s1541];+  s1544 = s1542 ^ s1543;+  s1545 = table1[s1544];+  s1546 = sbv_bv_extract_u32_23_16_u8(s1500);+  s1547 = table0[s1546];+  s1549 = s1547 ^ s1548;+  s1550 = table2[s1549];+  s1551 = s1545 ^ s1550;+  s1552 = sbv_bv_extract_u32_15_8_u8(s1529);+  s1553 = table0[s1552];+  s1555 = s1553 ^ s1554;+  s1556 = table3[s1555];+  s1557 = s1551 ^ s1556;+  s1558 = sbv_bv_extract_u32_7_0_u8(s1443);+  s1559 = table0[s1558];+  s1561 = s1559 ^ s1560;+  s1562 = table4[s1561];+  s1563 = s1557 ^ s1562;+  s1564 = sbv_bv_extract_u32_23_16_u8(s1563);+  s1565 = table0[s1564];+  s1567 = s1565 ^ s1566;+  s1568 = table2[s1567];+  s1569 = s1540 ^ s1568;+  s1570 = sbv_bv_extract_u32_31_24_u8(s1500);+  s1571 = table0[s1570];+  s1573 = s1571 ^ s1572;+  s1574 = table1[s1573];+  s1575 = sbv_bv_extract_u32_23_16_u8(s1529);+  s1576 = table0[s1575];+  s1578 = s1576 ^ s1577;+  s1579 = table2[s1578];+  s1580 = s1574 ^ s1579;+  s1581 = sbv_bv_extract_u32_15_8_u8(s1443);+  s1582 = table0[s1581];+  s1584 = s1582 ^ s1583;+  s1585 = table3[s1584];+  s1586 = s1580 ^ s1585;+  s1587 = sbv_bv_extract_u32_7_0_u8(s1471);+  s1588 = table0[s1587];+  s1590 = s1588 ^ s1589;+  s1591 = table4[s1590];+  s1592 = s1586 ^ s1591;+  s1593 = sbv_bv_extract_u32_15_8_u8(s1592);+  s1594 = table0[s1593];+  s1596 = s1594 ^ s1595;+  s1597 = table3[s1596];+  s1598 = s1569 ^ s1597;+  s1599 = sbv_bv_extract_u32_31_24_u8(s1529);+  s1600 = table0[s1599];+  s1602 = s1600 ^ s1601;+  s1603 = table1[s1602];+  s1604 = sbv_bv_extract_u32_23_16_u8(s1443);+  s1605 = table0[s1604];+  s1607 = s1605 ^ s1606;+  s1608 = table2[s1607];+  s1609 = s1603 ^ s1608;+  s1610 = sbv_bv_extract_u32_15_8_u8(s1471);+  s1611 = table0[s1610];+  s1613 = s1611 ^ s1612;+  s1614 = table3[s1613];+  s1615 = s1609 ^ s1614;+  s1616 = sbv_bv_extract_u32_7_0_u8(s1500);+  s1617 = table0[s1616];+  s1619 = s1617 ^ s1618;+  s1620 = table4[s1619];+  s1621 = s1615 ^ s1620;+  s1622 = sbv_bv_extract_u32_7_0_u8(s1621);+  s1623 = table0[s1622];+  s1625 = s1623 ^ s1624;+  s1626 = table4[s1625];+  s1627 = s1598 ^ s1626;+  s1628 = sbv_bv_extract_u32_31_24_u8(s1627);+  s1629 = table0[s1628];+  s1631 = s1629 ^ s1630;+  s1632 = table1[s1631];+  s1633 = sbv_bv_extract_u32_31_24_u8(s1563);+  s1634 = table0[s1633];+  s1636 = s1634 ^ s1635;+  s1637 = table1[s1636];+  s1638 = sbv_bv_extract_u32_23_16_u8(s1592);+  s1639 = table0[s1638];+  s1641 = s1639 ^ s1640;+  s1642 = table2[s1641];+  s1643 = s1637 ^ s1642;+  s1644 = sbv_bv_extract_u32_15_8_u8(s1621);+  s1645 = table0[s1644];+  s1647 = s1645 ^ s1646;+  s1648 = table3[s1647];+  s1649 = s1643 ^ s1648;+  s1650 = sbv_bv_extract_u32_7_0_u8(s1535);+  s1651 = table0[s1650];+  s1653 = s1651 ^ s1652;+  s1654 = table4[s1653];+  s1655 = s1649 ^ s1654;+  s1656 = sbv_bv_extract_u32_23_16_u8(s1655);+  s1657 = table0[s1656];+  s1659 = s1657 ^ s1658;+  s1660 = table2[s1659];+  s1661 = s1632 ^ s1660;+  s1662 = sbv_bv_extract_u32_31_24_u8(s1592);+  s1663 = table0[s1662];+  s1665 = s1663 ^ s1664;+  s1666 = table1[s1665];+  s1667 = sbv_bv_extract_u32_23_16_u8(s1621);+  s1668 = table0[s1667];+  s1670 = s1668 ^ s1669;+  s1671 = table2[s1670];+  s1672 = s1666 ^ s1671;+  s1673 = sbv_bv_extract_u32_15_8_u8(s1535);+  s1674 = table0[s1673];+  s1676 = s1674 ^ s1675;+  s1677 = table3[s1676];+  s1678 = s1672 ^ s1677;+  s1679 = sbv_bv_extract_u32_7_0_u8(s1563);+  s1680 = table0[s1679];+  s1682 = s1680 ^ s1681;+  s1683 = table4[s1682];+  s1684 = s1678 ^ s1683;+  s1685 = sbv_bv_extract_u32_15_8_u8(s1684);+  s1686 = table0[s1685];+  s1688 = s1686 ^ s1687;+  s1689 = table3[s1688];+  s1690 = s1661 ^ s1689;+  s1691 = sbv_bv_extract_u32_31_24_u8(s1621);+  s1692 = table0[s1691];+  s1694 = s1692 ^ s1693;+  s1695 = table1[s1694];+  s1696 = sbv_bv_extract_u32_23_16_u8(s1535);+  s1697 = table0[s1696];+  s1699 = s1697 ^ s1698;+  s1700 = table2[s1699];+  s1701 = s1695 ^ s1700;+  s1702 = sbv_bv_extract_u32_15_8_u8(s1563);+  s1703 = table0[s1702];+  s1705 = s1703 ^ s1704;+  s1706 = table3[s1705];+  s1707 = s1701 ^ s1706;+  s1708 = sbv_bv_extract_u32_7_0_u8(s1592);+  s1709 = table0[s1708];+  s1711 = s1709 ^ s1710;+  s1712 = table4[s1711];+  s1713 = s1707 ^ s1712;+  s1714 = sbv_bv_extract_u32_7_0_u8(s1713);+  s1715 = table0[s1714];+  s1717 = s1715 ^ s1716;+  s1718 = table4[s1717];+  s1719 = s1690 ^ s1718;+  s1720 = sbv_bv_extract_u32_31_24_u8(s1719);+  s1721 = table0[s1720];+  s1723 = s1721 ^ s1722;+  s1724 = table1[s1723];+  s1725 = sbv_bv_extract_u32_31_24_u8(s1655);+  s1726 = table0[s1725];+  s1728 = s1726 ^ s1727;+  s1729 = table1[s1728];+  s1730 = sbv_bv_extract_u32_23_16_u8(s1684);+  s1731 = table0[s1730];+  s1733 = s1731 ^ s1732;+  s1734 = table2[s1733];+  s1735 = s1729 ^ s1734;+  s1736 = sbv_bv_extract_u32_15_8_u8(s1713);+  s1737 = table0[s1736];+  s1739 = s1737 ^ s1738;+  s1740 = table3[s1739];+  s1741 = s1735 ^ s1740;+  s1742 = sbv_bv_extract_u32_7_0_u8(s1627);+  s1743 = table0[s1742];+  s1745 = s1743 ^ s1744;+  s1746 = table4[s1745];+  s1747 = s1741 ^ s1746;+  s1748 = sbv_bv_extract_u32_23_16_u8(s1747);+  s1749 = table0[s1748];+  s1751 = s1749 ^ s1750;+  s1752 = table2[s1751];+  s1753 = s1724 ^ s1752;+  s1754 = sbv_bv_extract_u32_31_24_u8(s1684);+  s1755 = table0[s1754];+  s1757 = s1755 ^ s1756;+  s1758 = table1[s1757];+  s1759 = sbv_bv_extract_u32_23_16_u8(s1713);+  s1760 = table0[s1759];+  s1762 = s1760 ^ s1761;+  s1763 = table2[s1762];+  s1764 = s1758 ^ s1763;+  s1765 = sbv_bv_extract_u32_15_8_u8(s1627);+  s1766 = table0[s1765];+  s1768 = s1766 ^ s1767;+  s1769 = table3[s1768];+  s1770 = s1764 ^ s1769;+  s1771 = sbv_bv_extract_u32_7_0_u8(s1655);+  s1772 = table0[s1771];+  s1774 = s1772 ^ s1773;+  s1775 = table4[s1774];+  s1776 = s1770 ^ s1775;+  s1777 = sbv_bv_extract_u32_15_8_u8(s1776);+  s1778 = table0[s1777];+  s1780 = s1778 ^ s1779;+  s1781 = table3[s1780];+  s1782 = s1753 ^ s1781;+  s1783 = sbv_bv_extract_u32_31_24_u8(s1713);+  s1784 = table0[s1783];+  s1786 = s1784 ^ s1785;+  s1787 = table1[s1786];+  s1788 = sbv_bv_extract_u32_23_16_u8(s1627);+  s1789 = table0[s1788];+  s1791 = s1789 ^ s1790;+  s1792 = table2[s1791];+  s1793 = s1787 ^ s1792;+  s1794 = sbv_bv_extract_u32_15_8_u8(s1655);+  s1795 = table0[s1794];+  s1797 = s1795 ^ s1796;+  s1798 = table3[s1797];+  s1799 = s1793 ^ s1798;+  s1800 = sbv_bv_extract_u32_7_0_u8(s1684);+  s1801 = table0[s1800];+  s1803 = s1801 ^ s1802;+  s1804 = table4[s1803];+  s1805 = s1799 ^ s1804;+  s1806 = sbv_bv_extract_u32_7_0_u8(s1805);+  s1807 = table0[s1806];+  s1809 = s1807 ^ s1808;+  s1810 = table4[s1809];+  s1811 = s1782 ^ s1810;+  s1812 = sbv_bv_extract_u32_31_24_u8(s1811);+  s1813 = table0[s1812];+  s1815 = s1813 ^ s1814;+  s1816 = table1[s1815];+  s1817 = sbv_bv_extract_u32_31_24_u8(s1747);+  s1818 = table0[s1817];+  s1820 = s1818 ^ s1819;+  s1821 = table1[s1820];+  s1822 = sbv_bv_extract_u32_23_16_u8(s1776);+  s1823 = table0[s1822];+  s1825 = s1823 ^ s1824;+  s1826 = table2[s1825];+  s1827 = s1821 ^ s1826;+  s1828 = sbv_bv_extract_u32_15_8_u8(s1805);+  s1829 = table0[s1828];+  s1831 = s1829 ^ s1830;+  s1832 = table3[s1831];+  s1833 = s1827 ^ s1832;+  s1834 = sbv_bv_extract_u32_7_0_u8(s1719);+  s1835 = table0[s1834];+  s1837 = s1835 ^ s1836;+  s1838 = table4[s1837];+  s1839 = s1833 ^ s1838;+  s1840 = sbv_bv_extract_u32_23_16_u8(s1839);+  s1841 = table0[s1840];+  s1843 = s1841 ^ s1842;+  s1844 = table2[s1843];+  s1845 = s1816 ^ s1844;+  s1846 = sbv_bv_extract_u32_31_24_u8(s1776);+  s1847 = table0[s1846];+  s1849 = s1847 ^ s1848;+  s1850 = table1[s1849];+  s1851 = sbv_bv_extract_u32_23_16_u8(s1805);+  s1852 = table0[s1851];+  s1854 = s1852 ^ s1853;+  s1855 = table2[s1854];+  s1856 = s1850 ^ s1855;+  s1857 = sbv_bv_extract_u32_15_8_u8(s1719);+  s1858 = table0[s1857];+  s1860 = s1858 ^ s1859;+  s1861 = table3[s1860];+  s1862 = s1856 ^ s1861;+  s1863 = sbv_bv_extract_u32_7_0_u8(s1747);+  s1864 = table0[s1863];+  s1866 = s1864 ^ s1865;+  s1867 = table4[s1866];+  s1868 = s1862 ^ s1867;+  s1869 = sbv_bv_extract_u32_15_8_u8(s1868);+  s1870 = table0[s1869];+  s1872 = s1870 ^ s1871;+  s1873 = table3[s1872];+  s1874 = s1845 ^ s1873;+  s1875 = sbv_bv_extract_u32_31_24_u8(s1805);+  s1876 = table0[s1875];+  s1878 = s1876 ^ s1877;+  s1879 = table1[s1878];+  s1880 = sbv_bv_extract_u32_23_16_u8(s1719);+  s1881 = table0[s1880];+  s1883 = s1881 ^ s1882;+  s1884 = table2[s1883];+  s1885 = s1879 ^ s1884;+  s1886 = sbv_bv_extract_u32_15_8_u8(s1747);+  s1887 = table0[s1886];+  s1889 = s1887 ^ s1888;+  s1890 = table3[s1889];+  s1891 = s1885 ^ s1890;+  s1892 = sbv_bv_extract_u32_7_0_u8(s1776);+  s1893 = table0[s1892];+  s1895 = s1893 ^ s1894;+  s1896 = table4[s1895];+  s1897 = s1891 ^ s1896;+  s1898 = sbv_bv_extract_u32_7_0_u8(s1897);+  s1899 = table0[s1898];+  s1901 = s1899 ^ s1900;+  s1902 = table4[s1901];+  s1903 = s1874 ^ s1902;+  s1904 = sbv_bv_extract_u32_31_24_u8(s1903);+  s1905 = table0[s1904];+  s1907 = s1905 ^ s1906;+  s1908 = table1[s1907];+  s1909 = sbv_bv_extract_u32_31_24_u8(s1839);+  s1910 = table0[s1909];+  s1912 = s1910 ^ s1911;+  s1913 = table1[s1912];+  s1914 = sbv_bv_extract_u32_23_16_u8(s1868);+  s1915 = table0[s1914];+  s1917 = s1915 ^ s1916;+  s1918 = table2[s1917];+  s1919 = s1913 ^ s1918;+  s1920 = sbv_bv_extract_u32_15_8_u8(s1897);+  s1921 = table0[s1920];+  s1923 = s1921 ^ s1922;+  s1924 = table3[s1923];+  s1925 = s1919 ^ s1924;+  s1926 = sbv_bv_extract_u32_7_0_u8(s1811);+  s1927 = table0[s1926];+  s1929 = s1927 ^ s1928;+  s1930 = table4[s1929];+  s1931 = s1925 ^ s1930;+  s1932 = sbv_bv_extract_u32_23_16_u8(s1931);+  s1933 = table0[s1932];+  s1935 = s1933 ^ s1934;+  s1936 = table2[s1935];+  s1937 = s1908 ^ s1936;+  s1938 = sbv_bv_extract_u32_31_24_u8(s1868);+  s1939 = table0[s1938];+  s1941 = s1939 ^ s1940;+  s1942 = table1[s1941];+  s1943 = sbv_bv_extract_u32_23_16_u8(s1897);+  s1944 = table0[s1943];+  s1946 = s1944 ^ s1945;+  s1947 = table2[s1946];+  s1948 = s1942 ^ s1947;+  s1949 = sbv_bv_extract_u32_15_8_u8(s1811);+  s1950 = table0[s1949];+  s1952 = s1950 ^ s1951;+  s1953 = table3[s1952];+  s1954 = s1948 ^ s1953;+  s1955 = sbv_bv_extract_u32_7_0_u8(s1839);+  s1956 = table0[s1955];+  s1958 = s1956 ^ s1957;+  s1959 = table4[s1958];+  s1960 = s1954 ^ s1959;+  s1961 = sbv_bv_extract_u32_15_8_u8(s1960);+  s1962 = table0[s1961];+  s1964 = s1962 ^ s1963;+  s1965 = table3[s1964];+  s1966 = s1937 ^ s1965;+  s1967 = sbv_bv_extract_u32_31_24_u8(s1897);+  s1968 = table0[s1967];+  s1970 = s1968 ^ s1969;+  s1971 = table1[s1970];+  s1972 = sbv_bv_extract_u32_23_16_u8(s1811);+  s1973 = table0[s1972];+  s1975 = s1973 ^ s1974;+  s1976 = table2[s1975];+  s1977 = s1971 ^ s1976;+  s1978 = sbv_bv_extract_u32_15_8_u8(s1839);+  s1979 = table0[s1978];+  s1981 = s1979 ^ s1980;+  s1982 = table3[s1981];+  s1983 = s1977 ^ s1982;+  s1984 = sbv_bv_extract_u32_7_0_u8(s1868);+  s1985 = table0[s1984];+  s1987 = s1985 ^ s1986;+  s1988 = table4[s1987];+  s1989 = s1983 ^ s1988;+  s1990 = sbv_bv_extract_u32_7_0_u8(s1989);+  s1991 = table0[s1990];+  s1993 = s1991 ^ s1992;+  s1994 = table4[s1993];+  s1995 = s1966 ^ s1994;+  s1996 = sbv_bv_extract_u32_31_24_u8(s1995);+  s1997 = table0[s1996];+  s1999 = s1997 ^ s1998;+  s2000 = table1[s1999];+  s2001 = sbv_bv_extract_u32_31_24_u8(s1931);+  s2002 = table0[s2001];+  s2004 = s2002 ^ s2003;+  s2005 = table1[s2004];+  s2006 = sbv_bv_extract_u32_23_16_u8(s1960);+  s2007 = table0[s2006];+  s2009 = s2007 ^ s2008;+  s2010 = table2[s2009];+  s2011 = s2005 ^ s2010;+  s2012 = sbv_bv_extract_u32_15_8_u8(s1989);+  s2013 = table0[s2012];+  s2015 = s2013 ^ s2014;+  s2016 = table3[s2015];+  s2017 = s2011 ^ s2016;+  s2018 = sbv_bv_extract_u32_7_0_u8(s1903);+  s2019 = table0[s2018];+  s2021 = s2019 ^ s2020;+  s2022 = table4[s2021];+  s2023 = s2017 ^ s2022;+  s2024 = sbv_bv_extract_u32_23_16_u8(s2023);+  s2025 = table0[s2024];+  s2027 = s2025 ^ s2026;+  s2028 = table2[s2027];+  s2029 = s2000 ^ s2028;+  s2030 = sbv_bv_extract_u32_31_24_u8(s1960);+  s2031 = table0[s2030];+  s2033 = s2031 ^ s2032;+  s2034 = table1[s2033];+  s2035 = sbv_bv_extract_u32_23_16_u8(s1989);+  s2036 = table0[s2035];+  s2038 = s2036 ^ s2037;+  s2039 = table2[s2038];+  s2040 = s2034 ^ s2039;+  s2041 = sbv_bv_extract_u32_15_8_u8(s1903);+  s2042 = table0[s2041];+  s2044 = s2042 ^ s2043;+  s2045 = table3[s2044];+  s2046 = s2040 ^ s2045;+  s2047 = sbv_bv_extract_u32_7_0_u8(s1931);+  s2048 = table0[s2047];+  s2050 = s2048 ^ s2049;+  s2051 = table4[s2050];+  s2052 = s2046 ^ s2051;+  s2053 = sbv_bv_extract_u32_15_8_u8(s2052);+  s2054 = table0[s2053];+  s2056 = s2054 ^ s2055;+  s2057 = table3[s2056];+  s2058 = s2029 ^ s2057;+  s2059 = sbv_bv_extract_u32_31_24_u8(s1989);+  s2060 = table0[s2059];+  s2062 = s2060 ^ s2061;+  s2063 = table1[s2062];+  s2064 = sbv_bv_extract_u32_23_16_u8(s1903);+  s2065 = table0[s2064];+  s2067 = s2065 ^ s2066;+  s2068 = table2[s2067];+  s2069 = s2063 ^ s2068;+  s2070 = sbv_bv_extract_u32_15_8_u8(s1931);+  s2071 = table0[s2070];+  s2073 = s2071 ^ s2072;+  s2074 = table3[s2073];+  s2075 = s2069 ^ s2074;+  s2076 = sbv_bv_extract_u32_7_0_u8(s1960);+  s2077 = table0[s2076];+  s2079 = s2077 ^ s2078;+  s2080 = table4[s2079];+  s2081 = s2075 ^ s2080;+  s2082 = sbv_bv_extract_u32_7_0_u8(s2081);+  s2083 = table0[s2082];+  s2085 = s2083 ^ s2084;+  s2086 = table4[s2085];+  s2087 = s2058 ^ s2086;+  s2088 = sbv_bv_extract_u32_31_24_u8(s2087);+  s2089 = table0[s2088];+  s2090 = sbv_bv_extract_u32_31_24_u8(s2023);+  s2091 = table0[s2090];+  s2093 = s2091 ^ s2092;+  s2094 = table1[s2093];+  s2095 = sbv_bv_extract_u32_23_16_u8(s2052);+  s2096 = table0[s2095];+  s2098 = s2096 ^ s2097;+  s2099 = table2[s2098];+  s2100 = s2094 ^ s2099;+  s2101 = sbv_bv_extract_u32_15_8_u8(s2081);+  s2102 = table0[s2101];+  s2104 = s2102 ^ s2103;+  s2105 = table3[s2104];+  s2106 = s2100 ^ s2105;+  s2107 = sbv_bv_extract_u32_7_0_u8(s1995);+  s2108 = table0[s2107];+  s2110 = s2108 ^ s2109;+  s2111 = table4[s2110];+  s2112 = s2106 ^ s2111;+  s2113 = sbv_bv_extract_u32_23_16_u8(s2112);+  s2114 = table0[s2113];+  s2115 = sbv_bv_join_u8_u8_u16(s2089, s2114);+  s2116 = sbv_bv_extract_u32_31_24_u8(s2052);+  s2117 = table0[s2116];+  s2119 = s2117 ^ s2118;+  s2120 = table1[s2119];+  s2121 = sbv_bv_extract_u32_23_16_u8(s2081);+  s2122 = table0[s2121];+  s2124 = s2122 ^ s2123;+  s2125 = table2[s2124];+  s2126 = s2120 ^ s2125;+  s2127 = sbv_bv_extract_u32_15_8_u8(s1995);+  s2128 = table0[s2127];+  s2130 = s2128 ^ s2129;+  s2131 = table3[s2130];+  s2132 = s2126 ^ s2131;+  s2133 = sbv_bv_extract_u32_7_0_u8(s2023);+  s2134 = table0[s2133];+  s2136 = s2134 ^ s2135;+  s2137 = table4[s2136];+  s2138 = s2132 ^ s2137;+  s2139 = sbv_bv_extract_u32_15_8_u8(s2138);+  s2140 = table0[s2139];+  s2141 = sbv_bv_extract_u32_31_24_u8(s2081);+  s2142 = table0[s2141];+  s2144 = s2142 ^ s2143;+  s2145 = table1[s2144];+  s2146 = sbv_bv_extract_u32_23_16_u8(s1995);+  s2147 = table0[s2146];+  s2149 = s2147 ^ s2148;+  s2150 = table2[s2149];+  s2151 = s2145 ^ s2150;+  s2152 = sbv_bv_extract_u32_15_8_u8(s2023);+  s2153 = table0[s2152];+  s2155 = s2153 ^ s2154;+  s2156 = table3[s2155];+  s2157 = s2151 ^ s2156;+  s2158 = sbv_bv_extract_u32_7_0_u8(s2052);+  s2159 = table0[s2158];+  s2161 = s2159 ^ s2160;+  s2162 = table4[s2161];+  s2163 = s2157 ^ s2162;+  s2164 = sbv_bv_extract_u32_7_0_u8(s2163);+  s2165 = table0[s2164];+  s2166 = sbv_bv_join_u8_u8_u16(s2140, s2165);+  s2167 = sbv_bv_join_u16_u16_u32(s2115, s2166);+  s2168 = s44 ^ s2167;+  s2169 = sbv_bv_extract_u32_31_24_u8(s2163);+  s2170 = table0[s2169];+  s2171 = sbv_bv_extract_u32_23_16_u8(s2087);+  s2172 = table0[s2171];+  s2173 = sbv_bv_join_u8_u8_u16(s2170, s2172);+  s2174 = sbv_bv_extract_u32_15_8_u8(s2112);+  s2175 = table0[s2174];+  s2176 = sbv_bv_extract_u32_7_0_u8(s2138);+  s2177 = table0[s2176];+  s2178 = sbv_bv_join_u8_u8_u16(s2175, s2177);+  s2179 = sbv_bv_join_u16_u16_u32(s2173, s2178);+  s2180 = s45 ^ s2179;+  s2181 = sbv_bv_extract_u32_31_24_u8(s2138);+  s2182 = table0[s2181];+  s2183 = sbv_bv_extract_u32_23_16_u8(s2163);+  s2184 = table0[s2183];+  s2185 = sbv_bv_join_u8_u8_u16(s2182, s2184);+  s2186 = sbv_bv_extract_u32_15_8_u8(s2087);+  s2187 = table0[s2186];+  s2188 = sbv_bv_extract_u32_7_0_u8(s2112);+  s2189 = table0[s2188];+  s2190 = sbv_bv_join_u8_u8_u16(s2187, s2189);+  s2191 = sbv_bv_join_u16_u16_u32(s2185, s2190);+  s2192 = s46 ^ s2191;+  s2193 = sbv_bv_extract_u32_31_24_u8(s2112);+  s2194 = table0[s2193];+  s2195 = sbv_bv_extract_u32_23_16_u8(s2138);+  s2196 = table0[s2195];+  s2197 = sbv_bv_join_u8_u8_u16(s2194, s2196);+  s2198 = sbv_bv_extract_u32_15_8_u8(s2163);+  s2199 = table0[s2198];+  s2200 = sbv_bv_extract_u32_7_0_u8(s2087);+  s2201 = table0[s2200];+  s2202 = sbv_bv_join_u8_u8_u16(s2199, s2201);+  s2203 = sbv_bv_join_u16_u16_u32(s2197, s2202);+  s2204 = s47 ^ s2203;++  sbv_output_0[0] = s2168;+  sbv_output_0[1] = s2180;+  sbv_output_0[2] = s2192;+  sbv_output_0[3] = s2204;+}+== END: "aes128OTFDecrypt.c" ==================+== BEGIN: "aes128Lib.h" ================+/* Header file for aes128Lib. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_aes128Lib_HEADER_INCLUDED+#define SBV_GENERATED_aes128Lib_HEADER_INCLUDED+++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* Entry point prototypes: */+void aes128KeySchedule(const SWord32 *key, SWord32 *encKS,+                       SWord32 *decKS);+void aes128BlockEncrypt(const SWord32 *pt, const SWord32 *xkey,+                        SWord32 *ct);+void aes128BlockDecrypt(const SWord32 *ct, const SWord32 *xkey,+                        SWord32 *pt);+void aes128InvKeySchedule(const SWord32 *key, SWord32 *decKS);+void aes128OTFDecrypt(const SWord32 *ct, const SWord32 *xkey,+                      SWord32 *pt);++#endif /* SBV_GENERATED_aes128Lib_HEADER_INCLUDED */+== END: "aes128Lib.h" ==================+== BEGIN: "aes128Lib_driver.c" ================+/* Example driver program for aes128Lib. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "aes128Lib.h"++void aes128KeySchedule_driver(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array key:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  key[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[44];+  SWord32 sbv_driver_output_1[44];++  aes128KeySchedule(sbv_driver_input_0, sbv_driver_output_0,+                    sbv_driver_output_1);++  printf("aes128KeySchedule(key, encKS, decKS) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 44 ; ++sbv_driver_output_0_ctr)+  { printf("  encKS[%2d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }+  int sbv_driver_output_1_ctr;+  for(sbv_driver_output_1_ctr = 0; sbv_driver_output_1_ctr < 44 ; ++sbv_driver_output_1_ctr)+  { printf("  decKS[%2d] = ", sbv_driver_output_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_1[sbv_driver_output_1_ctr]);+    printf("\n");+  }+}++void aes128BlockEncrypt_driver(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array pt:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  pt[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord32 sbv_driver_input_1[44] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array xkey:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 44 ; ++sbv_driver_input_1_ctr)+  { printf("  xkey[%2d] = ", sbv_driver_input_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[4];++  aes128BlockEncrypt(sbv_driver_input_0, sbv_driver_input_1,+                     sbv_driver_output_0);++  printf("aes128BlockEncrypt(pt, xkey, ct) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 4 ; ++sbv_driver_output_0_ctr)+  { printf("  ct[%1d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }+}++void aes128BlockDecrypt_driver(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array ct:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  ct[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord32 sbv_driver_input_1[44] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array xkey:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 44 ; ++sbv_driver_input_1_ctr)+  { printf("  xkey[%2d] = ", sbv_driver_input_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[4];++  aes128BlockDecrypt(sbv_driver_input_0, sbv_driver_input_1,+                     sbv_driver_output_0);++  printf("aes128BlockDecrypt(ct, xkey, pt) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 4 ; ++sbv_driver_output_0_ctr)+  { printf("  pt[%1d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }+}++void aes128InvKeySchedule_driver(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array key:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  key[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[44];++  aes128InvKeySchedule(sbv_driver_input_0, sbv_driver_output_0);++  printf("aes128InvKeySchedule(key, decKS) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 44 ; ++sbv_driver_output_0_ctr)+  { printf("  decKS[%2d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }+}++void aes128OTFDecrypt_driver(void)+{+  const SWord32 sbv_driver_input_0[4] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array ct:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 4 ; ++sbv_driver_input_0_ctr)+  { printf("  ct[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord32 sbv_driver_input_1[44] = {+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,+      0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL+  };++  printf("Contents of input array xkey:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 44 ; ++sbv_driver_input_1_ctr)+  { printf("  xkey[%2d] = ", sbv_driver_input_1_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord32 sbv_driver_output_0[4];++  aes128OTFDecrypt(sbv_driver_input_0, sbv_driver_input_1,+                   sbv_driver_output_0);++  printf("aes128OTFDecrypt(ct, xkey, pt) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 4 ; ++sbv_driver_output_0_ctr)+  { printf("  pt[%1d] = ", sbv_driver_output_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }+}++int main(void)+{+  printf("====================================\n");+  printf("** Driver run for aes128KeySchedule:\n");+  printf("====================================\n");+  aes128KeySchedule_driver();++  printf("=====================================\n");+  printf("** Driver run for aes128BlockEncrypt:\n");+  printf("=====================================\n");+  aes128BlockEncrypt_driver();++  printf("=====================================\n");+  printf("** Driver run for aes128BlockDecrypt:\n");+  printf("=====================================\n");+  aes128BlockDecrypt_driver();++  printf("=======================================\n");+  printf("** Driver run for aes128InvKeySchedule:\n");+  printf("=======================================\n");+  aes128InvKeySchedule_driver();++  printf("===================================\n");+  printf("** Driver run for aes128OTFDecrypt:\n");+  printf("===================================\n");+  aes128OTFDecrypt_driver();++  return 0;+}+== END: "aes128Lib_driver.c" ==================+== BEGIN: "Makefile" ================+# Makefile for aes128Lib. Automatically generated by SBV. Do not edit!++# include any user-defined .mk file in the current directory.+-include *.mk++CC?=gcc+CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer+AR?=ar+ARFLAGS?=cr++all: aes128Lib.a aes128Lib_driver++aes128Lib.a: aes128KeySchedule.o aes128BlockEncrypt.o aes128BlockDecrypt.o aes128InvKeySchedule.o aes128OTFDecrypt.o+	rm -f $@.tmp+	${AR} ${ARFLAGS} $@.tmp $^+	mv -f $@.tmp $@++aes128Lib_driver: aes128Lib_driver.c aes128Lib.h aes128Lib.a+	${CC} ${CCFLAGS} $< -o $@ aes128Lib.a ${LDFLAGS}++aes128KeySchedule.o: aes128KeySchedule.c aes128Lib.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128BlockEncrypt.o: aes128BlockEncrypt.c aes128Lib.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128BlockDecrypt.o: aes128BlockDecrypt.c aes128Lib.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128InvKeySchedule.o: aes128InvKeySchedule.c aes128Lib.h+	${CC} ${CCFLAGS} -c $< -o $@++aes128OTFDecrypt.o: aes128OTFDecrypt.c aes128Lib.h+	${CC} ${CCFLAGS} -c $< -o $@++clean:+	rm -f *.o++veryclean: clean+	rm -f aes128Lib.a aes128Lib_driver aes128Lib.a.tmp == END: "Makefile" ==================
SBVTestSuite/GoldFiles/cgUninterpret.gold view
@@ -12,11 +12,11 @@ tstShiftLeft.o: tstShiftLeft.c tstShiftLeft.h 	${CC} ${CCFLAGS} -c $< -o $@ -tstShiftLeft_driver.o: tstShiftLeft_driver.c+tstShiftLeft_driver.o: tstShiftLeft_driver.c tstShiftLeft.h 	${CC} ${CCFLAGS} -c $< -o $@  tstShiftLeft_driver: tstShiftLeft.o tstShiftLeft_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "tstShiftLeft.h" ================ /* Header file for tstShiftLeft. Automatically generated by SBV. Do not edit! */ -#ifndef __tstShiftLeft__HEADER_INCLUDED__-#define __tstShiftLeft__HEADER_INCLUDED__+#ifndef SBV_GENERATED_tstShiftLeft_HEADER_INCLUDED+#define SBV_GENERATED_tstShiftLeft_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord32 tstShiftLeft(const SWord32 *vs); -#endif /* __tstShiftLeft__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_tstShiftLeft_HEADER_INCLUDED */ == END: "tstShiftLeft.h" ================== == BEGIN: "tstShiftLeft_driver.c" ================ /* Example driver program for tstShiftLeft. */@@ -73,19 +81,22 @@  int main(void) {-  const SWord32 vs[3] = {+  const SWord32 sbv_driver_input_0[3] = {       0x00000001UL, 0x00000002UL, 0x00000003UL   };    printf("Contents of input array vs:\n");-  int vs_ctr;-  for(vs_ctr = 0; vs_ctr < 3 ; ++vs_ctr)-    printf("  vs[%1d] = 0x%08"PRIx32"UL\n", vs_ctr ,vs[vs_ctr]);+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 3 ; ++sbv_driver_input_0_ctr)+  { printf("  vs[%1d] = ", sbv_driver_input_0_ctr);+    printf("0x%08"PRIx32"UL", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }  -  const SWord32 __result = tstShiftLeft(vs);+  const SWord32 sbv_result = tstShiftLeft(sbv_driver_input_0); -  printf("tstShiftLeft(vs) = 0x%08"PRIx32"UL\n", __result);+  printf("tstShiftLeft(vs) = 0x%08"PRIx32"UL\n", sbv_result);    return 0; }@@ -98,16 +109,33 @@ /* User specified custom code for "SBV_SHIFTLEFT" */ #define SBV_SHIFTLEFT(x, y) ((x) << (y)) -SWord32 tstShiftLeft(const SWord32 *vs)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_add(SWord32 a, SWord32 b) {-  const SWord32 s0 = vs[0];-  const SWord32 s1 = vs[1];-  const SWord32 s2 = vs[2];-  const SWord32 s3 = /* Uninterpreted function */ SBV_SHIFTLEFT(s0,-                                                                s2);-  const SWord32 s4 = /* Uninterpreted function */ SBV_SHIFTLEFT(s1,-                                                                s2);-  const SWord32 s5 = s3 + s4;+  const SWord32 bits = (SWord32) ((((uint64_t) (SWord32) a) + ((uint64_t) (SWord32) b)) & UINT64_C(0x00000000ffffffff));+  return (SWord32) bits;+}+++SWord32 tstShiftLeft(const SWord32 *sbv_input_0)+{+  const SWord32 s0 = sbv_input_0[0];+  const SWord32 s1 = sbv_input_0[1];+  const SWord32 s2 = sbv_input_0[2];+        SWord32 s3;+        SWord32 s4;+        SWord32 s5;+  s3 = /* Uninterpreted function */ SBV_SHIFTLEFT(s0, s2);+  s4 = /* Uninterpreted function */ SBV_SHIFTLEFT(s1, s2);+  s5 = sbv_bv_u32_add(s3, s4);    return s5; }
SBVTestSuite/GoldFiles/codeGen1.gold view
@@ -12,11 +12,11 @@ foo.o: foo.c foo.h 	${CC} ${CCFLAGS} -c $< -o $@ -foo_driver.o: foo_driver.c+foo_driver.o: foo_driver.c foo.h 	${CC} ${CCFLAGS} -c $< -o $@  foo_driver: foo.o foo_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "foo.h" ================ /* Header file for foo. Automatically generated by SBV. Do not edit! */ -#ifndef __foo__HEADER_INCLUDED__-#define __foo__HEADER_INCLUDED__+#ifndef SBV_GENERATED_foo_HEADER_INCLUDED+#define SBV_GENERATED_foo_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -63,7 +71,7 @@ SInt16 foo(const SInt16 x, const SInt64 *xArr, SWord16 *z,            SInt16 *zArr, SInt64 *yArr); -#endif /* __foo__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_foo_HEADER_INCLUDED */ == END: "foo.h" ================== == BEGIN: "foo_driver.c" ================ /* Example driver program for foo. */@@ -74,7 +82,7 @@  int main(void) {-  const SInt64 xArr[45] = {+  const SInt64 sbv_driver_input_1[45] = {       0x0000000000000000LL, 0x0000000000000000LL, 0x0000000000000000LL,       0x0000000000000000LL, 0x0000000000000000LL, 0x0000000000000000LL,       0x0000000000000000LL, 0x0000000000000000LL, 0x0000000000000000LL,@@ -93,24 +101,34 @@   };    printf("Contents of input array xArr:\n");-  int xArr_ctr;-  for(xArr_ctr = 0; xArr_ctr < 45 ; ++xArr_ctr)-    printf("  xArr[%2d] = %"PRId64"LL\n", xArr_ctr ,xArr[xArr_ctr]);+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 45 ; ++sbv_driver_input_1_ctr)+  { printf("  xArr[%2d] = ", sbv_driver_input_1_ctr);+    printf("%"PRId64"LL", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  } -  SWord16 z;-  SInt16 zArr[7];-  SInt64 yArr[45];+  SWord16 sbv_driver_output_0;+  SInt16 sbv_driver_output_1[7];+  SInt64 sbv_driver_output_2[45]; -  const SInt16 __result = foo(0x0000, xArr, &z, zArr, yArr);+  const SInt16 sbv_result = foo(0x0000, sbv_driver_input_1,+                                &sbv_driver_output_0, sbv_driver_output_1, sbv_driver_output_2); -  printf("foo(0x0000, xArr, &z, zArr, yArr) = %"PRId16"\n", __result);-  printf("  z = 0x%04"PRIx16"U\n", z);-  int zArr_ctr;-  for(zArr_ctr = 0; zArr_ctr < 7 ; ++zArr_ctr)-    printf("  zArr[%1d] = %"PRId16"\n", zArr_ctr ,zArr[zArr_ctr]);-  int yArr_ctr;-  for(yArr_ctr = 0; yArr_ctr < 45 ; ++yArr_ctr)-    printf("  yArr[%2d] = %"PRId64"LL\n", yArr_ctr ,yArr[yArr_ctr]);+  printf("foo(0x0000, xArr, &z, zArr, yArr) = %"PRId16"\n", sbv_result);+  printf("  z = 0x%04"PRIx16"U\n", sbv_driver_output_0);+  int sbv_driver_output_1_ctr;+  for(sbv_driver_output_1_ctr = 0; sbv_driver_output_1_ctr < 7 ; ++sbv_driver_output_1_ctr)+  { printf("  zArr[%1d] = ", sbv_driver_output_1_ctr);+    printf("%"PRId16"", sbv_driver_output_1[sbv_driver_output_1_ctr]);+    printf("\n");+  }+  int sbv_driver_output_2_ctr;+  for(sbv_driver_output_2_ctr = 0; sbv_driver_output_2_ctr < 45 ; ++sbv_driver_output_2_ctr)+  { printf("  yArr[%2d] = ", sbv_driver_output_2_ctr);+    printf("%"PRId64"LL", sbv_driver_output_2[sbv_driver_output_2_ctr]);+    printf("\n");+  }    return 0; }@@ -120,111 +138,133 @@  #include "foo.h" -SInt16 foo(const SInt16 x, const SInt64 *xArr, SWord16 *z,-           SInt16 *zArr, SInt64 *yArr)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SInt16 sbv_bv_s16_add(SInt16 a, SInt16 b) {-  const SInt16 s0 = x;-  const SInt64 s1 = xArr[0];-  const SInt64 s2 = xArr[1];-  const SInt64 s3 = xArr[2];-  const SInt64 s4 = xArr[3];-  const SInt64 s5 = xArr[4];-  const SInt64 s6 = xArr[5];-  const SInt64 s7 = xArr[6];-  const SInt64 s8 = xArr[7];-  const SInt64 s9 = xArr[8];-  const SInt64 s10 = xArr[9];-  const SInt64 s11 = xArr[10];-  const SInt64 s12 = xArr[11];-  const SInt64 s13 = xArr[12];-  const SInt64 s14 = xArr[13];-  const SInt64 s15 = xArr[14];-  const SInt64 s16 = xArr[15];-  const SInt64 s17 = xArr[16];-  const SInt64 s18 = xArr[17];-  const SInt64 s19 = xArr[18];-  const SInt64 s20 = xArr[19];-  const SInt64 s21 = xArr[20];-  const SInt64 s22 = xArr[21];-  const SInt64 s23 = xArr[22];-  const SInt64 s24 = xArr[23];-  const SInt64 s25 = xArr[24];-  const SInt64 s26 = xArr[25];-  const SInt64 s27 = xArr[26];-  const SInt64 s28 = xArr[27];-  const SInt64 s29 = xArr[28];-  const SInt64 s30 = xArr[29];-  const SInt64 s31 = xArr[30];-  const SInt64 s32 = xArr[31];-  const SInt64 s33 = xArr[32];-  const SInt64 s34 = xArr[33];-  const SInt64 s35 = xArr[34];-  const SInt64 s36 = xArr[35];-  const SInt64 s37 = xArr[36];-  const SInt64 s38 = xArr[37];-  const SInt64 s39 = xArr[38];-  const SInt64 s40 = xArr[39];-  const SInt64 s41 = xArr[40];-  const SInt64 s42 = xArr[41];-  const SInt64 s43 = xArr[42];-  const SInt64 s44 = xArr[43];-  const SInt64 s45 = xArr[44];-  const SInt16 s48 = s0 + 0x0001;-  const SInt16 s50 = s0 * 0x0002;+  const SWord16 bits = (SWord16) ((((uint64_t) (SWord16) a) + ((uint64_t) (SWord16) b)) & UINT64_C(0x000000000000ffff));+  SInt16 result; memcpy(&result, &bits, sizeof result); return result;+} -  *z = 0x0005U;-  zArr[0] = s48;-  zArr[1] = s48;-  zArr[2] = s48;-  zArr[3] = s48;-  zArr[4] = s48;-  zArr[5] = s48;-  zArr[6] = s48;-  yArr[0] = s1;-  yArr[1] = s2;-  yArr[2] = s3;-  yArr[3] = s4;-  yArr[4] = s5;-  yArr[5] = s6;-  yArr[6] = s7;-  yArr[7] = s8;-  yArr[8] = s9;-  yArr[9] = s10;-  yArr[10] = s11;-  yArr[11] = s12;-  yArr[12] = s13;-  yArr[13] = s14;-  yArr[14] = s15;-  yArr[15] = s16;-  yArr[16] = s17;-  yArr[17] = s18;-  yArr[18] = s19;-  yArr[19] = s20;-  yArr[20] = s21;-  yArr[21] = s22;-  yArr[22] = s23;-  yArr[23] = s24;-  yArr[24] = s25;-  yArr[25] = s26;-  yArr[26] = s27;-  yArr[27] = s28;-  yArr[28] = s29;-  yArr[29] = s30;-  yArr[30] = s31;-  yArr[31] = s32;-  yArr[32] = s33;-  yArr[33] = s34;-  yArr[34] = s35;-  yArr[35] = s36;-  yArr[36] = s37;-  yArr[37] = s38;-  yArr[38] = s39;-  yArr[39] = s40;-  yArr[40] = s41;-  yArr[41] = s42;-  yArr[42] = s43;-  yArr[43] = s44;-  yArr[44] = s45;+static inline SBV_CGEN_UNUSED SInt16 sbv_bv_s16_mul(SInt16 a, SInt16 b)+{+  const SWord16 bits = (SWord16) ((((uint64_t) (SWord16) a) * ((uint64_t) (SWord16) b)) & UINT64_C(0x000000000000ffff));+  SInt16 result; memcpy(&result, &bits, sizeof result); return result;+}+++SInt16 foo(const SInt16 sbv_input_0, const SInt64 *sbv_input_1,+           SWord16 *sbv_output_0, SInt16 *sbv_output_1, SInt64 *sbv_output_2)+{+  const SInt16 s0 = sbv_input_0;+  const SInt64 s1 = sbv_input_1[0];+  const SInt64 s2 = sbv_input_1[1];+  const SInt64 s3 = sbv_input_1[2];+  const SInt64 s4 = sbv_input_1[3];+  const SInt64 s5 = sbv_input_1[4];+  const SInt64 s6 = sbv_input_1[5];+  const SInt64 s7 = sbv_input_1[6];+  const SInt64 s8 = sbv_input_1[7];+  const SInt64 s9 = sbv_input_1[8];+  const SInt64 s10 = sbv_input_1[9];+  const SInt64 s11 = sbv_input_1[10];+  const SInt64 s12 = sbv_input_1[11];+  const SInt64 s13 = sbv_input_1[12];+  const SInt64 s14 = sbv_input_1[13];+  const SInt64 s15 = sbv_input_1[14];+  const SInt64 s16 = sbv_input_1[15];+  const SInt64 s17 = sbv_input_1[16];+  const SInt64 s18 = sbv_input_1[17];+  const SInt64 s19 = sbv_input_1[18];+  const SInt64 s20 = sbv_input_1[19];+  const SInt64 s21 = sbv_input_1[20];+  const SInt64 s22 = sbv_input_1[21];+  const SInt64 s23 = sbv_input_1[22];+  const SInt64 s24 = sbv_input_1[23];+  const SInt64 s25 = sbv_input_1[24];+  const SInt64 s26 = sbv_input_1[25];+  const SInt64 s27 = sbv_input_1[26];+  const SInt64 s28 = sbv_input_1[27];+  const SInt64 s29 = sbv_input_1[28];+  const SInt64 s30 = sbv_input_1[29];+  const SInt64 s31 = sbv_input_1[30];+  const SInt64 s32 = sbv_input_1[31];+  const SInt64 s33 = sbv_input_1[32];+  const SInt64 s34 = sbv_input_1[33];+  const SInt64 s35 = sbv_input_1[34];+  const SInt64 s36 = sbv_input_1[35];+  const SInt64 s37 = sbv_input_1[36];+  const SInt64 s38 = sbv_input_1[37];+  const SInt64 s39 = sbv_input_1[38];+  const SInt64 s40 = sbv_input_1[39];+  const SInt64 s41 = sbv_input_1[40];+  const SInt64 s42 = sbv_input_1[41];+  const SInt64 s43 = sbv_input_1[42];+  const SInt64 s44 = sbv_input_1[43];+  const SInt64 s45 = sbv_input_1[44];+  const SInt16 s48 = sbv_bv_s16_add(s0, 0x0001);+  const SInt16 s50 = sbv_bv_s16_mul(s0, 0x0002);++  *sbv_output_0 = 0x0005U;+  sbv_output_1[0] = s48;+  sbv_output_1[1] = s48;+  sbv_output_1[2] = s48;+  sbv_output_1[3] = s48;+  sbv_output_1[4] = s48;+  sbv_output_1[5] = s48;+  sbv_output_1[6] = s48;+  sbv_output_2[0] = s1;+  sbv_output_2[1] = s2;+  sbv_output_2[2] = s3;+  sbv_output_2[3] = s4;+  sbv_output_2[4] = s5;+  sbv_output_2[5] = s6;+  sbv_output_2[6] = s7;+  sbv_output_2[7] = s8;+  sbv_output_2[8] = s9;+  sbv_output_2[9] = s10;+  sbv_output_2[10] = s11;+  sbv_output_2[11] = s12;+  sbv_output_2[12] = s13;+  sbv_output_2[13] = s14;+  sbv_output_2[14] = s15;+  sbv_output_2[15] = s16;+  sbv_output_2[16] = s17;+  sbv_output_2[17] = s18;+  sbv_output_2[18] = s19;+  sbv_output_2[19] = s20;+  sbv_output_2[20] = s21;+  sbv_output_2[21] = s22;+  sbv_output_2[22] = s23;+  sbv_output_2[23] = s24;+  sbv_output_2[24] = s25;+  sbv_output_2[25] = s26;+  sbv_output_2[26] = s27;+  sbv_output_2[27] = s28;+  sbv_output_2[28] = s29;+  sbv_output_2[29] = s30;+  sbv_output_2[30] = s31;+  sbv_output_2[31] = s32;+  sbv_output_2[32] = s33;+  sbv_output_2[33] = s34;+  sbv_output_2[34] = s35;+  sbv_output_2[35] = s36;+  sbv_output_2[36] = s37;+  sbv_output_2[37] = s38;+  sbv_output_2[38] = s39;+  sbv_output_2[39] = s40;+  sbv_output_2[40] = s41;+  sbv_output_2[41] = s42;+  sbv_output_2[42] = s43;+  sbv_output_2[43] = s44;+  sbv_output_2[44] = s45;   return s50; } == END: "foo.c" ==================
SBVTestSuite/GoldFiles/crcUSB5_1.gold view
@@ -12,11 +12,11 @@ crcUSB5.o: crcUSB5.c crcUSB5.h 	${CC} ${CCFLAGS} -c $< -o $@ -crcUSB5_driver.o: crcUSB5_driver.c+crcUSB5_driver.o: crcUSB5_driver.c crcUSB5.h 	${CC} ${CCFLAGS} -c $< -o $@  crcUSB5_driver: crcUSB5.o crcUSB5_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "crcUSB5.h" ================ /* Header file for crcUSB5. Automatically generated by SBV. Do not edit! */ -#ifndef __crcUSB5__HEADER_INCLUDED__-#define __crcUSB5__HEADER_INCLUDED__+#ifndef SBV_GENERATED_crcUSB5_HEADER_INCLUDED+#define SBV_GENERATED_crcUSB5_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord16 crcUSB5(const SWord16 msg); -#endif /* __crcUSB5__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_crcUSB5_HEADER_INCLUDED */ == END: "crcUSB5.h" ================== == BEGIN: "crcUSB5_driver.c" ================ /* Example driver program for crcUSB5. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord16 __result = crcUSB5(0xfedcU);+  const SWord16 sbv_result = crcUSB5(0xfedcU); -  printf("crcUSB5(0xfedcU) = 0x%04"PRIx16"U\n", __result);+  printf("crcUSB5(0xfedcU) = 0x%04"PRIx16"U\n", sbv_result);    return 0; }@@ -85,30 +93,128 @@  #include "crcUSB5.h" -SWord16 crcUSB5(const SWord16 msg)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_10_10_u1(SWord16 a) {-  const SWord16 s0 = msg;-  const SBool   s1 = (SBool) ((s0 >> 10) & 1);+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 10)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_9_9_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 9)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_8_8_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_7_7_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 7)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_6_6_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 6)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_5_5_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 5)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_4_4_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 4)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_3_3_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 3)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_2_2_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 2)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_1_1_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 1)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_0_0_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}+++SWord16 crcUSB5(const SWord16 sbv_input_0)+{+  const SWord16 s0 = sbv_input_0;+  const SBool   s1 = sbv_bv_extract_u16_10_10_u1(s0);   const SBool   s3 = s1 != false;-  const SBool   s4 = (SBool) ((s0 >> 9) & 1);+  const SBool   s4 = sbv_bv_extract_u16_9_9_u1(s0);   const SBool   s5 = false != s4;-  const SBool   s6 = (SBool) ((s0 >> 8) & 1);+  const SBool   s6 = sbv_bv_extract_u16_8_8_u1(s0);   const SBool   s7 = false != s6;-  const SBool   s8 = (SBool) ((s0 >> 7) & 1);+  const SBool   s8 = sbv_bv_extract_u16_7_7_u1(s0);   const SBool   s9 = false != s8;-  const SBool   s10 = (SBool) ((s0 >> 6) & 1);+  const SBool   s10 = sbv_bv_extract_u16_6_6_u1(s0);   const SBool   s11 = false != s10;-  const SBool   s12 = (SBool) ((s0 >> 5) & 1);+  const SBool   s12 = sbv_bv_extract_u16_5_5_u1(s0);   const SBool   s13 = false != s12;-  const SBool   s14 = (SBool) ((s0 >> 4) & 1);+  const SBool   s14 = sbv_bv_extract_u16_4_4_u1(s0);   const SBool   s15 = false != s14;-  const SBool   s16 = (SBool) ((s0 >> 3) & 1);+  const SBool   s16 = sbv_bv_extract_u16_3_3_u1(s0);   const SBool   s17 = false != s16;-  const SBool   s18 = (SBool) ((s0 >> 2) & 1);+  const SBool   s18 = sbv_bv_extract_u16_2_2_u1(s0);   const SBool   s19 = false != s18;-  const SBool   s20 = (SBool) ((s0 >> 1) & 1);+  const SBool   s20 = sbv_bv_extract_u16_1_1_u1(s0);   const SBool   s21 = false != s20;-  const SBool   s22 = (SBool) (s0 & 1);+  const SBool   s22 = sbv_bv_extract_u16_0_0_u1(s0);   const SBool   s23 = false != s22;   const SBool   s24 = !s9;   const SBool   s25 = s3 ? s24 : s9;
SBVTestSuite/GoldFiles/crcUSB5_2.gold view
@@ -12,11 +12,11 @@ crcUSB5.o: crcUSB5.c crcUSB5.h 	${CC} ${CCFLAGS} -c $< -o $@ -crcUSB5_driver.o: crcUSB5_driver.c+crcUSB5_driver.o: crcUSB5_driver.c crcUSB5.h 	${CC} ${CCFLAGS} -c $< -o $@  crcUSB5_driver: crcUSB5.o crcUSB5_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "crcUSB5.h" ================ /* Header file for crcUSB5. Automatically generated by SBV. Do not edit! */ -#ifndef __crcUSB5__HEADER_INCLUDED__-#define __crcUSB5__HEADER_INCLUDED__+#ifndef SBV_GENERATED_crcUSB5_HEADER_INCLUDED+#define SBV_GENERATED_crcUSB5_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord16 crcUSB5(const SWord16 msg); -#endif /* __crcUSB5__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_crcUSB5_HEADER_INCLUDED */ == END: "crcUSB5.h" ================== == BEGIN: "crcUSB5_driver.c" ================ /* Example driver program for crcUSB5. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord16 __result = crcUSB5(0xfedcU);+  const SWord16 sbv_result = crcUSB5(0xfedcU); -  printf("crcUSB5(0xfedcU) = 0x%04"PRIx16"U\n", __result);+  printf("crcUSB5(0xfedcU) = 0x%04"PRIx16"U\n", sbv_result);    return 0; }@@ -85,55 +93,206 @@  #include "crcUSB5.h" -SWord16 crcUSB5(const SWord16 msg)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_u16_shl(SWord16 a, SWord16 amount) {-  const SWord16 s0 = msg;-  const SWord16 s2 = s0 << 5;-  const SBool   s3 = (SBool) ((s2 >> 15) & 1);+  const uint64_t n = (uint64_t) (SWord16) amount;+  const SWord16 result = n >= 16 ? (SWord16) 0 : (SWord16) ((uint64_t) (SWord16) a << n);+  return result;+}++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_u16_lshr(SWord16 a, SWord16 amount)+{+  const uint64_t n = (uint64_t) (SWord16) amount;+  return n >= 16 ? (SWord16) 0 : (SWord16) ((uint64_t) (SWord16) a >> n);+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_15_15_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 15)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_14_14_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 14)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_13_13_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 13)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_12_12_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 12)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_11_11_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 11)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_10_10_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 10)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_9_9_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 9)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_8_8_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_7_7_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 7)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_6_6_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 6)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_5_5_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 5)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_4_4_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 4)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_3_3_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 3)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_2_2_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 2)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_1_1_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 1)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u16_0_0_u1(SWord16 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}+++SWord16 crcUSB5(const SWord16 sbv_input_0)+{+  const SWord16 s0 = sbv_input_0;+  const SWord16 s2 = sbv_bv_u16_shl(s0, 0x0005U);+  const SBool   s3 = sbv_bv_extract_u16_15_15_u1(s2);   const SBool   s5 = s3 != false;-  const SBool   s6 = (SBool) ((s2 >> 14) & 1);+  const SBool   s6 = sbv_bv_extract_u16_14_14_u1(s2);   const SBool   s7 = false != s6;-  const SBool   s8 = (SBool) ((s2 >> 13) & 1);+  const SBool   s8 = sbv_bv_extract_u16_13_13_u1(s2);   const SBool   s9 = false != s8;-  const SBool   s10 = (SBool) ((s2 >> 12) & 1);+  const SBool   s10 = sbv_bv_extract_u16_12_12_u1(s2);   const SBool   s11 = false != s10;   const SBool   s12 = !s11;   const SBool   s13 = s5 ? s12 : s11;-  const SBool   s14 = (SBool) ((s2 >> 11) & 1);+  const SBool   s14 = sbv_bv_extract_u16_11_11_u1(s2);   const SBool   s15 = false != s14;   const SBool   s16 = !s15;   const SBool   s17 = s7 ? s16 : s15;-  const SBool   s18 = (SBool) ((s2 >> 10) & 1);+  const SBool   s18 = sbv_bv_extract_u16_10_10_u1(s2);   const SBool   s19 = false != s18;   const SBool   s20 = !s19;   const SBool   s21 = s5 ? s20 : s19;   const SBool   s22 = !s21;   const SBool   s23 = s9 ? s22 : s21;-  const SBool   s24 = (SBool) ((s2 >> 9) & 1);+  const SBool   s24 = sbv_bv_extract_u16_9_9_u1(s2);   const SBool   s25 = false != s24;   const SBool   s26 = !s25;   const SBool   s27 = s7 ? s26 : s25;   const SBool   s28 = !s27;   const SBool   s29 = s13 ? s28 : s27;-  const SBool   s30 = (SBool) ((s2 >> 8) & 1);+  const SBool   s30 = sbv_bv_extract_u16_8_8_u1(s2);   const SBool   s31 = false != s30;   const SBool   s32 = !s31;   const SBool   s33 = s9 ? s32 : s31;   const SBool   s34 = !s33;   const SBool   s35 = s17 ? s34 : s33;-  const SBool   s36 = (SBool) ((s2 >> 7) & 1);+  const SBool   s36 = sbv_bv_extract_u16_7_7_u1(s2);   const SBool   s37 = false != s36;   const SBool   s38 = !s37;   const SBool   s39 = s13 ? s38 : s37;   const SBool   s40 = !s39;   const SBool   s41 = s23 ? s40 : s39;-  const SBool   s42 = (SBool) ((s2 >> 6) & 1);+  const SBool   s42 = sbv_bv_extract_u16_6_6_u1(s2);   const SBool   s43 = false != s42;   const SBool   s44 = !s43;   const SBool   s45 = s17 ? s44 : s43;   const SBool   s46 = !s45;   const SBool   s47 = s29 ? s46 : s45;-  const SBool   s48 = (SBool) ((s2 >> 5) & 1);+  const SBool   s48 = sbv_bv_extract_u16_5_5_u1(s2);   const SBool   s49 = false != s48;   const SBool   s50 = !s49;   const SBool   s51 = s23 ? s50 : s49;@@ -161,29 +320,29 @@   const SBool   s73 = s47 ? s72 : s47;   const SBool   s74 = !s53;   const SBool   s75 = s53 ? s74 : s53;-  const SBool   s76 = (SBool) ((s2 >> 4) & 1);+  const SBool   s76 = sbv_bv_extract_u16_4_4_u1(s2);   const SBool   s77 = false != s76;   const SBool   s78 = !s77;   const SBool   s79 = s29 ? s78 : s77;   const SBool   s80 = !s79;   const SBool   s81 = s41 ? s80 : s79;-  const SBool   s82 = (SBool) ((s2 >> 3) & 1);+  const SBool   s82 = sbv_bv_extract_u16_3_3_u1(s2);   const SBool   s83 = false != s82;   const SBool   s84 = !s83;   const SBool   s85 = s35 ? s84 : s83;   const SBool   s86 = !s85;   const SBool   s87 = s47 ? s86 : s85;-  const SBool   s88 = (SBool) ((s2 >> 2) & 1);+  const SBool   s88 = sbv_bv_extract_u16_2_2_u1(s2);   const SBool   s89 = false != s88;   const SBool   s90 = !s89;   const SBool   s91 = s41 ? s90 : s89;   const SBool   s92 = !s91;   const SBool   s93 = s53 ? s92 : s91;-  const SBool   s94 = (SBool) ((s2 >> 1) & 1);+  const SBool   s94 = sbv_bv_extract_u16_1_1_u1(s2);   const SBool   s95 = false != s94;   const SBool   s96 = !s95;   const SBool   s97 = s47 ? s96 : s95;-  const SBool   s98 = (SBool) (s2 & 1);+  const SBool   s98 = sbv_bv_extract_u16_0_0_u1(s2);   const SBool   s99 = false != s98;   const SBool   s100 = !s99;   const SBool   s101 = s53 ? s100 : s99;
SBVTestSuite/GoldFiles/doctest_sanity.gold view
@@ -1,3 +1,3 @@-Total:      1248; Tried: 1248; Skipped:    0; Success: 1248; Errors:    0; Failures    0-Examples:   1093; Tried: 1093; Skipped:    0; Success: 1093; Errors:    0; Failures    0+Total:      1268; Tried: 1268; Skipped:    0; Success: 1268; Errors:    0; Failures    0+Examples:   1113; Tried: 1113; Skipped:    0; Success: 1113; Errors:    0; Failures    0 Setup:       155; Tried:  155; Skipped:    0; Success:  155; Errors:    0; Failures    0
SBVTestSuite/GoldFiles/fib1.gold view
@@ -12,11 +12,11 @@ fib1.o: fib1.c fib1.h 	${CC} ${CCFLAGS} -c $< -o $@ -fib1_driver.o: fib1_driver.c+fib1_driver.o: fib1_driver.c fib1.h 	${CC} ${CCFLAGS} -c $< -o $@  fib1_driver: fib1.o fib1_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "fib1.h" ================ /* Header file for fib1. Automatically generated by SBV. Do not edit! */ -#ifndef __fib1__HEADER_INCLUDED__-#define __fib1__HEADER_INCLUDED__+#ifndef SBV_GENERATED_fib1_HEADER_INCLUDED+#define SBV_GENERATED_fib1_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord64 fib1(const SWord64 n); -#endif /* __fib1__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_fib1_HEADER_INCLUDED */ == END: "fib1.h" ================== == BEGIN: "fib1_driver.c" ================ /* Example driver program for fib1. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord64 __result = fib1(0x000000000000000cULL);+  const SWord64 sbv_result = fib1(0x000000000000000cULL); -  printf("fib1(0x000000000000000cULL) = 0x%016"PRIx64"ULL\n", __result);+  printf("fib1(0x000000000000000cULL) = 0x%016"PRIx64"ULL\n", sbv_result);    return 0; }@@ -85,9 +93,9 @@  #include "fib1.h" -SWord64 fib1(const SWord64 n)+SWord64 fib1(const SWord64 sbv_input_0) {-  const SWord64 s0 = n;+  const SWord64 s0 = sbv_input_0;   const SBool   s2 = s0 == 0x0000000000000000ULL;   const SBool   s4 = s0 == 0x0000000000000001ULL;   const SBool   s6 = s0 == 0x0000000000000002ULL;
SBVTestSuite/GoldFiles/fib2.gold view
@@ -12,11 +12,11 @@ fib2.o: fib2.c fib2.h 	${CC} ${CCFLAGS} -c $< -o $@ -fib2_driver.o: fib2_driver.c+fib2_driver.o: fib2_driver.c fib2.h 	${CC} ${CCFLAGS} -c $< -o $@  fib2_driver: fib2.o fib2_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "fib2.h" ================ /* Header file for fib2. Automatically generated by SBV. Do not edit! */ -#ifndef __fib2__HEADER_INCLUDED__-#define __fib2__HEADER_INCLUDED__+#ifndef SBV_GENERATED_fib2_HEADER_INCLUDED+#define SBV_GENERATED_fib2_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord64 fib2(const SWord64 n); -#endif /* __fib2__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_fib2_HEADER_INCLUDED */ == END: "fib2.h" ================== == BEGIN: "fib2_driver.c" ================ /* Example driver program for fib2. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord64 __result = fib2(0x0000000000000014ULL);+  const SWord64 sbv_result = fib2(0x0000000000000014ULL); -  printf("fib2(0x0000000000000014ULL) = 0x%016"PRIx64"ULL\n", __result);+  printf("fib2(0x0000000000000014ULL) = 0x%016"PRIx64"ULL\n", sbv_result);    return 0; }@@ -85,9 +93,10 @@  #include "fib2.h" -SWord64 fib2(const SWord64 n)+SWord64 fib2(const SWord64 sbv_input_0) {-  const SWord64 s0 = n;+  const SWord64 s0 = sbv_input_0;+        SWord64 s65;   static const SWord64 table0[] = {       0x0000000000000000ULL, 0x0000000000000001ULL,       0x0000000000000001ULL, 0x0000000000000002ULL,@@ -122,7 +131,7 @@       0x000001686c8312d0ULL, 0x000002472d96a909ULL,       0x000003af9a19bbd9ULL, 0x000005f6c7b064e2ULL, 0x000009a661ca20bbULL   };-  const SWord64 s65 = s0 >= 65 ? 0x0000000000000000ULL : table0[s0];+  s65 = s0 >= 65 ? 0x0000000000000000ULL : table0[s0];    return s65; }
SBVTestSuite/GoldFiles/floats_cgen.gold view
@@ -2,2787 +2,5195 @@ /* File: "toFP_Int8_ToFloat.c". Automatically generated by SBV. Do not edit! */  #include "floatCodeGen.h"--SFloat toFP_Int8_ToFloat(const SInt8 a)-{-  const SInt8  s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Int8_ToFloat.c" ==================-== BEGIN: "toFP_Int16_ToFloat.c" ================-/* File: "toFP_Int16_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Int16_ToFloat(const SInt16 a)-{-  const SInt16 s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Int16_ToFloat.c" ==================-== BEGIN: "toFP_Int32_ToFloat.c" ================-/* File: "toFP_Int32_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Int32_ToFloat(const SInt32 a)-{-  const SInt32 s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Int32_ToFloat.c" ==================-== BEGIN: "toFP_Int64_ToFloat.c" ================-/* File: "toFP_Int64_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Int64_ToFloat(const SInt64 a)-{-  const SInt64 s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Int64_ToFloat.c" ==================-== BEGIN: "toFP_Word8_ToFloat.c" ================-/* File: "toFP_Word8_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Word8_ToFloat(const SWord8 a)-{-  const SWord8 s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Word8_ToFloat.c" ==================-== BEGIN: "toFP_Word16_ToFloat.c" ================-/* File: "toFP_Word16_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Word16_ToFloat(const SWord16 a)-{-  const SWord16 s0 = a;-  const SFloat  s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Word16_ToFloat.c" ==================-== BEGIN: "toFP_Word32_ToFloat.c" ================-/* File: "toFP_Word32_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Word32_ToFloat(const SWord32 a)-{-  const SWord32 s0 = a;-  const SFloat  s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Word32_ToFloat.c" ==================-== BEGIN: "toFP_Word64_ToFloat.c" ================-/* File: "toFP_Word64_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Word64_ToFloat(const SWord64 a)-{-  const SWord64 s0 = a;-  const SFloat  s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Word64_ToFloat.c" ==================-== BEGIN: "toFP_Float_ToFloat.c" ================-/* File: "toFP_Float_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Float_ToFloat(const SFloat a)-{-  const SFloat s0 = a;-  return s0;-}-== END: "toFP_Float_ToFloat.c" ==================-== BEGIN: "toFP_Double_ToFloat.c" ================-/* File: "toFP_Double_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Double_ToFloat(const SDouble a)-{-  const SDouble s0 = a;-  const SFloat  s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Double_ToFloat.c" ==================-== BEGIN: "toFP_Integer_ToFloat.c" ================-/* File: "toFP_Integer_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Integer_ToFloat(const SInteger a)-{-  const SInteger s0 = a;-  const SFloat   s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Integer_ToFloat.c" ==================-== BEGIN: "toFP_Real_ToFloat.c" ================-/* File: "toFP_Real_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat toFP_Real_ToFloat(const SReal a)-{-  const SReal  s0 = a;-  const SFloat s2 = (SFloat) s0;--  return s2;-}-== END: "toFP_Real_ToFloat.c" ==================-== BEGIN: "toFP_Int8_ToDouble.c" ================-/* File: "toFP_Int8_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Int8_ToDouble(const SInt8 a)-{-  const SInt8   s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Int8_ToDouble.c" ==================-== BEGIN: "toFP_Int16_ToDouble.c" ================-/* File: "toFP_Int16_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Int16_ToDouble(const SInt16 a)-{-  const SInt16  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Int16_ToDouble.c" ==================-== BEGIN: "toFP_Int32_ToDouble.c" ================-/* File: "toFP_Int32_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Int32_ToDouble(const SInt32 a)-{-  const SInt32  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Int32_ToDouble.c" ==================-== BEGIN: "toFP_Int64_ToDouble.c" ================-/* File: "toFP_Int64_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Int64_ToDouble(const SInt64 a)-{-  const SInt64  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Int64_ToDouble.c" ==================-== BEGIN: "toFP_Word8_ToDouble.c" ================-/* File: "toFP_Word8_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Word8_ToDouble(const SWord8 a)-{-  const SWord8  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Word8_ToDouble.c" ==================-== BEGIN: "toFP_Word16_ToDouble.c" ================-/* File: "toFP_Word16_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Word16_ToDouble(const SWord16 a)-{-  const SWord16 s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Word16_ToDouble.c" ==================-== BEGIN: "toFP_Word32_ToDouble.c" ================-/* File: "toFP_Word32_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Word32_ToDouble(const SWord32 a)-{-  const SWord32 s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Word32_ToDouble.c" ==================-== BEGIN: "toFP_Word64_ToDouble.c" ================-/* File: "toFP_Word64_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Word64_ToDouble(const SWord64 a)-{-  const SWord64 s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Word64_ToDouble.c" ==================-== BEGIN: "toFP_Float_ToDouble.c" ================-/* File: "toFP_Float_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Float_ToDouble(const SFloat a)-{-  const SFloat  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Float_ToDouble.c" ==================-== BEGIN: "toFP_Double_ToDouble.c" ================-/* File: "toFP_Double_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Double_ToDouble(const SDouble a)-{-  const SDouble s0 = a;-  return s0;-}-== END: "toFP_Double_ToDouble.c" ==================-== BEGIN: "toFP_Integer_ToDouble.c" ================-/* File: "toFP_Integer_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Integer_ToDouble(const SInteger a)-{-  const SInteger s0 = a;-  const SDouble  s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Integer_ToDouble.c" ==================-== BEGIN: "toFP_Real_ToDouble.c" ================-/* File: "toFP_Real_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble toFP_Real_ToDouble(const SReal a)-{-  const SReal   s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "toFP_Real_ToDouble.c" ==================-== BEGIN: "fromFP_Float_ToInt8.c" ================-/* File: "fromFP_Float_ToInt8.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt8 fromFP_Float_ToInt8(const SFloat a)-{-  const SFloat s0 = a;-  const SInt8  s2 = (SInt8) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToInt8.c" ==================-== BEGIN: "fromFP_Float_ToInt16.c" ================-/* File: "fromFP_Float_ToInt16.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt16 fromFP_Float_ToInt16(const SFloat a)-{-  const SFloat s0 = a;-  const SInt16 s2 = (SInt16) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToInt16.c" ==================-== BEGIN: "fromFP_Float_ToInt32.c" ================-/* File: "fromFP_Float_ToInt32.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt32 fromFP_Float_ToInt32(const SFloat a)-{-  const SFloat s0 = a;-  const SInt32 s2 = (SInt32) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToInt32.c" ==================-== BEGIN: "fromFP_Float_ToInt64.c" ================-/* File: "fromFP_Float_ToInt64.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt64 fromFP_Float_ToInt64(const SFloat a)-{-  const SFloat s0 = a;-  const SInt64 s2 = (SInt64) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToInt64.c" ==================-== BEGIN: "fromFP_Float_ToWord8.c" ================-/* File: "fromFP_Float_ToWord8.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord8 fromFP_Float_ToWord8(const SFloat a)-{-  const SFloat s0 = a;-  const SWord8 s2 = (SWord8) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToWord8.c" ==================-== BEGIN: "fromFP_Float_ToWord16.c" ================-/* File: "fromFP_Float_ToWord16.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord16 fromFP_Float_ToWord16(const SFloat a)-{-  const SFloat  s0 = a;-  const SWord16 s2 = (SWord16) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToWord16.c" ==================-== BEGIN: "fromFP_Float_ToWord32.c" ================-/* File: "fromFP_Float_ToWord32.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord32 fromFP_Float_ToWord32(const SFloat a)-{-  const SFloat  s0 = a;-  const SWord32 s2 = (SWord32) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToWord32.c" ==================-== BEGIN: "fromFP_Float_ToWord64.c" ================-/* File: "fromFP_Float_ToWord64.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord64 fromFP_Float_ToWord64(const SFloat a)-{-  const SFloat  s0 = a;-  const SWord64 s2 = (SWord64) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToWord64.c" ==================-== BEGIN: "fromFP_Float_ToFloat.c" ================-/* File: "fromFP_Float_ToFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat fromFP_Float_ToFloat(const SFloat a)-{-  const SFloat s0 = a;-  return s0;-}-== END: "fromFP_Float_ToFloat.c" ==================-== BEGIN: "fromFP_Float_ToDouble.c" ================-/* File: "fromFP_Float_ToDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble fromFP_Float_ToDouble(const SFloat a)-{-  const SFloat  s0 = a;-  const SDouble s2 = (SDouble) s0;--  return s2;-}-== END: "fromFP_Float_ToDouble.c" ==================-== BEGIN: "fromFP_Float_ToInteger.c" ================-/* File: "fromFP_Float_ToInteger.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInteger fromFP_Float_ToInteger(const SFloat a)-{-  const SFloat   s0 = a;-  const SInteger s2 = (SInteger) rintf(s0);--  return s2;-}-== END: "fromFP_Float_ToInteger.c" ==================-== BEGIN: "fromFP_Float_ToReal.c" ================-/* File: "fromFP_Float_ToReal.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SReal fromFP_Float_ToReal(const SFloat a)-{-  const SFloat s0 = a;-  const SReal  s2 = (SReal) s0;--  return s2;-}-== END: "fromFP_Float_ToReal.c" ==================-== BEGIN: "fromFP_DoubleTo_Int8.c" ================-/* File: "fromFP_DoubleTo_Int8.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt8 fromFP_DoubleTo_Int8(const SDouble a)-{-  const SDouble s0 = a;-  const SInt8   s2 = (SInt8) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Int8.c" ==================-== BEGIN: "fromFP_DoubleTo_Int16.c" ================-/* File: "fromFP_DoubleTo_Int16.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt16 fromFP_DoubleTo_Int16(const SDouble a)-{-  const SDouble s0 = a;-  const SInt16  s2 = (SInt16) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Int16.c" ==================-== BEGIN: "fromFP_DoubleTo_Int32.c" ================-/* File: "fromFP_DoubleTo_Int32.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt32 fromFP_DoubleTo_Int32(const SDouble a)-{-  const SDouble s0 = a;-  const SInt32  s2 = (SInt32) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Int32.c" ==================-== BEGIN: "fromFP_DoubleTo_Int64.c" ================-/* File: "fromFP_DoubleTo_Int64.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInt64 fromFP_DoubleTo_Int64(const SDouble a)-{-  const SDouble s0 = a;-  const SInt64  s2 = (SInt64) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Int64.c" ==================-== BEGIN: "fromFP_DoubleTo_Word8.c" ================-/* File: "fromFP_DoubleTo_Word8.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord8 fromFP_DoubleTo_Word8(const SDouble a)-{-  const SDouble s0 = a;-  const SWord8  s2 = (SWord8) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Word8.c" ==================-== BEGIN: "fromFP_DoubleTo_Word16.c" ================-/* File: "fromFP_DoubleTo_Word16.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord16 fromFP_DoubleTo_Word16(const SDouble a)-{-  const SDouble s0 = a;-  const SWord16 s2 = (SWord16) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Word16.c" ==================-== BEGIN: "fromFP_DoubleTo_Word32.c" ================-/* File: "fromFP_DoubleTo_Word32.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord32 fromFP_DoubleTo_Word32(const SDouble a)-{-  const SDouble s0 = a;-  const SWord32 s2 = (SWord32) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Word32.c" ==================-== BEGIN: "fromFP_DoubleTo_Word64.c" ================-/* File: "fromFP_DoubleTo_Word64.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord64 fromFP_DoubleTo_Word64(const SDouble a)-{-  const SDouble s0 = a;-  const SWord64 s2 = (SWord64) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Word64.c" ==================-== BEGIN: "fromFP_DoubleTo_Float.c" ================-/* File: "fromFP_DoubleTo_Float.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat fromFP_DoubleTo_Float(const SDouble a)-{-  const SDouble s0 = a;-  const SFloat  s2 = (SFloat) s0;--  return s2;-}-== END: "fromFP_DoubleTo_Float.c" ==================-== BEGIN: "fromFP_DoubleTo_Double.c" ================-/* File: "fromFP_DoubleTo_Double.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble fromFP_DoubleTo_Double(const SDouble a)-{-  const SDouble s0 = a;-  return s0;-}-== END: "fromFP_DoubleTo_Double.c" ==================-== BEGIN: "fromFP_DoubleTo_Integer.c" ================-/* File: "fromFP_DoubleTo_Integer.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SInteger fromFP_DoubleTo_Integer(const SDouble a)-{-  const SDouble  s0 = a;-  const SInteger s2 = (SInteger) rint(s0);--  return s2;-}-== END: "fromFP_DoubleTo_Integer.c" ==================-== BEGIN: "fromFP_DoubleTo_Real.c" ================-/* File: "fromFP_DoubleTo_Real.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SReal fromFP_DoubleTo_Real(const SDouble a)-{-  const SDouble s0 = a;-  const SReal   s2 = (SReal) s0;--  return s2;-}-== END: "fromFP_DoubleTo_Real.c" ==================-== BEGIN: "fromFP_SWord32_SFloat.c" ================-/* File: "fromFP_SWord32_SFloat.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat fromFP_SWord32_SFloat(const SWord32 a)-{-  const SWord32 s0 = a;-        SFloat  s1; memcpy(&s1, &s0, sizeof(SFloat));--  return s1;-}-== END: "fromFP_SWord32_SFloat.c" ==================-== BEGIN: "fromFP_SWord64_SDouble.c" ================-/* File: "fromFP_SWord64_SDouble.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble fromFP_SWord64_SDouble(const SWord64 a)-{-  const SWord64 s0 = a;-        SDouble s1; memcpy(&s1, &s0, sizeof(SDouble));--  return s1;-}-== END: "fromFP_SWord64_SDouble.c" ==================-== BEGIN: "fromFP_SFloat_SWord32.c" ================-/* File: "fromFP_SFloat_SWord32.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord32 fromFP_SFloat_SWord32(const SFloat a)-{-  const SFloat  s0 = a;-        SWord32 s1; memcpy(&s1, &s0, sizeof(SWord32));--  return s1;-}-== END: "fromFP_SFloat_SWord32.c" ==================-== BEGIN: "fromFP_SDouble_SWord64.c" ================-/* File: "fromFP_SDouble_SWord64.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SWord64 fromFP_SDouble_SWord64(const SDouble a)-{-  const SDouble s0 = a;-        SWord64 s1; memcpy(&s1, &s0, sizeof(SWord64));--  return s1;-}-== END: "fromFP_SDouble_SWord64.c" ==================-== BEGIN: "f_FP_Abs.c" ================-/* File: "f_FP_Abs.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Abs(const SFloat a)-{-  const SFloat s0 = a;-  const SFloat s1 = fabsf(s0);--  return s1;-}-== END: "f_FP_Abs.c" ==================-== BEGIN: "d_FP_Abs.c" ================-/* File: "d_FP_Abs.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Abs(const SDouble a)-{-  const SDouble s0 = a;-  const SDouble s1 = fabs(s0);--  return s1;-}-== END: "d_FP_Abs.c" ==================-== BEGIN: "f_FP_Neg.c" ================-/* File: "f_FP_Neg.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Neg(const SFloat a)-{-  const SFloat s0 = a;-  const SFloat s1 = (- s0);--  return s1;-}-== END: "f_FP_Neg.c" ==================-== BEGIN: "d_FP_Neg.c" ================-/* File: "d_FP_Neg.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Neg(const SDouble a)-{-  const SDouble s0 = a;-  const SDouble s1 = (- s0);--  return s1;-}-== END: "d_FP_Neg.c" ==================-== BEGIN: "f_FP_Add.c" ================-/* File: "f_FP_Add.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Add(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s3 = s0 + s1;--  return s3;-}-== END: "f_FP_Add.c" ==================-== BEGIN: "d_FP_Add.c" ================-/* File: "d_FP_Add.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Add(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s3 = s0 + s1;--  return s3;-}-== END: "d_FP_Add.c" ==================-== BEGIN: "f_FP_Sub.c" ================-/* File: "f_FP_Sub.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Sub(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s3 = s0 - s1;--  return s3;-}-== END: "f_FP_Sub.c" ==================-== BEGIN: "d_FP_Sub.c" ================-/* File: "d_FP_Sub.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Sub(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s3 = s0 - s1;--  return s3;-}-== END: "d_FP_Sub.c" ==================-== BEGIN: "f_FP_Mul.c" ================-/* File: "f_FP_Mul.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Mul(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s3 = s0 * s1;--  return s3;-}-== END: "f_FP_Mul.c" ==================-== BEGIN: "d_FP_Mul.c" ================-/* File: "d_FP_Mul.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Mul(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s3 = s0 * s1;--  return s3;-}-== END: "d_FP_Mul.c" ==================-== BEGIN: "f_FP_Div.c" ================-/* File: "f_FP_Div.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Div(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s3 = s0 / s1;--  return s3;-}-== END: "f_FP_Div.c" ==================-== BEGIN: "d_FP_Div.c" ================-/* File: "d_FP_Div.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Div(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s3 = s0 / s1;--  return s3;-}-== END: "d_FP_Div.c" ==================-== BEGIN: "f_FP_FMA.c" ================-/* File: "f_FP_FMA.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_FMA(const SFloat a, const SFloat b, const SFloat c)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s2 = c;-  const SFloat s4 = fmaf(s0, s1, s2);--  return s4;-}-== END: "f_FP_FMA.c" ==================-== BEGIN: "d_FP_FMA.c" ================-/* File: "d_FP_FMA.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_FMA(const SDouble a, const SDouble b, const SDouble c)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s2 = c;-  const SDouble s4 = fma(s0, s1, s2);--  return s4;-}-== END: "d_FP_FMA.c" ==================-== BEGIN: "f_FP_Sqrt.c" ================-/* File: "f_FP_Sqrt.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Sqrt(const SFloat a)-{-  const SFloat s0 = a;-  const SFloat s2 = sqrtf(s0);--  return s2;-}-== END: "f_FP_Sqrt.c" ==================-== BEGIN: "d_FP_Sqrt.c" ================-/* File: "d_FP_Sqrt.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Sqrt(const SDouble a)-{-  const SDouble s0 = a;-  const SDouble s2 = sqrt(s0);--  return s2;-}-== END: "d_FP_Sqrt.c" ==================-== BEGIN: "f_FP_Rem.c" ================-/* File: "f_FP_Rem.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Rem(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s2 = fmodf(s0, s1);--  return s2;-}-== END: "f_FP_Rem.c" ==================-== BEGIN: "d_FP_Rem.c" ================-/* File: "d_FP_Rem.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Rem(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s2 = fmod(s0, s1);--  return s2;-}-== END: "d_FP_Rem.c" ==================-== BEGIN: "f_FP_RoundToIntegral.c" ================-/* File: "f_FP_RoundToIntegral.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_RoundToIntegral(const SFloat a)-{-  const SFloat s0 = a;-  const SFloat s2 = rintf(s0);--  return s2;-}-== END: "f_FP_RoundToIntegral.c" ==================-== BEGIN: "d_FP_RoundToIntegral.c" ================-/* File: "d_FP_RoundToIntegral.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_RoundToIntegral(const SDouble a)-{-  const SDouble s0 = a;-  const SDouble s2 = rint(s0);--  return s2;-}-== END: "d_FP_RoundToIntegral.c" ==================-== BEGIN: "f_FP_Min.c" ================-/* File: "f_FP_Min.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Min(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0F /* 0.0F */ : fminf(s0,-                                                                                                                                              s1);--  return s2;-}-== END: "f_FP_Min.c" ==================-== BEGIN: "d_FP_Min.c" ================-/* File: "d_FP_Min.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Min(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0 /* 0.0 */ : fmin(s0,-                                                                                                                                            s1);--  return s2;-}-== END: "d_FP_Min.c" ==================-== BEGIN: "f_FP_Max.c" ================-/* File: "f_FP_Max.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SFloat f_FP_Max(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SFloat s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0F /* 0.0F */ : fmaxf(s0,-                                                                                                                                              s1);--  return s2;-}-== END: "f_FP_Max.c" ==================-== BEGIN: "d_FP_Max.c" ================-/* File: "d_FP_Max.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SDouble d_FP_Max(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SDouble s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0 /* 0.0 */ : fmax(s0,-                                                                                                                                            s1);--  return s2;-}-== END: "d_FP_Max.c" ==================-== BEGIN: "f_FP_IsEqualObject.c" ================-/* File: "f_FP_IsEqualObject.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsEqualObject(const SFloat a, const SFloat b)-{-  const SFloat s0 = a;-  const SFloat s1 = b;-  const SBool  s2 = isnan(s0) ? isnan(s1) : (signbit(s0) && (s0 == 0)) ? (signbit(s1) && (s1 == 0)) : (signbit(s1) && (s1 == 0)) ? (signbit(s0) && (s0 == 0)) : (s0 == s1);--  return s2;-}-== END: "f_FP_IsEqualObject.c" ==================-== BEGIN: "d_FP_IsEqualObject.c" ================-/* File: "d_FP_IsEqualObject.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsEqualObject(const SDouble a, const SDouble b)-{-  const SDouble s0 = a;-  const SDouble s1 = b;-  const SBool   s2 = isnan(s0) ? isnan(s1) : (signbit(s0) && (s0 == 0)) ? (signbit(s1) && (s1 == 0)) : (signbit(s1) && (s1 == 0)) ? (signbit(s0) && (s0 == 0)) : (s0 == s1);--  return s2;-}-== END: "d_FP_IsEqualObject.c" ==================-== BEGIN: "f_FP_IsNormal.c" ================-/* File: "f_FP_IsNormal.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsNormal(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = isnormal(s0);--  return s1;-}-== END: "f_FP_IsNormal.c" ==================-== BEGIN: "d_FP_IsNormal.c" ================-/* File: "d_FP_IsNormal.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsNormal(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = isnormal(s0);--  return s1;-}-== END: "d_FP_IsNormal.c" ==================-== BEGIN: "f_FP_IsZero.c" ================-/* File: "f_FP_IsZero.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsZero(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = FP_ZERO == fpclassify(s0);--  return s1;-}-== END: "f_FP_IsZero.c" ==================-== BEGIN: "d_FP_IsZero.c" ================-/* File: "d_FP_IsZero.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsZero(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = FP_ZERO == fpclassify(s0);--  return s1;-}-== END: "d_FP_IsZero.c" ==================-== BEGIN: "f_FP_IsSubnormal.c" ================-/* File: "f_FP_IsSubnormal.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsSubnormal(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = FP_SUBNORMAL == fpclassify(s0);--  return s1;-}-== END: "f_FP_IsSubnormal.c" ==================-== BEGIN: "d_FP_IsSubnormal.c" ================-/* File: "d_FP_IsSubnormal.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsSubnormal(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = FP_SUBNORMAL == fpclassify(s0);--  return s1;-}-== END: "d_FP_IsSubnormal.c" ==================-== BEGIN: "f_FP_IsInfinite.c" ================-/* File: "f_FP_IsInfinite.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsInfinite(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = isinf(s0);--  return s1;-}-== END: "f_FP_IsInfinite.c" ==================-== BEGIN: "d_FP_IsInfinite.c" ================-/* File: "d_FP_IsInfinite.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsInfinite(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = isinf(s0);--  return s1;-}-== END: "d_FP_IsInfinite.c" ==================-== BEGIN: "f_FP_IsNaN.c" ================-/* File: "f_FP_IsNaN.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsNaN(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = isnan(s0);--  return s1;-}-== END: "f_FP_IsNaN.c" ==================-== BEGIN: "d_FP_IsNaN.c" ================-/* File: "d_FP_IsNaN.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsNaN(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = isnan(s0);--  return s1;-}-== END: "d_FP_IsNaN.c" ==================-== BEGIN: "f_FP_IsNegative.c" ================-/* File: "f_FP_IsNegative.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsNegative(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = !isnan(s0) && signbit(s0);--  return s1;-}-== END: "f_FP_IsNegative.c" ==================-== BEGIN: "d_FP_IsNegative.c" ================-/* File: "d_FP_IsNegative.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsNegative(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = !isnan(s0) && signbit(s0);--  return s1;-}-== END: "d_FP_IsNegative.c" ==================-== BEGIN: "f_FP_IsPositive.c" ================-/* File: "f_FP_IsPositive.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool f_FP_IsPositive(const SFloat a)-{-  const SFloat s0 = a;-  const SBool  s1 = !isnan(s0) && !signbit(s0);--  return s1;-}-== END: "f_FP_IsPositive.c" ==================-== BEGIN: "d_FP_IsPositive.c" ================-/* File: "d_FP_IsPositive.c". Automatically generated by SBV. Do not edit! */--#include "floatCodeGen.h"--SBool d_FP_IsPositive(const SDouble a)-{-  const SDouble s0 = a;-  const SBool   s1 = !isnan(s0) && !signbit(s0);--  return s1;-}-== END: "d_FP_IsPositive.c" ==================-== BEGIN: "floatCodeGen.h" ================-/* Header file for floatCodeGen. Automatically generated by SBV. Do not edit! */--#ifndef __floatCodeGen__HEADER_INCLUDED__-#define __floatCodeGen__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* User requested mapping for SInteger.                                 */-/* NB. Loss of precision: Target type is subject to modular arithmetic. */-typedef SInt64 SInteger;--/* User requested mapping for SReal.                          */-/* NB. Loss of precision: Target type is subject to rounding. */-typedef long double SReal;--/* Entry point prototypes: */-SFloat toFP_Int8_ToFloat(const SInt8 a);-SFloat toFP_Int16_ToFloat(const SInt16 a);-SFloat toFP_Int32_ToFloat(const SInt32 a);-SFloat toFP_Int64_ToFloat(const SInt64 a);-SFloat toFP_Word8_ToFloat(const SWord8 a);-SFloat toFP_Word16_ToFloat(const SWord16 a);-SFloat toFP_Word32_ToFloat(const SWord32 a);-SFloat toFP_Word64_ToFloat(const SWord64 a);-SFloat toFP_Float_ToFloat(const SFloat a);-SFloat toFP_Double_ToFloat(const SDouble a);-SFloat toFP_Integer_ToFloat(const SInteger a);-SFloat toFP_Real_ToFloat(const SReal a);-SDouble toFP_Int8_ToDouble(const SInt8 a);-SDouble toFP_Int16_ToDouble(const SInt16 a);-SDouble toFP_Int32_ToDouble(const SInt32 a);-SDouble toFP_Int64_ToDouble(const SInt64 a);-SDouble toFP_Word8_ToDouble(const SWord8 a);-SDouble toFP_Word16_ToDouble(const SWord16 a);-SDouble toFP_Word32_ToDouble(const SWord32 a);-SDouble toFP_Word64_ToDouble(const SWord64 a);-SDouble toFP_Float_ToDouble(const SFloat a);-SDouble toFP_Double_ToDouble(const SDouble a);-SDouble toFP_Integer_ToDouble(const SInteger a);-SDouble toFP_Real_ToDouble(const SReal a);-SInt8 fromFP_Float_ToInt8(const SFloat a);-SInt16 fromFP_Float_ToInt16(const SFloat a);-SInt32 fromFP_Float_ToInt32(const SFloat a);-SInt64 fromFP_Float_ToInt64(const SFloat a);-SWord8 fromFP_Float_ToWord8(const SFloat a);-SWord16 fromFP_Float_ToWord16(const SFloat a);-SWord32 fromFP_Float_ToWord32(const SFloat a);-SWord64 fromFP_Float_ToWord64(const SFloat a);-SFloat fromFP_Float_ToFloat(const SFloat a);-SDouble fromFP_Float_ToDouble(const SFloat a);-SInteger fromFP_Float_ToInteger(const SFloat a);-SReal fromFP_Float_ToReal(const SFloat a);-SInt8 fromFP_DoubleTo_Int8(const SDouble a);-SInt16 fromFP_DoubleTo_Int16(const SDouble a);-SInt32 fromFP_DoubleTo_Int32(const SDouble a);-SInt64 fromFP_DoubleTo_Int64(const SDouble a);-SWord8 fromFP_DoubleTo_Word8(const SDouble a);-SWord16 fromFP_DoubleTo_Word16(const SDouble a);-SWord32 fromFP_DoubleTo_Word32(const SDouble a);-SWord64 fromFP_DoubleTo_Word64(const SDouble a);-SFloat fromFP_DoubleTo_Float(const SDouble a);-SDouble fromFP_DoubleTo_Double(const SDouble a);-SInteger fromFP_DoubleTo_Integer(const SDouble a);-SReal fromFP_DoubleTo_Real(const SDouble a);-SFloat fromFP_SWord32_SFloat(const SWord32 a);-SDouble fromFP_SWord64_SDouble(const SWord64 a);-SWord32 fromFP_SFloat_SWord32(const SFloat a);-SWord64 fromFP_SDouble_SWord64(const SDouble a);-SFloat f_FP_Abs(const SFloat a);-SDouble d_FP_Abs(const SDouble a);-SFloat f_FP_Neg(const SFloat a);-SDouble d_FP_Neg(const SDouble a);-SFloat f_FP_Add(const SFloat a, const SFloat b);-SDouble d_FP_Add(const SDouble a, const SDouble b);-SFloat f_FP_Sub(const SFloat a, const SFloat b);-SDouble d_FP_Sub(const SDouble a, const SDouble b);-SFloat f_FP_Mul(const SFloat a, const SFloat b);-SDouble d_FP_Mul(const SDouble a, const SDouble b);-SFloat f_FP_Div(const SFloat a, const SFloat b);-SDouble d_FP_Div(const SDouble a, const SDouble b);-SFloat f_FP_FMA(const SFloat a, const SFloat b, const SFloat c);-SDouble d_FP_FMA(const SDouble a, const SDouble b,-                 const SDouble c);-SFloat f_FP_Sqrt(const SFloat a);-SDouble d_FP_Sqrt(const SDouble a);-SFloat f_FP_Rem(const SFloat a, const SFloat b);-SDouble d_FP_Rem(const SDouble a, const SDouble b);-SFloat f_FP_RoundToIntegral(const SFloat a);-SDouble d_FP_RoundToIntegral(const SDouble a);-SFloat f_FP_Min(const SFloat a, const SFloat b);-SDouble d_FP_Min(const SDouble a, const SDouble b);-SFloat f_FP_Max(const SFloat a, const SFloat b);-SDouble d_FP_Max(const SDouble a, const SDouble b);-SBool f_FP_IsEqualObject(const SFloat a, const SFloat b);-SBool d_FP_IsEqualObject(const SDouble a, const SDouble b);-SBool f_FP_IsNormal(const SFloat a);-SBool d_FP_IsNormal(const SDouble a);-SBool f_FP_IsZero(const SFloat a);-SBool d_FP_IsZero(const SDouble a);-SBool f_FP_IsSubnormal(const SFloat a);-SBool d_FP_IsSubnormal(const SDouble a);-SBool f_FP_IsInfinite(const SFloat a);-SBool d_FP_IsInfinite(const SDouble a);-SBool f_FP_IsNaN(const SFloat a);-SBool d_FP_IsNaN(const SDouble a);-SBool f_FP_IsNegative(const SFloat a);-SBool d_FP_IsNegative(const SDouble a);-SBool f_FP_IsPositive(const SFloat a);-SBool d_FP_IsPositive(const SDouble a);--#endif /* __floatCodeGen__HEADER_INCLUDED__ */-== END: "floatCodeGen.h" ==================-== BEGIN: "floatCodeGen_driver.c" ================-/* Example driver program for floatCodeGen. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "floatCodeGen.h"--void toFP_Int8_ToFloat_driver(void)-{-  const SFloat __result = toFP_Int8_ToFloat(42);--  printf("toFP_Int8_ToFloat(42) = %a\n", __result);-}--void toFP_Int16_ToFloat_driver(void)-{-  const SFloat __result = toFP_Int16_ToFloat(0x002a);--  printf("toFP_Int16_ToFloat(0x002a) = %a\n", __result);-}--void toFP_Int32_ToFloat_driver(void)-{-  const SFloat __result = toFP_Int32_ToFloat(0x0000002aL);--  printf("toFP_Int32_ToFloat(0x0000002aL) = %a\n", __result);-}--void toFP_Int64_ToFloat_driver(void)-{-  const SFloat __result = toFP_Int64_ToFloat(0x000000000000002aLL);--  printf("toFP_Int64_ToFloat(0x000000000000002aLL) = %a\n", __result);-}--void toFP_Word8_ToFloat_driver(void)-{-  const SFloat __result = toFP_Word8_ToFloat(42);--  printf("toFP_Word8_ToFloat(42) = %a\n", __result);-}--void toFP_Word16_ToFloat_driver(void)-{-  const SFloat __result = toFP_Word16_ToFloat(0x002aU);--  printf("toFP_Word16_ToFloat(0x002aU) = %a\n", __result);-}--void toFP_Word32_ToFloat_driver(void)-{-  const SFloat __result = toFP_Word32_ToFloat(0x0000002aUL);--  printf("toFP_Word32_ToFloat(0x0000002aUL) = %a\n", __result);-}--void toFP_Word64_ToFloat_driver(void)-{-  const SFloat __result = toFP_Word64_ToFloat(0x000000000000002aULL);--  printf("toFP_Word64_ToFloat(0x000000000000002aULL) = %a\n", __result);-}--void toFP_Float_ToFloat_driver(void)-{-  const SFloat __result = toFP_Float_ToFloat(0x1.5p5F /* 42.0F */);--  printf("toFP_Float_ToFloat(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void toFP_Double_ToFloat_driver(void)-{-  const SFloat __result = toFP_Double_ToFloat(0x1.5p5 /* 42.0 */);--  printf("toFP_Double_ToFloat(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void toFP_Integer_ToFloat_driver(void)-{-  const SFloat __result = toFP_Integer_ToFloat(0x000000000000002aLL);--  printf("toFP_Integer_ToFloat(0x000000000000002aLL) = %a\n", __result);-}--void toFP_Real_ToFloat_driver(void)-{-  const SFloat __result = toFP_Real_ToFloat(42.0L);--  printf("toFP_Real_ToFloat(42.0L) = %a\n", __result);-}--void toFP_Int8_ToDouble_driver(void)-{-  const SDouble __result = toFP_Int8_ToDouble(42);--  printf("toFP_Int8_ToDouble(42) = %a\n", __result);-}--void toFP_Int16_ToDouble_driver(void)-{-  const SDouble __result = toFP_Int16_ToDouble(0x002a);--  printf("toFP_Int16_ToDouble(0x002a) = %a\n", __result);-}--void toFP_Int32_ToDouble_driver(void)-{-  const SDouble __result = toFP_Int32_ToDouble(0x0000002aL);--  printf("toFP_Int32_ToDouble(0x0000002aL) = %a\n", __result);-}--void toFP_Int64_ToDouble_driver(void)-{-  const SDouble __result = toFP_Int64_ToDouble(0x000000000000002aLL);--  printf("toFP_Int64_ToDouble(0x000000000000002aLL) = %a\n", __result);-}--void toFP_Word8_ToDouble_driver(void)-{-  const SDouble __result = toFP_Word8_ToDouble(42);--  printf("toFP_Word8_ToDouble(42) = %a\n", __result);-}--void toFP_Word16_ToDouble_driver(void)-{-  const SDouble __result = toFP_Word16_ToDouble(0x002aU);--  printf("toFP_Word16_ToDouble(0x002aU) = %a\n", __result);-}--void toFP_Word32_ToDouble_driver(void)-{-  const SDouble __result = toFP_Word32_ToDouble(0x0000002aUL);--  printf("toFP_Word32_ToDouble(0x0000002aUL) = %a\n", __result);-}--void toFP_Word64_ToDouble_driver(void)-{-  const SDouble __result = toFP_Word64_ToDouble(0x000000000000002aULL);--  printf("toFP_Word64_ToDouble(0x000000000000002aULL) = %a\n", __result);-}--void toFP_Float_ToDouble_driver(void)-{-  const SDouble __result = toFP_Float_ToDouble(0x1.5p5F /* 42.0F */);--  printf("toFP_Float_ToDouble(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void toFP_Double_ToDouble_driver(void)-{-  const SDouble __result = toFP_Double_ToDouble(0x1.5p5 /* 42.0 */);--  printf("toFP_Double_ToDouble(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void toFP_Integer_ToDouble_driver(void)-{-  const SDouble __result = toFP_Integer_ToDouble(0x000000000000002aLL);--  printf("toFP_Integer_ToDouble(0x000000000000002aLL) = %a\n", __result);-}--void toFP_Real_ToDouble_driver(void)-{-  const SDouble __result = toFP_Real_ToDouble(42.0L);--  printf("toFP_Real_ToDouble(42.0L) = %a\n", __result);-}--void fromFP_Float_ToInt8_driver(void)-{-  const SInt8 __result = fromFP_Float_ToInt8(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToInt8(0x1.5p5F /* 42.0F */) = %"PRId8"\n", __result);-}--void fromFP_Float_ToInt16_driver(void)-{-  const SInt16 __result = fromFP_Float_ToInt16(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToInt16(0x1.5p5F /* 42.0F */) = %"PRId16"\n", __result);-}--void fromFP_Float_ToInt32_driver(void)-{-  const SInt32 __result = fromFP_Float_ToInt32(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToInt32(0x1.5p5F /* 42.0F */) = %"PRId32"L\n", __result);-}--void fromFP_Float_ToInt64_driver(void)-{-  const SInt64 __result = fromFP_Float_ToInt64(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToInt64(0x1.5p5F /* 42.0F */) = %"PRId64"LL\n", __result);-}--void fromFP_Float_ToWord8_driver(void)-{-  const SWord8 __result = fromFP_Float_ToWord8(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToWord8(0x1.5p5F /* 42.0F */) = %"PRIu8"\n", __result);-}--void fromFP_Float_ToWord16_driver(void)-{-  const SWord16 __result = fromFP_Float_ToWord16(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToWord16(0x1.5p5F /* 42.0F */) = 0x%04"PRIx16"U\n", __result);-}--void fromFP_Float_ToWord32_driver(void)-{-  const SWord32 __result = fromFP_Float_ToWord32(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToWord32(0x1.5p5F /* 42.0F */) = 0x%08"PRIx32"UL\n", __result);-}--void fromFP_Float_ToWord64_driver(void)-{-  const SWord64 __result = fromFP_Float_ToWord64(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToWord64(0x1.5p5F /* 42.0F */) = 0x%016"PRIx64"ULL\n", __result);-}--void fromFP_Float_ToFloat_driver(void)-{-  const SFloat __result = fromFP_Float_ToFloat(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToFloat(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void fromFP_Float_ToDouble_driver(void)-{-  const SDouble __result = fromFP_Float_ToDouble(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToDouble(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void fromFP_Float_ToInteger_driver(void)-{-  const SInteger __result = fromFP_Float_ToInteger(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToInteger(0x1.5p5F /* 42.0F */) = %"PRId64"LL\n", __result);-}--void fromFP_Float_ToReal_driver(void)-{-  const SReal __result = fromFP_Float_ToReal(0x1.5p5F /* 42.0F */);--  printf("fromFP_Float_ToReal(0x1.5p5F /* 42.0F */) = %Lf\n", __result);-}--void fromFP_DoubleTo_Int8_driver(void)-{-  const SInt8 __result = fromFP_DoubleTo_Int8(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Int8(0x1.5p5 /* 42.0 */) = %"PRId8"\n", __result);-}--void fromFP_DoubleTo_Int16_driver(void)-{-  const SInt16 __result = fromFP_DoubleTo_Int16(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Int16(0x1.5p5 /* 42.0 */) = %"PRId16"\n", __result);-}--void fromFP_DoubleTo_Int32_driver(void)-{-  const SInt32 __result = fromFP_DoubleTo_Int32(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Int32(0x1.5p5 /* 42.0 */) = %"PRId32"L\n", __result);-}--void fromFP_DoubleTo_Int64_driver(void)-{-  const SInt64 __result = fromFP_DoubleTo_Int64(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Int64(0x1.5p5 /* 42.0 */) = %"PRId64"LL\n", __result);-}--void fromFP_DoubleTo_Word8_driver(void)-{-  const SWord8 __result = fromFP_DoubleTo_Word8(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Word8(0x1.5p5 /* 42.0 */) = %"PRIu8"\n", __result);-}--void fromFP_DoubleTo_Word16_driver(void)-{-  const SWord16 __result = fromFP_DoubleTo_Word16(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Word16(0x1.5p5 /* 42.0 */) = 0x%04"PRIx16"U\n", __result);-}--void fromFP_DoubleTo_Word32_driver(void)-{-  const SWord32 __result = fromFP_DoubleTo_Word32(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Word32(0x1.5p5 /* 42.0 */) = 0x%08"PRIx32"UL\n", __result);-}--void fromFP_DoubleTo_Word64_driver(void)-{-  const SWord64 __result = fromFP_DoubleTo_Word64(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Word64(0x1.5p5 /* 42.0 */) = 0x%016"PRIx64"ULL\n", __result);-}--void fromFP_DoubleTo_Float_driver(void)-{-  const SFloat __result = fromFP_DoubleTo_Float(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Float(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void fromFP_DoubleTo_Double_driver(void)-{-  const SDouble __result = fromFP_DoubleTo_Double(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Double(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void fromFP_DoubleTo_Integer_driver(void)-{-  const SInteger __result = fromFP_DoubleTo_Integer(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Integer(0x1.5p5 /* 42.0 */) = %"PRId64"LL\n", __result);-}--void fromFP_DoubleTo_Real_driver(void)-{-  const SReal __result = fromFP_DoubleTo_Real(0x1.5p5 /* 42.0 */);--  printf("fromFP_DoubleTo_Real(0x1.5p5 /* 42.0 */) = %Lf\n", __result);-}--void fromFP_SWord32_SFloat_driver(void)-{-  const SFloat __result = fromFP_SWord32_SFloat(0x0000002aUL);--  printf("fromFP_SWord32_SFloat(0x0000002aUL) = %a\n", __result);-}--void fromFP_SWord64_SDouble_driver(void)-{-  const SDouble __result = fromFP_SWord64_SDouble(0x000000000000002aULL);--  printf("fromFP_SWord64_SDouble(0x000000000000002aULL) = %a\n", __result);-}--void fromFP_SFloat_SWord32_driver(void)-{-  const SWord32 __result = fromFP_SFloat_SWord32(0x1.5p5F /* 42.0F */);--  printf("fromFP_SFloat_SWord32(0x1.5p5F /* 42.0F */) = 0x%08"PRIx32"UL\n", __result);-}--void fromFP_SDouble_SWord64_driver(void)-{-  const SWord64 __result = fromFP_SDouble_SWord64(0x1.5p5 /* 42.0 */);--  printf("fromFP_SDouble_SWord64(0x1.5p5 /* 42.0 */) = 0x%016"PRIx64"ULL\n", __result);-}--void f_FP_Abs_driver(void)-{-  const SFloat __result = f_FP_Abs(0x1.5p5F /* 42.0F */);--  printf("f_FP_Abs(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void d_FP_Abs_driver(void)-{-  const SDouble __result = d_FP_Abs(0x1.5p5 /* 42.0 */);--  printf("d_FP_Abs(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void f_FP_Neg_driver(void)-{-  const SFloat __result = f_FP_Neg(0x1.5p5F /* 42.0F */);--  printf("f_FP_Neg(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void d_FP_Neg_driver(void)-{-  const SDouble __result = d_FP_Neg(0x1.5p5 /* 42.0 */);--  printf("d_FP_Neg(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void f_FP_Add_driver(void)-{-  const SFloat __result = f_FP_Add(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Add(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Add_driver(void)-{-  const SDouble __result = d_FP_Add(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Add(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_Sub_driver(void)-{-  const SFloat __result = f_FP_Sub(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Sub(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Sub_driver(void)-{-  const SDouble __result = d_FP_Sub(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Sub(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_Mul_driver(void)-{-  const SFloat __result = f_FP_Mul(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Mul(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Mul_driver(void)-{-  const SDouble __result = d_FP_Mul(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Mul(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_Div_driver(void)-{-  const SFloat __result = f_FP_Div(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Div(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Div_driver(void)-{-  const SDouble __result = d_FP_Div(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Div(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_FMA_driver(void)-{-  const SFloat __result = f_FP_FMA(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */, 0x1.6p5F /* 44.0F */);--  printf("f_FP_FMA(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */, 0x1.6p5F /* 44.0F */) = %a\n", __result);-}--void d_FP_FMA_driver(void)-{-  const SDouble __result = d_FP_FMA(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */, 0x1.6p5 /* 44.0 */);--  printf("d_FP_FMA(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */, 0x1.6p5 /* 44.0 */) = %a\n", __result);-}--void f_FP_Sqrt_driver(void)-{-  const SFloat __result = f_FP_Sqrt(0x1.5p5F /* 42.0F */);--  printf("f_FP_Sqrt(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void d_FP_Sqrt_driver(void)-{-  const SDouble __result = d_FP_Sqrt(0x1.5p5 /* 42.0 */);--  printf("d_FP_Sqrt(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void f_FP_Rem_driver(void)-{-  const SFloat __result = f_FP_Rem(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Rem(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Rem_driver(void)-{-  const SDouble __result = d_FP_Rem(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Rem(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_RoundToIntegral_driver(void)-{-  const SFloat __result = f_FP_RoundToIntegral(0x1.5p5F /* 42.0F */);--  printf("f_FP_RoundToIntegral(0x1.5p5F /* 42.0F */) = %a\n", __result);-}--void d_FP_RoundToIntegral_driver(void)-{-  const SDouble __result = d_FP_RoundToIntegral(0x1.5p5 /* 42.0 */);--  printf("d_FP_RoundToIntegral(0x1.5p5 /* 42.0 */) = %a\n", __result);-}--void f_FP_Min_driver(void)-{-  const SFloat __result = f_FP_Min(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Min(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Min_driver(void)-{-  const SDouble __result = d_FP_Min(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Min(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_Max_driver(void)-{-  const SFloat __result = f_FP_Max(0x1.5p5F /* 42.0F */,-                                   0x1.58p5F /* 43.0F */);--  printf("f_FP_Max(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", __result);-}--void d_FP_Max_driver(void)-{-  const SDouble __result = d_FP_Max(0x1.5p5 /* 42.0 */,-                                    0x1.58p5 /* 43.0 */);--  printf("d_FP_Max(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", __result);-}--void f_FP_IsEqualObject_driver(void)-{-  const SBool __result = f_FP_IsEqualObject(0x1.5p5F /* 42.0F */,-                                            0x1.58p5F /* 43.0F */);--  printf("f_FP_IsEqualObject(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %d\n", __result);-}--void d_FP_IsEqualObject_driver(void)-{-  const SBool __result = d_FP_IsEqualObject(0x1.5p5 /* 42.0 */,-                                            0x1.58p5 /* 43.0 */);--  printf("d_FP_IsEqualObject(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %d\n", __result);-}--void f_FP_IsNormal_driver(void)-{-  const SBool __result = f_FP_IsNormal(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsNormal(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsNormal_driver(void)-{-  const SBool __result = d_FP_IsNormal(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsNormal(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsZero_driver(void)-{-  const SBool __result = f_FP_IsZero(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsZero(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsZero_driver(void)-{-  const SBool __result = d_FP_IsZero(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsZero(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsSubnormal_driver(void)-{-  const SBool __result = f_FP_IsSubnormal(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsSubnormal(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsSubnormal_driver(void)-{-  const SBool __result = d_FP_IsSubnormal(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsSubnormal(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsInfinite_driver(void)-{-  const SBool __result = f_FP_IsInfinite(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsInfinite(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsInfinite_driver(void)-{-  const SBool __result = d_FP_IsInfinite(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsInfinite(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsNaN_driver(void)-{-  const SBool __result = f_FP_IsNaN(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsNaN(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsNaN_driver(void)-{-  const SBool __result = d_FP_IsNaN(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsNaN(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsNegative_driver(void)-{-  const SBool __result = f_FP_IsNegative(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsNegative(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsNegative_driver(void)-{-  const SBool __result = d_FP_IsNegative(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsNegative(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--void f_FP_IsPositive_driver(void)-{-  const SBool __result = f_FP_IsPositive(0x1.5p5F /* 42.0F */);--  printf("f_FP_IsPositive(0x1.5p5F /* 42.0F */) = %d\n", __result);-}--void d_FP_IsPositive_driver(void)-{-  const SBool __result = d_FP_IsPositive(0x1.5p5 /* 42.0 */);--  printf("d_FP_IsPositive(0x1.5p5 /* 42.0 */) = %d\n", __result);-}--int main(void)-{-  printf("====================================\n");-  printf("** Driver run for toFP_Int8_ToFloat:\n");-  printf("====================================\n");-  toFP_Int8_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Int16_ToFloat:\n");-  printf("=====================================\n");-  toFP_Int16_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Int32_ToFloat:\n");-  printf("=====================================\n");-  toFP_Int32_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Int64_ToFloat:\n");-  printf("=====================================\n");-  toFP_Int64_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Word8_ToFloat:\n");-  printf("=====================================\n");-  toFP_Word8_ToFloat_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Word16_ToFloat:\n");-  printf("======================================\n");-  toFP_Word16_ToFloat_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Word32_ToFloat:\n");-  printf("======================================\n");-  toFP_Word32_ToFloat_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Word64_ToFloat:\n");-  printf("======================================\n");-  toFP_Word64_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Float_ToFloat:\n");-  printf("=====================================\n");-  toFP_Float_ToFloat_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Double_ToFloat:\n");-  printf("======================================\n");-  toFP_Double_ToFloat_driver();--  printf("=======================================\n");-  printf("** Driver run for toFP_Integer_ToFloat:\n");-  printf("=======================================\n");-  toFP_Integer_ToFloat_driver();--  printf("====================================\n");-  printf("** Driver run for toFP_Real_ToFloat:\n");-  printf("====================================\n");-  toFP_Real_ToFloat_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Int8_ToDouble:\n");-  printf("=====================================\n");-  toFP_Int8_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Int16_ToDouble:\n");-  printf("======================================\n");-  toFP_Int16_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Int32_ToDouble:\n");-  printf("======================================\n");-  toFP_Int32_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Int64_ToDouble:\n");-  printf("======================================\n");-  toFP_Int64_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Word8_ToDouble:\n");-  printf("======================================\n");-  toFP_Word8_ToDouble_driver();--  printf("=======================================\n");-  printf("** Driver run for toFP_Word16_ToDouble:\n");-  printf("=======================================\n");-  toFP_Word16_ToDouble_driver();--  printf("=======================================\n");-  printf("** Driver run for toFP_Word32_ToDouble:\n");-  printf("=======================================\n");-  toFP_Word32_ToDouble_driver();--  printf("=======================================\n");-  printf("** Driver run for toFP_Word64_ToDouble:\n");-  printf("=======================================\n");-  toFP_Word64_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for toFP_Float_ToDouble:\n");-  printf("======================================\n");-  toFP_Float_ToDouble_driver();--  printf("=======================================\n");-  printf("** Driver run for toFP_Double_ToDouble:\n");-  printf("=======================================\n");-  toFP_Double_ToDouble_driver();--  printf("========================================\n");-  printf("** Driver run for toFP_Integer_ToDouble:\n");-  printf("========================================\n");-  toFP_Integer_ToDouble_driver();--  printf("=====================================\n");-  printf("** Driver run for toFP_Real_ToDouble:\n");-  printf("=====================================\n");-  toFP_Real_ToDouble_driver();--  printf("======================================\n");-  printf("** Driver run for fromFP_Float_ToInt8:\n");-  printf("======================================\n");-  fromFP_Float_ToInt8_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_Float_ToInt16:\n");-  printf("=======================================\n");-  fromFP_Float_ToInt16_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_Float_ToInt32:\n");-  printf("=======================================\n");-  fromFP_Float_ToInt32_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_Float_ToInt64:\n");-  printf("=======================================\n");-  fromFP_Float_ToInt64_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_Float_ToWord8:\n");-  printf("=======================================\n");-  fromFP_Float_ToWord8_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_Float_ToWord16:\n");-  printf("========================================\n");-  fromFP_Float_ToWord16_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_Float_ToWord32:\n");-  printf("========================================\n");-  fromFP_Float_ToWord32_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_Float_ToWord64:\n");-  printf("========================================\n");-  fromFP_Float_ToWord64_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_Float_ToFloat:\n");-  printf("=======================================\n");-  fromFP_Float_ToFloat_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_Float_ToDouble:\n");-  printf("========================================\n");-  fromFP_Float_ToDouble_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_Float_ToInteger:\n");-  printf("=========================================\n");-  fromFP_Float_ToInteger_driver();--  printf("======================================\n");-  printf("** Driver run for fromFP_Float_ToReal:\n");-  printf("======================================\n");-  fromFP_Float_ToReal_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_DoubleTo_Int8:\n");-  printf("=======================================\n");-  fromFP_DoubleTo_Int8_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Int16:\n");-  printf("========================================\n");-  fromFP_DoubleTo_Int16_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Int32:\n");-  printf("========================================\n");-  fromFP_DoubleTo_Int32_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Int64:\n");-  printf("========================================\n");-  fromFP_DoubleTo_Int64_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Word8:\n");-  printf("========================================\n");-  fromFP_DoubleTo_Word8_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Word16:\n");-  printf("=========================================\n");-  fromFP_DoubleTo_Word16_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Word32:\n");-  printf("=========================================\n");-  fromFP_DoubleTo_Word32_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Word64:\n");-  printf("=========================================\n");-  fromFP_DoubleTo_Word64_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Float:\n");-  printf("========================================\n");-  fromFP_DoubleTo_Float_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Double:\n");-  printf("=========================================\n");-  fromFP_DoubleTo_Double_driver();--  printf("==========================================\n");-  printf("** Driver run for fromFP_DoubleTo_Integer:\n");-  printf("==========================================\n");-  fromFP_DoubleTo_Integer_driver();--  printf("=======================================\n");-  printf("** Driver run for fromFP_DoubleTo_Real:\n");-  printf("=======================================\n");-  fromFP_DoubleTo_Real_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_SWord32_SFloat:\n");-  printf("========================================\n");-  fromFP_SWord32_SFloat_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_SWord64_SDouble:\n");-  printf("=========================================\n");-  fromFP_SWord64_SDouble_driver();--  printf("========================================\n");-  printf("** Driver run for fromFP_SFloat_SWord32:\n");-  printf("========================================\n");-  fromFP_SFloat_SWord32_driver();--  printf("=========================================\n");-  printf("** Driver run for fromFP_SDouble_SWord64:\n");-  printf("=========================================\n");-  fromFP_SDouble_SWord64_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Abs:\n");-  printf("===========================\n");-  f_FP_Abs_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Abs:\n");-  printf("===========================\n");-  d_FP_Abs_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Neg:\n");-  printf("===========================\n");-  f_FP_Neg_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Neg:\n");-  printf("===========================\n");-  d_FP_Neg_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Add:\n");-  printf("===========================\n");-  f_FP_Add_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Add:\n");-  printf("===========================\n");-  d_FP_Add_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Sub:\n");-  printf("===========================\n");-  f_FP_Sub_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Sub:\n");-  printf("===========================\n");-  d_FP_Sub_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Mul:\n");-  printf("===========================\n");-  f_FP_Mul_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Mul:\n");-  printf("===========================\n");-  d_FP_Mul_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Div:\n");-  printf("===========================\n");-  f_FP_Div_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Div:\n");-  printf("===========================\n");-  d_FP_Div_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_FMA:\n");-  printf("===========================\n");-  f_FP_FMA_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_FMA:\n");-  printf("===========================\n");-  d_FP_FMA_driver();--  printf("============================\n");-  printf("** Driver run for f_FP_Sqrt:\n");-  printf("============================\n");-  f_FP_Sqrt_driver();--  printf("============================\n");-  printf("** Driver run for d_FP_Sqrt:\n");-  printf("============================\n");-  d_FP_Sqrt_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Rem:\n");-  printf("===========================\n");-  f_FP_Rem_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Rem:\n");-  printf("===========================\n");-  d_FP_Rem_driver();--  printf("=======================================\n");-  printf("** Driver run for f_FP_RoundToIntegral:\n");-  printf("=======================================\n");-  f_FP_RoundToIntegral_driver();--  printf("=======================================\n");-  printf("** Driver run for d_FP_RoundToIntegral:\n");-  printf("=======================================\n");-  d_FP_RoundToIntegral_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Min:\n");-  printf("===========================\n");-  f_FP_Min_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Min:\n");-  printf("===========================\n");-  d_FP_Min_driver();--  printf("===========================\n");-  printf("** Driver run for f_FP_Max:\n");-  printf("===========================\n");-  f_FP_Max_driver();--  printf("===========================\n");-  printf("** Driver run for d_FP_Max:\n");-  printf("===========================\n");-  d_FP_Max_driver();--  printf("=====================================\n");-  printf("** Driver run for f_FP_IsEqualObject:\n");-  printf("=====================================\n");-  f_FP_IsEqualObject_driver();--  printf("=====================================\n");-  printf("** Driver run for d_FP_IsEqualObject:\n");-  printf("=====================================\n");-  d_FP_IsEqualObject_driver();--  printf("================================\n");-  printf("** Driver run for f_FP_IsNormal:\n");-  printf("================================\n");-  f_FP_IsNormal_driver();--  printf("================================\n");-  printf("** Driver run for d_FP_IsNormal:\n");-  printf("================================\n");-  d_FP_IsNormal_driver();--  printf("==============================\n");-  printf("** Driver run for f_FP_IsZero:\n");-  printf("==============================\n");-  f_FP_IsZero_driver();--  printf("==============================\n");-  printf("** Driver run for d_FP_IsZero:\n");-  printf("==============================\n");-  d_FP_IsZero_driver();--  printf("===================================\n");-  printf("** Driver run for f_FP_IsSubnormal:\n");-  printf("===================================\n");-  f_FP_IsSubnormal_driver();--  printf("===================================\n");-  printf("** Driver run for d_FP_IsSubnormal:\n");-  printf("===================================\n");-  d_FP_IsSubnormal_driver();--  printf("==================================\n");-  printf("** Driver run for f_FP_IsInfinite:\n");-  printf("==================================\n");-  f_FP_IsInfinite_driver();--  printf("==================================\n");-  printf("** Driver run for d_FP_IsInfinite:\n");-  printf("==================================\n");-  d_FP_IsInfinite_driver();--  printf("=============================\n");-  printf("** Driver run for f_FP_IsNaN:\n");-  printf("=============================\n");-  f_FP_IsNaN_driver();--  printf("=============================\n");-  printf("** Driver run for d_FP_IsNaN:\n");-  printf("=============================\n");-  d_FP_IsNaN_driver();--  printf("==================================\n");-  printf("** Driver run for f_FP_IsNegative:\n");-  printf("==================================\n");-  f_FP_IsNegative_driver();--  printf("==================================\n");-  printf("** Driver run for d_FP_IsNegative:\n");-  printf("==================================\n");-  d_FP_IsNegative_driver();--  printf("==================================\n");-  printf("** Driver run for f_FP_IsPositive:\n");-  printf("==================================\n");-  f_FP_IsPositive_driver();--  printf("==================================\n");-  printf("** Driver run for d_FP_IsPositive:\n");-  printf("==================================\n");-  d_FP_IsPositive_driver();--  return 0;-}-== END: "floatCodeGen_driver.c" ==================-== BEGIN: "Makefile" ================-# Makefile for floatCodeGen. Automatically generated by SBV. Do not edit!--# include any user-defined .mk file in the current directory.--include *.mk--CC?=gcc-CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer-LDFLAGS?=-lm-AR?=ar-ARFLAGS?=cr--all: floatCodeGen.a floatCodeGen_driver--floatCodeGen.a: toFP_Int8_ToFloat.o toFP_Int16_ToFloat.o toFP_Int32_ToFloat.o toFP_Int64_ToFloat.o toFP_Word8_ToFloat.o toFP_Word16_ToFloat.o toFP_Word32_ToFloat.o toFP_Word64_ToFloat.o toFP_Float_ToFloat.o toFP_Double_ToFloat.o toFP_Integer_ToFloat.o toFP_Real_ToFloat.o toFP_Int8_ToDouble.o toFP_Int16_ToDouble.o toFP_Int32_ToDouble.o toFP_Int64_ToDouble.o toFP_Word8_ToDouble.o toFP_Word16_ToDouble.o toFP_Word32_ToDouble.o toFP_Word64_ToDouble.o toFP_Float_ToDouble.o toFP_Double_ToDouble.o toFP_Integer_ToDouble.o toFP_Real_ToDouble.o fromFP_Float_ToInt8.o fromFP_Float_ToInt16.o fromFP_Float_ToInt32.o fromFP_Float_ToInt64.o fromFP_Float_ToWord8.o fromFP_Float_ToWord16.o fromFP_Float_ToWord32.o fromFP_Float_ToWord64.o fromFP_Float_ToFloat.o fromFP_Float_ToDouble.o fromFP_Float_ToInteger.o fromFP_Float_ToReal.o fromFP_DoubleTo_Int8.o fromFP_DoubleTo_Int16.o fromFP_DoubleTo_Int32.o fromFP_DoubleTo_Int64.o fromFP_DoubleTo_Word8.o fromFP_DoubleTo_Word16.o fromFP_DoubleTo_Word32.o fromFP_DoubleTo_Word64.o fromFP_DoubleTo_Float.o fromFP_DoubleTo_Double.o fromFP_DoubleTo_Integer.o fromFP_DoubleTo_Real.o fromFP_SWord32_SFloat.o fromFP_SWord64_SDouble.o fromFP_SFloat_SWord32.o fromFP_SDouble_SWord64.o f_FP_Abs.o d_FP_Abs.o f_FP_Neg.o d_FP_Neg.o f_FP_Add.o d_FP_Add.o f_FP_Sub.o d_FP_Sub.o f_FP_Mul.o d_FP_Mul.o f_FP_Div.o d_FP_Div.o f_FP_FMA.o d_FP_FMA.o f_FP_Sqrt.o d_FP_Sqrt.o f_FP_Rem.o d_FP_Rem.o f_FP_RoundToIntegral.o d_FP_RoundToIntegral.o f_FP_Min.o d_FP_Min.o f_FP_Max.o d_FP_Max.o f_FP_IsEqualObject.o d_FP_IsEqualObject.o f_FP_IsNormal.o d_FP_IsNormal.o f_FP_IsZero.o d_FP_IsZero.o f_FP_IsSubnormal.o d_FP_IsSubnormal.o f_FP_IsInfinite.o d_FP_IsInfinite.o f_FP_IsNaN.o d_FP_IsNaN.o f_FP_IsNegative.o d_FP_IsNegative.o f_FP_IsPositive.o d_FP_IsPositive.o-	${AR} ${ARFLAGS} $@ $^--floatCodeGen_driver: floatCodeGen_driver.c floatCodeGen.h-	${CC} ${CCFLAGS} $< -o $@ floatCodeGen.a ${LDFLAGS}--toFP_Int8_ToFloat.o: toFP_Int8_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int16_ToFloat.o: toFP_Int16_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int32_ToFloat.o: toFP_Int32_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int64_ToFloat.o: toFP_Int64_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word8_ToFloat.o: toFP_Word8_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word16_ToFloat.o: toFP_Word16_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word32_ToFloat.o: toFP_Word32_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word64_ToFloat.o: toFP_Word64_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Float_ToFloat.o: toFP_Float_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Double_ToFloat.o: toFP_Double_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Integer_ToFloat.o: toFP_Integer_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Real_ToFloat.o: toFP_Real_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int8_ToDouble.o: toFP_Int8_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int16_ToDouble.o: toFP_Int16_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int32_ToDouble.o: toFP_Int32_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Int64_ToDouble.o: toFP_Int64_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word8_ToDouble.o: toFP_Word8_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word16_ToDouble.o: toFP_Word16_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word32_ToDouble.o: toFP_Word32_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Word64_ToDouble.o: toFP_Word64_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Float_ToDouble.o: toFP_Float_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Double_ToDouble.o: toFP_Double_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Integer_ToDouble.o: toFP_Integer_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--toFP_Real_ToDouble.o: toFP_Real_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToInt8.o: fromFP_Float_ToInt8.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToInt16.o: fromFP_Float_ToInt16.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToInt32.o: fromFP_Float_ToInt32.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToInt64.o: fromFP_Float_ToInt64.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToWord8.o: fromFP_Float_ToWord8.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToWord16.o: fromFP_Float_ToWord16.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToWord32.o: fromFP_Float_ToWord32.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToWord64.o: fromFP_Float_ToWord64.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToFloat.o: fromFP_Float_ToFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToDouble.o: fromFP_Float_ToDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToInteger.o: fromFP_Float_ToInteger.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_Float_ToReal.o: fromFP_Float_ToReal.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Int8.o: fromFP_DoubleTo_Int8.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Int16.o: fromFP_DoubleTo_Int16.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Int32.o: fromFP_DoubleTo_Int32.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Int64.o: fromFP_DoubleTo_Int64.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Word8.o: fromFP_DoubleTo_Word8.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Word16.o: fromFP_DoubleTo_Word16.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Word32.o: fromFP_DoubleTo_Word32.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Word64.o: fromFP_DoubleTo_Word64.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Float.o: fromFP_DoubleTo_Float.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Double.o: fromFP_DoubleTo_Double.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Integer.o: fromFP_DoubleTo_Integer.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_DoubleTo_Real.o: fromFP_DoubleTo_Real.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_SWord32_SFloat.o: fromFP_SWord32_SFloat.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_SWord64_SDouble.o: fromFP_SWord64_SDouble.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_SFloat_SWord32.o: fromFP_SFloat_SWord32.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--fromFP_SDouble_SWord64.o: fromFP_SDouble_SWord64.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Abs.o: f_FP_Abs.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Abs.o: d_FP_Abs.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Neg.o: f_FP_Neg.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Neg.o: d_FP_Neg.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Add.o: f_FP_Add.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Add.o: d_FP_Add.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Sub.o: f_FP_Sub.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Sub.o: d_FP_Sub.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Mul.o: f_FP_Mul.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Mul.o: d_FP_Mul.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Div.o: f_FP_Div.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Div.o: d_FP_Div.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_FMA.o: f_FP_FMA.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_FMA.o: d_FP_FMA.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Sqrt.o: f_FP_Sqrt.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Sqrt.o: d_FP_Sqrt.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Rem.o: f_FP_Rem.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Rem.o: d_FP_Rem.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_RoundToIntegral.o: f_FP_RoundToIntegral.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_RoundToIntegral.o: d_FP_RoundToIntegral.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Min.o: f_FP_Min.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Min.o: d_FP_Min.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_Max.o: f_FP_Max.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_Max.o: d_FP_Max.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsEqualObject.o: f_FP_IsEqualObject.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsEqualObject.o: d_FP_IsEqualObject.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsNormal.o: f_FP_IsNormal.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsNormal.o: d_FP_IsNormal.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsZero.o: f_FP_IsZero.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsZero.o: d_FP_IsZero.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsSubnormal.o: f_FP_IsSubnormal.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsSubnormal.o: d_FP_IsSubnormal.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsInfinite.o: f_FP_IsInfinite.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsInfinite.o: d_FP_IsInfinite.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsNaN.o: f_FP_IsNaN.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsNaN.o: d_FP_IsNaN.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsNegative.o: f_FP_IsNegative.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsNegative.o: d_FP_IsNegative.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--f_FP_IsPositive.o: f_FP_IsPositive.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--d_FP_IsPositive.o: d_FP_IsPositive.c floatCodeGen.h-	${CC} ${CCFLAGS} -c $< -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f floatCodeGen.a floatCodeGen_driver+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat toFP_Int8_ToFloat(const SInt8 sbv_input_0)+{+  const SInt8  s0 = sbv_input_0;+        SFloat s2;+  s2 = (SFloat) s0;++  return s2;+}+== END: "toFP_Int8_ToFloat.c" ==================+== BEGIN: "toFP_Int16_ToFloat.c" ================+/* File: "toFP_Int16_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat toFP_Int16_ToFloat(const SInt16 sbv_input_0)+{+  const SInt16 s0 = sbv_input_0;+        SFloat s2;+  s2 = (SFloat) s0;++  return s2;+}+== END: "toFP_Int16_ToFloat.c" ==================+== BEGIN: "toFP_Int32_ToFloat.c" ================+/* File: "toFP_Int32_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_s32_float(SInt32 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = ((((uint64_t) a) >> (31)) & UINT64_C(1)) != 0;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 32; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0x00000000ffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 32 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Int32_ToFloat(const SInt32 sbv_input_0)+{+  const SInt32 s0 = sbv_input_0;+        SFloat s2;+  s2 = sbv_fp_cast_s32_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Int32_ToFloat.c" ==================+== BEGIN: "toFP_Int64_ToFloat.c" ================+/* File: "toFP_Int64_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_s64_float(SInt64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = ((((uint64_t) a) >> (63)) & UINT64_C(1)) != 0;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Int64_ToFloat(const SInt64 sbv_input_0)+{+  const SInt64 s0 = sbv_input_0;+        SFloat s2;+  s2 = sbv_fp_cast_s64_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Int64_ToFloat.c" ==================+== BEGIN: "toFP_Word8_ToFloat.c" ================+/* File: "toFP_Word8_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat toFP_Word8_ToFloat(const SWord8 sbv_input_0)+{+  const SWord8 s0 = sbv_input_0;+        SFloat s2;+  s2 = (SFloat) s0;++  return s2;+}+== END: "toFP_Word8_ToFloat.c" ==================+== BEGIN: "toFP_Word16_ToFloat.c" ================+/* File: "toFP_Word16_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat toFP_Word16_ToFloat(const SWord16 sbv_input_0)+{+  const SWord16 s0 = sbv_input_0;+        SFloat  s2;+  s2 = (SFloat) s0;++  return s2;+}+== END: "toFP_Word16_ToFloat.c" ==================+== BEGIN: "toFP_Word32_ToFloat.c" ================+/* File: "toFP_Word32_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_u32_float(SWord32 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = false;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 32; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0x00000000ffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 32 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Word32_ToFloat(const SWord32 sbv_input_0)+{+  const SWord32 s0 = sbv_input_0;+        SFloat  s2;+  s2 = sbv_fp_cast_u32_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Word32_ToFloat.c" ==================+== BEGIN: "toFP_Word64_ToFloat.c" ================+/* File: "toFP_Word64_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_u64_float(SWord64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = false;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Word64_ToFloat(const SWord64 sbv_input_0)+{+  const SWord64 s0 = sbv_input_0;+        SFloat  s2;+  s2 = sbv_fp_cast_u64_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Word64_ToFloat.c" ==================+== BEGIN: "toFP_Float_ToFloat.c" ================+/* File: "toFP_Float_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat toFP_Float_ToFloat(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+  return s0;+}+== END: "toFP_Float_ToFloat.c" ==================+== BEGIN: "toFP_Double_ToFloat.c" ================+/* File: "toFP_Double_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_double_float(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Double_ToFloat(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SFloat  s2;+  s2 = sbv_fp_cast_double_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Double_ToFloat.c" ==================+== BEGIN: "toFP_Integer_ToFloat.c" ================+/* File: "toFP_Integer_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_integer_float(SInt64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = ((((uint64_t) a) >> (63)) & UINT64_C(1)) != 0;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Integer_ToFloat(const SInteger sbv_input_0)+{+  const SInteger s0 = sbv_input_0;+        SFloat   s2;+  s2 = sbv_fp_cast_integer_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Integer_ToFloat.c" ==================+== BEGIN: "toFP_Real_ToFloat.c" ================+/* File: "toFP_Real_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++#include <float.h>+#if FLT_RADIX == 2 && LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 && LDBL_MIN_EXP == -1021+#define SBV_LDBL_EXP_BITS 11+#elif FLT_RADIX == 2 && (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381+#define SBV_LDBL_EXP_BITS 15+#else+#error SBV C long-double conversions require binary64, x87 extended, or binary128 long double+#endif+#if BF_EXP_BITS_MAX < SBV_LDBL_EXP_BITS+#error SBV C long-double conversions exceed the LibBF exponent range+#endif++static SBV_CGEN_UNUSED bf_flags_t sbv_bf_long_double_flags(bf_rnd_t rnd)+{+  return BF_FLAG_SUBNORMAL | bf_set_exp_bits(SBV_LDBL_EXP_BITS) | (bf_flags_t) rnd;+}++static SBV_CGEN_UNUSED void sbv_bf_set_long_double(bf_t *result, long double value)+{+  int exponent, shift = 0, status = 0; bf_t chunk;+  if (isnan(value)) { bf_set_nan(result); return; }+  if (isinf(value)) { bf_set_inf(result, signbit(value) != 0); return; }+  if (value == 0) { bf_set_zero(result, signbit(value) != 0); return; }+  long double fraction = frexpl(fabsl(value), &exponent);+  bf_init(result->ctx, &chunk); bf_set_zero(result, 0);+  while (fraction != 0) {+    fraction = ldexpl(fraction, 32);+    const uint32_t bits = (uint32_t) fraction; fraction -= (long double) bits;+    status |= bf_mul_2exp(result, 32, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    status |= bf_set_ui(&chunk, bits);+    status |= bf_add(result, result, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ); shift += 32;+  }+  status |= bf_mul_2exp(result, exponent - shift, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  bf_delete(&chunk); if (status & BF_ST_MEM_ERROR) abort();+  if (signbit(value)) bf_neg(result);+}++static SBV_CGEN_UNUSED long double sbv_bf_get_long_double(bf_t *value, bf_rnd_t rnd)+{+  if (bf_round(value, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)) & BF_ST_MEM_ERROR) abort();+  if (bf_is_nan(value)) return nanl("");+  if (!bf_is_finite(value)) return value->sign ? -HUGE_VALL : HUGE_VALL;+  if (bf_is_zero(value)) return value->sign ? -0.0L : 0.0L;+  long double significand = 0;+  const slimb_t base = (slimb_t) value->len * LIMB_BITS;+  for (int i = 0; i < LDBL_MANT_DIG; ++i) {+    const slimb_t bit = base - 1 - i;+    const unsigned digit = bit < 0 ? 0 : (unsigned) ((value->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1);+    significand = significand * 2 + digit;+  }+  const long double result = ldexpl(significand, (int) value->expn - LDBL_MANT_DIG);+  return value->sign ? -result : result;+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_real_float(SReal a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); sbv_bf_set_long_double(&x, a);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat toFP_Real_ToFloat(const SReal sbv_input_0)+{+  const SReal  s0 = sbv_input_0;+        SFloat s2;+  s2 = sbv_fp_cast_real_float(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Real_ToFloat.c" ==================+== BEGIN: "toFP_Int8_ToDouble.c" ================+/* File: "toFP_Int8_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Int8_ToDouble(const SInt8 sbv_input_0)+{+  const SInt8   s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Int8_ToDouble.c" ==================+== BEGIN: "toFP_Int16_ToDouble.c" ================+/* File: "toFP_Int16_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Int16_ToDouble(const SInt16 sbv_input_0)+{+  const SInt16  s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Int16_ToDouble.c" ==================+== BEGIN: "toFP_Int32_ToDouble.c" ================+/* File: "toFP_Int32_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Int32_ToDouble(const SInt32 sbv_input_0)+{+  const SInt32  s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Int32_ToDouble.c" ==================+== BEGIN: "toFP_Int64_ToDouble.c" ================+/* File: "toFP_Int64_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SDouble sbv_fp_cast_s64_double(SInt64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = ((((uint64_t) a) >> (63)) & UINT64_C(1)) != 0;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 53, BF_FLAG_SUBNORMAL | bf_set_exp_bits(11) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SDouble) result;+}+++SDouble toFP_Int64_ToDouble(const SInt64 sbv_input_0)+{+  const SInt64  s0 = sbv_input_0;+        SDouble s2;+  s2 = sbv_fp_cast_s64_double(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Int64_ToDouble.c" ==================+== BEGIN: "toFP_Word8_ToDouble.c" ================+/* File: "toFP_Word8_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Word8_ToDouble(const SWord8 sbv_input_0)+{+  const SWord8  s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Word8_ToDouble.c" ==================+== BEGIN: "toFP_Word16_ToDouble.c" ================+/* File: "toFP_Word16_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Word16_ToDouble(const SWord16 sbv_input_0)+{+  const SWord16 s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Word16_ToDouble.c" ==================+== BEGIN: "toFP_Word32_ToDouble.c" ================+/* File: "toFP_Word32_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Word32_ToDouble(const SWord32 sbv_input_0)+{+  const SWord32 s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Word32_ToDouble.c" ==================+== BEGIN: "toFP_Word64_ToDouble.c" ================+/* File: "toFP_Word64_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SDouble sbv_fp_cast_u64_double(SWord64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = false;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 53, BF_FLAG_SUBNORMAL | bf_set_exp_bits(11) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SDouble) result;+}+++SDouble toFP_Word64_ToDouble(const SWord64 sbv_input_0)+{+  const SWord64 s0 = sbv_input_0;+        SDouble s2;+  s2 = sbv_fp_cast_u64_double(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Word64_ToDouble.c" ==================+== BEGIN: "toFP_Float_ToDouble.c" ================+/* File: "toFP_Float_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Float_ToDouble(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "toFP_Float_ToDouble.c" ==================+== BEGIN: "toFP_Double_ToDouble.c" ================+/* File: "toFP_Double_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble toFP_Double_ToDouble(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+  return s0;+}+== END: "toFP_Double_ToDouble.c" ==================+== BEGIN: "toFP_Integer_ToDouble.c" ================+/* File: "toFP_Integer_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SDouble sbv_fp_cast_integer_double(SInt64 a, bf_rnd_t rnd)+{+  uint64_t words[1]; uint64_t carry = 1; size_t i; limb_t j;+  const bool negative = ((((uint64_t) a) >> (63)) & UINT64_C(1)) != 0;+  bf_context_t ctx; bf_t x, chunk; double result;+  for (i = 0; i < 1; ++i) {+    words[i] = 0;+    for (j = 0; j < 64 && i * 64 + j < 64; ++j)+      if (((((uint64_t) a) >> ((i * 64 + j))) & UINT64_C(1)) != 0) words[i] |= UINT64_C(1) << j;+  }+  if (negative) for (i = 0; i < 1; ++i) {+    const uint64_t next = ~words[i] + carry; carry = carry && next == 0; words[i] = next;+  }+  words[0] &= UINT64_C(0xffffffffffffffff);+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_init(&ctx, &chunk); bf_set_ui(&x, 0);+  for (i = 1; i-- > 0;) {+    bf_mul_2exp(&x, i == 0 ? 64 : 64, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    bf_set_ui(&chunk, words[i]); bf_add(&x, &x, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  }+  if (negative) bf_neg(&x);+  bf_round(&x, 53, BF_FLAG_SUBNORMAL | bf_set_exp_bits(11) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&chunk); bf_delete(&x); bf_context_end(&ctx); return (SDouble) result;+}+++SDouble toFP_Integer_ToDouble(const SInteger sbv_input_0)+{+  const SInteger s0 = sbv_input_0;+        SDouble  s2;+  s2 = sbv_fp_cast_integer_double(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Integer_ToDouble.c" ==================+== BEGIN: "toFP_Real_ToDouble.c" ================+/* File: "toFP_Real_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++#include <float.h>+#if FLT_RADIX == 2 && LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 && LDBL_MIN_EXP == -1021+#define SBV_LDBL_EXP_BITS 11+#elif FLT_RADIX == 2 && (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381+#define SBV_LDBL_EXP_BITS 15+#else+#error SBV C long-double conversions require binary64, x87 extended, or binary128 long double+#endif+#if BF_EXP_BITS_MAX < SBV_LDBL_EXP_BITS+#error SBV C long-double conversions exceed the LibBF exponent range+#endif++static SBV_CGEN_UNUSED bf_flags_t sbv_bf_long_double_flags(bf_rnd_t rnd)+{+  return BF_FLAG_SUBNORMAL | bf_set_exp_bits(SBV_LDBL_EXP_BITS) | (bf_flags_t) rnd;+}++static SBV_CGEN_UNUSED void sbv_bf_set_long_double(bf_t *result, long double value)+{+  int exponent, shift = 0, status = 0; bf_t chunk;+  if (isnan(value)) { bf_set_nan(result); return; }+  if (isinf(value)) { bf_set_inf(result, signbit(value) != 0); return; }+  if (value == 0) { bf_set_zero(result, signbit(value) != 0); return; }+  long double fraction = frexpl(fabsl(value), &exponent);+  bf_init(result->ctx, &chunk); bf_set_zero(result, 0);+  while (fraction != 0) {+    fraction = ldexpl(fraction, 32);+    const uint32_t bits = (uint32_t) fraction; fraction -= (long double) bits;+    status |= bf_mul_2exp(result, 32, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    status |= bf_set_ui(&chunk, bits);+    status |= bf_add(result, result, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ); shift += 32;+  }+  status |= bf_mul_2exp(result, exponent - shift, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  bf_delete(&chunk); if (status & BF_ST_MEM_ERROR) abort();+  if (signbit(value)) bf_neg(result);+}++static SBV_CGEN_UNUSED long double sbv_bf_get_long_double(bf_t *value, bf_rnd_t rnd)+{+  if (bf_round(value, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)) & BF_ST_MEM_ERROR) abort();+  if (bf_is_nan(value)) return nanl("");+  if (!bf_is_finite(value)) return value->sign ? -HUGE_VALL : HUGE_VALL;+  if (bf_is_zero(value)) return value->sign ? -0.0L : 0.0L;+  long double significand = 0;+  const slimb_t base = (slimb_t) value->len * LIMB_BITS;+  for (int i = 0; i < LDBL_MANT_DIG; ++i) {+    const slimb_t bit = base - 1 - i;+    const unsigned digit = bit < 0 ? 0 : (unsigned) ((value->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1);+    significand = significand * 2 + digit;+  }+  const long double result = ldexpl(significand, (int) value->expn - LDBL_MANT_DIG);+  return value->sign ? -result : result;+}++static SBV_CGEN_UNUSED inline SDouble sbv_fp_cast_real_double(SReal a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); sbv_bf_set_long_double(&x, a);+  bf_round(&x, 53, BF_FLAG_SUBNORMAL | bf_set_exp_bits(11) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SDouble) result;+}+++SDouble toFP_Real_ToDouble(const SReal sbv_input_0)+{+  const SReal   s0 = sbv_input_0;+        SDouble s2;+  s2 = sbv_fp_cast_real_double(s0, BF_RNDN);++  return s2;+}+== END: "toFP_Real_ToDouble.c" ==================+== BEGIN: "fromFP_Float_ToInt8.c" ================+/* File: "fromFP_Float_ToInt8.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt8 sbv_fp_cast_float_s8(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord8 raw = (SWord8) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 8; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord8) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord8) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt8 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt8 fromFP_Float_ToInt8(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SInt8  s2;+  s2 = sbv_fp_cast_float_s8(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToInt8.c" ==================+== BEGIN: "fromFP_Float_ToInt16.c" ================+/* File: "fromFP_Float_ToInt16.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt16 sbv_fp_cast_float_s16(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord16 raw = (SWord16) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 16; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord16) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord16) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt16 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt16 fromFP_Float_ToInt16(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SInt16 s2;+  s2 = sbv_fp_cast_float_s16(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToInt16.c" ==================+== BEGIN: "fromFP_Float_ToInt32.c" ================+/* File: "fromFP_Float_ToInt32.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt32 sbv_fp_cast_float_s32(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord32 raw = (SWord32) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 32; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord32) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord32) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt32 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt32 fromFP_Float_ToInt32(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SInt32 s2;+  s2 = sbv_fp_cast_float_s32(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToInt32.c" ==================+== BEGIN: "fromFP_Float_ToInt64.c" ================+/* File: "fromFP_Float_ToInt64.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt64 sbv_fp_cast_float_s64(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt64 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt64 fromFP_Float_ToInt64(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SInt64 s2;+  s2 = sbv_fp_cast_float_s64(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToInt64.c" ==================+== BEGIN: "fromFP_Float_ToWord8.c" ================+/* File: "fromFP_Float_ToWord8.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord8 sbv_fp_cast_float_u8(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord8 raw = (SWord8) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 8; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord8) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord8) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord8 fromFP_Float_ToWord8(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SWord8 s2;+  s2 = sbv_fp_cast_float_u8(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToWord8.c" ==================+== BEGIN: "fromFP_Float_ToWord16.c" ================+/* File: "fromFP_Float_ToWord16.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord16 sbv_fp_cast_float_u16(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord16 raw = (SWord16) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 16; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord16) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord16) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord16 fromFP_Float_ToWord16(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SWord16 s2;+  s2 = sbv_fp_cast_float_u16(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToWord16.c" ==================+== BEGIN: "fromFP_Float_ToWord32.c" ================+/* File: "fromFP_Float_ToWord32.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord32 sbv_fp_cast_float_u32(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord32 raw = (SWord32) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 32; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord32) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord32) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord32 fromFP_Float_ToWord32(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SWord32 s2;+  s2 = sbv_fp_cast_float_u32(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToWord32.c" ==================+== BEGIN: "fromFP_Float_ToWord64.c" ================+/* File: "fromFP_Float_ToWord64.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord64 sbv_fp_cast_float_u64(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord64 fromFP_Float_ToWord64(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SWord64 s2;+  s2 = sbv_fp_cast_float_u64(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToWord64.c" ==================+== BEGIN: "fromFP_Float_ToFloat.c" ================+/* File: "fromFP_Float_ToFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat fromFP_Float_ToFloat(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+  return s0;+}+== END: "fromFP_Float_ToFloat.c" ==================+== BEGIN: "fromFP_Float_ToDouble.c" ================+/* File: "fromFP_Float_ToDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble fromFP_Float_ToDouble(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SDouble s2;+  s2 = (SDouble) s0;++  return s2;+}+== END: "fromFP_Float_ToDouble.c" ==================+== BEGIN: "fromFP_Float_ToInteger.c" ================+/* File: "fromFP_Float_ToInteger.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt64 sbv_fp_cast_float_integer(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt64 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInteger fromFP_Float_ToInteger(const SFloat sbv_input_0)+{+  const SFloat   s0 = sbv_input_0;+        SInteger s2;+  s2 = sbv_fp_cast_float_integer(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToInteger.c" ==================+== BEGIN: "fromFP_Float_ToReal.c" ================+/* File: "fromFP_Float_ToReal.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++#include <float.h>+#if FLT_RADIX == 2 && LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 && LDBL_MIN_EXP == -1021+#define SBV_LDBL_EXP_BITS 11+#elif FLT_RADIX == 2 && (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381+#define SBV_LDBL_EXP_BITS 15+#else+#error SBV C long-double conversions require binary64, x87 extended, or binary128 long double+#endif+#if BF_EXP_BITS_MAX < SBV_LDBL_EXP_BITS+#error SBV C long-double conversions exceed the LibBF exponent range+#endif++static SBV_CGEN_UNUSED bf_flags_t sbv_bf_long_double_flags(bf_rnd_t rnd)+{+  return BF_FLAG_SUBNORMAL | bf_set_exp_bits(SBV_LDBL_EXP_BITS) | (bf_flags_t) rnd;+}++static SBV_CGEN_UNUSED void sbv_bf_set_long_double(bf_t *result, long double value)+{+  int exponent, shift = 0, status = 0; bf_t chunk;+  if (isnan(value)) { bf_set_nan(result); return; }+  if (isinf(value)) { bf_set_inf(result, signbit(value) != 0); return; }+  if (value == 0) { bf_set_zero(result, signbit(value) != 0); return; }+  long double fraction = frexpl(fabsl(value), &exponent);+  bf_init(result->ctx, &chunk); bf_set_zero(result, 0);+  while (fraction != 0) {+    fraction = ldexpl(fraction, 32);+    const uint32_t bits = (uint32_t) fraction; fraction -= (long double) bits;+    status |= bf_mul_2exp(result, 32, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    status |= bf_set_ui(&chunk, bits);+    status |= bf_add(result, result, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ); shift += 32;+  }+  status |= bf_mul_2exp(result, exponent - shift, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  bf_delete(&chunk); if (status & BF_ST_MEM_ERROR) abort();+  if (signbit(value)) bf_neg(result);+}++static SBV_CGEN_UNUSED long double sbv_bf_get_long_double(bf_t *value, bf_rnd_t rnd)+{+  if (bf_round(value, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)) & BF_ST_MEM_ERROR) abort();+  if (bf_is_nan(value)) return nanl("");+  if (!bf_is_finite(value)) return value->sign ? -HUGE_VALL : HUGE_VALL;+  if (bf_is_zero(value)) return value->sign ? -0.0L : 0.0L;+  long double significand = 0;+  const slimb_t base = (slimb_t) value->len * LIMB_BITS;+  for (int i = 0; i < LDBL_MANT_DIG; ++i) {+    const slimb_t bit = base - 1 - i;+    const unsigned digit = bit < 0 ? 0 : (unsigned) ((value->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1);+    significand = significand * 2 + digit;+  }+  const long double result = ldexpl(significand, (int) value->expn - LDBL_MANT_DIG);+  return value->sign ? -result : result;+}++static SBV_CGEN_UNUSED inline SReal sbv_fp_cast_float_real(SFloat a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; long double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a);+  bf_round(&x, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)); result = sbv_bf_get_long_double(&x, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SReal) result;+}+++SReal fromFP_Float_ToReal(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SReal  s2;+  s2 = sbv_fp_cast_float_real(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_Float_ToReal.c" ==================+== BEGIN: "fromFP_DoubleTo_Int8.c" ================+/* File: "fromFP_DoubleTo_Int8.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt8 sbv_fp_cast_double_s8(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord8 raw = (SWord8) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 8; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord8) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord8) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt8 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt8 fromFP_DoubleTo_Int8(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SInt8   s2;+  s2 = sbv_fp_cast_double_s8(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Int8.c" ==================+== BEGIN: "fromFP_DoubleTo_Int16.c" ================+/* File: "fromFP_DoubleTo_Int16.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt16 sbv_fp_cast_double_s16(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord16 raw = (SWord16) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 16; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord16) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord16) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt16 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt16 fromFP_DoubleTo_Int16(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SInt16  s2;+  s2 = sbv_fp_cast_double_s16(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Int16.c" ==================+== BEGIN: "fromFP_DoubleTo_Int32.c" ================+/* File: "fromFP_DoubleTo_Int32.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt32 sbv_fp_cast_double_s32(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord32 raw = (SWord32) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 32; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord32) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord32) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt32 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt32 fromFP_DoubleTo_Int32(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SInt32  s2;+  s2 = sbv_fp_cast_double_s32(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Int32.c" ==================+== BEGIN: "fromFP_DoubleTo_Int64.c" ================+/* File: "fromFP_DoubleTo_Int64.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt64 sbv_fp_cast_double_s64(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt64 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInt64 fromFP_DoubleTo_Int64(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SInt64  s2;+  s2 = sbv_fp_cast_double_s64(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Int64.c" ==================+== BEGIN: "fromFP_DoubleTo_Word8.c" ================+/* File: "fromFP_DoubleTo_Word8.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord8 sbv_fp_cast_double_u8(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord8 raw = (SWord8) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 8; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord8) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord8) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord8 fromFP_DoubleTo_Word8(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SWord8  s2;+  s2 = sbv_fp_cast_double_u8(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Word8.c" ==================+== BEGIN: "fromFP_DoubleTo_Word16.c" ================+/* File: "fromFP_DoubleTo_Word16.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord16 sbv_fp_cast_double_u16(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord16 raw = (SWord16) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 16; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord16) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord16) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord16 fromFP_DoubleTo_Word16(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SWord16 s2;+  s2 = sbv_fp_cast_double_u16(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Word16.c" ==================+== BEGIN: "fromFP_DoubleTo_Word32.c" ================+/* File: "fromFP_DoubleTo_Word32.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord32 sbv_fp_cast_double_u32(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord32 raw = (SWord32) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 32; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord32) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord32) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord32 fromFP_DoubleTo_Word32(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SWord32 s2;+  s2 = sbv_fp_cast_double_u32(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Word32.c" ==================+== BEGIN: "fromFP_DoubleTo_Word64.c" ================+/* File: "fromFP_DoubleTo_Word64.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SWord64 sbv_fp_cast_double_u64(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  return raw;+}+++SWord64 fromFP_DoubleTo_Word64(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SWord64 s2;+  s2 = sbv_fp_cast_double_u64(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Word64.c" ==================+== BEGIN: "fromFP_DoubleTo_Float.c" ================+/* File: "fromFP_DoubleTo_Float.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SFloat sbv_fp_cast_double_float(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a);+  bf_round(&x, 24, BF_FLAG_SUBNORMAL | bf_set_exp_bits(8) | (bf_flags_t) rnd); bf_get_float64(&x, &result, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SFloat) result;+}+++SFloat fromFP_DoubleTo_Float(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SFloat  s2;+  s2 = sbv_fp_cast_double_float(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Float.c" ==================+== BEGIN: "fromFP_DoubleTo_Double.c" ================+/* File: "fromFP_DoubleTo_Double.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble fromFP_DoubleTo_Double(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+  return s0;+}+== END: "fromFP_DoubleTo_Double.c" ==================+== BEGIN: "fromFP_DoubleTo_Integer.c" ================+/* File: "fromFP_DoubleTo_Integer.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++static SBV_CGEN_UNUSED inline SInt64 sbv_fp_cast_double_integer(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; SWord64 raw = (SWord64) 0; limb_t i;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a); bf_rint(&x, rnd);+  if (bf_is_finite(&x) && !bf_is_zero(&x)) {+    const slimb_t base = (slimb_t) x.len * LIMB_BITS;+    for (i = 0; i < 64; ++i) {+      const slimb_t bit = (slimb_t) i - x.expn + base;+      if (bit >= 0 && bit < base) { raw = (SWord64) ((uint64_t) raw | ((uint64_t) (((x.tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1) != 0) << (i))); }+    }+    if (x.sign) raw = (SWord64) (~(uint64_t) raw + UINT64_C(1));+  }+  bf_delete(&x); bf_context_end(&ctx);+  SInt64 result; memcpy(&result, &raw, sizeof result); return result;+}+++SInteger fromFP_DoubleTo_Integer(const SDouble sbv_input_0)+{+  const SDouble  s0 = sbv_input_0;+        SInteger s2;+  s2 = sbv_fp_cast_double_integer(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Integer.c" ==================+== BEGIN: "fromFP_DoubleTo_Real.c" ================+/* File: "fromFP_DoubleTo_Real.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++/* LibBF-backed arbitrary floating-point runtime. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static SBV_CGEN_UNUSED inline bf_rnd_t sbv_bf_rounding_mode(int mode)+{+  switch (mode) {+    case 0: return BF_RNDN;+    case 1: return BF_RNDNA;+    case 2: return BF_RNDU;+    case 3: return BF_RNDD;+    case 4: return BF_RNDZ;+    default: abort();+  }+}++static SBV_CGEN_UNUSED void *sbv_bf_realloc(void *opaque, void *ptr, size_t size)+{+  (void) opaque;+  return realloc(ptr, size);+}++#include <float.h>+#if FLT_RADIX == 2 && LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 && LDBL_MIN_EXP == -1021+#define SBV_LDBL_EXP_BITS 11+#elif FLT_RADIX == 2 && (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381+#define SBV_LDBL_EXP_BITS 15+#else+#error SBV C long-double conversions require binary64, x87 extended, or binary128 long double+#endif+#if BF_EXP_BITS_MAX < SBV_LDBL_EXP_BITS+#error SBV C long-double conversions exceed the LibBF exponent range+#endif++static SBV_CGEN_UNUSED bf_flags_t sbv_bf_long_double_flags(bf_rnd_t rnd)+{+  return BF_FLAG_SUBNORMAL | bf_set_exp_bits(SBV_LDBL_EXP_BITS) | (bf_flags_t) rnd;+}++static SBV_CGEN_UNUSED void sbv_bf_set_long_double(bf_t *result, long double value)+{+  int exponent, shift = 0, status = 0; bf_t chunk;+  if (isnan(value)) { bf_set_nan(result); return; }+  if (isinf(value)) { bf_set_inf(result, signbit(value) != 0); return; }+  if (value == 0) { bf_set_zero(result, signbit(value) != 0); return; }+  long double fraction = frexpl(fabsl(value), &exponent);+  bf_init(result->ctx, &chunk); bf_set_zero(result, 0);+  while (fraction != 0) {+    fraction = ldexpl(fraction, 32);+    const uint32_t bits = (uint32_t) fraction; fraction -= (long double) bits;+    status |= bf_mul_2exp(result, 32, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+    status |= bf_set_ui(&chunk, bits);+    status |= bf_add(result, result, &chunk, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ); shift += 32;+  }+  status |= bf_mul_2exp(result, exponent - shift, BF_PREC_INF, BF_FLAG_EXT_EXP | BF_RNDZ);+  bf_delete(&chunk); if (status & BF_ST_MEM_ERROR) abort();+  if (signbit(value)) bf_neg(result);+}++static SBV_CGEN_UNUSED long double sbv_bf_get_long_double(bf_t *value, bf_rnd_t rnd)+{+  if (bf_round(value, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)) & BF_ST_MEM_ERROR) abort();+  if (bf_is_nan(value)) return nanl("");+  if (!bf_is_finite(value)) return value->sign ? -HUGE_VALL : HUGE_VALL;+  if (bf_is_zero(value)) return value->sign ? -0.0L : 0.0L;+  long double significand = 0;+  const slimb_t base = (slimb_t) value->len * LIMB_BITS;+  for (int i = 0; i < LDBL_MANT_DIG; ++i) {+    const slimb_t bit = base - 1 - i;+    const unsigned digit = bit < 0 ? 0 : (unsigned) ((value->tab[bit / LIMB_BITS] >> (bit % LIMB_BITS)) & 1);+    significand = significand * 2 + digit;+  }+  const long double result = ldexpl(significand, (int) value->expn - LDBL_MANT_DIG);+  return value->sign ? -result : result;+}++static SBV_CGEN_UNUSED inline SReal sbv_fp_cast_double_real(SDouble a, bf_rnd_t rnd)+{+  bf_context_t ctx; bf_t x; long double result;+  bf_context_init(&ctx, sbv_bf_realloc, NULL); bf_init(&ctx, &x); bf_set_float64(&x, (double) a);+  bf_round(&x, LDBL_MANT_DIG, sbv_bf_long_double_flags(rnd)); result = sbv_bf_get_long_double(&x, rnd);+  bf_delete(&x); bf_context_end(&ctx); return (SReal) result;+}+++SReal fromFP_DoubleTo_Real(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SReal   s2;+  s2 = sbv_fp_cast_double_real(s0, BF_RNDN);++  return s2;+}+== END: "fromFP_DoubleTo_Real.c" ==================+== BEGIN: "fromFP_SWord32_SFloat.c" ================+/* File: "fromFP_SWord32_SFloat.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat fromFP_SWord32_SFloat(const SWord32 sbv_input_0)+{+  const SWord32 s0 = sbv_input_0;+        SFloat  s1;+  memcpy(&s1, &s0, sizeof(SFloat));++  return s1;+}+== END: "fromFP_SWord32_SFloat.c" ==================+== BEGIN: "fromFP_SWord64_SDouble.c" ================+/* File: "fromFP_SWord64_SDouble.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble fromFP_SWord64_SDouble(const SWord64 sbv_input_0)+{+  const SWord64 s0 = sbv_input_0;+        SDouble s1;+  memcpy(&s1, &s0, sizeof(SDouble));++  return s1;+}+== END: "fromFP_SWord64_SDouble.c" ==================+== BEGIN: "fromFP_SFloat_SWord32.c" ================+/* File: "fromFP_SFloat_SWord32.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SWord32 fromFP_SFloat_SWord32(const SFloat sbv_input_0)+{+  const SFloat  s0 = sbv_input_0;+        SWord32 s1;+  memcpy(&s1, &s0, sizeof(SWord32));++  return s1;+}+== END: "fromFP_SFloat_SWord32.c" ==================+== BEGIN: "fromFP_SDouble_SWord64.c" ================+/* File: "fromFP_SDouble_SWord64.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SWord64 fromFP_SDouble_SWord64(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SWord64 s1;+  memcpy(&s1, &s0, sizeof(SWord64));++  return s1;+}+== END: "fromFP_SDouble_SWord64.c" ==================+== BEGIN: "f_FP_Abs.c" ================+/* File: "f_FP_Abs.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Abs(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SFloat s1;+  s1 = fabsf(s0);++  return s1;+}+== END: "f_FP_Abs.c" ==================+== BEGIN: "d_FP_Abs.c" ================+/* File: "d_FP_Abs.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Abs(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SDouble s1;+  s1 = fabs(s0);++  return s1;+}+== END: "d_FP_Abs.c" ==================+== BEGIN: "f_FP_Neg.c" ================+/* File: "f_FP_Neg.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Neg(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SFloat s1;+  s1 = (- s0);++  return s1;+}+== END: "f_FP_Neg.c" ==================+== BEGIN: "d_FP_Neg.c" ================+/* File: "d_FP_Neg.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Neg(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SDouble s1;+  s1 = (- s0);++  return s1;+}+== END: "d_FP_Neg.c" ==================+== BEGIN: "f_FP_Add.c" ================+/* File: "f_FP_Add.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Add(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s3;+  s3 = s0 + s1;++  return s3;+}+== END: "f_FP_Add.c" ==================+== BEGIN: "d_FP_Add.c" ================+/* File: "d_FP_Add.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Add(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s3;+  s3 = s0 + s1;++  return s3;+}+== END: "d_FP_Add.c" ==================+== BEGIN: "f_FP_Sub.c" ================+/* File: "f_FP_Sub.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Sub(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s3;+  s3 = s0 - s1;++  return s3;+}+== END: "f_FP_Sub.c" ==================+== BEGIN: "d_FP_Sub.c" ================+/* File: "d_FP_Sub.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Sub(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s3;+  s3 = s0 - s1;++  return s3;+}+== END: "d_FP_Sub.c" ==================+== BEGIN: "f_FP_Mul.c" ================+/* File: "f_FP_Mul.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Mul(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s3;+  s3 = s0 * s1;++  return s3;+}+== END: "f_FP_Mul.c" ==================+== BEGIN: "d_FP_Mul.c" ================+/* File: "d_FP_Mul.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Mul(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s3;+  s3 = s0 * s1;++  return s3;+}+== END: "d_FP_Mul.c" ==================+== BEGIN: "f_FP_Div.c" ================+/* File: "f_FP_Div.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Div(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s3;+  s3 = s0 / s1;++  return s3;+}+== END: "f_FP_Div.c" ==================+== BEGIN: "d_FP_Div.c" ================+/* File: "d_FP_Div.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Div(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s3;+  s3 = s0 / s1;++  return s3;+}+== END: "d_FP_Div.c" ==================+== BEGIN: "f_FP_FMA.c" ================+/* File: "f_FP_FMA.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_FMA(const SFloat sbv_input_0, const SFloat sbv_input_1,+                const SFloat sbv_input_2)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+  const SFloat s2 = sbv_input_2;+        SFloat s4;+  s4 = fmaf(s0, s1, s2);++  return s4;+}+== END: "f_FP_FMA.c" ==================+== BEGIN: "d_FP_FMA.c" ================+/* File: "d_FP_FMA.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_FMA(const SDouble sbv_input_0,+                 const SDouble sbv_input_1, const SDouble sbv_input_2)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+  const SDouble s2 = sbv_input_2;+        SDouble s4;+  s4 = fma(s0, s1, s2);++  return s4;+}+== END: "d_FP_FMA.c" ==================+== BEGIN: "f_FP_Sqrt.c" ================+/* File: "f_FP_Sqrt.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Sqrt(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SFloat s2;+  s2 = sqrtf(s0);++  return s2;+}+== END: "f_FP_Sqrt.c" ==================+== BEGIN: "d_FP_Sqrt.c" ================+/* File: "d_FP_Sqrt.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Sqrt(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SDouble s2;+  s2 = sqrt(s0);++  return s2;+}+== END: "d_FP_Sqrt.c" ==================+== BEGIN: "f_FP_Rem.c" ================+/* File: "f_FP_Rem.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Rem(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s2;+  s2 = remainderf(s0, s1);++  return s2;+}+== END: "f_FP_Rem.c" ==================+== BEGIN: "d_FP_Rem.c" ================+/* File: "d_FP_Rem.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Rem(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s2;+  s2 = remainder(s0, s1);++  return s2;+}+== END: "d_FP_Rem.c" ==================+== BEGIN: "f_FP_RoundToIntegral.c" ================+/* File: "f_FP_RoundToIntegral.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_RoundToIntegral(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SFloat s2;+  s2 = rintf(s0);++  return s2;+}+== END: "f_FP_RoundToIntegral.c" ==================+== BEGIN: "d_FP_RoundToIntegral.c" ================+/* File: "d_FP_RoundToIntegral.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_RoundToIntegral(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SDouble s2;+  s2 = rint(s0);++  return s2;+}+== END: "d_FP_RoundToIntegral.c" ==================+== BEGIN: "f_FP_Min.c" ================+/* File: "f_FP_Min.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Min(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s2;+  s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0F /* 0.0F */ : fminf(s0,+                                                                                                                                 s1);++  return s2;+}+== END: "f_FP_Min.c" ==================+== BEGIN: "d_FP_Min.c" ================+/* File: "d_FP_Min.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Min(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s2;+  s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0 /* 0.0 */ : fmin(s0,+                                                                                                                              s1);++  return s2;+}+== END: "d_FP_Min.c" ==================+== BEGIN: "f_FP_Max.c" ================+/* File: "f_FP_Max.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SFloat f_FP_Max(const SFloat sbv_input_0, const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SFloat s2;+  s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0F /* 0.0F */ : fmaxf(s0,+                                                                                                                                 s1);++  return s2;+}+== END: "f_FP_Max.c" ==================+== BEGIN: "d_FP_Max.c" ================+/* File: "d_FP_Max.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SDouble d_FP_Max(const SDouble sbv_input_0,+                 const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SDouble s2;+  s2 = ((FP_ZERO == fpclassify(s0)) && (FP_ZERO == fpclassify(s1)) && (signbit(s0) != signbit(s1))) ? 0x0p+0 /* 0.0 */ : fmax(s0,+                                                                                                                              s1);++  return s2;+}+== END: "d_FP_Max.c" ==================+== BEGIN: "f_FP_IsEqualObject.c" ================+/* File: "f_FP_IsEqualObject.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsEqualObject(const SFloat sbv_input_0,+                         const SFloat sbv_input_1)+{+  const SFloat s0 = sbv_input_0;+  const SFloat s1 = sbv_input_1;+        SBool  s2;+  s2 = isnan(s0) ? isnan(s1) : (signbit(s0) && (s0 == 0)) ? (signbit(s1) && (s1 == 0)) : (signbit(s1) && (s1 == 0)) ? (signbit(s0) && (s0 == 0)) : (s0 == s1);++  return s2;+}+== END: "f_FP_IsEqualObject.c" ==================+== BEGIN: "d_FP_IsEqualObject.c" ================+/* File: "d_FP_IsEqualObject.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsEqualObject(const SDouble sbv_input_0,+                         const SDouble sbv_input_1)+{+  const SDouble s0 = sbv_input_0;+  const SDouble s1 = sbv_input_1;+        SBool   s2;+  s2 = isnan(s0) ? isnan(s1) : (signbit(s0) && (s0 == 0)) ? (signbit(s1) && (s1 == 0)) : (signbit(s1) && (s1 == 0)) ? (signbit(s0) && (s0 == 0)) : (s0 == s1);++  return s2;+}+== END: "d_FP_IsEqualObject.c" ==================+== BEGIN: "f_FP_IsNormal.c" ================+/* File: "f_FP_IsNormal.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsNormal(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = isnormal(s0);++  return s1;+}+== END: "f_FP_IsNormal.c" ==================+== BEGIN: "d_FP_IsNormal.c" ================+/* File: "d_FP_IsNormal.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsNormal(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = isnormal(s0);++  return s1;+}+== END: "d_FP_IsNormal.c" ==================+== BEGIN: "f_FP_IsZero.c" ================+/* File: "f_FP_IsZero.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsZero(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = FP_ZERO == fpclassify(s0);++  return s1;+}+== END: "f_FP_IsZero.c" ==================+== BEGIN: "d_FP_IsZero.c" ================+/* File: "d_FP_IsZero.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsZero(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = FP_ZERO == fpclassify(s0);++  return s1;+}+== END: "d_FP_IsZero.c" ==================+== BEGIN: "f_FP_IsSubnormal.c" ================+/* File: "f_FP_IsSubnormal.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsSubnormal(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = FP_SUBNORMAL == fpclassify(s0);++  return s1;+}+== END: "f_FP_IsSubnormal.c" ==================+== BEGIN: "d_FP_IsSubnormal.c" ================+/* File: "d_FP_IsSubnormal.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsSubnormal(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = FP_SUBNORMAL == fpclassify(s0);++  return s1;+}+== END: "d_FP_IsSubnormal.c" ==================+== BEGIN: "f_FP_IsInfinite.c" ================+/* File: "f_FP_IsInfinite.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsInfinite(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = isinf(s0);++  return s1;+}+== END: "f_FP_IsInfinite.c" ==================+== BEGIN: "d_FP_IsInfinite.c" ================+/* File: "d_FP_IsInfinite.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsInfinite(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = isinf(s0);++  return s1;+}+== END: "d_FP_IsInfinite.c" ==================+== BEGIN: "f_FP_IsNaN.c" ================+/* File: "f_FP_IsNaN.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsNaN(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = isnan(s0);++  return s1;+}+== END: "f_FP_IsNaN.c" ==================+== BEGIN: "d_FP_IsNaN.c" ================+/* File: "d_FP_IsNaN.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsNaN(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = isnan(s0);++  return s1;+}+== END: "d_FP_IsNaN.c" ==================+== BEGIN: "f_FP_IsNegative.c" ================+/* File: "f_FP_IsNegative.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsNegative(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = !isnan(s0) && signbit(s0);++  return s1;+}+== END: "f_FP_IsNegative.c" ==================+== BEGIN: "d_FP_IsNegative.c" ================+/* File: "d_FP_IsNegative.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsNegative(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = !isnan(s0) && signbit(s0);++  return s1;+}+== END: "d_FP_IsNegative.c" ==================+== BEGIN: "f_FP_IsPositive.c" ================+/* File: "f_FP_IsPositive.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool f_FP_IsPositive(const SFloat sbv_input_0)+{+  const SFloat s0 = sbv_input_0;+        SBool  s1;+  s1 = !isnan(s0) && !signbit(s0);++  return s1;+}+== END: "f_FP_IsPositive.c" ==================+== BEGIN: "d_FP_IsPositive.c" ================+/* File: "d_FP_IsPositive.c". Automatically generated by SBV. Do not edit! */++#include "floatCodeGen.h"+#include <libbf.h>++/* Preserve separate SBV rounding steps; explicit fma calls remain fused. */+#if defined(__clang__)+#pragma STDC FP_CONTRACT OFF+#endif+++SBool d_FP_IsPositive(const SDouble sbv_input_0)+{+  const SDouble s0 = sbv_input_0;+        SBool   s1;+  s1 = !isnan(s0) && !signbit(s0);++  return s1;+}+== END: "d_FP_IsPositive.c" ==================+== BEGIN: "floatCodeGen.h" ================+/* Header file for floatCodeGen. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_floatCodeGen_HEADER_INCLUDED+#define SBV_GENERATED_floatCodeGen_HEADER_INCLUDED++#if defined(__FAST_MATH__) || (defined(__FINITE_MATH_ONLY__) && __FINITE_MATH_ONLY__ > 0)+#error "SBV-generated C requires IEEE floating-point semantics; disable fast-math and finite-math-only."+#endif++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>+#include <float.h>+#if FLT_EVAL_METHOD != 0+#error "SBV-generated C requires FLT_EVAL_METHOD == 0; indeterminate or excess-precision floating evaluation is unsupported."+#endif++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* User requested mapping for SInteger.                                 */+/* NB. Loss of precision: Target type is subject to modular arithmetic. */+typedef SInt64 SInteger;++/* User requested mapping for SReal.                          */+/* NB. Loss of precision: Target type is subject to rounding. */+typedef long double SReal;++/* IEEE-754 rounding modes. */+#ifndef SBV_ROUNDING_MODE_DEFINED+#define SBV_ROUNDING_MODE_DEFINED+typedef enum { SBV_RM_RNE = 0, SBV_RM_RNA = 1, SBV_RM_RTP = 2, SBV_RM_RTN = 3, SBV_RM_RTZ = 4 } RoundingMode;+#endif+++/* Entry point prototypes: */+SFloat toFP_Int8_ToFloat(const SInt8 a);+SFloat toFP_Int16_ToFloat(const SInt16 a);+SFloat toFP_Int32_ToFloat(const SInt32 a);+SFloat toFP_Int64_ToFloat(const SInt64 a);+SFloat toFP_Word8_ToFloat(const SWord8 a);+SFloat toFP_Word16_ToFloat(const SWord16 a);+SFloat toFP_Word32_ToFloat(const SWord32 a);+SFloat toFP_Word64_ToFloat(const SWord64 a);+SFloat toFP_Float_ToFloat(const SFloat a);+SFloat toFP_Double_ToFloat(const SDouble a);+SFloat toFP_Integer_ToFloat(const SInteger a);+SFloat toFP_Real_ToFloat(const SReal a);+SDouble toFP_Int8_ToDouble(const SInt8 a);+SDouble toFP_Int16_ToDouble(const SInt16 a);+SDouble toFP_Int32_ToDouble(const SInt32 a);+SDouble toFP_Int64_ToDouble(const SInt64 a);+SDouble toFP_Word8_ToDouble(const SWord8 a);+SDouble toFP_Word16_ToDouble(const SWord16 a);+SDouble toFP_Word32_ToDouble(const SWord32 a);+SDouble toFP_Word64_ToDouble(const SWord64 a);+SDouble toFP_Float_ToDouble(const SFloat a);+SDouble toFP_Double_ToDouble(const SDouble a);+SDouble toFP_Integer_ToDouble(const SInteger a);+SDouble toFP_Real_ToDouble(const SReal a);+SInt8 fromFP_Float_ToInt8(const SFloat a);+SInt16 fromFP_Float_ToInt16(const SFloat a);+SInt32 fromFP_Float_ToInt32(const SFloat a);+SInt64 fromFP_Float_ToInt64(const SFloat a);+SWord8 fromFP_Float_ToWord8(const SFloat a);+SWord16 fromFP_Float_ToWord16(const SFloat a);+SWord32 fromFP_Float_ToWord32(const SFloat a);+SWord64 fromFP_Float_ToWord64(const SFloat a);+SFloat fromFP_Float_ToFloat(const SFloat a);+SDouble fromFP_Float_ToDouble(const SFloat a);+SInteger fromFP_Float_ToInteger(const SFloat a);+SReal fromFP_Float_ToReal(const SFloat a);+SInt8 fromFP_DoubleTo_Int8(const SDouble a);+SInt16 fromFP_DoubleTo_Int16(const SDouble a);+SInt32 fromFP_DoubleTo_Int32(const SDouble a);+SInt64 fromFP_DoubleTo_Int64(const SDouble a);+SWord8 fromFP_DoubleTo_Word8(const SDouble a);+SWord16 fromFP_DoubleTo_Word16(const SDouble a);+SWord32 fromFP_DoubleTo_Word32(const SDouble a);+SWord64 fromFP_DoubleTo_Word64(const SDouble a);+SFloat fromFP_DoubleTo_Float(const SDouble a);+SDouble fromFP_DoubleTo_Double(const SDouble a);+SInteger fromFP_DoubleTo_Integer(const SDouble a);+SReal fromFP_DoubleTo_Real(const SDouble a);+SFloat fromFP_SWord32_SFloat(const SWord32 a);+SDouble fromFP_SWord64_SDouble(const SWord64 a);+SWord32 fromFP_SFloat_SWord32(const SFloat a);+SWord64 fromFP_SDouble_SWord64(const SDouble a);+SFloat f_FP_Abs(const SFloat a);+SDouble d_FP_Abs(const SDouble a);+SFloat f_FP_Neg(const SFloat a);+SDouble d_FP_Neg(const SDouble a);+SFloat f_FP_Add(const SFloat a, const SFloat b);+SDouble d_FP_Add(const SDouble a, const SDouble b);+SFloat f_FP_Sub(const SFloat a, const SFloat b);+SDouble d_FP_Sub(const SDouble a, const SDouble b);+SFloat f_FP_Mul(const SFloat a, const SFloat b);+SDouble d_FP_Mul(const SDouble a, const SDouble b);+SFloat f_FP_Div(const SFloat a, const SFloat b);+SDouble d_FP_Div(const SDouble a, const SDouble b);+SFloat f_FP_FMA(const SFloat a, const SFloat b, const SFloat c);+SDouble d_FP_FMA(const SDouble a, const SDouble b,+                 const SDouble c);+SFloat f_FP_Sqrt(const SFloat a);+SDouble d_FP_Sqrt(const SDouble a);+SFloat f_FP_Rem(const SFloat a, const SFloat b);+SDouble d_FP_Rem(const SDouble a, const SDouble b);+SFloat f_FP_RoundToIntegral(const SFloat a);+SDouble d_FP_RoundToIntegral(const SDouble a);+SFloat f_FP_Min(const SFloat a, const SFloat b);+SDouble d_FP_Min(const SDouble a, const SDouble b);+SFloat f_FP_Max(const SFloat a, const SFloat b);+SDouble d_FP_Max(const SDouble a, const SDouble b);+SBool f_FP_IsEqualObject(const SFloat a, const SFloat b);+SBool d_FP_IsEqualObject(const SDouble a, const SDouble b);+SBool f_FP_IsNormal(const SFloat a);+SBool d_FP_IsNormal(const SDouble a);+SBool f_FP_IsZero(const SFloat a);+SBool d_FP_IsZero(const SDouble a);+SBool f_FP_IsSubnormal(const SFloat a);+SBool d_FP_IsSubnormal(const SDouble a);+SBool f_FP_IsInfinite(const SFloat a);+SBool d_FP_IsInfinite(const SDouble a);+SBool f_FP_IsNaN(const SFloat a);+SBool d_FP_IsNaN(const SDouble a);+SBool f_FP_IsNegative(const SFloat a);+SBool d_FP_IsNegative(const SDouble a);+SBool f_FP_IsPositive(const SFloat a);+SBool d_FP_IsPositive(const SDouble a);++#endif /* SBV_GENERATED_floatCodeGen_HEADER_INCLUDED */+== END: "floatCodeGen.h" ==================+== BEGIN: "floatCodeGen_driver.c" ================+/* Example driver program for floatCodeGen. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "floatCodeGen.h"+#include <libbf.h>++void toFP_Int8_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Int8_ToFloat(42);++  printf("toFP_Int8_ToFloat(42) = %a\n", sbv_result);+}++void toFP_Int16_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Int16_ToFloat(0x002a);++  printf("toFP_Int16_ToFloat(0x002a) = %a\n", sbv_result);+}++void toFP_Int32_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Int32_ToFloat(0x0000002aL);++  printf("toFP_Int32_ToFloat(0x0000002aL) = %a\n", sbv_result);+}++void toFP_Int64_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Int64_ToFloat(0x000000000000002aLL);++  printf("toFP_Int64_ToFloat(0x000000000000002aLL) = %a\n", sbv_result);+}++void toFP_Word8_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Word8_ToFloat(42);++  printf("toFP_Word8_ToFloat(42) = %a\n", sbv_result);+}++void toFP_Word16_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Word16_ToFloat(0x002aU);++  printf("toFP_Word16_ToFloat(0x002aU) = %a\n", sbv_result);+}++void toFP_Word32_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Word32_ToFloat(0x0000002aUL);++  printf("toFP_Word32_ToFloat(0x0000002aUL) = %a\n", sbv_result);+}++void toFP_Word64_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Word64_ToFloat(0x000000000000002aULL);++  printf("toFP_Word64_ToFloat(0x000000000000002aULL) = %a\n", sbv_result);+}++void toFP_Float_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Float_ToFloat(0x1.5p5F /* 42.0F */);++  printf("toFP_Float_ToFloat(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void toFP_Double_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Double_ToFloat(0x1.5p5 /* 42.0 */);++  printf("toFP_Double_ToFloat(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void toFP_Integer_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Integer_ToFloat(0x000000000000002aLL);++  printf("toFP_Integer_ToFloat(0x000000000000002aLL) = %a\n", sbv_result);+}++void toFP_Real_ToFloat_driver(void)+{+  const SFloat sbv_result = toFP_Real_ToFloat(42.0L);++  printf("toFP_Real_ToFloat(42.0L) = %a\n", sbv_result);+}++void toFP_Int8_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Int8_ToDouble(42);++  printf("toFP_Int8_ToDouble(42) = %a\n", sbv_result);+}++void toFP_Int16_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Int16_ToDouble(0x002a);++  printf("toFP_Int16_ToDouble(0x002a) = %a\n", sbv_result);+}++void toFP_Int32_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Int32_ToDouble(0x0000002aL);++  printf("toFP_Int32_ToDouble(0x0000002aL) = %a\n", sbv_result);+}++void toFP_Int64_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Int64_ToDouble(0x000000000000002aLL);++  printf("toFP_Int64_ToDouble(0x000000000000002aLL) = %a\n", sbv_result);+}++void toFP_Word8_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Word8_ToDouble(42);++  printf("toFP_Word8_ToDouble(42) = %a\n", sbv_result);+}++void toFP_Word16_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Word16_ToDouble(0x002aU);++  printf("toFP_Word16_ToDouble(0x002aU) = %a\n", sbv_result);+}++void toFP_Word32_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Word32_ToDouble(0x0000002aUL);++  printf("toFP_Word32_ToDouble(0x0000002aUL) = %a\n", sbv_result);+}++void toFP_Word64_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Word64_ToDouble(0x000000000000002aULL);++  printf("toFP_Word64_ToDouble(0x000000000000002aULL) = %a\n", sbv_result);+}++void toFP_Float_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Float_ToDouble(0x1.5p5F /* 42.0F */);++  printf("toFP_Float_ToDouble(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void toFP_Double_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Double_ToDouble(0x1.5p5 /* 42.0 */);++  printf("toFP_Double_ToDouble(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void toFP_Integer_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Integer_ToDouble(0x000000000000002aLL);++  printf("toFP_Integer_ToDouble(0x000000000000002aLL) = %a\n", sbv_result);+}++void toFP_Real_ToDouble_driver(void)+{+  const SDouble sbv_result = toFP_Real_ToDouble(42.0L);++  printf("toFP_Real_ToDouble(42.0L) = %a\n", sbv_result);+}++void fromFP_Float_ToInt8_driver(void)+{+  const SInt8 sbv_result = fromFP_Float_ToInt8(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToInt8(0x1.5p5F /* 42.0F */) = %"PRId8"\n", sbv_result);+}++void fromFP_Float_ToInt16_driver(void)+{+  const SInt16 sbv_result = fromFP_Float_ToInt16(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToInt16(0x1.5p5F /* 42.0F */) = %"PRId16"\n", sbv_result);+}++void fromFP_Float_ToInt32_driver(void)+{+  const SInt32 sbv_result = fromFP_Float_ToInt32(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToInt32(0x1.5p5F /* 42.0F */) = %"PRId32"L\n", sbv_result);+}++void fromFP_Float_ToInt64_driver(void)+{+  const SInt64 sbv_result = fromFP_Float_ToInt64(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToInt64(0x1.5p5F /* 42.0F */) = %"PRId64"LL\n", sbv_result);+}++void fromFP_Float_ToWord8_driver(void)+{+  const SWord8 sbv_result = fromFP_Float_ToWord8(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToWord8(0x1.5p5F /* 42.0F */) = %"PRIu8"\n", sbv_result);+}++void fromFP_Float_ToWord16_driver(void)+{+  const SWord16 sbv_result = fromFP_Float_ToWord16(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToWord16(0x1.5p5F /* 42.0F */) = 0x%04"PRIx16"U\n", sbv_result);+}++void fromFP_Float_ToWord32_driver(void)+{+  const SWord32 sbv_result = fromFP_Float_ToWord32(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToWord32(0x1.5p5F /* 42.0F */) = 0x%08"PRIx32"UL\n", sbv_result);+}++void fromFP_Float_ToWord64_driver(void)+{+  const SWord64 sbv_result = fromFP_Float_ToWord64(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToWord64(0x1.5p5F /* 42.0F */) = 0x%016"PRIx64"ULL\n", sbv_result);+}++void fromFP_Float_ToFloat_driver(void)+{+  const SFloat sbv_result = fromFP_Float_ToFloat(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToFloat(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void fromFP_Float_ToDouble_driver(void)+{+  const SDouble sbv_result = fromFP_Float_ToDouble(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToDouble(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void fromFP_Float_ToInteger_driver(void)+{+  const SInteger sbv_result = fromFP_Float_ToInteger(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToInteger(0x1.5p5F /* 42.0F */) = %"PRId64"LL\n", sbv_result);+}++void fromFP_Float_ToReal_driver(void)+{+  const SReal sbv_result = fromFP_Float_ToReal(0x1.5p5F /* 42.0F */);++  printf("fromFP_Float_ToReal(0x1.5p5F /* 42.0F */) = %Lf\n", sbv_result);+}++void fromFP_DoubleTo_Int8_driver(void)+{+  const SInt8 sbv_result = fromFP_DoubleTo_Int8(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Int8(0x1.5p5 /* 42.0 */) = %"PRId8"\n", sbv_result);+}++void fromFP_DoubleTo_Int16_driver(void)+{+  const SInt16 sbv_result = fromFP_DoubleTo_Int16(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Int16(0x1.5p5 /* 42.0 */) = %"PRId16"\n", sbv_result);+}++void fromFP_DoubleTo_Int32_driver(void)+{+  const SInt32 sbv_result = fromFP_DoubleTo_Int32(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Int32(0x1.5p5 /* 42.0 */) = %"PRId32"L\n", sbv_result);+}++void fromFP_DoubleTo_Int64_driver(void)+{+  const SInt64 sbv_result = fromFP_DoubleTo_Int64(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Int64(0x1.5p5 /* 42.0 */) = %"PRId64"LL\n", sbv_result);+}++void fromFP_DoubleTo_Word8_driver(void)+{+  const SWord8 sbv_result = fromFP_DoubleTo_Word8(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Word8(0x1.5p5 /* 42.0 */) = %"PRIu8"\n", sbv_result);+}++void fromFP_DoubleTo_Word16_driver(void)+{+  const SWord16 sbv_result = fromFP_DoubleTo_Word16(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Word16(0x1.5p5 /* 42.0 */) = 0x%04"PRIx16"U\n", sbv_result);+}++void fromFP_DoubleTo_Word32_driver(void)+{+  const SWord32 sbv_result = fromFP_DoubleTo_Word32(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Word32(0x1.5p5 /* 42.0 */) = 0x%08"PRIx32"UL\n", sbv_result);+}++void fromFP_DoubleTo_Word64_driver(void)+{+  const SWord64 sbv_result = fromFP_DoubleTo_Word64(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Word64(0x1.5p5 /* 42.0 */) = 0x%016"PRIx64"ULL\n", sbv_result);+}++void fromFP_DoubleTo_Float_driver(void)+{+  const SFloat sbv_result = fromFP_DoubleTo_Float(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Float(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void fromFP_DoubleTo_Double_driver(void)+{+  const SDouble sbv_result = fromFP_DoubleTo_Double(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Double(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void fromFP_DoubleTo_Integer_driver(void)+{+  const SInteger sbv_result = fromFP_DoubleTo_Integer(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Integer(0x1.5p5 /* 42.0 */) = %"PRId64"LL\n", sbv_result);+}++void fromFP_DoubleTo_Real_driver(void)+{+  const SReal sbv_result = fromFP_DoubleTo_Real(0x1.5p5 /* 42.0 */);++  printf("fromFP_DoubleTo_Real(0x1.5p5 /* 42.0 */) = %Lf\n", sbv_result);+}++void fromFP_SWord32_SFloat_driver(void)+{+  const SFloat sbv_result = fromFP_SWord32_SFloat(0x0000002aUL);++  printf("fromFP_SWord32_SFloat(0x0000002aUL) = %a\n", sbv_result);+}++void fromFP_SWord64_SDouble_driver(void)+{+  const SDouble sbv_result = fromFP_SWord64_SDouble(0x000000000000002aULL);++  printf("fromFP_SWord64_SDouble(0x000000000000002aULL) = %a\n", sbv_result);+}++void fromFP_SFloat_SWord32_driver(void)+{+  const SWord32 sbv_result = fromFP_SFloat_SWord32(0x1.5p5F /* 42.0F */);++  printf("fromFP_SFloat_SWord32(0x1.5p5F /* 42.0F */) = 0x%08"PRIx32"UL\n", sbv_result);+}++void fromFP_SDouble_SWord64_driver(void)+{+  const SWord64 sbv_result = fromFP_SDouble_SWord64(0x1.5p5 /* 42.0 */);++  printf("fromFP_SDouble_SWord64(0x1.5p5 /* 42.0 */) = 0x%016"PRIx64"ULL\n", sbv_result);+}++void f_FP_Abs_driver(void)+{+  const SFloat sbv_result = f_FP_Abs(0x1.5p5F /* 42.0F */);++  printf("f_FP_Abs(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void d_FP_Abs_driver(void)+{+  const SDouble sbv_result = d_FP_Abs(0x1.5p5 /* 42.0 */);++  printf("d_FP_Abs(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void f_FP_Neg_driver(void)+{+  const SFloat sbv_result = f_FP_Neg(0x1.5p5F /* 42.0F */);++  printf("f_FP_Neg(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void d_FP_Neg_driver(void)+{+  const SDouble sbv_result = d_FP_Neg(0x1.5p5 /* 42.0 */);++  printf("d_FP_Neg(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void f_FP_Add_driver(void)+{+  const SFloat sbv_result = f_FP_Add(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Add(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Add_driver(void)+{+  const SDouble sbv_result = d_FP_Add(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Add(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_Sub_driver(void)+{+  const SFloat sbv_result = f_FP_Sub(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Sub(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Sub_driver(void)+{+  const SDouble sbv_result = d_FP_Sub(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Sub(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_Mul_driver(void)+{+  const SFloat sbv_result = f_FP_Mul(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Mul(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Mul_driver(void)+{+  const SDouble sbv_result = d_FP_Mul(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Mul(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_Div_driver(void)+{+  const SFloat sbv_result = f_FP_Div(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Div(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Div_driver(void)+{+  const SDouble sbv_result = d_FP_Div(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Div(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_FMA_driver(void)+{+  const SFloat sbv_result = f_FP_FMA(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */, 0x1.6p5F /* 44.0F */);++  printf("f_FP_FMA(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */, 0x1.6p5F /* 44.0F */) = %a\n", sbv_result);+}++void d_FP_FMA_driver(void)+{+  const SDouble sbv_result = d_FP_FMA(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */, 0x1.6p5 /* 44.0 */);++  printf("d_FP_FMA(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */, 0x1.6p5 /* 44.0 */) = %a\n", sbv_result);+}++void f_FP_Sqrt_driver(void)+{+  const SFloat sbv_result = f_FP_Sqrt(0x1.5p5F /* 42.0F */);++  printf("f_FP_Sqrt(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void d_FP_Sqrt_driver(void)+{+  const SDouble sbv_result = d_FP_Sqrt(0x1.5p5 /* 42.0 */);++  printf("d_FP_Sqrt(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void f_FP_Rem_driver(void)+{+  const SFloat sbv_result = f_FP_Rem(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Rem(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Rem_driver(void)+{+  const SDouble sbv_result = d_FP_Rem(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Rem(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_RoundToIntegral_driver(void)+{+  const SFloat sbv_result = f_FP_RoundToIntegral(0x1.5p5F /* 42.0F */);++  printf("f_FP_RoundToIntegral(0x1.5p5F /* 42.0F */) = %a\n", sbv_result);+}++void d_FP_RoundToIntegral_driver(void)+{+  const SDouble sbv_result = d_FP_RoundToIntegral(0x1.5p5 /* 42.0 */);++  printf("d_FP_RoundToIntegral(0x1.5p5 /* 42.0 */) = %a\n", sbv_result);+}++void f_FP_Min_driver(void)+{+  const SFloat sbv_result = f_FP_Min(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Min(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Min_driver(void)+{+  const SDouble sbv_result = d_FP_Min(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Min(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_Max_driver(void)+{+  const SFloat sbv_result = f_FP_Max(0x1.5p5F /* 42.0F */,+                                     0x1.58p5F /* 43.0F */);++  printf("f_FP_Max(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %a\n", sbv_result);+}++void d_FP_Max_driver(void)+{+  const SDouble sbv_result = d_FP_Max(0x1.5p5 /* 42.0 */,+                                      0x1.58p5 /* 43.0 */);++  printf("d_FP_Max(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %a\n", sbv_result);+}++void f_FP_IsEqualObject_driver(void)+{+  const SBool sbv_result = f_FP_IsEqualObject(0x1.5p5F /* 42.0F */,+                                              0x1.58p5F /* 43.0F */);++  printf("f_FP_IsEqualObject(0x1.5p5F /* 42.0F */, 0x1.58p5F /* 43.0F */) = %d\n", sbv_result);+}++void d_FP_IsEqualObject_driver(void)+{+  const SBool sbv_result = d_FP_IsEqualObject(0x1.5p5 /* 42.0 */,+                                              0x1.58p5 /* 43.0 */);++  printf("d_FP_IsEqualObject(0x1.5p5 /* 42.0 */, 0x1.58p5 /* 43.0 */) = %d\n", sbv_result);+}++void f_FP_IsNormal_driver(void)+{+  const SBool sbv_result = f_FP_IsNormal(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsNormal(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsNormal_driver(void)+{+  const SBool sbv_result = d_FP_IsNormal(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsNormal(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsZero_driver(void)+{+  const SBool sbv_result = f_FP_IsZero(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsZero(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsZero_driver(void)+{+  const SBool sbv_result = d_FP_IsZero(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsZero(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsSubnormal_driver(void)+{+  const SBool sbv_result = f_FP_IsSubnormal(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsSubnormal(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsSubnormal_driver(void)+{+  const SBool sbv_result = d_FP_IsSubnormal(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsSubnormal(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsInfinite_driver(void)+{+  const SBool sbv_result = f_FP_IsInfinite(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsInfinite(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsInfinite_driver(void)+{+  const SBool sbv_result = d_FP_IsInfinite(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsInfinite(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsNaN_driver(void)+{+  const SBool sbv_result = f_FP_IsNaN(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsNaN(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsNaN_driver(void)+{+  const SBool sbv_result = d_FP_IsNaN(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsNaN(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsNegative_driver(void)+{+  const SBool sbv_result = f_FP_IsNegative(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsNegative(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsNegative_driver(void)+{+  const SBool sbv_result = d_FP_IsNegative(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsNegative(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++void f_FP_IsPositive_driver(void)+{+  const SBool sbv_result = f_FP_IsPositive(0x1.5p5F /* 42.0F */);++  printf("f_FP_IsPositive(0x1.5p5F /* 42.0F */) = %d\n", sbv_result);+}++void d_FP_IsPositive_driver(void)+{+  const SBool sbv_result = d_FP_IsPositive(0x1.5p5 /* 42.0 */);++  printf("d_FP_IsPositive(0x1.5p5 /* 42.0 */) = %d\n", sbv_result);+}++int main(void)+{+  printf("====================================\n");+  printf("** Driver run for toFP_Int8_ToFloat:\n");+  printf("====================================\n");+  toFP_Int8_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Int16_ToFloat:\n");+  printf("=====================================\n");+  toFP_Int16_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Int32_ToFloat:\n");+  printf("=====================================\n");+  toFP_Int32_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Int64_ToFloat:\n");+  printf("=====================================\n");+  toFP_Int64_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Word8_ToFloat:\n");+  printf("=====================================\n");+  toFP_Word8_ToFloat_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Word16_ToFloat:\n");+  printf("======================================\n");+  toFP_Word16_ToFloat_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Word32_ToFloat:\n");+  printf("======================================\n");+  toFP_Word32_ToFloat_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Word64_ToFloat:\n");+  printf("======================================\n");+  toFP_Word64_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Float_ToFloat:\n");+  printf("=====================================\n");+  toFP_Float_ToFloat_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Double_ToFloat:\n");+  printf("======================================\n");+  toFP_Double_ToFloat_driver();++  printf("=======================================\n");+  printf("** Driver run for toFP_Integer_ToFloat:\n");+  printf("=======================================\n");+  toFP_Integer_ToFloat_driver();++  printf("====================================\n");+  printf("** Driver run for toFP_Real_ToFloat:\n");+  printf("====================================\n");+  toFP_Real_ToFloat_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Int8_ToDouble:\n");+  printf("=====================================\n");+  toFP_Int8_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Int16_ToDouble:\n");+  printf("======================================\n");+  toFP_Int16_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Int32_ToDouble:\n");+  printf("======================================\n");+  toFP_Int32_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Int64_ToDouble:\n");+  printf("======================================\n");+  toFP_Int64_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Word8_ToDouble:\n");+  printf("======================================\n");+  toFP_Word8_ToDouble_driver();++  printf("=======================================\n");+  printf("** Driver run for toFP_Word16_ToDouble:\n");+  printf("=======================================\n");+  toFP_Word16_ToDouble_driver();++  printf("=======================================\n");+  printf("** Driver run for toFP_Word32_ToDouble:\n");+  printf("=======================================\n");+  toFP_Word32_ToDouble_driver();++  printf("=======================================\n");+  printf("** Driver run for toFP_Word64_ToDouble:\n");+  printf("=======================================\n");+  toFP_Word64_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for toFP_Float_ToDouble:\n");+  printf("======================================\n");+  toFP_Float_ToDouble_driver();++  printf("=======================================\n");+  printf("** Driver run for toFP_Double_ToDouble:\n");+  printf("=======================================\n");+  toFP_Double_ToDouble_driver();++  printf("========================================\n");+  printf("** Driver run for toFP_Integer_ToDouble:\n");+  printf("========================================\n");+  toFP_Integer_ToDouble_driver();++  printf("=====================================\n");+  printf("** Driver run for toFP_Real_ToDouble:\n");+  printf("=====================================\n");+  toFP_Real_ToDouble_driver();++  printf("======================================\n");+  printf("** Driver run for fromFP_Float_ToInt8:\n");+  printf("======================================\n");+  fromFP_Float_ToInt8_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_Float_ToInt16:\n");+  printf("=======================================\n");+  fromFP_Float_ToInt16_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_Float_ToInt32:\n");+  printf("=======================================\n");+  fromFP_Float_ToInt32_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_Float_ToInt64:\n");+  printf("=======================================\n");+  fromFP_Float_ToInt64_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_Float_ToWord8:\n");+  printf("=======================================\n");+  fromFP_Float_ToWord8_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_Float_ToWord16:\n");+  printf("========================================\n");+  fromFP_Float_ToWord16_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_Float_ToWord32:\n");+  printf("========================================\n");+  fromFP_Float_ToWord32_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_Float_ToWord64:\n");+  printf("========================================\n");+  fromFP_Float_ToWord64_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_Float_ToFloat:\n");+  printf("=======================================\n");+  fromFP_Float_ToFloat_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_Float_ToDouble:\n");+  printf("========================================\n");+  fromFP_Float_ToDouble_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_Float_ToInteger:\n");+  printf("=========================================\n");+  fromFP_Float_ToInteger_driver();++  printf("======================================\n");+  printf("** Driver run for fromFP_Float_ToReal:\n");+  printf("======================================\n");+  fromFP_Float_ToReal_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_DoubleTo_Int8:\n");+  printf("=======================================\n");+  fromFP_DoubleTo_Int8_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Int16:\n");+  printf("========================================\n");+  fromFP_DoubleTo_Int16_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Int32:\n");+  printf("========================================\n");+  fromFP_DoubleTo_Int32_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Int64:\n");+  printf("========================================\n");+  fromFP_DoubleTo_Int64_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Word8:\n");+  printf("========================================\n");+  fromFP_DoubleTo_Word8_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Word16:\n");+  printf("=========================================\n");+  fromFP_DoubleTo_Word16_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Word32:\n");+  printf("=========================================\n");+  fromFP_DoubleTo_Word32_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Word64:\n");+  printf("=========================================\n");+  fromFP_DoubleTo_Word64_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Float:\n");+  printf("========================================\n");+  fromFP_DoubleTo_Float_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Double:\n");+  printf("=========================================\n");+  fromFP_DoubleTo_Double_driver();++  printf("==========================================\n");+  printf("** Driver run for fromFP_DoubleTo_Integer:\n");+  printf("==========================================\n");+  fromFP_DoubleTo_Integer_driver();++  printf("=======================================\n");+  printf("** Driver run for fromFP_DoubleTo_Real:\n");+  printf("=======================================\n");+  fromFP_DoubleTo_Real_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_SWord32_SFloat:\n");+  printf("========================================\n");+  fromFP_SWord32_SFloat_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_SWord64_SDouble:\n");+  printf("=========================================\n");+  fromFP_SWord64_SDouble_driver();++  printf("========================================\n");+  printf("** Driver run for fromFP_SFloat_SWord32:\n");+  printf("========================================\n");+  fromFP_SFloat_SWord32_driver();++  printf("=========================================\n");+  printf("** Driver run for fromFP_SDouble_SWord64:\n");+  printf("=========================================\n");+  fromFP_SDouble_SWord64_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Abs:\n");+  printf("===========================\n");+  f_FP_Abs_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Abs:\n");+  printf("===========================\n");+  d_FP_Abs_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Neg:\n");+  printf("===========================\n");+  f_FP_Neg_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Neg:\n");+  printf("===========================\n");+  d_FP_Neg_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Add:\n");+  printf("===========================\n");+  f_FP_Add_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Add:\n");+  printf("===========================\n");+  d_FP_Add_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Sub:\n");+  printf("===========================\n");+  f_FP_Sub_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Sub:\n");+  printf("===========================\n");+  d_FP_Sub_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Mul:\n");+  printf("===========================\n");+  f_FP_Mul_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Mul:\n");+  printf("===========================\n");+  d_FP_Mul_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Div:\n");+  printf("===========================\n");+  f_FP_Div_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Div:\n");+  printf("===========================\n");+  d_FP_Div_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_FMA:\n");+  printf("===========================\n");+  f_FP_FMA_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_FMA:\n");+  printf("===========================\n");+  d_FP_FMA_driver();++  printf("============================\n");+  printf("** Driver run for f_FP_Sqrt:\n");+  printf("============================\n");+  f_FP_Sqrt_driver();++  printf("============================\n");+  printf("** Driver run for d_FP_Sqrt:\n");+  printf("============================\n");+  d_FP_Sqrt_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Rem:\n");+  printf("===========================\n");+  f_FP_Rem_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Rem:\n");+  printf("===========================\n");+  d_FP_Rem_driver();++  printf("=======================================\n");+  printf("** Driver run for f_FP_RoundToIntegral:\n");+  printf("=======================================\n");+  f_FP_RoundToIntegral_driver();++  printf("=======================================\n");+  printf("** Driver run for d_FP_RoundToIntegral:\n");+  printf("=======================================\n");+  d_FP_RoundToIntegral_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Min:\n");+  printf("===========================\n");+  f_FP_Min_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Min:\n");+  printf("===========================\n");+  d_FP_Min_driver();++  printf("===========================\n");+  printf("** Driver run for f_FP_Max:\n");+  printf("===========================\n");+  f_FP_Max_driver();++  printf("===========================\n");+  printf("** Driver run for d_FP_Max:\n");+  printf("===========================\n");+  d_FP_Max_driver();++  printf("=====================================\n");+  printf("** Driver run for f_FP_IsEqualObject:\n");+  printf("=====================================\n");+  f_FP_IsEqualObject_driver();++  printf("=====================================\n");+  printf("** Driver run for d_FP_IsEqualObject:\n");+  printf("=====================================\n");+  d_FP_IsEqualObject_driver();++  printf("================================\n");+  printf("** Driver run for f_FP_IsNormal:\n");+  printf("================================\n");+  f_FP_IsNormal_driver();++  printf("================================\n");+  printf("** Driver run for d_FP_IsNormal:\n");+  printf("================================\n");+  d_FP_IsNormal_driver();++  printf("==============================\n");+  printf("** Driver run for f_FP_IsZero:\n");+  printf("==============================\n");+  f_FP_IsZero_driver();++  printf("==============================\n");+  printf("** Driver run for d_FP_IsZero:\n");+  printf("==============================\n");+  d_FP_IsZero_driver();++  printf("===================================\n");+  printf("** Driver run for f_FP_IsSubnormal:\n");+  printf("===================================\n");+  f_FP_IsSubnormal_driver();++  printf("===================================\n");+  printf("** Driver run for d_FP_IsSubnormal:\n");+  printf("===================================\n");+  d_FP_IsSubnormal_driver();++  printf("==================================\n");+  printf("** Driver run for f_FP_IsInfinite:\n");+  printf("==================================\n");+  f_FP_IsInfinite_driver();++  printf("==================================\n");+  printf("** Driver run for d_FP_IsInfinite:\n");+  printf("==================================\n");+  d_FP_IsInfinite_driver();++  printf("=============================\n");+  printf("** Driver run for f_FP_IsNaN:\n");+  printf("=============================\n");+  f_FP_IsNaN_driver();++  printf("=============================\n");+  printf("** Driver run for d_FP_IsNaN:\n");+  printf("=============================\n");+  d_FP_IsNaN_driver();++  printf("==================================\n");+  printf("** Driver run for f_FP_IsNegative:\n");+  printf("==================================\n");+  f_FP_IsNegative_driver();++  printf("==================================\n");+  printf("** Driver run for d_FP_IsNegative:\n");+  printf("==================================\n");+  d_FP_IsNegative_driver();++  printf("==================================\n");+  printf("** Driver run for f_FP_IsPositive:\n");+  printf("==================================\n");+  f_FP_IsPositive_driver();++  printf("==================================\n");+  printf("** Driver run for d_FP_IsPositive:\n");+  printf("==================================\n");+  d_FP_IsPositive_driver();++  return 0;+}+== END: "floatCodeGen_driver.c" ==================+== BEGIN: "Makefile" ================+# Makefile for floatCodeGen. Automatically generated by SBV. Do not edit!++# include any user-defined .mk file in the current directory.+-include *.mk++CC?=gcc+CCFLAGS?=-Wall -O3 -DNDEBUG -fomit-frame-pointer+SBV_LIBS?=-lm -lbf+AR?=ar+ARFLAGS?=cr++all: floatCodeGen.a floatCodeGen_driver++floatCodeGen.a: toFP_Int8_ToFloat.o toFP_Int16_ToFloat.o toFP_Int32_ToFloat.o toFP_Int64_ToFloat.o toFP_Word8_ToFloat.o toFP_Word16_ToFloat.o toFP_Word32_ToFloat.o toFP_Word64_ToFloat.o toFP_Float_ToFloat.o toFP_Double_ToFloat.o toFP_Integer_ToFloat.o toFP_Real_ToFloat.o toFP_Int8_ToDouble.o toFP_Int16_ToDouble.o toFP_Int32_ToDouble.o toFP_Int64_ToDouble.o toFP_Word8_ToDouble.o toFP_Word16_ToDouble.o toFP_Word32_ToDouble.o toFP_Word64_ToDouble.o toFP_Float_ToDouble.o toFP_Double_ToDouble.o toFP_Integer_ToDouble.o toFP_Real_ToDouble.o fromFP_Float_ToInt8.o fromFP_Float_ToInt16.o fromFP_Float_ToInt32.o fromFP_Float_ToInt64.o fromFP_Float_ToWord8.o fromFP_Float_ToWord16.o fromFP_Float_ToWord32.o fromFP_Float_ToWord64.o fromFP_Float_ToFloat.o fromFP_Float_ToDouble.o fromFP_Float_ToInteger.o fromFP_Float_ToReal.o fromFP_DoubleTo_Int8.o fromFP_DoubleTo_Int16.o fromFP_DoubleTo_Int32.o fromFP_DoubleTo_Int64.o fromFP_DoubleTo_Word8.o fromFP_DoubleTo_Word16.o fromFP_DoubleTo_Word32.o fromFP_DoubleTo_Word64.o fromFP_DoubleTo_Float.o fromFP_DoubleTo_Double.o fromFP_DoubleTo_Integer.o fromFP_DoubleTo_Real.o fromFP_SWord32_SFloat.o fromFP_SWord64_SDouble.o fromFP_SFloat_SWord32.o fromFP_SDouble_SWord64.o f_FP_Abs.o d_FP_Abs.o f_FP_Neg.o d_FP_Neg.o f_FP_Add.o d_FP_Add.o f_FP_Sub.o d_FP_Sub.o f_FP_Mul.o d_FP_Mul.o f_FP_Div.o d_FP_Div.o f_FP_FMA.o d_FP_FMA.o f_FP_Sqrt.o d_FP_Sqrt.o f_FP_Rem.o d_FP_Rem.o f_FP_RoundToIntegral.o d_FP_RoundToIntegral.o f_FP_Min.o d_FP_Min.o f_FP_Max.o d_FP_Max.o f_FP_IsEqualObject.o d_FP_IsEqualObject.o f_FP_IsNormal.o d_FP_IsNormal.o f_FP_IsZero.o d_FP_IsZero.o f_FP_IsSubnormal.o d_FP_IsSubnormal.o f_FP_IsInfinite.o d_FP_IsInfinite.o f_FP_IsNaN.o d_FP_IsNaN.o f_FP_IsNegative.o d_FP_IsNegative.o f_FP_IsPositive.o d_FP_IsPositive.o+	rm -f $@.tmp+	${AR} ${ARFLAGS} $@.tmp $^+	mv -f $@.tmp $@++floatCodeGen_driver: floatCodeGen_driver.c floatCodeGen.h floatCodeGen.a+	${CC} ${CCFLAGS} -ffp-contract=off $< -o $@ floatCodeGen.a ${LDFLAGS} ${SBV_LIBS}++toFP_Int8_ToFloat.o: toFP_Int8_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int16_ToFloat.o: toFP_Int16_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int32_ToFloat.o: toFP_Int32_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int64_ToFloat.o: toFP_Int64_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word8_ToFloat.o: toFP_Word8_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word16_ToFloat.o: toFP_Word16_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word32_ToFloat.o: toFP_Word32_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word64_ToFloat.o: toFP_Word64_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Float_ToFloat.o: toFP_Float_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Double_ToFloat.o: toFP_Double_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Integer_ToFloat.o: toFP_Integer_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Real_ToFloat.o: toFP_Real_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int8_ToDouble.o: toFP_Int8_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int16_ToDouble.o: toFP_Int16_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int32_ToDouble.o: toFP_Int32_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Int64_ToDouble.o: toFP_Int64_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word8_ToDouble.o: toFP_Word8_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word16_ToDouble.o: toFP_Word16_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word32_ToDouble.o: toFP_Word32_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Word64_ToDouble.o: toFP_Word64_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Float_ToDouble.o: toFP_Float_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Double_ToDouble.o: toFP_Double_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Integer_ToDouble.o: toFP_Integer_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++toFP_Real_ToDouble.o: toFP_Real_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToInt8.o: fromFP_Float_ToInt8.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToInt16.o: fromFP_Float_ToInt16.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToInt32.o: fromFP_Float_ToInt32.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToInt64.o: fromFP_Float_ToInt64.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToWord8.o: fromFP_Float_ToWord8.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToWord16.o: fromFP_Float_ToWord16.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToWord32.o: fromFP_Float_ToWord32.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToWord64.o: fromFP_Float_ToWord64.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToFloat.o: fromFP_Float_ToFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToDouble.o: fromFP_Float_ToDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToInteger.o: fromFP_Float_ToInteger.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_Float_ToReal.o: fromFP_Float_ToReal.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Int8.o: fromFP_DoubleTo_Int8.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Int16.o: fromFP_DoubleTo_Int16.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Int32.o: fromFP_DoubleTo_Int32.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Int64.o: fromFP_DoubleTo_Int64.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Word8.o: fromFP_DoubleTo_Word8.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Word16.o: fromFP_DoubleTo_Word16.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Word32.o: fromFP_DoubleTo_Word32.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Word64.o: fromFP_DoubleTo_Word64.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Float.o: fromFP_DoubleTo_Float.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Double.o: fromFP_DoubleTo_Double.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Integer.o: fromFP_DoubleTo_Integer.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_DoubleTo_Real.o: fromFP_DoubleTo_Real.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_SWord32_SFloat.o: fromFP_SWord32_SFloat.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_SWord64_SDouble.o: fromFP_SWord64_SDouble.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_SFloat_SWord32.o: fromFP_SFloat_SWord32.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++fromFP_SDouble_SWord64.o: fromFP_SDouble_SWord64.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Abs.o: f_FP_Abs.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Abs.o: d_FP_Abs.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Neg.o: f_FP_Neg.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Neg.o: d_FP_Neg.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Add.o: f_FP_Add.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Add.o: d_FP_Add.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Sub.o: f_FP_Sub.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Sub.o: d_FP_Sub.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Mul.o: f_FP_Mul.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Mul.o: d_FP_Mul.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Div.o: f_FP_Div.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Div.o: d_FP_Div.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_FMA.o: f_FP_FMA.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_FMA.o: d_FP_FMA.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Sqrt.o: f_FP_Sqrt.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Sqrt.o: d_FP_Sqrt.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Rem.o: f_FP_Rem.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Rem.o: d_FP_Rem.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_RoundToIntegral.o: f_FP_RoundToIntegral.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_RoundToIntegral.o: d_FP_RoundToIntegral.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Min.o: f_FP_Min.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Min.o: d_FP_Min.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_Max.o: f_FP_Max.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_Max.o: d_FP_Max.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsEqualObject.o: f_FP_IsEqualObject.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsEqualObject.o: d_FP_IsEqualObject.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsNormal.o: f_FP_IsNormal.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsNormal.o: d_FP_IsNormal.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsZero.o: f_FP_IsZero.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsZero.o: d_FP_IsZero.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsSubnormal.o: f_FP_IsSubnormal.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsSubnormal.o: d_FP_IsSubnormal.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsInfinite.o: f_FP_IsInfinite.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsInfinite.o: d_FP_IsInfinite.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsNaN.o: f_FP_IsNaN.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsNaN.o: d_FP_IsNaN.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsNegative.o: f_FP_IsNegative.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsNegative.o: d_FP_IsNegative.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++f_FP_IsPositive.o: f_FP_IsPositive.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++d_FP_IsPositive.o: d_FP_IsPositive.c floatCodeGen.h+	${CC} ${CCFLAGS} -ffp-contract=off -c $< -o $@++clean:+	rm -f *.o++veryclean: clean+	rm -f floatCodeGen.a floatCodeGen_driver floatCodeGen.a.tmp == END: "Makefile" ==================
SBVTestSuite/GoldFiles/gcd.gold view
@@ -12,11 +12,11 @@ sgcd.o: sgcd.c sgcd.h 	${CC} ${CCFLAGS} -c $< -o $@ -sgcd_driver.o: sgcd_driver.c+sgcd_driver.o: sgcd_driver.c sgcd.h 	${CC} ${CCFLAGS} -c $< -o $@  sgcd_driver: sgcd.o sgcd_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "sgcd.h" ================ /* Header file for sgcd. Automatically generated by SBV. Do not edit! */ -#ifndef __sgcd__HEADER_INCLUDED__-#define __sgcd__HEADER_INCLUDED__+#ifndef SBV_GENERATED_sgcd_HEADER_INCLUDED+#define SBV_GENERATED_sgcd_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord8 sgcd(const SWord8 x, const SWord8 y); -#endif /* __sgcd__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_sgcd_HEADER_INCLUDED */ == END: "sgcd.h" ================== == BEGIN: "sgcd_driver.c" ================ /* Example driver program for sgcd. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord8 __result = sgcd(55, 154);+  const SWord8 sbv_result = sgcd(55, 154); -  printf("sgcd(55, 154) = %"PRIu8"\n", __result);+  printf("sgcd(55, 154) = %"PRIu8"\n", sbv_result);    return 0; }@@ -85,42 +93,58 @@  #include "sgcd.h" -SWord8 sgcd(const SWord8 x, const SWord8 y)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_rem(SWord8 a, SWord8 b) {-  const SWord8 s0 = x;-  const SWord8 s1 = y;+  if (b == (SWord8) 0) return a;+  return (SWord8) (a % b);+}+++SWord8 sgcd(const SWord8 sbv_input_0, const SWord8 sbv_input_1)+{+  const SWord8 s0 = sbv_input_0;+  const SWord8 s1 = sbv_input_1;   const SBool  s3 = s1 == 0;-  const SWord8 s4 = (s1 == 0) ? s0 : (s0 % s1);+  const SWord8 s4 = sbv_bv_u8_rem(s0, s1);   const SWord8 s5 = s3 ? s0 : s4;   const SBool  s6 = 0 == s5;-  const SWord8 s7 = (s5 == 0) ? s1 : (s1 % s5);+  const SWord8 s7 = sbv_bv_u8_rem(s1, s5);   const SWord8 s8 = s6 ? s1 : s7;   const SBool  s9 = 0 == s8;-  const SWord8 s10 = (s8 == 0) ? s5 : (s5 % s8);+  const SWord8 s10 = sbv_bv_u8_rem(s5, s8);   const SWord8 s11 = s9 ? s5 : s10;   const SBool  s12 = 0 == s11;-  const SWord8 s13 = (s11 == 0) ? s8 : (s8 % s11);+  const SWord8 s13 = sbv_bv_u8_rem(s8, s11);   const SWord8 s14 = s12 ? s8 : s13;   const SBool  s15 = 0 == s14;-  const SWord8 s16 = (s14 == 0) ? s11 : (s11 % s14);+  const SWord8 s16 = sbv_bv_u8_rem(s11, s14);   const SWord8 s17 = s15 ? s11 : s16;   const SBool  s18 = 0 == s17;-  const SWord8 s19 = (s17 == 0) ? s14 : (s14 % s17);+  const SWord8 s19 = sbv_bv_u8_rem(s14, s17);   const SWord8 s20 = s18 ? s14 : s19;   const SBool  s21 = 0 == s20;-  const SWord8 s22 = (s20 == 0) ? s17 : (s17 % s20);+  const SWord8 s22 = sbv_bv_u8_rem(s17, s20);   const SWord8 s23 = s21 ? s17 : s22;   const SBool  s24 = 0 == s23;-  const SWord8 s25 = (s23 == 0) ? s20 : (s20 % s23);+  const SWord8 s25 = sbv_bv_u8_rem(s20, s23);   const SWord8 s26 = s24 ? s20 : s25;   const SBool  s27 = 0 == s26;-  const SWord8 s28 = (s26 == 0) ? s23 : (s23 % s26);+  const SWord8 s28 = sbv_bv_u8_rem(s23, s26);   const SWord8 s29 = s27 ? s23 : s28;   const SBool  s30 = 0 == s29;-  const SWord8 s31 = (s29 == 0) ? s26 : (s26 % s29);+  const SWord8 s31 = sbv_bv_u8_rem(s26, s29);   const SWord8 s32 = s30 ? s26 : s31;   const SBool  s33 = 0 == s32;-  const SWord8 s34 = (s32 == 0) ? s29 : (s29 % s32);+  const SWord8 s34 = sbv_bv_u8_rem(s29, s32);   const SWord8 s35 = s33 ? s29 : s34;   const SBool  s36 = 0 == s35;   const SWord8 s37 = s36 ? s32 : s35;
SBVTestSuite/GoldFiles/legato_c.gold view
@@ -12,6414 +12,6460 @@ legatoMult.o: legatoMult.c legatoMult.h 	${CC} ${CCFLAGS} -c $< -o $@ -legatoMult_driver.o: legatoMult_driver.c-	${CC} ${CCFLAGS} -c $< -o $@--legatoMult_driver: legatoMult.o legatoMult_driver.o-	${CC} ${CCFLAGS} $^ -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f legatoMult_driver-== END: "Makefile" ==================-== BEGIN: "legatoMult.h" ================-/* Header file for legatoMult. Automatically generated by SBV. Do not edit! */--#ifndef __legatoMult__HEADER_INCLUDED__-#define __legatoMult__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* Entry point prototype: */-void legatoMult(const SWord8 x, const SWord8 y, SWord8 *hi,-                SWord8 *lo);--#endif /* __legatoMult__HEADER_INCLUDED__ */-== END: "legatoMult.h" ==================-== BEGIN: "legatoMult_driver.c" ================-/* Example driver program for legatoMult. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "legatoMult.h"--int main(void)-{-  SWord8 hi;-  SWord8 lo;--  legatoMult(87, 92, &hi, &lo);--  printf("legatoMult(87, 92, &hi, &lo) ->\n");-  printf("  hi = %"PRIu8"\n", hi);-  printf("  lo = %"PRIu8"\n", lo);--  return 0;-}-== END: "legatoMult_driver.c" ==================-== BEGIN: "legatoMult.c" ================-/* File: "legatoMult.c". Automatically generated by SBV. Do not edit! */--#include "legatoMult.h"--void legatoMult(const SWord8 x, const SWord8 y, SWord8 *hi,-                SWord8 *lo)-{-  const SWord8 s0 = x;-  const SWord8 s1 = y;-  const SBool  s2 = (SBool) (s0 & 1);-  const SBool  s4 = s2 != false;-  const SBool  s5 = !s4;-  const SWord8 s6 = (s0 >> 1) | (s0 << 7);-  const SWord8 s8 = s6 & 127;-  const SBool  s9 = (SBool) (s8 & 1);-  const SBool  s10 = false != s9;-  const SBool  s11 = !s10;-  const SWord8 s12 = (s8 >> 1) | (s8 << 7);-  const SWord8 s13 = 127 & s12;-  const SBool  s14 = (SBool) (s13 & 1);-  const SBool  s15 = false != s14;-  const SBool  s16 = !s15;-  const SWord8 s17 = (s13 >> 1) | (s13 << 7);-  const SWord8 s18 = 127 & s17;-  const SBool  s19 = (SBool) (s18 & 1);-  const SBool  s20 = false != s19;-  const SBool  s21 = !s20;-  const SWord8 s24 = s4 ? 128 : 0;-  const SBool  s25 = (SBool) (s24 & 1);-  const SBool  s26 = false != s25;-  const SWord8 s27 = s26 ? 128 : 0;-  const SBool  s28 = (SBool) (s27 & 1);-  const SBool  s29 = false != s28;-  const SWord8 s30 = (s18 >> 1) | (s18 << 7);-  const SWord8 s31 = 128 | s30;-  const SWord8 s32 = 127 & s30;-  const SWord8 s33 = s29 ? s31 : s32;-  const SBool  s34 = (SBool) (s33 & 1);-  const SBool  s35 = false != s34;-  const SBool  s36 = !s35;-  const SWord8 s37 = (s24 >> 1) | (s24 << 7);-  const SWord8 s38 = 128 | s37;-  const SWord8 s39 = 127 & s37;-  const SWord8 s40 = s10 ? s38 : s39;-  const SBool  s41 = (SBool) (s40 & 1);-  const SBool  s42 = false != s41;-  const SWord8 s43 = (s27 >> 1) | (s27 << 7);-  const SWord8 s44 = 128 | s43;-  const SWord8 s45 = 127 & s43;-  const SWord8 s46 = s42 ? s44 : s45;-  const SBool  s47 = (SBool) (s46 & 1);-  const SBool  s48 = false != s47;-  const SWord8 s49 = (s33 >> 1) | (s33 << 7);-  const SWord8 s50 = 128 | s49;-  const SWord8 s51 = 127 & s49;-  const SWord8 s52 = s48 ? s50 : s51;-  const SBool  s53 = (SBool) (s52 & 1);-  const SBool  s54 = false != s53;-  const SBool  s55 = !s54;-  const SWord8 s56 = (s40 >> 1) | (s40 << 7);-  const SWord8 s57 = 128 | s56;-  const SWord8 s58 = 127 & s56;-  const SWord8 s59 = s15 ? s57 : s58;-  const SBool  s60 = (SBool) (s59 & 1);-  const SBool  s61 = false != s60;-  const SWord8 s62 = (s46 >> 1) | (s46 << 7);-  const SWord8 s63 = 128 | s62;-  const SWord8 s64 = 127 & s62;-  const SWord8 s65 = s61 ? s63 : s64;-  const SBool  s66 = (SBool) (s65 & 1);-  const SBool  s67 = false != s66;-  const SWord8 s68 = (s52 >> 1) | (s52 << 7);-  const SWord8 s69 = 128 | s68;-  const SWord8 s70 = 127 & s68;-  const SWord8 s71 = s67 ? s69 : s70;-  const SBool  s72 = (SBool) (s71 & 1);-  const SBool  s73 = false != s72;-  const SBool  s74 = !s73;-  const SWord8 s75 = (s59 >> 1) | (s59 << 7);-  const SWord8 s76 = 128 | s75;-  const SWord8 s77 = 127 & s75;-  const SWord8 s78 = s20 ? s76 : s77;-  const SBool  s79 = (SBool) (s78 & 1);-  const SBool  s80 = false != s79;-  const SWord8 s81 = (s65 >> 1) | (s65 << 7);-  const SWord8 s82 = 128 | s81;-  const SWord8 s83 = 127 & s81;-  const SWord8 s84 = s80 ? s82 : s83;-  const SBool  s85 = (SBool) (s84 & 1);-  const SBool  s86 = false != s85;-  const SWord8 s87 = (s71 >> 1) | (s71 << 7);-  const SWord8 s88 = 128 | s87;-  const SWord8 s89 = 127 & s87;-  const SWord8 s90 = s86 ? s88 : s89;-  const SBool  s91 = (SBool) (s90 & 1);-  const SBool  s92 = false != s91;-  const SBool  s93 = !s92;-  const SWord8 s94 = (s78 >> 1) | (s78 << 7);-  const SWord8 s95 = 128 | s94;-  const SWord8 s96 = 127 & s94;-  const SWord8 s97 = s35 ? s95 : s96;-  const SWord8 s98 = (s97 >> 1) | (s97 << 7);-  const SWord8 s99 = 128 | s98;-  const SWord8 s100 = 127 & s98;-  const SWord8 s101 = s54 ? s99 : s100;-  const SWord8 s102 = (s101 >> 1) | (s101 << 7);-  const SWord8 s103 = 128 | s102;-  const SWord8 s104 = 127 & s102;-  const SWord8 s105 = s73 ? s103 : s104;-  const SWord8 s106 = (s105 >> 1) | (s105 << 7);-  const SWord8 s107 = 128 | s106;-  const SWord8 s108 = 127 & s106;-  const SWord8 s109 = s92 ? s107 : s108;-  const SWord8 s110 = s1 + s105;-  const SBool  s111 = s110 < s1;-  const SBool  s112 = s110 < s105;-  const SBool  s113 = s111 || s112;-  const SWord8 s114 = (s110 >> 1) | (s110 << 7);-  const SWord8 s115 = 128 | s114;-  const SWord8 s116 = 127 & s114;-  const SWord8 s117 = s113 ? s115 : s116;-  const SWord8 s118 = s93 ? s109 : s117;-  const SWord8 s119 = s1 + s101;-  const SBool  s120 = s119 < s1;-  const SBool  s121 = s119 < s101;-  const SBool  s122 = s120 || s121;-  const SWord8 s123 = (s119 >> 1) | (s119 << 7);-  const SWord8 s124 = 128 | s123;-  const SWord8 s125 = 127 & s123;-  const SWord8 s126 = s122 ? s124 : s125;-  const SWord8 s127 = (s126 >> 1) | (s126 << 7);-  const SWord8 s128 = 128 | s127;-  const SWord8 s129 = 127 & s127;-  const SWord8 s130 = s92 ? s128 : s129;-  const SWord8 s131 = s1 + s126;-  const SBool  s132 = s131 < s1;-  const SBool  s133 = s131 < s126;-  const SBool  s134 = s132 || s133;-  const SWord8 s135 = (s131 >> 1) | (s131 << 7);-  const SWord8 s136 = 128 | s135;-  const SWord8 s137 = 127 & s135;-  const SWord8 s138 = s134 ? s136 : s137;-  const SWord8 s139 = s93 ? s130 : s138;-  const SWord8 s140 = s74 ? s118 : s139;-  const SWord8 s141 = s1 + s97;-  const SBool  s142 = s141 < s1;-  const SBool  s143 = s141 < s97;-  const SBool  s144 = s142 || s143;-  const SWord8 s145 = (s141 >> 1) | (s141 << 7);-  const SWord8 s146 = 128 | s145;-  const SWord8 s147 = 127 & s145;-  const SWord8 s148 = s144 ? s146 : s147;-  const SWord8 s149 = (s148 >> 1) | (s148 << 7);-  const SWord8 s150 = 128 | s149;-  const SWord8 s151 = 127 & s149;-  const SWord8 s152 = s73 ? s150 : s151;-  const SWord8 s153 = (s152 >> 1) | (s152 << 7);-  const SWord8 s154 = 128 | s153;-  const SWord8 s155 = 127 & s153;-  const SWord8 s156 = s92 ? s154 : s155;-  const SWord8 s157 = s1 + s152;-  const SBool  s158 = s157 < s1;-  const SBool  s159 = s157 < s152;-  const SBool  s160 = s158 || s159;-  const SWord8 s161 = (s157 >> 1) | (s157 << 7);-  const SWord8 s162 = 128 | s161;-  const SWord8 s163 = 127 & s161;-  const SWord8 s164 = s160 ? s162 : s163;-  const SWord8 s165 = s93 ? s156 : s164;-  const SWord8 s166 = s1 + s148;-  const SBool  s167 = s166 < s1;-  const SBool  s168 = s166 < s148;-  const SBool  s169 = s167 || s168;-  const SWord8 s170 = (s166 >> 1) | (s166 << 7);-  const SWord8 s171 = 128 | s170;-  const SWord8 s172 = 127 & s170;-  const SWord8 s173 = s169 ? s171 : s172;-  const SWord8 s174 = (s173 >> 1) | (s173 << 7);-  const SWord8 s175 = 128 | s174;-  const SWord8 s176 = 127 & s174;-  const SWord8 s177 = s92 ? s175 : s176;-  const SWord8 s178 = s1 + s173;-  const SBool  s179 = s178 < s1;-  const SBool  s180 = s178 < s173;-  const SBool  s181 = s179 || s180;-  const SWord8 s182 = (s178 >> 1) | (s178 << 7);-  const SWord8 s183 = 128 | s182;-  const SWord8 s184 = 127 & s182;-  const SWord8 s185 = s181 ? s183 : s184;-  const SWord8 s186 = s93 ? s177 : s185;-  const SWord8 s187 = s74 ? s165 : s186;-  const SWord8 s188 = s55 ? s140 : s187;-  const SWord8 s189 = s1 + s78;-  const SBool  s190 = (SBool) (s189 & 1);-  const SBool  s191 = false != s190;-  const SWord8 s192 = s191 ? s82 : s83;-  const SBool  s193 = (SBool) (s192 & 1);-  const SBool  s194 = false != s193;-  const SWord8 s195 = s194 ? s88 : s89;-  const SBool  s196 = (SBool) (s195 & 1);-  const SBool  s197 = false != s196;-  const SBool  s198 = !s197;-  const SBool  s199 = s189 < s1;-  const SBool  s200 = s189 < s78;-  const SBool  s201 = s199 || s200;-  const SWord8 s202 = (s189 >> 1) | (s189 << 7);-  const SWord8 s203 = 128 | s202;-  const SWord8 s204 = 127 & s202;-  const SWord8 s205 = s201 ? s203 : s204;-  const SWord8 s206 = (s205 >> 1) | (s205 << 7);-  const SWord8 s207 = 128 | s206;-  const SWord8 s208 = 127 & s206;-  const SWord8 s209 = s54 ? s207 : s208;-  const SWord8 s210 = (s209 >> 1) | (s209 << 7);-  const SWord8 s211 = 128 | s210;-  const SWord8 s212 = 127 & s210;-  const SWord8 s213 = s73 ? s211 : s212;-  const SWord8 s214 = (s213 >> 1) | (s213 << 7);-  const SWord8 s215 = 128 | s214;-  const SWord8 s216 = 127 & s214;-  const SWord8 s217 = s197 ? s215 : s216;-  const SWord8 s218 = s1 + s213;-  const SBool  s219 = s218 < s1;-  const SBool  s220 = s218 < s213;-  const SBool  s221 = s219 || s220;-  const SWord8 s222 = (s218 >> 1) | (s218 << 7);-  const SWord8 s223 = 128 | s222;-  const SWord8 s224 = 127 & s222;-  const SWord8 s225 = s221 ? s223 : s224;-  const SWord8 s226 = s198 ? s217 : s225;-  const SWord8 s227 = s1 + s209;-  const SBool  s228 = s227 < s1;-  const SBool  s229 = s227 < s209;-  const SBool  s230 = s228 || s229;-  const SWord8 s231 = (s227 >> 1) | (s227 << 7);-  const SWord8 s232 = 128 | s231;-  const SWord8 s233 = 127 & s231;-  const SWord8 s234 = s230 ? s232 : s233;-  const SWord8 s235 = (s234 >> 1) | (s234 << 7);-  const SWord8 s236 = 128 | s235;-  const SWord8 s237 = 127 & s235;-  const SWord8 s238 = s197 ? s236 : s237;-  const SWord8 s239 = s1 + s234;-  const SBool  s240 = s239 < s1;-  const SBool  s241 = s239 < s234;-  const SBool  s242 = s240 || s241;-  const SWord8 s243 = (s239 >> 1) | (s239 << 7);-  const SWord8 s244 = 128 | s243;-  const SWord8 s245 = 127 & s243;-  const SWord8 s246 = s242 ? s244 : s245;-  const SWord8 s247 = s198 ? s238 : s246;-  const SWord8 s248 = s74 ? s226 : s247;-  const SWord8 s249 = s1 + s205;-  const SBool  s250 = s249 < s1;-  const SBool  s251 = s249 < s205;-  const SBool  s252 = s250 || s251;-  const SWord8 s253 = (s249 >> 1) | (s249 << 7);-  const SWord8 s254 = 128 | s253;-  const SWord8 s255 = 127 & s253;-  const SWord8 s256 = s252 ? s254 : s255;-  const SWord8 s257 = (s256 >> 1) | (s256 << 7);-  const SWord8 s258 = 128 | s257;-  const SWord8 s259 = 127 & s257;-  const SWord8 s260 = s73 ? s258 : s259;-  const SWord8 s261 = (s260 >> 1) | (s260 << 7);-  const SWord8 s262 = 128 | s261;-  const SWord8 s263 = 127 & s261;-  const SWord8 s264 = s197 ? s262 : s263;-  const SWord8 s265 = s1 + s260;-  const SBool  s266 = s265 < s1;-  const SBool  s267 = s265 < s260;-  const SBool  s268 = s266 || s267;-  const SWord8 s269 = (s265 >> 1) | (s265 << 7);-  const SWord8 s270 = 128 | s269;-  const SWord8 s271 = 127 & s269;-  const SWord8 s272 = s268 ? s270 : s271;-  const SWord8 s273 = s198 ? s264 : s272;-  const SWord8 s274 = s1 + s256;-  const SBool  s275 = s274 < s1;-  const SBool  s276 = s274 < s256;-  const SBool  s277 = s275 || s276;-  const SWord8 s278 = (s274 >> 1) | (s274 << 7);-  const SWord8 s279 = 128 | s278;-  const SWord8 s280 = 127 & s278;-  const SWord8 s281 = s277 ? s279 : s280;-  const SWord8 s282 = (s281 >> 1) | (s281 << 7);-  const SWord8 s283 = 128 | s282;-  const SWord8 s284 = 127 & s282;-  const SWord8 s285 = s197 ? s283 : s284;-  const SWord8 s286 = s1 + s281;-  const SBool  s287 = s286 < s1;-  const SBool  s288 = s286 < s281;-  const SBool  s289 = s287 || s288;-  const SWord8 s290 = (s286 >> 1) | (s286 << 7);-  const SWord8 s291 = 128 | s290;-  const SWord8 s292 = 127 & s290;-  const SWord8 s293 = s289 ? s291 : s292;-  const SWord8 s294 = s198 ? s285 : s293;-  const SWord8 s295 = s74 ? s273 : s294;-  const SWord8 s296 = s55 ? s248 : s295;-  const SWord8 s297 = s36 ? s188 : s296;-  const SWord8 s298 = s1 + s59;-  const SBool  s299 = (SBool) (s298 & 1);-  const SBool  s300 = false != s299;-  const SWord8 s301 = s300 ? s63 : s64;-  const SBool  s302 = (SBool) (s301 & 1);-  const SBool  s303 = false != s302;-  const SWord8 s304 = s303 ? s69 : s70;-  const SBool  s305 = (SBool) (s304 & 1);-  const SBool  s306 = false != s305;-  const SBool  s307 = !s306;-  const SBool  s308 = s298 < s1;-  const SBool  s309 = s298 < s59;-  const SBool  s310 = s308 || s309;-  const SWord8 s311 = (s298 >> 1) | (s298 << 7);-  const SWord8 s312 = 128 | s311;-  const SWord8 s313 = 127 & s311;-  const SWord8 s314 = s310 ? s312 : s313;-  const SBool  s315 = (SBool) (s314 & 1);-  const SBool  s316 = false != s315;-  const SWord8 s317 = (s301 >> 1) | (s301 << 7);-  const SWord8 s318 = 128 | s317;-  const SWord8 s319 = 127 & s317;-  const SWord8 s320 = s316 ? s318 : s319;-  const SBool  s321 = (SBool) (s320 & 1);-  const SBool  s322 = false != s321;-  const SWord8 s323 = (s304 >> 1) | (s304 << 7);-  const SWord8 s324 = 128 | s323;-  const SWord8 s325 = 127 & s323;-  const SWord8 s326 = s322 ? s324 : s325;-  const SBool  s327 = (SBool) (s326 & 1);-  const SBool  s328 = false != s327;-  const SBool  s329 = !s328;-  const SWord8 s330 = (s314 >> 1) | (s314 << 7);-  const SWord8 s331 = 128 | s330;-  const SWord8 s332 = 127 & s330;-  const SWord8 s333 = s35 ? s331 : s332;-  const SWord8 s334 = (s333 >> 1) | (s333 << 7);-  const SWord8 s335 = 128 | s334;-  const SWord8 s336 = 127 & s334;-  const SWord8 s337 = s54 ? s335 : s336;-  const SWord8 s338 = (s337 >> 1) | (s337 << 7);-  const SWord8 s339 = 128 | s338;-  const SWord8 s340 = 127 & s338;-  const SWord8 s341 = s306 ? s339 : s340;-  const SWord8 s342 = (s341 >> 1) | (s341 << 7);-  const SWord8 s343 = 128 | s342;-  const SWord8 s344 = 127 & s342;-  const SWord8 s345 = s328 ? s343 : s344;-  const SWord8 s346 = s1 + s341;-  const SBool  s347 = s346 < s1;-  const SBool  s348 = s346 < s341;-  const SBool  s349 = s347 || s348;-  const SWord8 s350 = (s346 >> 1) | (s346 << 7);-  const SWord8 s351 = 128 | s350;-  const SWord8 s352 = 127 & s350;-  const SWord8 s353 = s349 ? s351 : s352;-  const SWord8 s354 = s329 ? s345 : s353;-  const SWord8 s355 = s1 + s337;-  const SBool  s356 = s355 < s1;-  const SBool  s357 = s355 < s337;-  const SBool  s358 = s356 || s357;-  const SWord8 s359 = (s355 >> 1) | (s355 << 7);-  const SWord8 s360 = 128 | s359;-  const SWord8 s361 = 127 & s359;-  const SWord8 s362 = s358 ? s360 : s361;-  const SWord8 s363 = (s362 >> 1) | (s362 << 7);-  const SWord8 s364 = 128 | s363;-  const SWord8 s365 = 127 & s363;-  const SWord8 s366 = s328 ? s364 : s365;-  const SWord8 s367 = s1 + s362;-  const SBool  s368 = s367 < s1;-  const SBool  s369 = s367 < s362;-  const SBool  s370 = s368 || s369;-  const SWord8 s371 = (s367 >> 1) | (s367 << 7);-  const SWord8 s372 = 128 | s371;-  const SWord8 s373 = 127 & s371;-  const SWord8 s374 = s370 ? s372 : s373;-  const SWord8 s375 = s329 ? s366 : s374;-  const SWord8 s376 = s307 ? s354 : s375;-  const SWord8 s377 = s1 + s333;-  const SBool  s378 = s377 < s1;-  const SBool  s379 = s377 < s333;-  const SBool  s380 = s378 || s379;-  const SWord8 s381 = (s377 >> 1) | (s377 << 7);-  const SWord8 s382 = 128 | s381;-  const SWord8 s383 = 127 & s381;-  const SWord8 s384 = s380 ? s382 : s383;-  const SWord8 s385 = (s384 >> 1) | (s384 << 7);-  const SWord8 s386 = 128 | s385;-  const SWord8 s387 = 127 & s385;-  const SWord8 s388 = s306 ? s386 : s387;-  const SWord8 s389 = (s388 >> 1) | (s388 << 7);-  const SWord8 s390 = 128 | s389;-  const SWord8 s391 = 127 & s389;-  const SWord8 s392 = s328 ? s390 : s391;-  const SWord8 s393 = s1 + s388;-  const SBool  s394 = s393 < s1;-  const SBool  s395 = s393 < s388;-  const SBool  s396 = s394 || s395;-  const SWord8 s397 = (s393 >> 1) | (s393 << 7);-  const SWord8 s398 = 128 | s397;-  const SWord8 s399 = 127 & s397;-  const SWord8 s400 = s396 ? s398 : s399;-  const SWord8 s401 = s329 ? s392 : s400;-  const SWord8 s402 = s1 + s384;-  const SBool  s403 = s402 < s1;-  const SBool  s404 = s402 < s384;-  const SBool  s405 = s403 || s404;-  const SWord8 s406 = (s402 >> 1) | (s402 << 7);-  const SWord8 s407 = 128 | s406;-  const SWord8 s408 = 127 & s406;-  const SWord8 s409 = s405 ? s407 : s408;-  const SWord8 s410 = (s409 >> 1) | (s409 << 7);-  const SWord8 s411 = 128 | s410;-  const SWord8 s412 = 127 & s410;-  const SWord8 s413 = s328 ? s411 : s412;-  const SWord8 s414 = s1 + s409;-  const SBool  s415 = s414 < s1;-  const SBool  s416 = s414 < s409;-  const SBool  s417 = s415 || s416;-  const SWord8 s418 = (s414 >> 1) | (s414 << 7);-  const SWord8 s419 = 128 | s418;-  const SWord8 s420 = 127 & s418;-  const SWord8 s421 = s417 ? s419 : s420;-  const SWord8 s422 = s329 ? s413 : s421;-  const SWord8 s423 = s307 ? s401 : s422;-  const SWord8 s424 = s55 ? s376 : s423;-  const SWord8 s425 = s1 + s314;-  const SBool  s426 = (SBool) (s425 & 1);-  const SBool  s427 = false != s426;-  const SWord8 s428 = s427 ? s318 : s319;-  const SBool  s429 = (SBool) (s428 & 1);-  const SBool  s430 = false != s429;-  const SWord8 s431 = s430 ? s324 : s325;-  const SBool  s432 = (SBool) (s431 & 1);-  const SBool  s433 = false != s432;-  const SBool  s434 = !s433;-  const SBool  s435 = s425 < s1;-  const SBool  s436 = s425 < s314;-  const SBool  s437 = s435 || s436;-  const SWord8 s438 = (s425 >> 1) | (s425 << 7);-  const SWord8 s439 = 128 | s438;-  const SWord8 s440 = 127 & s438;-  const SWord8 s441 = s437 ? s439 : s440;-  const SWord8 s442 = (s441 >> 1) | (s441 << 7);-  const SWord8 s443 = 128 | s442;-  const SWord8 s444 = 127 & s442;-  const SWord8 s445 = s54 ? s443 : s444;-  const SWord8 s446 = (s445 >> 1) | (s445 << 7);-  const SWord8 s447 = 128 | s446;-  const SWord8 s448 = 127 & s446;-  const SWord8 s449 = s306 ? s447 : s448;-  const SWord8 s450 = (s449 >> 1) | (s449 << 7);-  const SWord8 s451 = 128 | s450;-  const SWord8 s452 = 127 & s450;-  const SWord8 s453 = s433 ? s451 : s452;-  const SWord8 s454 = s1 + s449;-  const SBool  s455 = s454 < s1;-  const SBool  s456 = s454 < s449;-  const SBool  s457 = s455 || s456;-  const SWord8 s458 = (s454 >> 1) | (s454 << 7);-  const SWord8 s459 = 128 | s458;-  const SWord8 s460 = 127 & s458;-  const SWord8 s461 = s457 ? s459 : s460;-  const SWord8 s462 = s434 ? s453 : s461;-  const SWord8 s463 = s1 + s445;-  const SBool  s464 = s463 < s1;-  const SBool  s465 = s463 < s445;-  const SBool  s466 = s464 || s465;-  const SWord8 s467 = (s463 >> 1) | (s463 << 7);-  const SWord8 s468 = 128 | s467;-  const SWord8 s469 = 127 & s467;-  const SWord8 s470 = s466 ? s468 : s469;-  const SWord8 s471 = (s470 >> 1) | (s470 << 7);-  const SWord8 s472 = 128 | s471;-  const SWord8 s473 = 127 & s471;-  const SWord8 s474 = s433 ? s472 : s473;-  const SWord8 s475 = s1 + s470;-  const SBool  s476 = s475 < s1;-  const SBool  s477 = s475 < s470;-  const SBool  s478 = s476 || s477;-  const SWord8 s479 = (s475 >> 1) | (s475 << 7);-  const SWord8 s480 = 128 | s479;-  const SWord8 s481 = 127 & s479;-  const SWord8 s482 = s478 ? s480 : s481;-  const SWord8 s483 = s434 ? s474 : s482;-  const SWord8 s484 = s307 ? s462 : s483;-  const SWord8 s485 = s1 + s441;-  const SBool  s486 = s485 < s1;-  const SBool  s487 = s485 < s441;-  const SBool  s488 = s486 || s487;-  const SWord8 s489 = (s485 >> 1) | (s485 << 7);-  const SWord8 s490 = 128 | s489;-  const SWord8 s491 = 127 & s489;-  const SWord8 s492 = s488 ? s490 : s491;-  const SWord8 s493 = (s492 >> 1) | (s492 << 7);-  const SWord8 s494 = 128 | s493;-  const SWord8 s495 = 127 & s493;-  const SWord8 s496 = s306 ? s494 : s495;-  const SWord8 s497 = (s496 >> 1) | (s496 << 7);-  const SWord8 s498 = 128 | s497;-  const SWord8 s499 = 127 & s497;-  const SWord8 s500 = s433 ? s498 : s499;-  const SWord8 s501 = s1 + s496;-  const SBool  s502 = s501 < s1;-  const SBool  s503 = s501 < s496;-  const SBool  s504 = s502 || s503;-  const SWord8 s505 = (s501 >> 1) | (s501 << 7);-  const SWord8 s506 = 128 | s505;-  const SWord8 s507 = 127 & s505;-  const SWord8 s508 = s504 ? s506 : s507;-  const SWord8 s509 = s434 ? s500 : s508;-  const SWord8 s510 = s1 + s492;-  const SBool  s511 = s510 < s1;-  const SBool  s512 = s510 < s492;-  const SBool  s513 = s511 || s512;-  const SWord8 s514 = (s510 >> 1) | (s510 << 7);-  const SWord8 s515 = 128 | s514;-  const SWord8 s516 = 127 & s514;-  const SWord8 s517 = s513 ? s515 : s516;-  const SWord8 s518 = (s517 >> 1) | (s517 << 7);-  const SWord8 s519 = 128 | s518;-  const SWord8 s520 = 127 & s518;-  const SWord8 s521 = s433 ? s519 : s520;-  const SWord8 s522 = s1 + s517;-  const SBool  s523 = s522 < s1;-  const SBool  s524 = s522 < s517;-  const SBool  s525 = s523 || s524;-  const SWord8 s526 = (s522 >> 1) | (s522 << 7);-  const SWord8 s527 = 128 | s526;-  const SWord8 s528 = 127 & s526;-  const SWord8 s529 = s525 ? s527 : s528;-  const SWord8 s530 = s434 ? s521 : s529;-  const SWord8 s531 = s307 ? s509 : s530;-  const SWord8 s532 = s55 ? s484 : s531;-  const SWord8 s533 = s36 ? s424 : s532;-  const SWord8 s534 = s21 ? s297 : s533;-  const SWord8 s535 = s1 + s40;-  const SBool  s536 = (SBool) (s535 & 1);-  const SBool  s537 = false != s536;-  const SWord8 s538 = s537 ? s44 : s45;-  const SBool  s539 = (SBool) (s538 & 1);-  const SBool  s540 = false != s539;-  const SWord8 s541 = s540 ? s50 : s51;-  const SBool  s542 = (SBool) (s541 & 1);-  const SBool  s543 = false != s542;-  const SBool  s544 = !s543;-  const SBool  s545 = s535 < s1;-  const SBool  s546 = s535 < s40;-  const SBool  s547 = s545 || s546;-  const SWord8 s548 = (s535 >> 1) | (s535 << 7);-  const SWord8 s549 = 128 | s548;-  const SWord8 s550 = 127 & s548;-  const SWord8 s551 = s547 ? s549 : s550;-  const SBool  s552 = (SBool) (s551 & 1);-  const SBool  s553 = false != s552;-  const SWord8 s554 = (s538 >> 1) | (s538 << 7);-  const SWord8 s555 = 128 | s554;-  const SWord8 s556 = 127 & s554;-  const SWord8 s557 = s553 ? s555 : s556;-  const SBool  s558 = (SBool) (s557 & 1);-  const SBool  s559 = false != s558;-  const SWord8 s560 = (s541 >> 1) | (s541 << 7);-  const SWord8 s561 = 128 | s560;-  const SWord8 s562 = 127 & s560;-  const SWord8 s563 = s559 ? s561 : s562;-  const SBool  s564 = (SBool) (s563 & 1);-  const SBool  s565 = false != s564;-  const SBool  s566 = !s565;-  const SWord8 s567 = (s551 >> 1) | (s551 << 7);-  const SWord8 s568 = 128 | s567;-  const SWord8 s569 = 127 & s567;-  const SWord8 s570 = s20 ? s568 : s569;-  const SBool  s571 = (SBool) (s570 & 1);-  const SBool  s572 = false != s571;-  const SWord8 s573 = (s557 >> 1) | (s557 << 7);-  const SWord8 s574 = 128 | s573;-  const SWord8 s575 = 127 & s573;-  const SWord8 s576 = s572 ? s574 : s575;-  const SBool  s577 = (SBool) (s576 & 1);-  const SBool  s578 = false != s577;-  const SWord8 s579 = (s563 >> 1) | (s563 << 7);-  const SWord8 s580 = 128 | s579;-  const SWord8 s581 = 127 & s579;-  const SWord8 s582 = s578 ? s580 : s581;-  const SBool  s583 = (SBool) (s582 & 1);-  const SBool  s584 = false != s583;-  const SBool  s585 = !s584;-  const SWord8 s586 = (s570 >> 1) | (s570 << 7);-  const SWord8 s587 = 128 | s586;-  const SWord8 s588 = 127 & s586;-  const SWord8 s589 = s35 ? s587 : s588;-  const SWord8 s590 = (s589 >> 1) | (s589 << 7);-  const SWord8 s591 = 128 | s590;-  const SWord8 s592 = 127 & s590;-  const SWord8 s593 = s543 ? s591 : s592;-  const SWord8 s594 = (s593 >> 1) | (s593 << 7);-  const SWord8 s595 = 128 | s594;-  const SWord8 s596 = 127 & s594;-  const SWord8 s597 = s565 ? s595 : s596;-  const SWord8 s598 = (s597 >> 1) | (s597 << 7);-  const SWord8 s599 = 128 | s598;-  const SWord8 s600 = 127 & s598;-  const SWord8 s601 = s584 ? s599 : s600;-  const SWord8 s602 = s1 + s597;-  const SBool  s603 = s602 < s1;-  const SBool  s604 = s602 < s597;-  const SBool  s605 = s603 || s604;-  const SWord8 s606 = (s602 >> 1) | (s602 << 7);-  const SWord8 s607 = 128 | s606;-  const SWord8 s608 = 127 & s606;-  const SWord8 s609 = s605 ? s607 : s608;-  const SWord8 s610 = s585 ? s601 : s609;-  const SWord8 s611 = s1 + s593;-  const SBool  s612 = s611 < s1;-  const SBool  s613 = s611 < s593;-  const SBool  s614 = s612 || s613;-  const SWord8 s615 = (s611 >> 1) | (s611 << 7);-  const SWord8 s616 = 128 | s615;-  const SWord8 s617 = 127 & s615;-  const SWord8 s618 = s614 ? s616 : s617;-  const SWord8 s619 = (s618 >> 1) | (s618 << 7);-  const SWord8 s620 = 128 | s619;-  const SWord8 s621 = 127 & s619;-  const SWord8 s622 = s584 ? s620 : s621;-  const SWord8 s623 = s1 + s618;-  const SBool  s624 = s623 < s1;-  const SBool  s625 = s623 < s618;-  const SBool  s626 = s624 || s625;-  const SWord8 s627 = (s623 >> 1) | (s623 << 7);-  const SWord8 s628 = 128 | s627;-  const SWord8 s629 = 127 & s627;-  const SWord8 s630 = s626 ? s628 : s629;-  const SWord8 s631 = s585 ? s622 : s630;-  const SWord8 s632 = s566 ? s610 : s631;-  const SWord8 s633 = s1 + s589;-  const SBool  s634 = s633 < s1;-  const SBool  s635 = s633 < s589;-  const SBool  s636 = s634 || s635;-  const SWord8 s637 = (s633 >> 1) | (s633 << 7);-  const SWord8 s638 = 128 | s637;-  const SWord8 s639 = 127 & s637;-  const SWord8 s640 = s636 ? s638 : s639;-  const SWord8 s641 = (s640 >> 1) | (s640 << 7);-  const SWord8 s642 = 128 | s641;-  const SWord8 s643 = 127 & s641;-  const SWord8 s644 = s565 ? s642 : s643;-  const SWord8 s645 = (s644 >> 1) | (s644 << 7);-  const SWord8 s646 = 128 | s645;-  const SWord8 s647 = 127 & s645;-  const SWord8 s648 = s584 ? s646 : s647;-  const SWord8 s649 = s1 + s644;-  const SBool  s650 = s649 < s1;-  const SBool  s651 = s649 < s644;-  const SBool  s652 = s650 || s651;-  const SWord8 s653 = (s649 >> 1) | (s649 << 7);-  const SWord8 s654 = 128 | s653;-  const SWord8 s655 = 127 & s653;-  const SWord8 s656 = s652 ? s654 : s655;-  const SWord8 s657 = s585 ? s648 : s656;-  const SWord8 s658 = s1 + s640;-  const SBool  s659 = s658 < s1;-  const SBool  s660 = s658 < s640;-  const SBool  s661 = s659 || s660;-  const SWord8 s662 = (s658 >> 1) | (s658 << 7);-  const SWord8 s663 = 128 | s662;-  const SWord8 s664 = 127 & s662;-  const SWord8 s665 = s661 ? s663 : s664;-  const SWord8 s666 = (s665 >> 1) | (s665 << 7);-  const SWord8 s667 = 128 | s666;-  const SWord8 s668 = 127 & s666;-  const SWord8 s669 = s584 ? s667 : s668;-  const SWord8 s670 = s1 + s665;-  const SBool  s671 = s670 < s1;-  const SBool  s672 = s670 < s665;-  const SBool  s673 = s671 || s672;-  const SWord8 s674 = (s670 >> 1) | (s670 << 7);-  const SWord8 s675 = 128 | s674;-  const SWord8 s676 = 127 & s674;-  const SWord8 s677 = s673 ? s675 : s676;-  const SWord8 s678 = s585 ? s669 : s677;-  const SWord8 s679 = s566 ? s657 : s678;-  const SWord8 s680 = s544 ? s632 : s679;-  const SWord8 s681 = s1 + s570;-  const SBool  s682 = (SBool) (s681 & 1);-  const SBool  s683 = false != s682;-  const SWord8 s684 = s683 ? s574 : s575;-  const SBool  s685 = (SBool) (s684 & 1);-  const SBool  s686 = false != s685;-  const SWord8 s687 = s686 ? s580 : s581;-  const SBool  s688 = (SBool) (s687 & 1);-  const SBool  s689 = false != s688;-  const SBool  s690 = !s689;-  const SBool  s691 = s681 < s1;-  const SBool  s692 = s681 < s570;-  const SBool  s693 = s691 || s692;-  const SWord8 s694 = (s681 >> 1) | (s681 << 7);-  const SWord8 s695 = 128 | s694;-  const SWord8 s696 = 127 & s694;-  const SWord8 s697 = s693 ? s695 : s696;-  const SWord8 s698 = (s697 >> 1) | (s697 << 7);-  const SWord8 s699 = 128 | s698;-  const SWord8 s700 = 127 & s698;-  const SWord8 s701 = s543 ? s699 : s700;-  const SWord8 s702 = (s701 >> 1) | (s701 << 7);-  const SWord8 s703 = 128 | s702;-  const SWord8 s704 = 127 & s702;-  const SWord8 s705 = s565 ? s703 : s704;-  const SWord8 s706 = (s705 >> 1) | (s705 << 7);-  const SWord8 s707 = 128 | s706;-  const SWord8 s708 = 127 & s706;-  const SWord8 s709 = s689 ? s707 : s708;-  const SWord8 s710 = s1 + s705;-  const SBool  s711 = s710 < s1;-  const SBool  s712 = s710 < s705;-  const SBool  s713 = s711 || s712;-  const SWord8 s714 = (s710 >> 1) | (s710 << 7);-  const SWord8 s715 = 128 | s714;-  const SWord8 s716 = 127 & s714;-  const SWord8 s717 = s713 ? s715 : s716;-  const SWord8 s718 = s690 ? s709 : s717;-  const SWord8 s719 = s1 + s701;-  const SBool  s720 = s719 < s1;-  const SBool  s721 = s719 < s701;-  const SBool  s722 = s720 || s721;-  const SWord8 s723 = (s719 >> 1) | (s719 << 7);-  const SWord8 s724 = 128 | s723;-  const SWord8 s725 = 127 & s723;-  const SWord8 s726 = s722 ? s724 : s725;-  const SWord8 s727 = (s726 >> 1) | (s726 << 7);-  const SWord8 s728 = 128 | s727;-  const SWord8 s729 = 127 & s727;-  const SWord8 s730 = s689 ? s728 : s729;-  const SWord8 s731 = s1 + s726;-  const SBool  s732 = s731 < s1;-  const SBool  s733 = s731 < s726;-  const SBool  s734 = s732 || s733;-  const SWord8 s735 = (s731 >> 1) | (s731 << 7);-  const SWord8 s736 = 128 | s735;-  const SWord8 s737 = 127 & s735;-  const SWord8 s738 = s734 ? s736 : s737;-  const SWord8 s739 = s690 ? s730 : s738;-  const SWord8 s740 = s566 ? s718 : s739;-  const SWord8 s741 = s1 + s697;-  const SBool  s742 = s741 < s1;-  const SBool  s743 = s741 < s697;-  const SBool  s744 = s742 || s743;-  const SWord8 s745 = (s741 >> 1) | (s741 << 7);-  const SWord8 s746 = 128 | s745;-  const SWord8 s747 = 127 & s745;-  const SWord8 s748 = s744 ? s746 : s747;-  const SWord8 s749 = (s748 >> 1) | (s748 << 7);-  const SWord8 s750 = 128 | s749;-  const SWord8 s751 = 127 & s749;-  const SWord8 s752 = s565 ? s750 : s751;-  const SWord8 s753 = (s752 >> 1) | (s752 << 7);-  const SWord8 s754 = 128 | s753;-  const SWord8 s755 = 127 & s753;-  const SWord8 s756 = s689 ? s754 : s755;-  const SWord8 s757 = s1 + s752;-  const SBool  s758 = s757 < s1;-  const SBool  s759 = s757 < s752;-  const SBool  s760 = s758 || s759;-  const SWord8 s761 = (s757 >> 1) | (s757 << 7);-  const SWord8 s762 = 128 | s761;-  const SWord8 s763 = 127 & s761;-  const SWord8 s764 = s760 ? s762 : s763;-  const SWord8 s765 = s690 ? s756 : s764;-  const SWord8 s766 = s1 + s748;-  const SBool  s767 = s766 < s1;-  const SBool  s768 = s766 < s748;-  const SBool  s769 = s767 || s768;-  const SWord8 s770 = (s766 >> 1) | (s766 << 7);-  const SWord8 s771 = 128 | s770;-  const SWord8 s772 = 127 & s770;-  const SWord8 s773 = s769 ? s771 : s772;-  const SWord8 s774 = (s773 >> 1) | (s773 << 7);-  const SWord8 s775 = 128 | s774;-  const SWord8 s776 = 127 & s774;-  const SWord8 s777 = s689 ? s775 : s776;-  const SWord8 s778 = s1 + s773;-  const SBool  s779 = s778 < s1;-  const SBool  s780 = s778 < s773;-  const SBool  s781 = s779 || s780;-  const SWord8 s782 = (s778 >> 1) | (s778 << 7);-  const SWord8 s783 = 128 | s782;-  const SWord8 s784 = 127 & s782;-  const SWord8 s785 = s781 ? s783 : s784;-  const SWord8 s786 = s690 ? s777 : s785;-  const SWord8 s787 = s566 ? s765 : s786;-  const SWord8 s788 = s544 ? s740 : s787;-  const SWord8 s789 = s36 ? s680 : s788;-  const SWord8 s790 = s1 + s551;-  const SBool  s791 = (SBool) (s790 & 1);-  const SBool  s792 = false != s791;-  const SWord8 s793 = s792 ? s555 : s556;-  const SBool  s794 = (SBool) (s793 & 1);-  const SBool  s795 = false != s794;-  const SWord8 s796 = s795 ? s561 : s562;-  const SBool  s797 = (SBool) (s796 & 1);-  const SBool  s798 = false != s797;-  const SBool  s799 = !s798;-  const SBool  s800 = s790 < s1;-  const SBool  s801 = s790 < s551;-  const SBool  s802 = s800 || s801;-  const SWord8 s803 = (s790 >> 1) | (s790 << 7);-  const SWord8 s804 = 128 | s803;-  const SWord8 s805 = 127 & s803;-  const SWord8 s806 = s802 ? s804 : s805;-  const SBool  s807 = (SBool) (s806 & 1);-  const SBool  s808 = false != s807;-  const SWord8 s809 = (s793 >> 1) | (s793 << 7);-  const SWord8 s810 = 128 | s809;-  const SWord8 s811 = 127 & s809;-  const SWord8 s812 = s808 ? s810 : s811;-  const SBool  s813 = (SBool) (s812 & 1);-  const SBool  s814 = false != s813;-  const SWord8 s815 = (s796 >> 1) | (s796 << 7);-  const SWord8 s816 = 128 | s815;-  const SWord8 s817 = 127 & s815;-  const SWord8 s818 = s814 ? s816 : s817;-  const SBool  s819 = (SBool) (s818 & 1);-  const SBool  s820 = false != s819;-  const SBool  s821 = !s820;-  const SWord8 s822 = (s806 >> 1) | (s806 << 7);-  const SWord8 s823 = 128 | s822;-  const SWord8 s824 = 127 & s822;-  const SWord8 s825 = s35 ? s823 : s824;-  const SWord8 s826 = (s825 >> 1) | (s825 << 7);-  const SWord8 s827 = 128 | s826;-  const SWord8 s828 = 127 & s826;-  const SWord8 s829 = s543 ? s827 : s828;-  const SWord8 s830 = (s829 >> 1) | (s829 << 7);-  const SWord8 s831 = 128 | s830;-  const SWord8 s832 = 127 & s830;-  const SWord8 s833 = s798 ? s831 : s832;-  const SWord8 s834 = (s833 >> 1) | (s833 << 7);-  const SWord8 s835 = 128 | s834;-  const SWord8 s836 = 127 & s834;-  const SWord8 s837 = s820 ? s835 : s836;-  const SWord8 s838 = s1 + s833;-  const SBool  s839 = s838 < s1;-  const SBool  s840 = s838 < s833;-  const SBool  s841 = s839 || s840;-  const SWord8 s842 = (s838 >> 1) | (s838 << 7);-  const SWord8 s843 = 128 | s842;-  const SWord8 s844 = 127 & s842;-  const SWord8 s845 = s841 ? s843 : s844;-  const SWord8 s846 = s821 ? s837 : s845;-  const SWord8 s847 = s1 + s829;-  const SBool  s848 = s847 < s1;-  const SBool  s849 = s847 < s829;-  const SBool  s850 = s848 || s849;-  const SWord8 s851 = (s847 >> 1) | (s847 << 7);-  const SWord8 s852 = 128 | s851;-  const SWord8 s853 = 127 & s851;-  const SWord8 s854 = s850 ? s852 : s853;-  const SWord8 s855 = (s854 >> 1) | (s854 << 7);-  const SWord8 s856 = 128 | s855;-  const SWord8 s857 = 127 & s855;-  const SWord8 s858 = s820 ? s856 : s857;-  const SWord8 s859 = s1 + s854;-  const SBool  s860 = s859 < s1;-  const SBool  s861 = s859 < s854;-  const SBool  s862 = s860 || s861;-  const SWord8 s863 = (s859 >> 1) | (s859 << 7);-  const SWord8 s864 = 128 | s863;-  const SWord8 s865 = 127 & s863;-  const SWord8 s866 = s862 ? s864 : s865;-  const SWord8 s867 = s821 ? s858 : s866;-  const SWord8 s868 = s799 ? s846 : s867;-  const SWord8 s869 = s1 + s825;-  const SBool  s870 = s869 < s1;-  const SBool  s871 = s869 < s825;-  const SBool  s872 = s870 || s871;-  const SWord8 s873 = (s869 >> 1) | (s869 << 7);-  const SWord8 s874 = 128 | s873;-  const SWord8 s875 = 127 & s873;-  const SWord8 s876 = s872 ? s874 : s875;-  const SWord8 s877 = (s876 >> 1) | (s876 << 7);-  const SWord8 s878 = 128 | s877;-  const SWord8 s879 = 127 & s877;-  const SWord8 s880 = s798 ? s878 : s879;-  const SWord8 s881 = (s880 >> 1) | (s880 << 7);-  const SWord8 s882 = 128 | s881;-  const SWord8 s883 = 127 & s881;-  const SWord8 s884 = s820 ? s882 : s883;-  const SWord8 s885 = s1 + s880;-  const SBool  s886 = s885 < s1;-  const SBool  s887 = s885 < s880;-  const SBool  s888 = s886 || s887;-  const SWord8 s889 = (s885 >> 1) | (s885 << 7);-  const SWord8 s890 = 128 | s889;-  const SWord8 s891 = 127 & s889;-  const SWord8 s892 = s888 ? s890 : s891;-  const SWord8 s893 = s821 ? s884 : s892;-  const SWord8 s894 = s1 + s876;-  const SBool  s895 = s894 < s1;-  const SBool  s896 = s894 < s876;-  const SBool  s897 = s895 || s896;-  const SWord8 s898 = (s894 >> 1) | (s894 << 7);-  const SWord8 s899 = 128 | s898;-  const SWord8 s900 = 127 & s898;-  const SWord8 s901 = s897 ? s899 : s900;-  const SWord8 s902 = (s901 >> 1) | (s901 << 7);-  const SWord8 s903 = 128 | s902;-  const SWord8 s904 = 127 & s902;-  const SWord8 s905 = s820 ? s903 : s904;-  const SWord8 s906 = s1 + s901;-  const SBool  s907 = s906 < s1;-  const SBool  s908 = s906 < s901;-  const SBool  s909 = s907 || s908;-  const SWord8 s910 = (s906 >> 1) | (s906 << 7);-  const SWord8 s911 = 128 | s910;-  const SWord8 s912 = 127 & s910;-  const SWord8 s913 = s909 ? s911 : s912;-  const SWord8 s914 = s821 ? s905 : s913;-  const SWord8 s915 = s799 ? s893 : s914;-  const SWord8 s916 = s544 ? s868 : s915;-  const SWord8 s917 = s1 + s806;-  const SBool  s918 = (SBool) (s917 & 1);-  const SBool  s919 = false != s918;-  const SWord8 s920 = s919 ? s810 : s811;-  const SBool  s921 = (SBool) (s920 & 1);-  const SBool  s922 = false != s921;-  const SWord8 s923 = s922 ? s816 : s817;-  const SBool  s924 = (SBool) (s923 & 1);-  const SBool  s925 = false != s924;-  const SBool  s926 = !s925;-  const SBool  s927 = s917 < s1;-  const SBool  s928 = s917 < s806;-  const SBool  s929 = s927 || s928;-  const SWord8 s930 = (s917 >> 1) | (s917 << 7);-  const SWord8 s931 = 128 | s930;-  const SWord8 s932 = 127 & s930;-  const SWord8 s933 = s929 ? s931 : s932;-  const SWord8 s934 = (s933 >> 1) | (s933 << 7);-  const SWord8 s935 = 128 | s934;-  const SWord8 s936 = 127 & s934;-  const SWord8 s937 = s543 ? s935 : s936;-  const SWord8 s938 = (s937 >> 1) | (s937 << 7);-  const SWord8 s939 = 128 | s938;-  const SWord8 s940 = 127 & s938;-  const SWord8 s941 = s798 ? s939 : s940;-  const SWord8 s942 = (s941 >> 1) | (s941 << 7);-  const SWord8 s943 = 128 | s942;-  const SWord8 s944 = 127 & s942;-  const SWord8 s945 = s925 ? s943 : s944;-  const SWord8 s946 = s1 + s941;-  const SBool  s947 = s946 < s1;-  const SBool  s948 = s946 < s941;-  const SBool  s949 = s947 || s948;-  const SWord8 s950 = (s946 >> 1) | (s946 << 7);-  const SWord8 s951 = 128 | s950;-  const SWord8 s952 = 127 & s950;-  const SWord8 s953 = s949 ? s951 : s952;-  const SWord8 s954 = s926 ? s945 : s953;-  const SWord8 s955 = s1 + s937;-  const SBool  s956 = s955 < s1;-  const SBool  s957 = s955 < s937;-  const SBool  s958 = s956 || s957;-  const SWord8 s959 = (s955 >> 1) | (s955 << 7);-  const SWord8 s960 = 128 | s959;-  const SWord8 s961 = 127 & s959;-  const SWord8 s962 = s958 ? s960 : s961;-  const SWord8 s963 = (s962 >> 1) | (s962 << 7);-  const SWord8 s964 = 128 | s963;-  const SWord8 s965 = 127 & s963;-  const SWord8 s966 = s925 ? s964 : s965;-  const SWord8 s967 = s1 + s962;-  const SBool  s968 = s967 < s1;-  const SBool  s969 = s967 < s962;-  const SBool  s970 = s968 || s969;-  const SWord8 s971 = (s967 >> 1) | (s967 << 7);-  const SWord8 s972 = 128 | s971;-  const SWord8 s973 = 127 & s971;-  const SWord8 s974 = s970 ? s972 : s973;-  const SWord8 s975 = s926 ? s966 : s974;-  const SWord8 s976 = s799 ? s954 : s975;-  const SWord8 s977 = s1 + s933;-  const SBool  s978 = s977 < s1;-  const SBool  s979 = s977 < s933;-  const SBool  s980 = s978 || s979;-  const SWord8 s981 = (s977 >> 1) | (s977 << 7);-  const SWord8 s982 = 128 | s981;-  const SWord8 s983 = 127 & s981;-  const SWord8 s984 = s980 ? s982 : s983;-  const SWord8 s985 = (s984 >> 1) | (s984 << 7);-  const SWord8 s986 = 128 | s985;-  const SWord8 s987 = 127 & s985;-  const SWord8 s988 = s798 ? s986 : s987;-  const SWord8 s989 = (s988 >> 1) | (s988 << 7);-  const SWord8 s990 = 128 | s989;-  const SWord8 s991 = 127 & s989;-  const SWord8 s992 = s925 ? s990 : s991;-  const SWord8 s993 = s1 + s988;-  const SBool  s994 = s993 < s1;-  const SBool  s995 = s993 < s988;-  const SBool  s996 = s994 || s995;-  const SWord8 s997 = (s993 >> 1) | (s993 << 7);-  const SWord8 s998 = 128 | s997;-  const SWord8 s999 = 127 & s997;-  const SWord8 s1000 = s996 ? s998 : s999;-  const SWord8 s1001 = s926 ? s992 : s1000;-  const SWord8 s1002 = s1 + s984;-  const SBool  s1003 = s1002 < s1;-  const SBool  s1004 = s1002 < s984;-  const SBool  s1005 = s1003 || s1004;-  const SWord8 s1006 = (s1002 >> 1) | (s1002 << 7);-  const SWord8 s1007 = 128 | s1006;-  const SWord8 s1008 = 127 & s1006;-  const SWord8 s1009 = s1005 ? s1007 : s1008;-  const SWord8 s1010 = (s1009 >> 1) | (s1009 << 7);-  const SWord8 s1011 = 128 | s1010;-  const SWord8 s1012 = 127 & s1010;-  const SWord8 s1013 = s925 ? s1011 : s1012;-  const SWord8 s1014 = s1 + s1009;-  const SBool  s1015 = s1014 < s1;-  const SBool  s1016 = s1014 < s1009;-  const SBool  s1017 = s1015 || s1016;-  const SWord8 s1018 = (s1014 >> 1) | (s1014 << 7);-  const SWord8 s1019 = 128 | s1018;-  const SWord8 s1020 = 127 & s1018;-  const SWord8 s1021 = s1017 ? s1019 : s1020;-  const SWord8 s1022 = s926 ? s1013 : s1021;-  const SWord8 s1023 = s799 ? s1001 : s1022;-  const SWord8 s1024 = s544 ? s976 : s1023;-  const SWord8 s1025 = s36 ? s916 : s1024;-  const SWord8 s1026 = s21 ? s789 : s1025;-  const SWord8 s1027 = s16 ? s534 : s1026;-  const SWord8 s1028 = s1 + s24;-  const SBool  s1029 = (SBool) (s1028 & 1);-  const SBool  s1030 = false != s1029;-  const SWord8 s1031 = s1030 ? 128 : 0;-  const SBool  s1032 = (SBool) (s1031 & 1);-  const SBool  s1033 = false != s1032;-  const SWord8 s1034 = s1033 ? s31 : s32;-  const SBool  s1035 = (SBool) (s1034 & 1);-  const SBool  s1036 = false != s1035;-  const SBool  s1037 = !s1036;-  const SBool  s1038 = s1028 < s1;-  const SBool  s1039 = s1028 < s24;-  const SBool  s1040 = s1038 || s1039;-  const SWord8 s1041 = (s1028 >> 1) | (s1028 << 7);-  const SWord8 s1042 = 128 | s1041;-  const SWord8 s1043 = 127 & s1041;-  const SWord8 s1044 = s1040 ? s1042 : s1043;-  const SBool  s1045 = (SBool) (s1044 & 1);-  const SBool  s1046 = false != s1045;-  const SWord8 s1047 = (s1031 >> 1) | (s1031 << 7);-  const SWord8 s1048 = 128 | s1047;-  const SWord8 s1049 = 127 & s1047;-  const SWord8 s1050 = s1046 ? s1048 : s1049;-  const SBool  s1051 = (SBool) (s1050 & 1);-  const SBool  s1052 = false != s1051;-  const SWord8 s1053 = (s1034 >> 1) | (s1034 << 7);-  const SWord8 s1054 = 128 | s1053;-  const SWord8 s1055 = 127 & s1053;-  const SWord8 s1056 = s1052 ? s1054 : s1055;-  const SBool  s1057 = (SBool) (s1056 & 1);-  const SBool  s1058 = false != s1057;-  const SBool  s1059 = !s1058;-  const SWord8 s1060 = (s1044 >> 1) | (s1044 << 7);-  const SWord8 s1061 = 128 | s1060;-  const SWord8 s1062 = 127 & s1060;-  const SWord8 s1063 = s15 ? s1061 : s1062;-  const SBool  s1064 = (SBool) (s1063 & 1);-  const SBool  s1065 = false != s1064;-  const SWord8 s1066 = (s1050 >> 1) | (s1050 << 7);-  const SWord8 s1067 = 128 | s1066;-  const SWord8 s1068 = 127 & s1066;-  const SWord8 s1069 = s1065 ? s1067 : s1068;-  const SBool  s1070 = (SBool) (s1069 & 1);-  const SBool  s1071 = false != s1070;-  const SWord8 s1072 = (s1056 >> 1) | (s1056 << 7);-  const SWord8 s1073 = 128 | s1072;-  const SWord8 s1074 = 127 & s1072;-  const SWord8 s1075 = s1071 ? s1073 : s1074;-  const SBool  s1076 = (SBool) (s1075 & 1);-  const SBool  s1077 = false != s1076;-  const SBool  s1078 = !s1077;-  const SWord8 s1079 = (s1063 >> 1) | (s1063 << 7);-  const SWord8 s1080 = 128 | s1079;-  const SWord8 s1081 = 127 & s1079;-  const SWord8 s1082 = s20 ? s1080 : s1081;-  const SBool  s1083 = (SBool) (s1082 & 1);-  const SBool  s1084 = false != s1083;-  const SWord8 s1085 = (s1069 >> 1) | (s1069 << 7);-  const SWord8 s1086 = 128 | s1085;-  const SWord8 s1087 = 127 & s1085;-  const SWord8 s1088 = s1084 ? s1086 : s1087;-  const SBool  s1089 = (SBool) (s1088 & 1);-  const SBool  s1090 = false != s1089;-  const SWord8 s1091 = (s1075 >> 1) | (s1075 << 7);-  const SWord8 s1092 = 128 | s1091;-  const SWord8 s1093 = 127 & s1091;-  const SWord8 s1094 = s1090 ? s1092 : s1093;-  const SBool  s1095 = (SBool) (s1094 & 1);-  const SBool  s1096 = false != s1095;-  const SBool  s1097 = !s1096;-  const SWord8 s1098 = (s1082 >> 1) | (s1082 << 7);-  const SWord8 s1099 = 128 | s1098;-  const SWord8 s1100 = 127 & s1098;-  const SWord8 s1101 = s1036 ? s1099 : s1100;-  const SWord8 s1102 = (s1101 >> 1) | (s1101 << 7);-  const SWord8 s1103 = 128 | s1102;-  const SWord8 s1104 = 127 & s1102;-  const SWord8 s1105 = s1058 ? s1103 : s1104;-  const SWord8 s1106 = (s1105 >> 1) | (s1105 << 7);-  const SWord8 s1107 = 128 | s1106;-  const SWord8 s1108 = 127 & s1106;-  const SWord8 s1109 = s1077 ? s1107 : s1108;-  const SWord8 s1110 = (s1109 >> 1) | (s1109 << 7);-  const SWord8 s1111 = 128 | s1110;-  const SWord8 s1112 = 127 & s1110;-  const SWord8 s1113 = s1096 ? s1111 : s1112;-  const SWord8 s1114 = s1 + s1109;-  const SBool  s1115 = s1114 < s1;-  const SBool  s1116 = s1114 < s1109;-  const SBool  s1117 = s1115 || s1116;-  const SWord8 s1118 = (s1114 >> 1) | (s1114 << 7);-  const SWord8 s1119 = 128 | s1118;-  const SWord8 s1120 = 127 & s1118;-  const SWord8 s1121 = s1117 ? s1119 : s1120;-  const SWord8 s1122 = s1097 ? s1113 : s1121;-  const SWord8 s1123 = s1 + s1105;-  const SBool  s1124 = s1123 < s1;-  const SBool  s1125 = s1123 < s1105;-  const SBool  s1126 = s1124 || s1125;-  const SWord8 s1127 = (s1123 >> 1) | (s1123 << 7);-  const SWord8 s1128 = 128 | s1127;-  const SWord8 s1129 = 127 & s1127;-  const SWord8 s1130 = s1126 ? s1128 : s1129;-  const SWord8 s1131 = (s1130 >> 1) | (s1130 << 7);-  const SWord8 s1132 = 128 | s1131;-  const SWord8 s1133 = 127 & s1131;-  const SWord8 s1134 = s1096 ? s1132 : s1133;-  const SWord8 s1135 = s1 + s1130;-  const SBool  s1136 = s1135 < s1;-  const SBool  s1137 = s1135 < s1130;-  const SBool  s1138 = s1136 || s1137;-  const SWord8 s1139 = (s1135 >> 1) | (s1135 << 7);-  const SWord8 s1140 = 128 | s1139;-  const SWord8 s1141 = 127 & s1139;-  const SWord8 s1142 = s1138 ? s1140 : s1141;-  const SWord8 s1143 = s1097 ? s1134 : s1142;-  const SWord8 s1144 = s1078 ? s1122 : s1143;-  const SWord8 s1145 = s1 + s1101;-  const SBool  s1146 = s1145 < s1;-  const SBool  s1147 = s1145 < s1101;-  const SBool  s1148 = s1146 || s1147;-  const SWord8 s1149 = (s1145 >> 1) | (s1145 << 7);-  const SWord8 s1150 = 128 | s1149;-  const SWord8 s1151 = 127 & s1149;-  const SWord8 s1152 = s1148 ? s1150 : s1151;-  const SWord8 s1153 = (s1152 >> 1) | (s1152 << 7);-  const SWord8 s1154 = 128 | s1153;-  const SWord8 s1155 = 127 & s1153;-  const SWord8 s1156 = s1077 ? s1154 : s1155;-  const SWord8 s1157 = (s1156 >> 1) | (s1156 << 7);-  const SWord8 s1158 = 128 | s1157;-  const SWord8 s1159 = 127 & s1157;-  const SWord8 s1160 = s1096 ? s1158 : s1159;-  const SWord8 s1161 = s1 + s1156;-  const SBool  s1162 = s1161 < s1;-  const SBool  s1163 = s1161 < s1156;-  const SBool  s1164 = s1162 || s1163;-  const SWord8 s1165 = (s1161 >> 1) | (s1161 << 7);-  const SWord8 s1166 = 128 | s1165;-  const SWord8 s1167 = 127 & s1165;-  const SWord8 s1168 = s1164 ? s1166 : s1167;-  const SWord8 s1169 = s1097 ? s1160 : s1168;-  const SWord8 s1170 = s1 + s1152;-  const SBool  s1171 = s1170 < s1;-  const SBool  s1172 = s1170 < s1152;-  const SBool  s1173 = s1171 || s1172;-  const SWord8 s1174 = (s1170 >> 1) | (s1170 << 7);-  const SWord8 s1175 = 128 | s1174;-  const SWord8 s1176 = 127 & s1174;-  const SWord8 s1177 = s1173 ? s1175 : s1176;-  const SWord8 s1178 = (s1177 >> 1) | (s1177 << 7);-  const SWord8 s1179 = 128 | s1178;-  const SWord8 s1180 = 127 & s1178;-  const SWord8 s1181 = s1096 ? s1179 : s1180;-  const SWord8 s1182 = s1 + s1177;-  const SBool  s1183 = s1182 < s1;-  const SBool  s1184 = s1182 < s1177;-  const SBool  s1185 = s1183 || s1184;-  const SWord8 s1186 = (s1182 >> 1) | (s1182 << 7);-  const SWord8 s1187 = 128 | s1186;-  const SWord8 s1188 = 127 & s1186;-  const SWord8 s1189 = s1185 ? s1187 : s1188;-  const SWord8 s1190 = s1097 ? s1181 : s1189;-  const SWord8 s1191 = s1078 ? s1169 : s1190;-  const SWord8 s1192 = s1059 ? s1144 : s1191;-  const SWord8 s1193 = s1 + s1082;-  const SBool  s1194 = (SBool) (s1193 & 1);-  const SBool  s1195 = false != s1194;-  const SWord8 s1196 = s1195 ? s1086 : s1087;-  const SBool  s1197 = (SBool) (s1196 & 1);-  const SBool  s1198 = false != s1197;-  const SWord8 s1199 = s1198 ? s1092 : s1093;-  const SBool  s1200 = (SBool) (s1199 & 1);-  const SBool  s1201 = false != s1200;-  const SBool  s1202 = !s1201;-  const SBool  s1203 = s1193 < s1;-  const SBool  s1204 = s1193 < s1082;-  const SBool  s1205 = s1203 || s1204;-  const SWord8 s1206 = (s1193 >> 1) | (s1193 << 7);-  const SWord8 s1207 = 128 | s1206;-  const SWord8 s1208 = 127 & s1206;-  const SWord8 s1209 = s1205 ? s1207 : s1208;-  const SWord8 s1210 = (s1209 >> 1) | (s1209 << 7);-  const SWord8 s1211 = 128 | s1210;-  const SWord8 s1212 = 127 & s1210;-  const SWord8 s1213 = s1058 ? s1211 : s1212;-  const SWord8 s1214 = (s1213 >> 1) | (s1213 << 7);-  const SWord8 s1215 = 128 | s1214;-  const SWord8 s1216 = 127 & s1214;-  const SWord8 s1217 = s1077 ? s1215 : s1216;-  const SWord8 s1218 = (s1217 >> 1) | (s1217 << 7);-  const SWord8 s1219 = 128 | s1218;-  const SWord8 s1220 = 127 & s1218;-  const SWord8 s1221 = s1201 ? s1219 : s1220;-  const SWord8 s1222 = s1 + s1217;-  const SBool  s1223 = s1222 < s1;-  const SBool  s1224 = s1222 < s1217;-  const SBool  s1225 = s1223 || s1224;-  const SWord8 s1226 = (s1222 >> 1) | (s1222 << 7);-  const SWord8 s1227 = 128 | s1226;-  const SWord8 s1228 = 127 & s1226;-  const SWord8 s1229 = s1225 ? s1227 : s1228;-  const SWord8 s1230 = s1202 ? s1221 : s1229;-  const SWord8 s1231 = s1 + s1213;-  const SBool  s1232 = s1231 < s1;-  const SBool  s1233 = s1231 < s1213;-  const SBool  s1234 = s1232 || s1233;-  const SWord8 s1235 = (s1231 >> 1) | (s1231 << 7);-  const SWord8 s1236 = 128 | s1235;-  const SWord8 s1237 = 127 & s1235;-  const SWord8 s1238 = s1234 ? s1236 : s1237;-  const SWord8 s1239 = (s1238 >> 1) | (s1238 << 7);-  const SWord8 s1240 = 128 | s1239;-  const SWord8 s1241 = 127 & s1239;-  const SWord8 s1242 = s1201 ? s1240 : s1241;-  const SWord8 s1243 = s1 + s1238;-  const SBool  s1244 = s1243 < s1;-  const SBool  s1245 = s1243 < s1238;-  const SBool  s1246 = s1244 || s1245;-  const SWord8 s1247 = (s1243 >> 1) | (s1243 << 7);-  const SWord8 s1248 = 128 | s1247;-  const SWord8 s1249 = 127 & s1247;-  const SWord8 s1250 = s1246 ? s1248 : s1249;-  const SWord8 s1251 = s1202 ? s1242 : s1250;-  const SWord8 s1252 = s1078 ? s1230 : s1251;-  const SWord8 s1253 = s1 + s1209;-  const SBool  s1254 = s1253 < s1;-  const SBool  s1255 = s1253 < s1209;-  const SBool  s1256 = s1254 || s1255;-  const SWord8 s1257 = (s1253 >> 1) | (s1253 << 7);-  const SWord8 s1258 = 128 | s1257;-  const SWord8 s1259 = 127 & s1257;-  const SWord8 s1260 = s1256 ? s1258 : s1259;-  const SWord8 s1261 = (s1260 >> 1) | (s1260 << 7);-  const SWord8 s1262 = 128 | s1261;-  const SWord8 s1263 = 127 & s1261;-  const SWord8 s1264 = s1077 ? s1262 : s1263;-  const SWord8 s1265 = (s1264 >> 1) | (s1264 << 7);-  const SWord8 s1266 = 128 | s1265;-  const SWord8 s1267 = 127 & s1265;-  const SWord8 s1268 = s1201 ? s1266 : s1267;-  const SWord8 s1269 = s1 + s1264;-  const SBool  s1270 = s1269 < s1;-  const SBool  s1271 = s1269 < s1264;-  const SBool  s1272 = s1270 || s1271;-  const SWord8 s1273 = (s1269 >> 1) | (s1269 << 7);-  const SWord8 s1274 = 128 | s1273;-  const SWord8 s1275 = 127 & s1273;-  const SWord8 s1276 = s1272 ? s1274 : s1275;-  const SWord8 s1277 = s1202 ? s1268 : s1276;-  const SWord8 s1278 = s1 + s1260;-  const SBool  s1279 = s1278 < s1;-  const SBool  s1280 = s1278 < s1260;-  const SBool  s1281 = s1279 || s1280;-  const SWord8 s1282 = (s1278 >> 1) | (s1278 << 7);-  const SWord8 s1283 = 128 | s1282;-  const SWord8 s1284 = 127 & s1282;-  const SWord8 s1285 = s1281 ? s1283 : s1284;-  const SWord8 s1286 = (s1285 >> 1) | (s1285 << 7);-  const SWord8 s1287 = 128 | s1286;-  const SWord8 s1288 = 127 & s1286;-  const SWord8 s1289 = s1201 ? s1287 : s1288;-  const SWord8 s1290 = s1 + s1285;-  const SBool  s1291 = s1290 < s1;-  const SBool  s1292 = s1290 < s1285;-  const SBool  s1293 = s1291 || s1292;-  const SWord8 s1294 = (s1290 >> 1) | (s1290 << 7);-  const SWord8 s1295 = 128 | s1294;-  const SWord8 s1296 = 127 & s1294;-  const SWord8 s1297 = s1293 ? s1295 : s1296;-  const SWord8 s1298 = s1202 ? s1289 : s1297;-  const SWord8 s1299 = s1078 ? s1277 : s1298;-  const SWord8 s1300 = s1059 ? s1252 : s1299;-  const SWord8 s1301 = s1037 ? s1192 : s1300;-  const SWord8 s1302 = s1 + s1063;-  const SBool  s1303 = (SBool) (s1302 & 1);-  const SBool  s1304 = false != s1303;-  const SWord8 s1305 = s1304 ? s1067 : s1068;-  const SBool  s1306 = (SBool) (s1305 & 1);-  const SBool  s1307 = false != s1306;-  const SWord8 s1308 = s1307 ? s1073 : s1074;-  const SBool  s1309 = (SBool) (s1308 & 1);-  const SBool  s1310 = false != s1309;-  const SBool  s1311 = !s1310;-  const SBool  s1312 = s1302 < s1;-  const SBool  s1313 = s1302 < s1063;-  const SBool  s1314 = s1312 || s1313;-  const SWord8 s1315 = (s1302 >> 1) | (s1302 << 7);-  const SWord8 s1316 = 128 | s1315;-  const SWord8 s1317 = 127 & s1315;-  const SWord8 s1318 = s1314 ? s1316 : s1317;-  const SBool  s1319 = (SBool) (s1318 & 1);-  const SBool  s1320 = false != s1319;-  const SWord8 s1321 = (s1305 >> 1) | (s1305 << 7);-  const SWord8 s1322 = 128 | s1321;-  const SWord8 s1323 = 127 & s1321;-  const SWord8 s1324 = s1320 ? s1322 : s1323;-  const SBool  s1325 = (SBool) (s1324 & 1);-  const SBool  s1326 = false != s1325;-  const SWord8 s1327 = (s1308 >> 1) | (s1308 << 7);-  const SWord8 s1328 = 128 | s1327;-  const SWord8 s1329 = 127 & s1327;-  const SWord8 s1330 = s1326 ? s1328 : s1329;-  const SBool  s1331 = (SBool) (s1330 & 1);-  const SBool  s1332 = false != s1331;-  const SBool  s1333 = !s1332;-  const SWord8 s1334 = (s1318 >> 1) | (s1318 << 7);-  const SWord8 s1335 = 128 | s1334;-  const SWord8 s1336 = 127 & s1334;-  const SWord8 s1337 = s1036 ? s1335 : s1336;-  const SWord8 s1338 = (s1337 >> 1) | (s1337 << 7);-  const SWord8 s1339 = 128 | s1338;-  const SWord8 s1340 = 127 & s1338;-  const SWord8 s1341 = s1058 ? s1339 : s1340;-  const SWord8 s1342 = (s1341 >> 1) | (s1341 << 7);-  const SWord8 s1343 = 128 | s1342;-  const SWord8 s1344 = 127 & s1342;-  const SWord8 s1345 = s1310 ? s1343 : s1344;-  const SWord8 s1346 = (s1345 >> 1) | (s1345 << 7);-  const SWord8 s1347 = 128 | s1346;-  const SWord8 s1348 = 127 & s1346;-  const SWord8 s1349 = s1332 ? s1347 : s1348;-  const SWord8 s1350 = s1 + s1345;-  const SBool  s1351 = s1350 < s1;-  const SBool  s1352 = s1350 < s1345;-  const SBool  s1353 = s1351 || s1352;-  const SWord8 s1354 = (s1350 >> 1) | (s1350 << 7);-  const SWord8 s1355 = 128 | s1354;-  const SWord8 s1356 = 127 & s1354;-  const SWord8 s1357 = s1353 ? s1355 : s1356;-  const SWord8 s1358 = s1333 ? s1349 : s1357;-  const SWord8 s1359 = s1 + s1341;-  const SBool  s1360 = s1359 < s1;-  const SBool  s1361 = s1359 < s1341;-  const SBool  s1362 = s1360 || s1361;-  const SWord8 s1363 = (s1359 >> 1) | (s1359 << 7);-  const SWord8 s1364 = 128 | s1363;-  const SWord8 s1365 = 127 & s1363;-  const SWord8 s1366 = s1362 ? s1364 : s1365;-  const SWord8 s1367 = (s1366 >> 1) | (s1366 << 7);-  const SWord8 s1368 = 128 | s1367;-  const SWord8 s1369 = 127 & s1367;-  const SWord8 s1370 = s1332 ? s1368 : s1369;-  const SWord8 s1371 = s1 + s1366;-  const SBool  s1372 = s1371 < s1;-  const SBool  s1373 = s1371 < s1366;-  const SBool  s1374 = s1372 || s1373;-  const SWord8 s1375 = (s1371 >> 1) | (s1371 << 7);-  const SWord8 s1376 = 128 | s1375;-  const SWord8 s1377 = 127 & s1375;-  const SWord8 s1378 = s1374 ? s1376 : s1377;-  const SWord8 s1379 = s1333 ? s1370 : s1378;-  const SWord8 s1380 = s1311 ? s1358 : s1379;-  const SWord8 s1381 = s1 + s1337;-  const SBool  s1382 = s1381 < s1;-  const SBool  s1383 = s1381 < s1337;-  const SBool  s1384 = s1382 || s1383;-  const SWord8 s1385 = (s1381 >> 1) | (s1381 << 7);-  const SWord8 s1386 = 128 | s1385;-  const SWord8 s1387 = 127 & s1385;-  const SWord8 s1388 = s1384 ? s1386 : s1387;-  const SWord8 s1389 = (s1388 >> 1) | (s1388 << 7);-  const SWord8 s1390 = 128 | s1389;-  const SWord8 s1391 = 127 & s1389;-  const SWord8 s1392 = s1310 ? s1390 : s1391;-  const SWord8 s1393 = (s1392 >> 1) | (s1392 << 7);-  const SWord8 s1394 = 128 | s1393;-  const SWord8 s1395 = 127 & s1393;-  const SWord8 s1396 = s1332 ? s1394 : s1395;-  const SWord8 s1397 = s1 + s1392;-  const SBool  s1398 = s1397 < s1;-  const SBool  s1399 = s1397 < s1392;-  const SBool  s1400 = s1398 || s1399;-  const SWord8 s1401 = (s1397 >> 1) | (s1397 << 7);-  const SWord8 s1402 = 128 | s1401;-  const SWord8 s1403 = 127 & s1401;-  const SWord8 s1404 = s1400 ? s1402 : s1403;-  const SWord8 s1405 = s1333 ? s1396 : s1404;-  const SWord8 s1406 = s1 + s1388;-  const SBool  s1407 = s1406 < s1;-  const SBool  s1408 = s1406 < s1388;-  const SBool  s1409 = s1407 || s1408;-  const SWord8 s1410 = (s1406 >> 1) | (s1406 << 7);-  const SWord8 s1411 = 128 | s1410;-  const SWord8 s1412 = 127 & s1410;-  const SWord8 s1413 = s1409 ? s1411 : s1412;-  const SWord8 s1414 = (s1413 >> 1) | (s1413 << 7);-  const SWord8 s1415 = 128 | s1414;-  const SWord8 s1416 = 127 & s1414;-  const SWord8 s1417 = s1332 ? s1415 : s1416;-  const SWord8 s1418 = s1 + s1413;-  const SBool  s1419 = s1418 < s1;-  const SBool  s1420 = s1418 < s1413;-  const SBool  s1421 = s1419 || s1420;-  const SWord8 s1422 = (s1418 >> 1) | (s1418 << 7);-  const SWord8 s1423 = 128 | s1422;-  const SWord8 s1424 = 127 & s1422;-  const SWord8 s1425 = s1421 ? s1423 : s1424;-  const SWord8 s1426 = s1333 ? s1417 : s1425;-  const SWord8 s1427 = s1311 ? s1405 : s1426;-  const SWord8 s1428 = s1059 ? s1380 : s1427;-  const SWord8 s1429 = s1 + s1318;-  const SBool  s1430 = (SBool) (s1429 & 1);-  const SBool  s1431 = false != s1430;-  const SWord8 s1432 = s1431 ? s1322 : s1323;-  const SBool  s1433 = (SBool) (s1432 & 1);-  const SBool  s1434 = false != s1433;-  const SWord8 s1435 = s1434 ? s1328 : s1329;-  const SBool  s1436 = (SBool) (s1435 & 1);-  const SBool  s1437 = false != s1436;-  const SBool  s1438 = !s1437;-  const SBool  s1439 = s1429 < s1;-  const SBool  s1440 = s1429 < s1318;-  const SBool  s1441 = s1439 || s1440;-  const SWord8 s1442 = (s1429 >> 1) | (s1429 << 7);-  const SWord8 s1443 = 128 | s1442;-  const SWord8 s1444 = 127 & s1442;-  const SWord8 s1445 = s1441 ? s1443 : s1444;-  const SWord8 s1446 = (s1445 >> 1) | (s1445 << 7);-  const SWord8 s1447 = 128 | s1446;-  const SWord8 s1448 = 127 & s1446;-  const SWord8 s1449 = s1058 ? s1447 : s1448;-  const SWord8 s1450 = (s1449 >> 1) | (s1449 << 7);-  const SWord8 s1451 = 128 | s1450;-  const SWord8 s1452 = 127 & s1450;-  const SWord8 s1453 = s1310 ? s1451 : s1452;-  const SWord8 s1454 = (s1453 >> 1) | (s1453 << 7);-  const SWord8 s1455 = 128 | s1454;-  const SWord8 s1456 = 127 & s1454;-  const SWord8 s1457 = s1437 ? s1455 : s1456;-  const SWord8 s1458 = s1 + s1453;-  const SBool  s1459 = s1458 < s1;-  const SBool  s1460 = s1458 < s1453;-  const SBool  s1461 = s1459 || s1460;-  const SWord8 s1462 = (s1458 >> 1) | (s1458 << 7);-  const SWord8 s1463 = 128 | s1462;-  const SWord8 s1464 = 127 & s1462;-  const SWord8 s1465 = s1461 ? s1463 : s1464;-  const SWord8 s1466 = s1438 ? s1457 : s1465;-  const SWord8 s1467 = s1 + s1449;-  const SBool  s1468 = s1467 < s1;-  const SBool  s1469 = s1467 < s1449;-  const SBool  s1470 = s1468 || s1469;-  const SWord8 s1471 = (s1467 >> 1) | (s1467 << 7);-  const SWord8 s1472 = 128 | s1471;-  const SWord8 s1473 = 127 & s1471;-  const SWord8 s1474 = s1470 ? s1472 : s1473;-  const SWord8 s1475 = (s1474 >> 1) | (s1474 << 7);-  const SWord8 s1476 = 128 | s1475;-  const SWord8 s1477 = 127 & s1475;-  const SWord8 s1478 = s1437 ? s1476 : s1477;-  const SWord8 s1479 = s1 + s1474;-  const SBool  s1480 = s1479 < s1;-  const SBool  s1481 = s1479 < s1474;-  const SBool  s1482 = s1480 || s1481;-  const SWord8 s1483 = (s1479 >> 1) | (s1479 << 7);-  const SWord8 s1484 = 128 | s1483;-  const SWord8 s1485 = 127 & s1483;-  const SWord8 s1486 = s1482 ? s1484 : s1485;-  const SWord8 s1487 = s1438 ? s1478 : s1486;-  const SWord8 s1488 = s1311 ? s1466 : s1487;-  const SWord8 s1489 = s1 + s1445;-  const SBool  s1490 = s1489 < s1;-  const SBool  s1491 = s1489 < s1445;-  const SBool  s1492 = s1490 || s1491;-  const SWord8 s1493 = (s1489 >> 1) | (s1489 << 7);-  const SWord8 s1494 = 128 | s1493;-  const SWord8 s1495 = 127 & s1493;-  const SWord8 s1496 = s1492 ? s1494 : s1495;-  const SWord8 s1497 = (s1496 >> 1) | (s1496 << 7);-  const SWord8 s1498 = 128 | s1497;-  const SWord8 s1499 = 127 & s1497;-  const SWord8 s1500 = s1310 ? s1498 : s1499;-  const SWord8 s1501 = (s1500 >> 1) | (s1500 << 7);-  const SWord8 s1502 = 128 | s1501;-  const SWord8 s1503 = 127 & s1501;-  const SWord8 s1504 = s1437 ? s1502 : s1503;-  const SWord8 s1505 = s1 + s1500;-  const SBool  s1506 = s1505 < s1;-  const SBool  s1507 = s1505 < s1500;-  const SBool  s1508 = s1506 || s1507;-  const SWord8 s1509 = (s1505 >> 1) | (s1505 << 7);-  const SWord8 s1510 = 128 | s1509;-  const SWord8 s1511 = 127 & s1509;-  const SWord8 s1512 = s1508 ? s1510 : s1511;-  const SWord8 s1513 = s1438 ? s1504 : s1512;-  const SWord8 s1514 = s1 + s1496;-  const SBool  s1515 = s1514 < s1;-  const SBool  s1516 = s1514 < s1496;-  const SBool  s1517 = s1515 || s1516;-  const SWord8 s1518 = (s1514 >> 1) | (s1514 << 7);-  const SWord8 s1519 = 128 | s1518;-  const SWord8 s1520 = 127 & s1518;-  const SWord8 s1521 = s1517 ? s1519 : s1520;-  const SWord8 s1522 = (s1521 >> 1) | (s1521 << 7);-  const SWord8 s1523 = 128 | s1522;-  const SWord8 s1524 = 127 & s1522;-  const SWord8 s1525 = s1437 ? s1523 : s1524;-  const SWord8 s1526 = s1 + s1521;-  const SBool  s1527 = s1526 < s1;-  const SBool  s1528 = s1526 < s1521;-  const SBool  s1529 = s1527 || s1528;-  const SWord8 s1530 = (s1526 >> 1) | (s1526 << 7);-  const SWord8 s1531 = 128 | s1530;-  const SWord8 s1532 = 127 & s1530;-  const SWord8 s1533 = s1529 ? s1531 : s1532;-  const SWord8 s1534 = s1438 ? s1525 : s1533;-  const SWord8 s1535 = s1311 ? s1513 : s1534;-  const SWord8 s1536 = s1059 ? s1488 : s1535;-  const SWord8 s1537 = s1037 ? s1428 : s1536;-  const SWord8 s1538 = s21 ? s1301 : s1537;-  const SWord8 s1539 = s1 + s1044;-  const SBool  s1540 = (SBool) (s1539 & 1);-  const SBool  s1541 = false != s1540;-  const SWord8 s1542 = s1541 ? s1048 : s1049;-  const SBool  s1543 = (SBool) (s1542 & 1);-  const SBool  s1544 = false != s1543;-  const SWord8 s1545 = s1544 ? s1054 : s1055;-  const SBool  s1546 = (SBool) (s1545 & 1);-  const SBool  s1547 = false != s1546;-  const SBool  s1548 = !s1547;-  const SBool  s1549 = s1539 < s1;-  const SBool  s1550 = s1539 < s1044;-  const SBool  s1551 = s1549 || s1550;-  const SWord8 s1552 = (s1539 >> 1) | (s1539 << 7);-  const SWord8 s1553 = 128 | s1552;-  const SWord8 s1554 = 127 & s1552;-  const SWord8 s1555 = s1551 ? s1553 : s1554;-  const SBool  s1556 = (SBool) (s1555 & 1);-  const SBool  s1557 = false != s1556;-  const SWord8 s1558 = (s1542 >> 1) | (s1542 << 7);-  const SWord8 s1559 = 128 | s1558;-  const SWord8 s1560 = 127 & s1558;-  const SWord8 s1561 = s1557 ? s1559 : s1560;-  const SBool  s1562 = (SBool) (s1561 & 1);-  const SBool  s1563 = false != s1562;-  const SWord8 s1564 = (s1545 >> 1) | (s1545 << 7);-  const SWord8 s1565 = 128 | s1564;-  const SWord8 s1566 = 127 & s1564;-  const SWord8 s1567 = s1563 ? s1565 : s1566;-  const SBool  s1568 = (SBool) (s1567 & 1);-  const SBool  s1569 = false != s1568;-  const SBool  s1570 = !s1569;-  const SWord8 s1571 = (s1555 >> 1) | (s1555 << 7);-  const SWord8 s1572 = 128 | s1571;-  const SWord8 s1573 = 127 & s1571;-  const SWord8 s1574 = s20 ? s1572 : s1573;-  const SBool  s1575 = (SBool) (s1574 & 1);-  const SBool  s1576 = false != s1575;-  const SWord8 s1577 = (s1561 >> 1) | (s1561 << 7);-  const SWord8 s1578 = 128 | s1577;-  const SWord8 s1579 = 127 & s1577;-  const SWord8 s1580 = s1576 ? s1578 : s1579;-  const SBool  s1581 = (SBool) (s1580 & 1);-  const SBool  s1582 = false != s1581;-  const SWord8 s1583 = (s1567 >> 1) | (s1567 << 7);-  const SWord8 s1584 = 128 | s1583;-  const SWord8 s1585 = 127 & s1583;-  const SWord8 s1586 = s1582 ? s1584 : s1585;-  const SBool  s1587 = (SBool) (s1586 & 1);-  const SBool  s1588 = false != s1587;-  const SBool  s1589 = !s1588;-  const SWord8 s1590 = (s1574 >> 1) | (s1574 << 7);-  const SWord8 s1591 = 128 | s1590;-  const SWord8 s1592 = 127 & s1590;-  const SWord8 s1593 = s1036 ? s1591 : s1592;-  const SWord8 s1594 = (s1593 >> 1) | (s1593 << 7);-  const SWord8 s1595 = 128 | s1594;-  const SWord8 s1596 = 127 & s1594;-  const SWord8 s1597 = s1547 ? s1595 : s1596;-  const SWord8 s1598 = (s1597 >> 1) | (s1597 << 7);-  const SWord8 s1599 = 128 | s1598;-  const SWord8 s1600 = 127 & s1598;-  const SWord8 s1601 = s1569 ? s1599 : s1600;-  const SWord8 s1602 = (s1601 >> 1) | (s1601 << 7);-  const SWord8 s1603 = 128 | s1602;-  const SWord8 s1604 = 127 & s1602;-  const SWord8 s1605 = s1588 ? s1603 : s1604;-  const SWord8 s1606 = s1 + s1601;-  const SBool  s1607 = s1606 < s1;-  const SBool  s1608 = s1606 < s1601;-  const SBool  s1609 = s1607 || s1608;-  const SWord8 s1610 = (s1606 >> 1) | (s1606 << 7);-  const SWord8 s1611 = 128 | s1610;-  const SWord8 s1612 = 127 & s1610;-  const SWord8 s1613 = s1609 ? s1611 : s1612;-  const SWord8 s1614 = s1589 ? s1605 : s1613;-  const SWord8 s1615 = s1 + s1597;-  const SBool  s1616 = s1615 < s1;-  const SBool  s1617 = s1615 < s1597;-  const SBool  s1618 = s1616 || s1617;-  const SWord8 s1619 = (s1615 >> 1) | (s1615 << 7);-  const SWord8 s1620 = 128 | s1619;-  const SWord8 s1621 = 127 & s1619;-  const SWord8 s1622 = s1618 ? s1620 : s1621;-  const SWord8 s1623 = (s1622 >> 1) | (s1622 << 7);-  const SWord8 s1624 = 128 | s1623;-  const SWord8 s1625 = 127 & s1623;-  const SWord8 s1626 = s1588 ? s1624 : s1625;-  const SWord8 s1627 = s1 + s1622;-  const SBool  s1628 = s1627 < s1;-  const SBool  s1629 = s1627 < s1622;-  const SBool  s1630 = s1628 || s1629;-  const SWord8 s1631 = (s1627 >> 1) | (s1627 << 7);-  const SWord8 s1632 = 128 | s1631;-  const SWord8 s1633 = 127 & s1631;-  const SWord8 s1634 = s1630 ? s1632 : s1633;-  const SWord8 s1635 = s1589 ? s1626 : s1634;-  const SWord8 s1636 = s1570 ? s1614 : s1635;-  const SWord8 s1637 = s1 + s1593;-  const SBool  s1638 = s1637 < s1;-  const SBool  s1639 = s1637 < s1593;-  const SBool  s1640 = s1638 || s1639;-  const SWord8 s1641 = (s1637 >> 1) | (s1637 << 7);-  const SWord8 s1642 = 128 | s1641;-  const SWord8 s1643 = 127 & s1641;-  const SWord8 s1644 = s1640 ? s1642 : s1643;-  const SWord8 s1645 = (s1644 >> 1) | (s1644 << 7);-  const SWord8 s1646 = 128 | s1645;-  const SWord8 s1647 = 127 & s1645;-  const SWord8 s1648 = s1569 ? s1646 : s1647;-  const SWord8 s1649 = (s1648 >> 1) | (s1648 << 7);-  const SWord8 s1650 = 128 | s1649;-  const SWord8 s1651 = 127 & s1649;-  const SWord8 s1652 = s1588 ? s1650 : s1651;-  const SWord8 s1653 = s1 + s1648;-  const SBool  s1654 = s1653 < s1;-  const SBool  s1655 = s1653 < s1648;-  const SBool  s1656 = s1654 || s1655;-  const SWord8 s1657 = (s1653 >> 1) | (s1653 << 7);-  const SWord8 s1658 = 128 | s1657;-  const SWord8 s1659 = 127 & s1657;-  const SWord8 s1660 = s1656 ? s1658 : s1659;-  const SWord8 s1661 = s1589 ? s1652 : s1660;-  const SWord8 s1662 = s1 + s1644;-  const SBool  s1663 = s1662 < s1;-  const SBool  s1664 = s1662 < s1644;-  const SBool  s1665 = s1663 || s1664;-  const SWord8 s1666 = (s1662 >> 1) | (s1662 << 7);-  const SWord8 s1667 = 128 | s1666;-  const SWord8 s1668 = 127 & s1666;-  const SWord8 s1669 = s1665 ? s1667 : s1668;-  const SWord8 s1670 = (s1669 >> 1) | (s1669 << 7);-  const SWord8 s1671 = 128 | s1670;-  const SWord8 s1672 = 127 & s1670;-  const SWord8 s1673 = s1588 ? s1671 : s1672;-  const SWord8 s1674 = s1 + s1669;-  const SBool  s1675 = s1674 < s1;-  const SBool  s1676 = s1674 < s1669;-  const SBool  s1677 = s1675 || s1676;-  const SWord8 s1678 = (s1674 >> 1) | (s1674 << 7);-  const SWord8 s1679 = 128 | s1678;-  const SWord8 s1680 = 127 & s1678;-  const SWord8 s1681 = s1677 ? s1679 : s1680;-  const SWord8 s1682 = s1589 ? s1673 : s1681;-  const SWord8 s1683 = s1570 ? s1661 : s1682;-  const SWord8 s1684 = s1548 ? s1636 : s1683;-  const SWord8 s1685 = s1 + s1574;-  const SBool  s1686 = (SBool) (s1685 & 1);-  const SBool  s1687 = false != s1686;-  const SWord8 s1688 = s1687 ? s1578 : s1579;-  const SBool  s1689 = (SBool) (s1688 & 1);-  const SBool  s1690 = false != s1689;-  const SWord8 s1691 = s1690 ? s1584 : s1585;-  const SBool  s1692 = (SBool) (s1691 & 1);-  const SBool  s1693 = false != s1692;-  const SBool  s1694 = !s1693;-  const SBool  s1695 = s1685 < s1;-  const SBool  s1696 = s1685 < s1574;-  const SBool  s1697 = s1695 || s1696;-  const SWord8 s1698 = (s1685 >> 1) | (s1685 << 7);-  const SWord8 s1699 = 128 | s1698;-  const SWord8 s1700 = 127 & s1698;-  const SWord8 s1701 = s1697 ? s1699 : s1700;-  const SWord8 s1702 = (s1701 >> 1) | (s1701 << 7);-  const SWord8 s1703 = 128 | s1702;-  const SWord8 s1704 = 127 & s1702;-  const SWord8 s1705 = s1547 ? s1703 : s1704;-  const SWord8 s1706 = (s1705 >> 1) | (s1705 << 7);-  const SWord8 s1707 = 128 | s1706;-  const SWord8 s1708 = 127 & s1706;-  const SWord8 s1709 = s1569 ? s1707 : s1708;-  const SWord8 s1710 = (s1709 >> 1) | (s1709 << 7);-  const SWord8 s1711 = 128 | s1710;-  const SWord8 s1712 = 127 & s1710;-  const SWord8 s1713 = s1693 ? s1711 : s1712;-  const SWord8 s1714 = s1 + s1709;-  const SBool  s1715 = s1714 < s1;-  const SBool  s1716 = s1714 < s1709;-  const SBool  s1717 = s1715 || s1716;-  const SWord8 s1718 = (s1714 >> 1) | (s1714 << 7);-  const SWord8 s1719 = 128 | s1718;-  const SWord8 s1720 = 127 & s1718;-  const SWord8 s1721 = s1717 ? s1719 : s1720;-  const SWord8 s1722 = s1694 ? s1713 : s1721;-  const SWord8 s1723 = s1 + s1705;-  const SBool  s1724 = s1723 < s1;-  const SBool  s1725 = s1723 < s1705;-  const SBool  s1726 = s1724 || s1725;-  const SWord8 s1727 = (s1723 >> 1) | (s1723 << 7);-  const SWord8 s1728 = 128 | s1727;-  const SWord8 s1729 = 127 & s1727;-  const SWord8 s1730 = s1726 ? s1728 : s1729;-  const SWord8 s1731 = (s1730 >> 1) | (s1730 << 7);-  const SWord8 s1732 = 128 | s1731;-  const SWord8 s1733 = 127 & s1731;-  const SWord8 s1734 = s1693 ? s1732 : s1733;-  const SWord8 s1735 = s1 + s1730;-  const SBool  s1736 = s1735 < s1;-  const SBool  s1737 = s1735 < s1730;-  const SBool  s1738 = s1736 || s1737;-  const SWord8 s1739 = (s1735 >> 1) | (s1735 << 7);-  const SWord8 s1740 = 128 | s1739;-  const SWord8 s1741 = 127 & s1739;-  const SWord8 s1742 = s1738 ? s1740 : s1741;-  const SWord8 s1743 = s1694 ? s1734 : s1742;-  const SWord8 s1744 = s1570 ? s1722 : s1743;-  const SWord8 s1745 = s1 + s1701;-  const SBool  s1746 = s1745 < s1;-  const SBool  s1747 = s1745 < s1701;-  const SBool  s1748 = s1746 || s1747;-  const SWord8 s1749 = (s1745 >> 1) | (s1745 << 7);-  const SWord8 s1750 = 128 | s1749;-  const SWord8 s1751 = 127 & s1749;-  const SWord8 s1752 = s1748 ? s1750 : s1751;-  const SWord8 s1753 = (s1752 >> 1) | (s1752 << 7);-  const SWord8 s1754 = 128 | s1753;-  const SWord8 s1755 = 127 & s1753;-  const SWord8 s1756 = s1569 ? s1754 : s1755;-  const SWord8 s1757 = (s1756 >> 1) | (s1756 << 7);-  const SWord8 s1758 = 128 | s1757;-  const SWord8 s1759 = 127 & s1757;-  const SWord8 s1760 = s1693 ? s1758 : s1759;-  const SWord8 s1761 = s1 + s1756;-  const SBool  s1762 = s1761 < s1;-  const SBool  s1763 = s1761 < s1756;-  const SBool  s1764 = s1762 || s1763;-  const SWord8 s1765 = (s1761 >> 1) | (s1761 << 7);-  const SWord8 s1766 = 128 | s1765;-  const SWord8 s1767 = 127 & s1765;-  const SWord8 s1768 = s1764 ? s1766 : s1767;-  const SWord8 s1769 = s1694 ? s1760 : s1768;-  const SWord8 s1770 = s1 + s1752;-  const SBool  s1771 = s1770 < s1;-  const SBool  s1772 = s1770 < s1752;-  const SBool  s1773 = s1771 || s1772;-  const SWord8 s1774 = (s1770 >> 1) | (s1770 << 7);-  const SWord8 s1775 = 128 | s1774;-  const SWord8 s1776 = 127 & s1774;-  const SWord8 s1777 = s1773 ? s1775 : s1776;-  const SWord8 s1778 = (s1777 >> 1) | (s1777 << 7);-  const SWord8 s1779 = 128 | s1778;-  const SWord8 s1780 = 127 & s1778;-  const SWord8 s1781 = s1693 ? s1779 : s1780;-  const SWord8 s1782 = s1 + s1777;-  const SBool  s1783 = s1782 < s1;-  const SBool  s1784 = s1782 < s1777;-  const SBool  s1785 = s1783 || s1784;-  const SWord8 s1786 = (s1782 >> 1) | (s1782 << 7);-  const SWord8 s1787 = 128 | s1786;-  const SWord8 s1788 = 127 & s1786;-  const SWord8 s1789 = s1785 ? s1787 : s1788;-  const SWord8 s1790 = s1694 ? s1781 : s1789;-  const SWord8 s1791 = s1570 ? s1769 : s1790;-  const SWord8 s1792 = s1548 ? s1744 : s1791;-  const SWord8 s1793 = s1037 ? s1684 : s1792;-  const SWord8 s1794 = s1 + s1555;-  const SBool  s1795 = (SBool) (s1794 & 1);-  const SBool  s1796 = false != s1795;-  const SWord8 s1797 = s1796 ? s1559 : s1560;-  const SBool  s1798 = (SBool) (s1797 & 1);-  const SBool  s1799 = false != s1798;-  const SWord8 s1800 = s1799 ? s1565 : s1566;-  const SBool  s1801 = (SBool) (s1800 & 1);-  const SBool  s1802 = false != s1801;-  const SBool  s1803 = !s1802;-  const SBool  s1804 = s1794 < s1;-  const SBool  s1805 = s1794 < s1555;-  const SBool  s1806 = s1804 || s1805;-  const SWord8 s1807 = (s1794 >> 1) | (s1794 << 7);-  const SWord8 s1808 = 128 | s1807;-  const SWord8 s1809 = 127 & s1807;-  const SWord8 s1810 = s1806 ? s1808 : s1809;-  const SBool  s1811 = (SBool) (s1810 & 1);-  const SBool  s1812 = false != s1811;-  const SWord8 s1813 = (s1797 >> 1) | (s1797 << 7);-  const SWord8 s1814 = 128 | s1813;-  const SWord8 s1815 = 127 & s1813;-  const SWord8 s1816 = s1812 ? s1814 : s1815;-  const SBool  s1817 = (SBool) (s1816 & 1);-  const SBool  s1818 = false != s1817;-  const SWord8 s1819 = (s1800 >> 1) | (s1800 << 7);-  const SWord8 s1820 = 128 | s1819;-  const SWord8 s1821 = 127 & s1819;-  const SWord8 s1822 = s1818 ? s1820 : s1821;-  const SBool  s1823 = (SBool) (s1822 & 1);-  const SBool  s1824 = false != s1823;-  const SBool  s1825 = !s1824;-  const SWord8 s1826 = (s1810 >> 1) | (s1810 << 7);-  const SWord8 s1827 = 128 | s1826;-  const SWord8 s1828 = 127 & s1826;-  const SWord8 s1829 = s1036 ? s1827 : s1828;-  const SWord8 s1830 = (s1829 >> 1) | (s1829 << 7);-  const SWord8 s1831 = 128 | s1830;-  const SWord8 s1832 = 127 & s1830;-  const SWord8 s1833 = s1547 ? s1831 : s1832;-  const SWord8 s1834 = (s1833 >> 1) | (s1833 << 7);-  const SWord8 s1835 = 128 | s1834;-  const SWord8 s1836 = 127 & s1834;-  const SWord8 s1837 = s1802 ? s1835 : s1836;-  const SWord8 s1838 = (s1837 >> 1) | (s1837 << 7);-  const SWord8 s1839 = 128 | s1838;-  const SWord8 s1840 = 127 & s1838;-  const SWord8 s1841 = s1824 ? s1839 : s1840;-  const SWord8 s1842 = s1 + s1837;-  const SBool  s1843 = s1842 < s1;-  const SBool  s1844 = s1842 < s1837;-  const SBool  s1845 = s1843 || s1844;-  const SWord8 s1846 = (s1842 >> 1) | (s1842 << 7);-  const SWord8 s1847 = 128 | s1846;-  const SWord8 s1848 = 127 & s1846;-  const SWord8 s1849 = s1845 ? s1847 : s1848;-  const SWord8 s1850 = s1825 ? s1841 : s1849;-  const SWord8 s1851 = s1 + s1833;-  const SBool  s1852 = s1851 < s1;-  const SBool  s1853 = s1851 < s1833;-  const SBool  s1854 = s1852 || s1853;-  const SWord8 s1855 = (s1851 >> 1) | (s1851 << 7);-  const SWord8 s1856 = 128 | s1855;-  const SWord8 s1857 = 127 & s1855;-  const SWord8 s1858 = s1854 ? s1856 : s1857;-  const SWord8 s1859 = (s1858 >> 1) | (s1858 << 7);-  const SWord8 s1860 = 128 | s1859;-  const SWord8 s1861 = 127 & s1859;-  const SWord8 s1862 = s1824 ? s1860 : s1861;-  const SWord8 s1863 = s1 + s1858;-  const SBool  s1864 = s1863 < s1;-  const SBool  s1865 = s1863 < s1858;-  const SBool  s1866 = s1864 || s1865;-  const SWord8 s1867 = (s1863 >> 1) | (s1863 << 7);-  const SWord8 s1868 = 128 | s1867;-  const SWord8 s1869 = 127 & s1867;-  const SWord8 s1870 = s1866 ? s1868 : s1869;-  const SWord8 s1871 = s1825 ? s1862 : s1870;-  const SWord8 s1872 = s1803 ? s1850 : s1871;-  const SWord8 s1873 = s1 + s1829;-  const SBool  s1874 = s1873 < s1;-  const SBool  s1875 = s1873 < s1829;-  const SBool  s1876 = s1874 || s1875;-  const SWord8 s1877 = (s1873 >> 1) | (s1873 << 7);-  const SWord8 s1878 = 128 | s1877;-  const SWord8 s1879 = 127 & s1877;-  const SWord8 s1880 = s1876 ? s1878 : s1879;-  const SWord8 s1881 = (s1880 >> 1) | (s1880 << 7);-  const SWord8 s1882 = 128 | s1881;-  const SWord8 s1883 = 127 & s1881;-  const SWord8 s1884 = s1802 ? s1882 : s1883;-  const SWord8 s1885 = (s1884 >> 1) | (s1884 << 7);-  const SWord8 s1886 = 128 | s1885;-  const SWord8 s1887 = 127 & s1885;-  const SWord8 s1888 = s1824 ? s1886 : s1887;-  const SWord8 s1889 = s1 + s1884;-  const SBool  s1890 = s1889 < s1;-  const SBool  s1891 = s1889 < s1884;-  const SBool  s1892 = s1890 || s1891;-  const SWord8 s1893 = (s1889 >> 1) | (s1889 << 7);-  const SWord8 s1894 = 128 | s1893;-  const SWord8 s1895 = 127 & s1893;-  const SWord8 s1896 = s1892 ? s1894 : s1895;-  const SWord8 s1897 = s1825 ? s1888 : s1896;-  const SWord8 s1898 = s1 + s1880;-  const SBool  s1899 = s1898 < s1;-  const SBool  s1900 = s1898 < s1880;-  const SBool  s1901 = s1899 || s1900;-  const SWord8 s1902 = (s1898 >> 1) | (s1898 << 7);-  const SWord8 s1903 = 128 | s1902;-  const SWord8 s1904 = 127 & s1902;-  const SWord8 s1905 = s1901 ? s1903 : s1904;-  const SWord8 s1906 = (s1905 >> 1) | (s1905 << 7);-  const SWord8 s1907 = 128 | s1906;-  const SWord8 s1908 = 127 & s1906;-  const SWord8 s1909 = s1824 ? s1907 : s1908;-  const SWord8 s1910 = s1 + s1905;-  const SBool  s1911 = s1910 < s1;-  const SBool  s1912 = s1910 < s1905;-  const SBool  s1913 = s1911 || s1912;-  const SWord8 s1914 = (s1910 >> 1) | (s1910 << 7);-  const SWord8 s1915 = 128 | s1914;-  const SWord8 s1916 = 127 & s1914;-  const SWord8 s1917 = s1913 ? s1915 : s1916;-  const SWord8 s1918 = s1825 ? s1909 : s1917;-  const SWord8 s1919 = s1803 ? s1897 : s1918;-  const SWord8 s1920 = s1548 ? s1872 : s1919;-  const SWord8 s1921 = s1 + s1810;-  const SBool  s1922 = (SBool) (s1921 & 1);-  const SBool  s1923 = false != s1922;-  const SWord8 s1924 = s1923 ? s1814 : s1815;-  const SBool  s1925 = (SBool) (s1924 & 1);-  const SBool  s1926 = false != s1925;-  const SWord8 s1927 = s1926 ? s1820 : s1821;-  const SBool  s1928 = (SBool) (s1927 & 1);-  const SBool  s1929 = false != s1928;-  const SBool  s1930 = !s1929;-  const SBool  s1931 = s1921 < s1;-  const SBool  s1932 = s1921 < s1810;-  const SBool  s1933 = s1931 || s1932;-  const SWord8 s1934 = (s1921 >> 1) | (s1921 << 7);-  const SWord8 s1935 = 128 | s1934;-  const SWord8 s1936 = 127 & s1934;-  const SWord8 s1937 = s1933 ? s1935 : s1936;-  const SWord8 s1938 = (s1937 >> 1) | (s1937 << 7);-  const SWord8 s1939 = 128 | s1938;-  const SWord8 s1940 = 127 & s1938;-  const SWord8 s1941 = s1547 ? s1939 : s1940;-  const SWord8 s1942 = (s1941 >> 1) | (s1941 << 7);-  const SWord8 s1943 = 128 | s1942;-  const SWord8 s1944 = 127 & s1942;-  const SWord8 s1945 = s1802 ? s1943 : s1944;-  const SWord8 s1946 = (s1945 >> 1) | (s1945 << 7);-  const SWord8 s1947 = 128 | s1946;-  const SWord8 s1948 = 127 & s1946;-  const SWord8 s1949 = s1929 ? s1947 : s1948;-  const SWord8 s1950 = s1 + s1945;-  const SBool  s1951 = s1950 < s1;-  const SBool  s1952 = s1950 < s1945;-  const SBool  s1953 = s1951 || s1952;-  const SWord8 s1954 = (s1950 >> 1) | (s1950 << 7);-  const SWord8 s1955 = 128 | s1954;-  const SWord8 s1956 = 127 & s1954;-  const SWord8 s1957 = s1953 ? s1955 : s1956;-  const SWord8 s1958 = s1930 ? s1949 : s1957;-  const SWord8 s1959 = s1 + s1941;-  const SBool  s1960 = s1959 < s1;-  const SBool  s1961 = s1959 < s1941;-  const SBool  s1962 = s1960 || s1961;-  const SWord8 s1963 = (s1959 >> 1) | (s1959 << 7);-  const SWord8 s1964 = 128 | s1963;-  const SWord8 s1965 = 127 & s1963;-  const SWord8 s1966 = s1962 ? s1964 : s1965;-  const SWord8 s1967 = (s1966 >> 1) | (s1966 << 7);-  const SWord8 s1968 = 128 | s1967;-  const SWord8 s1969 = 127 & s1967;-  const SWord8 s1970 = s1929 ? s1968 : s1969;-  const SWord8 s1971 = s1 + s1966;-  const SBool  s1972 = s1971 < s1;-  const SBool  s1973 = s1971 < s1966;-  const SBool  s1974 = s1972 || s1973;-  const SWord8 s1975 = (s1971 >> 1) | (s1971 << 7);-  const SWord8 s1976 = 128 | s1975;-  const SWord8 s1977 = 127 & s1975;-  const SWord8 s1978 = s1974 ? s1976 : s1977;-  const SWord8 s1979 = s1930 ? s1970 : s1978;-  const SWord8 s1980 = s1803 ? s1958 : s1979;-  const SWord8 s1981 = s1 + s1937;-  const SBool  s1982 = s1981 < s1;-  const SBool  s1983 = s1981 < s1937;-  const SBool  s1984 = s1982 || s1983;-  const SWord8 s1985 = (s1981 >> 1) | (s1981 << 7);-  const SWord8 s1986 = 128 | s1985;-  const SWord8 s1987 = 127 & s1985;-  const SWord8 s1988 = s1984 ? s1986 : s1987;-  const SWord8 s1989 = (s1988 >> 1) | (s1988 << 7);-  const SWord8 s1990 = 128 | s1989;-  const SWord8 s1991 = 127 & s1989;-  const SWord8 s1992 = s1802 ? s1990 : s1991;-  const SWord8 s1993 = (s1992 >> 1) | (s1992 << 7);-  const SWord8 s1994 = 128 | s1993;-  const SWord8 s1995 = 127 & s1993;-  const SWord8 s1996 = s1929 ? s1994 : s1995;-  const SWord8 s1997 = s1 + s1992;-  const SBool  s1998 = s1997 < s1;-  const SBool  s1999 = s1997 < s1992;-  const SBool  s2000 = s1998 || s1999;-  const SWord8 s2001 = (s1997 >> 1) | (s1997 << 7);-  const SWord8 s2002 = 128 | s2001;-  const SWord8 s2003 = 127 & s2001;-  const SWord8 s2004 = s2000 ? s2002 : s2003;-  const SWord8 s2005 = s1930 ? s1996 : s2004;-  const SWord8 s2006 = s1 + s1988;-  const SBool  s2007 = s2006 < s1;-  const SBool  s2008 = s2006 < s1988;-  const SBool  s2009 = s2007 || s2008;-  const SWord8 s2010 = (s2006 >> 1) | (s2006 << 7);-  const SWord8 s2011 = 128 | s2010;-  const SWord8 s2012 = 127 & s2010;-  const SWord8 s2013 = s2009 ? s2011 : s2012;-  const SWord8 s2014 = (s2013 >> 1) | (s2013 << 7);-  const SWord8 s2015 = 128 | s2014;-  const SWord8 s2016 = 127 & s2014;-  const SWord8 s2017 = s1929 ? s2015 : s2016;-  const SWord8 s2018 = s1 + s2013;-  const SBool  s2019 = s2018 < s1;-  const SBool  s2020 = s2018 < s2013;-  const SBool  s2021 = s2019 || s2020;-  const SWord8 s2022 = (s2018 >> 1) | (s2018 << 7);-  const SWord8 s2023 = 128 | s2022;-  const SWord8 s2024 = 127 & s2022;-  const SWord8 s2025 = s2021 ? s2023 : s2024;-  const SWord8 s2026 = s1930 ? s2017 : s2025;-  const SWord8 s2027 = s1803 ? s2005 : s2026;-  const SWord8 s2028 = s1548 ? s1980 : s2027;-  const SWord8 s2029 = s1037 ? s1920 : s2028;-  const SWord8 s2030 = s21 ? s1793 : s2029;-  const SWord8 s2031 = s16 ? s1538 : s2030;-  const SWord8 s2032 = s11 ? s1027 : s2031;-  const SBool  s2033 = (SBool) (s1 & 1);-  const SBool  s2034 = false != s2033;-  const SWord8 s2035 = s2034 ? 128 : 0;-  const SBool  s2036 = (SBool) (s2035 & 1);-  const SBool  s2037 = false != s2036;-  const SWord8 s2038 = s17 | 128;-  const SWord8 s2039 = s2037 ? s2038 : s18;-  const SBool  s2040 = (SBool) (s2039 & 1);-  const SBool  s2041 = false != s2040;-  const SBool  s2042 = !s2041;-  const SWord8 s2043 = (s1 >> 1) | (s1 << 7);-  const SWord8 s2044 = 127 & s2043;-  const SBool  s2045 = (SBool) (s2044 & 1);-  const SBool  s2046 = false != s2045;-  const SWord8 s2047 = (s2035 >> 1) | (s2035 << 7);-  const SWord8 s2048 = 128 | s2047;-  const SWord8 s2049 = 127 & s2047;-  const SWord8 s2050 = s2046 ? s2048 : s2049;-  const SBool  s2051 = (SBool) (s2050 & 1);-  const SBool  s2052 = false != s2051;-  const SWord8 s2053 = (s2039 >> 1) | (s2039 << 7);-  const SWord8 s2054 = 128 | s2053;-  const SWord8 s2055 = 127 & s2053;-  const SWord8 s2056 = s2052 ? s2054 : s2055;-  const SBool  s2057 = (SBool) (s2056 & 1);-  const SBool  s2058 = false != s2057;-  const SBool  s2059 = !s2058;-  const SWord8 s2060 = (s2044 >> 1) | (s2044 << 7);-  const SWord8 s2061 = 128 | s2060;-  const SWord8 s2062 = 127 & s2060;-  const SWord8 s2063 = s10 ? s2061 : s2062;-  const SBool  s2064 = (SBool) (s2063 & 1);-  const SBool  s2065 = false != s2064;-  const SWord8 s2066 = (s2050 >> 1) | (s2050 << 7);-  const SWord8 s2067 = 128 | s2066;-  const SWord8 s2068 = 127 & s2066;-  const SWord8 s2069 = s2065 ? s2067 : s2068;-  const SBool  s2070 = (SBool) (s2069 & 1);-  const SBool  s2071 = false != s2070;-  const SWord8 s2072 = (s2056 >> 1) | (s2056 << 7);-  const SWord8 s2073 = 128 | s2072;-  const SWord8 s2074 = 127 & s2072;-  const SWord8 s2075 = s2071 ? s2073 : s2074;-  const SBool  s2076 = (SBool) (s2075 & 1);-  const SBool  s2077 = false != s2076;-  const SBool  s2078 = !s2077;-  const SWord8 s2079 = (s2063 >> 1) | (s2063 << 7);-  const SWord8 s2080 = 128 | s2079;-  const SWord8 s2081 = 127 & s2079;-  const SWord8 s2082 = s15 ? s2080 : s2081;-  const SBool  s2083 = (SBool) (s2082 & 1);-  const SBool  s2084 = false != s2083;-  const SWord8 s2085 = (s2069 >> 1) | (s2069 << 7);-  const SWord8 s2086 = 128 | s2085;-  const SWord8 s2087 = 127 & s2085;-  const SWord8 s2088 = s2084 ? s2086 : s2087;-  const SBool  s2089 = (SBool) (s2088 & 1);-  const SBool  s2090 = false != s2089;-  const SWord8 s2091 = (s2075 >> 1) | (s2075 << 7);-  const SWord8 s2092 = 128 | s2091;-  const SWord8 s2093 = 127 & s2091;-  const SWord8 s2094 = s2090 ? s2092 : s2093;-  const SBool  s2095 = (SBool) (s2094 & 1);-  const SBool  s2096 = false != s2095;-  const SBool  s2097 = !s2096;-  const SWord8 s2098 = (s2082 >> 1) | (s2082 << 7);-  const SWord8 s2099 = 128 | s2098;-  const SWord8 s2100 = 127 & s2098;-  const SWord8 s2101 = s2041 ? s2099 : s2100;-  const SBool  s2102 = (SBool) (s2101 & 1);-  const SBool  s2103 = false != s2102;-  const SWord8 s2104 = (s2088 >> 1) | (s2088 << 7);-  const SWord8 s2105 = 128 | s2104;-  const SWord8 s2106 = 127 & s2104;-  const SWord8 s2107 = s2103 ? s2105 : s2106;-  const SBool  s2108 = (SBool) (s2107 & 1);-  const SBool  s2109 = false != s2108;-  const SWord8 s2110 = (s2094 >> 1) | (s2094 << 7);-  const SWord8 s2111 = 128 | s2110;-  const SWord8 s2112 = 127 & s2110;-  const SWord8 s2113 = s2109 ? s2111 : s2112;-  const SBool  s2114 = (SBool) (s2113 & 1);-  const SBool  s2115 = false != s2114;-  const SBool  s2116 = !s2115;-  const SWord8 s2117 = (s2101 >> 1) | (s2101 << 7);-  const SWord8 s2118 = 128 | s2117;-  const SWord8 s2119 = 127 & s2117;-  const SWord8 s2120 = s2058 ? s2118 : s2119;-  const SWord8 s2121 = (s2120 >> 1) | (s2120 << 7);-  const SWord8 s2122 = 128 | s2121;-  const SWord8 s2123 = 127 & s2121;-  const SWord8 s2124 = s2077 ? s2122 : s2123;-  const SWord8 s2125 = (s2124 >> 1) | (s2124 << 7);-  const SWord8 s2126 = 128 | s2125;-  const SWord8 s2127 = 127 & s2125;-  const SWord8 s2128 = s2096 ? s2126 : s2127;-  const SWord8 s2129 = (s2128 >> 1) | (s2128 << 7);-  const SWord8 s2130 = 128 | s2129;-  const SWord8 s2131 = 127 & s2129;-  const SWord8 s2132 = s2115 ? s2130 : s2131;-  const SWord8 s2133 = s1 + s2128;-  const SBool  s2134 = s2133 < s1;-  const SBool  s2135 = s2133 < s2128;-  const SBool  s2136 = s2134 || s2135;-  const SWord8 s2137 = (s2133 >> 1) | (s2133 << 7);-  const SWord8 s2138 = 128 | s2137;-  const SWord8 s2139 = 127 & s2137;-  const SWord8 s2140 = s2136 ? s2138 : s2139;-  const SWord8 s2141 = s2116 ? s2132 : s2140;-  const SWord8 s2142 = s1 + s2124;-  const SBool  s2143 = s2142 < s1;-  const SBool  s2144 = s2142 < s2124;-  const SBool  s2145 = s2143 || s2144;-  const SWord8 s2146 = (s2142 >> 1) | (s2142 << 7);-  const SWord8 s2147 = 128 | s2146;-  const SWord8 s2148 = 127 & s2146;-  const SWord8 s2149 = s2145 ? s2147 : s2148;-  const SWord8 s2150 = (s2149 >> 1) | (s2149 << 7);-  const SWord8 s2151 = 128 | s2150;-  const SWord8 s2152 = 127 & s2150;-  const SWord8 s2153 = s2115 ? s2151 : s2152;-  const SWord8 s2154 = s1 + s2149;-  const SBool  s2155 = s2154 < s1;-  const SBool  s2156 = s2154 < s2149;-  const SBool  s2157 = s2155 || s2156;-  const SWord8 s2158 = (s2154 >> 1) | (s2154 << 7);-  const SWord8 s2159 = 128 | s2158;-  const SWord8 s2160 = 127 & s2158;-  const SWord8 s2161 = s2157 ? s2159 : s2160;-  const SWord8 s2162 = s2116 ? s2153 : s2161;-  const SWord8 s2163 = s2097 ? s2141 : s2162;-  const SWord8 s2164 = s1 + s2120;-  const SBool  s2165 = s2164 < s1;-  const SBool  s2166 = s2164 < s2120;-  const SBool  s2167 = s2165 || s2166;-  const SWord8 s2168 = (s2164 >> 1) | (s2164 << 7);-  const SWord8 s2169 = 128 | s2168;-  const SWord8 s2170 = 127 & s2168;-  const SWord8 s2171 = s2167 ? s2169 : s2170;-  const SWord8 s2172 = (s2171 >> 1) | (s2171 << 7);-  const SWord8 s2173 = 128 | s2172;-  const SWord8 s2174 = 127 & s2172;-  const SWord8 s2175 = s2096 ? s2173 : s2174;-  const SWord8 s2176 = (s2175 >> 1) | (s2175 << 7);-  const SWord8 s2177 = 128 | s2176;-  const SWord8 s2178 = 127 & s2176;-  const SWord8 s2179 = s2115 ? s2177 : s2178;-  const SWord8 s2180 = s1 + s2175;-  const SBool  s2181 = s2180 < s1;-  const SBool  s2182 = s2180 < s2175;-  const SBool  s2183 = s2181 || s2182;-  const SWord8 s2184 = (s2180 >> 1) | (s2180 << 7);-  const SWord8 s2185 = 128 | s2184;-  const SWord8 s2186 = 127 & s2184;-  const SWord8 s2187 = s2183 ? s2185 : s2186;-  const SWord8 s2188 = s2116 ? s2179 : s2187;-  const SWord8 s2189 = s1 + s2171;-  const SBool  s2190 = s2189 < s1;-  const SBool  s2191 = s2189 < s2171;-  const SBool  s2192 = s2190 || s2191;-  const SWord8 s2193 = (s2189 >> 1) | (s2189 << 7);-  const SWord8 s2194 = 128 | s2193;-  const SWord8 s2195 = 127 & s2193;-  const SWord8 s2196 = s2192 ? s2194 : s2195;-  const SWord8 s2197 = (s2196 >> 1) | (s2196 << 7);-  const SWord8 s2198 = 128 | s2197;-  const SWord8 s2199 = 127 & s2197;-  const SWord8 s2200 = s2115 ? s2198 : s2199;-  const SWord8 s2201 = s1 + s2196;-  const SBool  s2202 = s2201 < s1;-  const SBool  s2203 = s2201 < s2196;-  const SBool  s2204 = s2202 || s2203;-  const SWord8 s2205 = (s2201 >> 1) | (s2201 << 7);-  const SWord8 s2206 = 128 | s2205;-  const SWord8 s2207 = 127 & s2205;-  const SWord8 s2208 = s2204 ? s2206 : s2207;-  const SWord8 s2209 = s2116 ? s2200 : s2208;-  const SWord8 s2210 = s2097 ? s2188 : s2209;-  const SWord8 s2211 = s2078 ? s2163 : s2210;-  const SWord8 s2212 = s1 + s2101;-  const SBool  s2213 = (SBool) (s2212 & 1);-  const SBool  s2214 = false != s2213;-  const SWord8 s2215 = s2214 ? s2105 : s2106;-  const SBool  s2216 = (SBool) (s2215 & 1);-  const SBool  s2217 = false != s2216;-  const SWord8 s2218 = s2217 ? s2111 : s2112;-  const SBool  s2219 = (SBool) (s2218 & 1);-  const SBool  s2220 = false != s2219;-  const SBool  s2221 = !s2220;-  const SBool  s2222 = s2212 < s1;-  const SBool  s2223 = s2212 < s2101;-  const SBool  s2224 = s2222 || s2223;-  const SWord8 s2225 = (s2212 >> 1) | (s2212 << 7);-  const SWord8 s2226 = 128 | s2225;-  const SWord8 s2227 = 127 & s2225;-  const SWord8 s2228 = s2224 ? s2226 : s2227;-  const SWord8 s2229 = (s2228 >> 1) | (s2228 << 7);-  const SWord8 s2230 = 128 | s2229;-  const SWord8 s2231 = 127 & s2229;-  const SWord8 s2232 = s2077 ? s2230 : s2231;-  const SWord8 s2233 = (s2232 >> 1) | (s2232 << 7);-  const SWord8 s2234 = 128 | s2233;-  const SWord8 s2235 = 127 & s2233;-  const SWord8 s2236 = s2096 ? s2234 : s2235;-  const SWord8 s2237 = (s2236 >> 1) | (s2236 << 7);-  const SWord8 s2238 = 128 | s2237;-  const SWord8 s2239 = 127 & s2237;-  const SWord8 s2240 = s2220 ? s2238 : s2239;-  const SWord8 s2241 = s1 + s2236;-  const SBool  s2242 = s2241 < s1;-  const SBool  s2243 = s2241 < s2236;-  const SBool  s2244 = s2242 || s2243;-  const SWord8 s2245 = (s2241 >> 1) | (s2241 << 7);-  const SWord8 s2246 = 128 | s2245;-  const SWord8 s2247 = 127 & s2245;-  const SWord8 s2248 = s2244 ? s2246 : s2247;-  const SWord8 s2249 = s2221 ? s2240 : s2248;-  const SWord8 s2250 = s1 + s2232;-  const SBool  s2251 = s2250 < s1;-  const SBool  s2252 = s2250 < s2232;-  const SBool  s2253 = s2251 || s2252;-  const SWord8 s2254 = (s2250 >> 1) | (s2250 << 7);-  const SWord8 s2255 = 128 | s2254;-  const SWord8 s2256 = 127 & s2254;-  const SWord8 s2257 = s2253 ? s2255 : s2256;-  const SWord8 s2258 = (s2257 >> 1) | (s2257 << 7);-  const SWord8 s2259 = 128 | s2258;-  const SWord8 s2260 = 127 & s2258;-  const SWord8 s2261 = s2220 ? s2259 : s2260;-  const SWord8 s2262 = s1 + s2257;-  const SBool  s2263 = s2262 < s1;-  const SBool  s2264 = s2262 < s2257;-  const SBool  s2265 = s2263 || s2264;-  const SWord8 s2266 = (s2262 >> 1) | (s2262 << 7);-  const SWord8 s2267 = 128 | s2266;-  const SWord8 s2268 = 127 & s2266;-  const SWord8 s2269 = s2265 ? s2267 : s2268;-  const SWord8 s2270 = s2221 ? s2261 : s2269;-  const SWord8 s2271 = s2097 ? s2249 : s2270;-  const SWord8 s2272 = s1 + s2228;-  const SBool  s2273 = s2272 < s1;-  const SBool  s2274 = s2272 < s2228;-  const SBool  s2275 = s2273 || s2274;-  const SWord8 s2276 = (s2272 >> 1) | (s2272 << 7);-  const SWord8 s2277 = 128 | s2276;-  const SWord8 s2278 = 127 & s2276;-  const SWord8 s2279 = s2275 ? s2277 : s2278;-  const SWord8 s2280 = (s2279 >> 1) | (s2279 << 7);-  const SWord8 s2281 = 128 | s2280;-  const SWord8 s2282 = 127 & s2280;-  const SWord8 s2283 = s2096 ? s2281 : s2282;-  const SWord8 s2284 = (s2283 >> 1) | (s2283 << 7);-  const SWord8 s2285 = 128 | s2284;-  const SWord8 s2286 = 127 & s2284;-  const SWord8 s2287 = s2220 ? s2285 : s2286;-  const SWord8 s2288 = s1 + s2283;-  const SBool  s2289 = s2288 < s1;-  const SBool  s2290 = s2288 < s2283;-  const SBool  s2291 = s2289 || s2290;-  const SWord8 s2292 = (s2288 >> 1) | (s2288 << 7);-  const SWord8 s2293 = 128 | s2292;-  const SWord8 s2294 = 127 & s2292;-  const SWord8 s2295 = s2291 ? s2293 : s2294;-  const SWord8 s2296 = s2221 ? s2287 : s2295;-  const SWord8 s2297 = s1 + s2279;-  const SBool  s2298 = s2297 < s1;-  const SBool  s2299 = s2297 < s2279;-  const SBool  s2300 = s2298 || s2299;-  const SWord8 s2301 = (s2297 >> 1) | (s2297 << 7);-  const SWord8 s2302 = 128 | s2301;-  const SWord8 s2303 = 127 & s2301;-  const SWord8 s2304 = s2300 ? s2302 : s2303;-  const SWord8 s2305 = (s2304 >> 1) | (s2304 << 7);-  const SWord8 s2306 = 128 | s2305;-  const SWord8 s2307 = 127 & s2305;-  const SWord8 s2308 = s2220 ? s2306 : s2307;-  const SWord8 s2309 = s1 + s2304;-  const SBool  s2310 = s2309 < s1;-  const SBool  s2311 = s2309 < s2304;-  const SBool  s2312 = s2310 || s2311;-  const SWord8 s2313 = (s2309 >> 1) | (s2309 << 7);-  const SWord8 s2314 = 128 | s2313;-  const SWord8 s2315 = 127 & s2313;-  const SWord8 s2316 = s2312 ? s2314 : s2315;-  const SWord8 s2317 = s2221 ? s2308 : s2316;-  const SWord8 s2318 = s2097 ? s2296 : s2317;-  const SWord8 s2319 = s2078 ? s2271 : s2318;-  const SWord8 s2320 = s2059 ? s2211 : s2319;-  const SWord8 s2321 = s1 + s2082;-  const SBool  s2322 = (SBool) (s2321 & 1);-  const SBool  s2323 = false != s2322;-  const SWord8 s2324 = s2323 ? s2086 : s2087;-  const SBool  s2325 = (SBool) (s2324 & 1);-  const SBool  s2326 = false != s2325;-  const SWord8 s2327 = s2326 ? s2092 : s2093;-  const SBool  s2328 = (SBool) (s2327 & 1);-  const SBool  s2329 = false != s2328;-  const SBool  s2330 = !s2329;-  const SBool  s2331 = s2321 < s1;-  const SBool  s2332 = s2321 < s2082;-  const SBool  s2333 = s2331 || s2332;-  const SWord8 s2334 = (s2321 >> 1) | (s2321 << 7);-  const SWord8 s2335 = 128 | s2334;-  const SWord8 s2336 = 127 & s2334;-  const SWord8 s2337 = s2333 ? s2335 : s2336;-  const SBool  s2338 = (SBool) (s2337 & 1);-  const SBool  s2339 = false != s2338;-  const SWord8 s2340 = (s2324 >> 1) | (s2324 << 7);-  const SWord8 s2341 = 128 | s2340;-  const SWord8 s2342 = 127 & s2340;-  const SWord8 s2343 = s2339 ? s2341 : s2342;-  const SBool  s2344 = (SBool) (s2343 & 1);-  const SBool  s2345 = false != s2344;-  const SWord8 s2346 = (s2327 >> 1) | (s2327 << 7);-  const SWord8 s2347 = 128 | s2346;-  const SWord8 s2348 = 127 & s2346;-  const SWord8 s2349 = s2345 ? s2347 : s2348;-  const SBool  s2350 = (SBool) (s2349 & 1);-  const SBool  s2351 = false != s2350;-  const SBool  s2352 = !s2351;-  const SWord8 s2353 = (s2337 >> 1) | (s2337 << 7);-  const SWord8 s2354 = 128 | s2353;-  const SWord8 s2355 = 127 & s2353;-  const SWord8 s2356 = s2058 ? s2354 : s2355;-  const SWord8 s2357 = (s2356 >> 1) | (s2356 << 7);-  const SWord8 s2358 = 128 | s2357;-  const SWord8 s2359 = 127 & s2357;-  const SWord8 s2360 = s2077 ? s2358 : s2359;-  const SWord8 s2361 = (s2360 >> 1) | (s2360 << 7);-  const SWord8 s2362 = 128 | s2361;-  const SWord8 s2363 = 127 & s2361;-  const SWord8 s2364 = s2329 ? s2362 : s2363;-  const SWord8 s2365 = (s2364 >> 1) | (s2364 << 7);-  const SWord8 s2366 = 128 | s2365;-  const SWord8 s2367 = 127 & s2365;-  const SWord8 s2368 = s2351 ? s2366 : s2367;-  const SWord8 s2369 = s1 + s2364;-  const SBool  s2370 = s2369 < s1;-  const SBool  s2371 = s2369 < s2364;-  const SBool  s2372 = s2370 || s2371;-  const SWord8 s2373 = (s2369 >> 1) | (s2369 << 7);-  const SWord8 s2374 = 128 | s2373;-  const SWord8 s2375 = 127 & s2373;-  const SWord8 s2376 = s2372 ? s2374 : s2375;-  const SWord8 s2377 = s2352 ? s2368 : s2376;-  const SWord8 s2378 = s1 + s2360;-  const SBool  s2379 = s2378 < s1;-  const SBool  s2380 = s2378 < s2360;-  const SBool  s2381 = s2379 || s2380;-  const SWord8 s2382 = (s2378 >> 1) | (s2378 << 7);-  const SWord8 s2383 = 128 | s2382;-  const SWord8 s2384 = 127 & s2382;-  const SWord8 s2385 = s2381 ? s2383 : s2384;-  const SWord8 s2386 = (s2385 >> 1) | (s2385 << 7);-  const SWord8 s2387 = 128 | s2386;-  const SWord8 s2388 = 127 & s2386;-  const SWord8 s2389 = s2351 ? s2387 : s2388;-  const SWord8 s2390 = s1 + s2385;-  const SBool  s2391 = s2390 < s1;-  const SBool  s2392 = s2390 < s2385;-  const SBool  s2393 = s2391 || s2392;-  const SWord8 s2394 = (s2390 >> 1) | (s2390 << 7);-  const SWord8 s2395 = 128 | s2394;-  const SWord8 s2396 = 127 & s2394;-  const SWord8 s2397 = s2393 ? s2395 : s2396;-  const SWord8 s2398 = s2352 ? s2389 : s2397;-  const SWord8 s2399 = s2330 ? s2377 : s2398;-  const SWord8 s2400 = s1 + s2356;-  const SBool  s2401 = s2400 < s1;-  const SBool  s2402 = s2400 < s2356;-  const SBool  s2403 = s2401 || s2402;-  const SWord8 s2404 = (s2400 >> 1) | (s2400 << 7);-  const SWord8 s2405 = 128 | s2404;-  const SWord8 s2406 = 127 & s2404;-  const SWord8 s2407 = s2403 ? s2405 : s2406;-  const SWord8 s2408 = (s2407 >> 1) | (s2407 << 7);-  const SWord8 s2409 = 128 | s2408;-  const SWord8 s2410 = 127 & s2408;-  const SWord8 s2411 = s2329 ? s2409 : s2410;-  const SWord8 s2412 = (s2411 >> 1) | (s2411 << 7);-  const SWord8 s2413 = 128 | s2412;-  const SWord8 s2414 = 127 & s2412;-  const SWord8 s2415 = s2351 ? s2413 : s2414;-  const SWord8 s2416 = s1 + s2411;-  const SBool  s2417 = s2416 < s1;-  const SBool  s2418 = s2416 < s2411;-  const SBool  s2419 = s2417 || s2418;-  const SWord8 s2420 = (s2416 >> 1) | (s2416 << 7);-  const SWord8 s2421 = 128 | s2420;-  const SWord8 s2422 = 127 & s2420;-  const SWord8 s2423 = s2419 ? s2421 : s2422;-  const SWord8 s2424 = s2352 ? s2415 : s2423;-  const SWord8 s2425 = s1 + s2407;-  const SBool  s2426 = s2425 < s1;-  const SBool  s2427 = s2425 < s2407;-  const SBool  s2428 = s2426 || s2427;-  const SWord8 s2429 = (s2425 >> 1) | (s2425 << 7);-  const SWord8 s2430 = 128 | s2429;-  const SWord8 s2431 = 127 & s2429;-  const SWord8 s2432 = s2428 ? s2430 : s2431;-  const SWord8 s2433 = (s2432 >> 1) | (s2432 << 7);-  const SWord8 s2434 = 128 | s2433;-  const SWord8 s2435 = 127 & s2433;-  const SWord8 s2436 = s2351 ? s2434 : s2435;-  const SWord8 s2437 = s1 + s2432;-  const SBool  s2438 = s2437 < s1;-  const SBool  s2439 = s2437 < s2432;-  const SBool  s2440 = s2438 || s2439;-  const SWord8 s2441 = (s2437 >> 1) | (s2437 << 7);-  const SWord8 s2442 = 128 | s2441;-  const SWord8 s2443 = 127 & s2441;-  const SWord8 s2444 = s2440 ? s2442 : s2443;-  const SWord8 s2445 = s2352 ? s2436 : s2444;-  const SWord8 s2446 = s2330 ? s2424 : s2445;-  const SWord8 s2447 = s2078 ? s2399 : s2446;-  const SWord8 s2448 = s1 + s2337;-  const SBool  s2449 = (SBool) (s2448 & 1);-  const SBool  s2450 = false != s2449;-  const SWord8 s2451 = s2450 ? s2341 : s2342;-  const SBool  s2452 = (SBool) (s2451 & 1);-  const SBool  s2453 = false != s2452;-  const SWord8 s2454 = s2453 ? s2347 : s2348;-  const SBool  s2455 = (SBool) (s2454 & 1);-  const SBool  s2456 = false != s2455;-  const SBool  s2457 = !s2456;-  const SBool  s2458 = s2448 < s1;-  const SBool  s2459 = s2448 < s2337;-  const SBool  s2460 = s2458 || s2459;-  const SWord8 s2461 = (s2448 >> 1) | (s2448 << 7);-  const SWord8 s2462 = 128 | s2461;-  const SWord8 s2463 = 127 & s2461;-  const SWord8 s2464 = s2460 ? s2462 : s2463;-  const SWord8 s2465 = (s2464 >> 1) | (s2464 << 7);-  const SWord8 s2466 = 128 | s2465;-  const SWord8 s2467 = 127 & s2465;-  const SWord8 s2468 = s2077 ? s2466 : s2467;-  const SWord8 s2469 = (s2468 >> 1) | (s2468 << 7);-  const SWord8 s2470 = 128 | s2469;-  const SWord8 s2471 = 127 & s2469;-  const SWord8 s2472 = s2329 ? s2470 : s2471;-  const SWord8 s2473 = (s2472 >> 1) | (s2472 << 7);-  const SWord8 s2474 = 128 | s2473;-  const SWord8 s2475 = 127 & s2473;-  const SWord8 s2476 = s2456 ? s2474 : s2475;-  const SWord8 s2477 = s1 + s2472;-  const SBool  s2478 = s2477 < s1;-  const SBool  s2479 = s2477 < s2472;-  const SBool  s2480 = s2478 || s2479;-  const SWord8 s2481 = (s2477 >> 1) | (s2477 << 7);-  const SWord8 s2482 = 128 | s2481;-  const SWord8 s2483 = 127 & s2481;-  const SWord8 s2484 = s2480 ? s2482 : s2483;-  const SWord8 s2485 = s2457 ? s2476 : s2484;-  const SWord8 s2486 = s1 + s2468;-  const SBool  s2487 = s2486 < s1;-  const SBool  s2488 = s2486 < s2468;-  const SBool  s2489 = s2487 || s2488;-  const SWord8 s2490 = (s2486 >> 1) | (s2486 << 7);-  const SWord8 s2491 = 128 | s2490;-  const SWord8 s2492 = 127 & s2490;-  const SWord8 s2493 = s2489 ? s2491 : s2492;-  const SWord8 s2494 = (s2493 >> 1) | (s2493 << 7);-  const SWord8 s2495 = 128 | s2494;-  const SWord8 s2496 = 127 & s2494;-  const SWord8 s2497 = s2456 ? s2495 : s2496;-  const SWord8 s2498 = s1 + s2493;-  const SBool  s2499 = s2498 < s1;-  const SBool  s2500 = s2498 < s2493;-  const SBool  s2501 = s2499 || s2500;-  const SWord8 s2502 = (s2498 >> 1) | (s2498 << 7);-  const SWord8 s2503 = 128 | s2502;-  const SWord8 s2504 = 127 & s2502;-  const SWord8 s2505 = s2501 ? s2503 : s2504;-  const SWord8 s2506 = s2457 ? s2497 : s2505;-  const SWord8 s2507 = s2330 ? s2485 : s2506;-  const SWord8 s2508 = s1 + s2464;-  const SBool  s2509 = s2508 < s1;-  const SBool  s2510 = s2508 < s2464;-  const SBool  s2511 = s2509 || s2510;-  const SWord8 s2512 = (s2508 >> 1) | (s2508 << 7);-  const SWord8 s2513 = 128 | s2512;-  const SWord8 s2514 = 127 & s2512;-  const SWord8 s2515 = s2511 ? s2513 : s2514;-  const SWord8 s2516 = (s2515 >> 1) | (s2515 << 7);-  const SWord8 s2517 = 128 | s2516;-  const SWord8 s2518 = 127 & s2516;-  const SWord8 s2519 = s2329 ? s2517 : s2518;-  const SWord8 s2520 = (s2519 >> 1) | (s2519 << 7);-  const SWord8 s2521 = 128 | s2520;-  const SWord8 s2522 = 127 & s2520;-  const SWord8 s2523 = s2456 ? s2521 : s2522;-  const SWord8 s2524 = s1 + s2519;-  const SBool  s2525 = s2524 < s1;-  const SBool  s2526 = s2524 < s2519;-  const SBool  s2527 = s2525 || s2526;-  const SWord8 s2528 = (s2524 >> 1) | (s2524 << 7);-  const SWord8 s2529 = 128 | s2528;-  const SWord8 s2530 = 127 & s2528;-  const SWord8 s2531 = s2527 ? s2529 : s2530;-  const SWord8 s2532 = s2457 ? s2523 : s2531;-  const SWord8 s2533 = s1 + s2515;-  const SBool  s2534 = s2533 < s1;-  const SBool  s2535 = s2533 < s2515;-  const SBool  s2536 = s2534 || s2535;-  const SWord8 s2537 = (s2533 >> 1) | (s2533 << 7);-  const SWord8 s2538 = 128 | s2537;-  const SWord8 s2539 = 127 & s2537;-  const SWord8 s2540 = s2536 ? s2538 : s2539;-  const SWord8 s2541 = (s2540 >> 1) | (s2540 << 7);-  const SWord8 s2542 = 128 | s2541;-  const SWord8 s2543 = 127 & s2541;-  const SWord8 s2544 = s2456 ? s2542 : s2543;-  const SWord8 s2545 = s1 + s2540;-  const SBool  s2546 = s2545 < s1;-  const SBool  s2547 = s2545 < s2540;-  const SBool  s2548 = s2546 || s2547;-  const SWord8 s2549 = (s2545 >> 1) | (s2545 << 7);-  const SWord8 s2550 = 128 | s2549;-  const SWord8 s2551 = 127 & s2549;-  const SWord8 s2552 = s2548 ? s2550 : s2551;-  const SWord8 s2553 = s2457 ? s2544 : s2552;-  const SWord8 s2554 = s2330 ? s2532 : s2553;-  const SWord8 s2555 = s2078 ? s2507 : s2554;-  const SWord8 s2556 = s2059 ? s2447 : s2555;-  const SWord8 s2557 = s2042 ? s2320 : s2556;-  const SWord8 s2558 = s1 + s2063;-  const SBool  s2559 = (SBool) (s2558 & 1);-  const SBool  s2560 = false != s2559;-  const SWord8 s2561 = s2560 ? s2067 : s2068;-  const SBool  s2562 = (SBool) (s2561 & 1);-  const SBool  s2563 = false != s2562;-  const SWord8 s2564 = s2563 ? s2073 : s2074;-  const SBool  s2565 = (SBool) (s2564 & 1);-  const SBool  s2566 = false != s2565;-  const SBool  s2567 = !s2566;-  const SBool  s2568 = s2558 < s1;-  const SBool  s2569 = s2558 < s2063;-  const SBool  s2570 = s2568 || s2569;-  const SWord8 s2571 = (s2558 >> 1) | (s2558 << 7);-  const SWord8 s2572 = 128 | s2571;-  const SWord8 s2573 = 127 & s2571;-  const SWord8 s2574 = s2570 ? s2572 : s2573;-  const SBool  s2575 = (SBool) (s2574 & 1);-  const SBool  s2576 = false != s2575;-  const SWord8 s2577 = (s2561 >> 1) | (s2561 << 7);-  const SWord8 s2578 = 128 | s2577;-  const SWord8 s2579 = 127 & s2577;-  const SWord8 s2580 = s2576 ? s2578 : s2579;-  const SBool  s2581 = (SBool) (s2580 & 1);-  const SBool  s2582 = false != s2581;-  const SWord8 s2583 = (s2564 >> 1) | (s2564 << 7);-  const SWord8 s2584 = 128 | s2583;-  const SWord8 s2585 = 127 & s2583;-  const SWord8 s2586 = s2582 ? s2584 : s2585;-  const SBool  s2587 = (SBool) (s2586 & 1);-  const SBool  s2588 = false != s2587;-  const SBool  s2589 = !s2588;-  const SWord8 s2590 = (s2574 >> 1) | (s2574 << 7);-  const SWord8 s2591 = 128 | s2590;-  const SWord8 s2592 = 127 & s2590;-  const SWord8 s2593 = s2041 ? s2591 : s2592;-  const SBool  s2594 = (SBool) (s2593 & 1);-  const SBool  s2595 = false != s2594;-  const SWord8 s2596 = (s2580 >> 1) | (s2580 << 7);-  const SWord8 s2597 = 128 | s2596;-  const SWord8 s2598 = 127 & s2596;-  const SWord8 s2599 = s2595 ? s2597 : s2598;-  const SBool  s2600 = (SBool) (s2599 & 1);-  const SBool  s2601 = false != s2600;-  const SWord8 s2602 = (s2586 >> 1) | (s2586 << 7);-  const SWord8 s2603 = 128 | s2602;-  const SWord8 s2604 = 127 & s2602;-  const SWord8 s2605 = s2601 ? s2603 : s2604;-  const SBool  s2606 = (SBool) (s2605 & 1);-  const SBool  s2607 = false != s2606;-  const SBool  s2608 = !s2607;-  const SWord8 s2609 = (s2593 >> 1) | (s2593 << 7);-  const SWord8 s2610 = 128 | s2609;-  const SWord8 s2611 = 127 & s2609;-  const SWord8 s2612 = s2058 ? s2610 : s2611;-  const SWord8 s2613 = (s2612 >> 1) | (s2612 << 7);-  const SWord8 s2614 = 128 | s2613;-  const SWord8 s2615 = 127 & s2613;-  const SWord8 s2616 = s2566 ? s2614 : s2615;-  const SWord8 s2617 = (s2616 >> 1) | (s2616 << 7);-  const SWord8 s2618 = 128 | s2617;-  const SWord8 s2619 = 127 & s2617;-  const SWord8 s2620 = s2588 ? s2618 : s2619;-  const SWord8 s2621 = (s2620 >> 1) | (s2620 << 7);-  const SWord8 s2622 = 128 | s2621;-  const SWord8 s2623 = 127 & s2621;-  const SWord8 s2624 = s2607 ? s2622 : s2623;-  const SWord8 s2625 = s1 + s2620;-  const SBool  s2626 = s2625 < s1;-  const SBool  s2627 = s2625 < s2620;-  const SBool  s2628 = s2626 || s2627;-  const SWord8 s2629 = (s2625 >> 1) | (s2625 << 7);-  const SWord8 s2630 = 128 | s2629;-  const SWord8 s2631 = 127 & s2629;-  const SWord8 s2632 = s2628 ? s2630 : s2631;-  const SWord8 s2633 = s2608 ? s2624 : s2632;-  const SWord8 s2634 = s1 + s2616;-  const SBool  s2635 = s2634 < s1;-  const SBool  s2636 = s2634 < s2616;-  const SBool  s2637 = s2635 || s2636;-  const SWord8 s2638 = (s2634 >> 1) | (s2634 << 7);-  const SWord8 s2639 = 128 | s2638;-  const SWord8 s2640 = 127 & s2638;-  const SWord8 s2641 = s2637 ? s2639 : s2640;-  const SWord8 s2642 = (s2641 >> 1) | (s2641 << 7);-  const SWord8 s2643 = 128 | s2642;-  const SWord8 s2644 = 127 & s2642;-  const SWord8 s2645 = s2607 ? s2643 : s2644;-  const SWord8 s2646 = s1 + s2641;-  const SBool  s2647 = s2646 < s1;-  const SBool  s2648 = s2646 < s2641;-  const SBool  s2649 = s2647 || s2648;-  const SWord8 s2650 = (s2646 >> 1) | (s2646 << 7);-  const SWord8 s2651 = 128 | s2650;-  const SWord8 s2652 = 127 & s2650;-  const SWord8 s2653 = s2649 ? s2651 : s2652;-  const SWord8 s2654 = s2608 ? s2645 : s2653;-  const SWord8 s2655 = s2589 ? s2633 : s2654;-  const SWord8 s2656 = s1 + s2612;-  const SBool  s2657 = s2656 < s1;-  const SBool  s2658 = s2656 < s2612;-  const SBool  s2659 = s2657 || s2658;-  const SWord8 s2660 = (s2656 >> 1) | (s2656 << 7);-  const SWord8 s2661 = 128 | s2660;-  const SWord8 s2662 = 127 & s2660;-  const SWord8 s2663 = s2659 ? s2661 : s2662;-  const SWord8 s2664 = (s2663 >> 1) | (s2663 << 7);-  const SWord8 s2665 = 128 | s2664;-  const SWord8 s2666 = 127 & s2664;-  const SWord8 s2667 = s2588 ? s2665 : s2666;-  const SWord8 s2668 = (s2667 >> 1) | (s2667 << 7);-  const SWord8 s2669 = 128 | s2668;-  const SWord8 s2670 = 127 & s2668;-  const SWord8 s2671 = s2607 ? s2669 : s2670;-  const SWord8 s2672 = s1 + s2667;-  const SBool  s2673 = s2672 < s1;-  const SBool  s2674 = s2672 < s2667;-  const SBool  s2675 = s2673 || s2674;-  const SWord8 s2676 = (s2672 >> 1) | (s2672 << 7);-  const SWord8 s2677 = 128 | s2676;-  const SWord8 s2678 = 127 & s2676;-  const SWord8 s2679 = s2675 ? s2677 : s2678;-  const SWord8 s2680 = s2608 ? s2671 : s2679;-  const SWord8 s2681 = s1 + s2663;-  const SBool  s2682 = s2681 < s1;-  const SBool  s2683 = s2681 < s2663;-  const SBool  s2684 = s2682 || s2683;-  const SWord8 s2685 = (s2681 >> 1) | (s2681 << 7);-  const SWord8 s2686 = 128 | s2685;-  const SWord8 s2687 = 127 & s2685;-  const SWord8 s2688 = s2684 ? s2686 : s2687;-  const SWord8 s2689 = (s2688 >> 1) | (s2688 << 7);-  const SWord8 s2690 = 128 | s2689;-  const SWord8 s2691 = 127 & s2689;-  const SWord8 s2692 = s2607 ? s2690 : s2691;-  const SWord8 s2693 = s1 + s2688;-  const SBool  s2694 = s2693 < s1;-  const SBool  s2695 = s2693 < s2688;-  const SBool  s2696 = s2694 || s2695;-  const SWord8 s2697 = (s2693 >> 1) | (s2693 << 7);-  const SWord8 s2698 = 128 | s2697;-  const SWord8 s2699 = 127 & s2697;-  const SWord8 s2700 = s2696 ? s2698 : s2699;-  const SWord8 s2701 = s2608 ? s2692 : s2700;-  const SWord8 s2702 = s2589 ? s2680 : s2701;-  const SWord8 s2703 = s2567 ? s2655 : s2702;-  const SWord8 s2704 = s1 + s2593;-  const SBool  s2705 = (SBool) (s2704 & 1);-  const SBool  s2706 = false != s2705;-  const SWord8 s2707 = s2706 ? s2597 : s2598;-  const SBool  s2708 = (SBool) (s2707 & 1);-  const SBool  s2709 = false != s2708;-  const SWord8 s2710 = s2709 ? s2603 : s2604;-  const SBool  s2711 = (SBool) (s2710 & 1);-  const SBool  s2712 = false != s2711;-  const SBool  s2713 = !s2712;-  const SBool  s2714 = s2704 < s1;-  const SBool  s2715 = s2704 < s2593;-  const SBool  s2716 = s2714 || s2715;-  const SWord8 s2717 = (s2704 >> 1) | (s2704 << 7);-  const SWord8 s2718 = 128 | s2717;-  const SWord8 s2719 = 127 & s2717;-  const SWord8 s2720 = s2716 ? s2718 : s2719;-  const SWord8 s2721 = (s2720 >> 1) | (s2720 << 7);-  const SWord8 s2722 = 128 | s2721;-  const SWord8 s2723 = 127 & s2721;-  const SWord8 s2724 = s2566 ? s2722 : s2723;-  const SWord8 s2725 = (s2724 >> 1) | (s2724 << 7);-  const SWord8 s2726 = 128 | s2725;-  const SWord8 s2727 = 127 & s2725;-  const SWord8 s2728 = s2588 ? s2726 : s2727;-  const SWord8 s2729 = (s2728 >> 1) | (s2728 << 7);-  const SWord8 s2730 = 128 | s2729;-  const SWord8 s2731 = 127 & s2729;-  const SWord8 s2732 = s2712 ? s2730 : s2731;-  const SWord8 s2733 = s1 + s2728;-  const SBool  s2734 = s2733 < s1;-  const SBool  s2735 = s2733 < s2728;-  const SBool  s2736 = s2734 || s2735;-  const SWord8 s2737 = (s2733 >> 1) | (s2733 << 7);-  const SWord8 s2738 = 128 | s2737;-  const SWord8 s2739 = 127 & s2737;-  const SWord8 s2740 = s2736 ? s2738 : s2739;-  const SWord8 s2741 = s2713 ? s2732 : s2740;-  const SWord8 s2742 = s1 + s2724;-  const SBool  s2743 = s2742 < s1;-  const SBool  s2744 = s2742 < s2724;-  const SBool  s2745 = s2743 || s2744;-  const SWord8 s2746 = (s2742 >> 1) | (s2742 << 7);-  const SWord8 s2747 = 128 | s2746;-  const SWord8 s2748 = 127 & s2746;-  const SWord8 s2749 = s2745 ? s2747 : s2748;-  const SWord8 s2750 = (s2749 >> 1) | (s2749 << 7);-  const SWord8 s2751 = 128 | s2750;-  const SWord8 s2752 = 127 & s2750;-  const SWord8 s2753 = s2712 ? s2751 : s2752;-  const SWord8 s2754 = s1 + s2749;-  const SBool  s2755 = s2754 < s1;-  const SBool  s2756 = s2754 < s2749;-  const SBool  s2757 = s2755 || s2756;-  const SWord8 s2758 = (s2754 >> 1) | (s2754 << 7);-  const SWord8 s2759 = 128 | s2758;-  const SWord8 s2760 = 127 & s2758;-  const SWord8 s2761 = s2757 ? s2759 : s2760;-  const SWord8 s2762 = s2713 ? s2753 : s2761;-  const SWord8 s2763 = s2589 ? s2741 : s2762;-  const SWord8 s2764 = s1 + s2720;-  const SBool  s2765 = s2764 < s1;-  const SBool  s2766 = s2764 < s2720;-  const SBool  s2767 = s2765 || s2766;-  const SWord8 s2768 = (s2764 >> 1) | (s2764 << 7);-  const SWord8 s2769 = 128 | s2768;-  const SWord8 s2770 = 127 & s2768;-  const SWord8 s2771 = s2767 ? s2769 : s2770;-  const SWord8 s2772 = (s2771 >> 1) | (s2771 << 7);-  const SWord8 s2773 = 128 | s2772;-  const SWord8 s2774 = 127 & s2772;-  const SWord8 s2775 = s2588 ? s2773 : s2774;-  const SWord8 s2776 = (s2775 >> 1) | (s2775 << 7);-  const SWord8 s2777 = 128 | s2776;-  const SWord8 s2778 = 127 & s2776;-  const SWord8 s2779 = s2712 ? s2777 : s2778;-  const SWord8 s2780 = s1 + s2775;-  const SBool  s2781 = s2780 < s1;-  const SBool  s2782 = s2780 < s2775;-  const SBool  s2783 = s2781 || s2782;-  const SWord8 s2784 = (s2780 >> 1) | (s2780 << 7);-  const SWord8 s2785 = 128 | s2784;-  const SWord8 s2786 = 127 & s2784;-  const SWord8 s2787 = s2783 ? s2785 : s2786;-  const SWord8 s2788 = s2713 ? s2779 : s2787;-  const SWord8 s2789 = s1 + s2771;-  const SBool  s2790 = s2789 < s1;-  const SBool  s2791 = s2789 < s2771;-  const SBool  s2792 = s2790 || s2791;-  const SWord8 s2793 = (s2789 >> 1) | (s2789 << 7);-  const SWord8 s2794 = 128 | s2793;-  const SWord8 s2795 = 127 & s2793;-  const SWord8 s2796 = s2792 ? s2794 : s2795;-  const SWord8 s2797 = (s2796 >> 1) | (s2796 << 7);-  const SWord8 s2798 = 128 | s2797;-  const SWord8 s2799 = 127 & s2797;-  const SWord8 s2800 = s2712 ? s2798 : s2799;-  const SWord8 s2801 = s1 + s2796;-  const SBool  s2802 = s2801 < s1;-  const SBool  s2803 = s2801 < s2796;-  const SBool  s2804 = s2802 || s2803;-  const SWord8 s2805 = (s2801 >> 1) | (s2801 << 7);-  const SWord8 s2806 = 128 | s2805;-  const SWord8 s2807 = 127 & s2805;-  const SWord8 s2808 = s2804 ? s2806 : s2807;-  const SWord8 s2809 = s2713 ? s2800 : s2808;-  const SWord8 s2810 = s2589 ? s2788 : s2809;-  const SWord8 s2811 = s2567 ? s2763 : s2810;-  const SWord8 s2812 = s2059 ? s2703 : s2811;-  const SWord8 s2813 = s1 + s2574;-  const SBool  s2814 = (SBool) (s2813 & 1);-  const SBool  s2815 = false != s2814;-  const SWord8 s2816 = s2815 ? s2578 : s2579;-  const SBool  s2817 = (SBool) (s2816 & 1);-  const SBool  s2818 = false != s2817;-  const SWord8 s2819 = s2818 ? s2584 : s2585;-  const SBool  s2820 = (SBool) (s2819 & 1);-  const SBool  s2821 = false != s2820;-  const SBool  s2822 = !s2821;-  const SBool  s2823 = s2813 < s1;-  const SBool  s2824 = s2813 < s2574;-  const SBool  s2825 = s2823 || s2824;-  const SWord8 s2826 = (s2813 >> 1) | (s2813 << 7);-  const SWord8 s2827 = 128 | s2826;-  const SWord8 s2828 = 127 & s2826;-  const SWord8 s2829 = s2825 ? s2827 : s2828;-  const SBool  s2830 = (SBool) (s2829 & 1);-  const SBool  s2831 = false != s2830;-  const SWord8 s2832 = (s2816 >> 1) | (s2816 << 7);-  const SWord8 s2833 = 128 | s2832;-  const SWord8 s2834 = 127 & s2832;-  const SWord8 s2835 = s2831 ? s2833 : s2834;-  const SBool  s2836 = (SBool) (s2835 & 1);-  const SBool  s2837 = false != s2836;-  const SWord8 s2838 = (s2819 >> 1) | (s2819 << 7);-  const SWord8 s2839 = 128 | s2838;-  const SWord8 s2840 = 127 & s2838;-  const SWord8 s2841 = s2837 ? s2839 : s2840;-  const SBool  s2842 = (SBool) (s2841 & 1);-  const SBool  s2843 = false != s2842;-  const SBool  s2844 = !s2843;-  const SWord8 s2845 = (s2829 >> 1) | (s2829 << 7);-  const SWord8 s2846 = 128 | s2845;-  const SWord8 s2847 = 127 & s2845;-  const SWord8 s2848 = s2058 ? s2846 : s2847;-  const SWord8 s2849 = (s2848 >> 1) | (s2848 << 7);-  const SWord8 s2850 = 128 | s2849;-  const SWord8 s2851 = 127 & s2849;-  const SWord8 s2852 = s2566 ? s2850 : s2851;-  const SWord8 s2853 = (s2852 >> 1) | (s2852 << 7);-  const SWord8 s2854 = 128 | s2853;-  const SWord8 s2855 = 127 & s2853;-  const SWord8 s2856 = s2821 ? s2854 : s2855;-  const SWord8 s2857 = (s2856 >> 1) | (s2856 << 7);-  const SWord8 s2858 = 128 | s2857;-  const SWord8 s2859 = 127 & s2857;-  const SWord8 s2860 = s2843 ? s2858 : s2859;-  const SWord8 s2861 = s1 + s2856;-  const SBool  s2862 = s2861 < s1;-  const SBool  s2863 = s2861 < s2856;-  const SBool  s2864 = s2862 || s2863;-  const SWord8 s2865 = (s2861 >> 1) | (s2861 << 7);-  const SWord8 s2866 = 128 | s2865;-  const SWord8 s2867 = 127 & s2865;-  const SWord8 s2868 = s2864 ? s2866 : s2867;-  const SWord8 s2869 = s2844 ? s2860 : s2868;-  const SWord8 s2870 = s1 + s2852;-  const SBool  s2871 = s2870 < s1;-  const SBool  s2872 = s2870 < s2852;-  const SBool  s2873 = s2871 || s2872;-  const SWord8 s2874 = (s2870 >> 1) | (s2870 << 7);-  const SWord8 s2875 = 128 | s2874;-  const SWord8 s2876 = 127 & s2874;-  const SWord8 s2877 = s2873 ? s2875 : s2876;-  const SWord8 s2878 = (s2877 >> 1) | (s2877 << 7);-  const SWord8 s2879 = 128 | s2878;-  const SWord8 s2880 = 127 & s2878;-  const SWord8 s2881 = s2843 ? s2879 : s2880;-  const SWord8 s2882 = s1 + s2877;-  const SBool  s2883 = s2882 < s1;-  const SBool  s2884 = s2882 < s2877;-  const SBool  s2885 = s2883 || s2884;-  const SWord8 s2886 = (s2882 >> 1) | (s2882 << 7);-  const SWord8 s2887 = 128 | s2886;-  const SWord8 s2888 = 127 & s2886;-  const SWord8 s2889 = s2885 ? s2887 : s2888;-  const SWord8 s2890 = s2844 ? s2881 : s2889;-  const SWord8 s2891 = s2822 ? s2869 : s2890;-  const SWord8 s2892 = s1 + s2848;-  const SBool  s2893 = s2892 < s1;-  const SBool  s2894 = s2892 < s2848;-  const SBool  s2895 = s2893 || s2894;-  const SWord8 s2896 = (s2892 >> 1) | (s2892 << 7);-  const SWord8 s2897 = 128 | s2896;-  const SWord8 s2898 = 127 & s2896;-  const SWord8 s2899 = s2895 ? s2897 : s2898;-  const SWord8 s2900 = (s2899 >> 1) | (s2899 << 7);-  const SWord8 s2901 = 128 | s2900;-  const SWord8 s2902 = 127 & s2900;-  const SWord8 s2903 = s2821 ? s2901 : s2902;-  const SWord8 s2904 = (s2903 >> 1) | (s2903 << 7);-  const SWord8 s2905 = 128 | s2904;-  const SWord8 s2906 = 127 & s2904;-  const SWord8 s2907 = s2843 ? s2905 : s2906;-  const SWord8 s2908 = s1 + s2903;-  const SBool  s2909 = s2908 < s1;-  const SBool  s2910 = s2908 < s2903;-  const SBool  s2911 = s2909 || s2910;-  const SWord8 s2912 = (s2908 >> 1) | (s2908 << 7);-  const SWord8 s2913 = 128 | s2912;-  const SWord8 s2914 = 127 & s2912;-  const SWord8 s2915 = s2911 ? s2913 : s2914;-  const SWord8 s2916 = s2844 ? s2907 : s2915;-  const SWord8 s2917 = s1 + s2899;-  const SBool  s2918 = s2917 < s1;-  const SBool  s2919 = s2917 < s2899;-  const SBool  s2920 = s2918 || s2919;-  const SWord8 s2921 = (s2917 >> 1) | (s2917 << 7);-  const SWord8 s2922 = 128 | s2921;-  const SWord8 s2923 = 127 & s2921;-  const SWord8 s2924 = s2920 ? s2922 : s2923;-  const SWord8 s2925 = (s2924 >> 1) | (s2924 << 7);-  const SWord8 s2926 = 128 | s2925;-  const SWord8 s2927 = 127 & s2925;-  const SWord8 s2928 = s2843 ? s2926 : s2927;-  const SWord8 s2929 = s1 + s2924;-  const SBool  s2930 = s2929 < s1;-  const SBool  s2931 = s2929 < s2924;-  const SBool  s2932 = s2930 || s2931;-  const SWord8 s2933 = (s2929 >> 1) | (s2929 << 7);-  const SWord8 s2934 = 128 | s2933;-  const SWord8 s2935 = 127 & s2933;-  const SWord8 s2936 = s2932 ? s2934 : s2935;-  const SWord8 s2937 = s2844 ? s2928 : s2936;-  const SWord8 s2938 = s2822 ? s2916 : s2937;-  const SWord8 s2939 = s2567 ? s2891 : s2938;-  const SWord8 s2940 = s1 + s2829;-  const SBool  s2941 = (SBool) (s2940 & 1);-  const SBool  s2942 = false != s2941;-  const SWord8 s2943 = s2942 ? s2833 : s2834;-  const SBool  s2944 = (SBool) (s2943 & 1);-  const SBool  s2945 = false != s2944;-  const SWord8 s2946 = s2945 ? s2839 : s2840;-  const SBool  s2947 = (SBool) (s2946 & 1);-  const SBool  s2948 = false != s2947;-  const SBool  s2949 = !s2948;-  const SBool  s2950 = s2940 < s1;-  const SBool  s2951 = s2940 < s2829;-  const SBool  s2952 = s2950 || s2951;-  const SWord8 s2953 = (s2940 >> 1) | (s2940 << 7);-  const SWord8 s2954 = 128 | s2953;-  const SWord8 s2955 = 127 & s2953;-  const SWord8 s2956 = s2952 ? s2954 : s2955;-  const SWord8 s2957 = (s2956 >> 1) | (s2956 << 7);-  const SWord8 s2958 = 128 | s2957;-  const SWord8 s2959 = 127 & s2957;-  const SWord8 s2960 = s2566 ? s2958 : s2959;-  const SWord8 s2961 = (s2960 >> 1) | (s2960 << 7);-  const SWord8 s2962 = 128 | s2961;-  const SWord8 s2963 = 127 & s2961;-  const SWord8 s2964 = s2821 ? s2962 : s2963;-  const SWord8 s2965 = (s2964 >> 1) | (s2964 << 7);-  const SWord8 s2966 = 128 | s2965;-  const SWord8 s2967 = 127 & s2965;-  const SWord8 s2968 = s2948 ? s2966 : s2967;-  const SWord8 s2969 = s1 + s2964;-  const SBool  s2970 = s2969 < s1;-  const SBool  s2971 = s2969 < s2964;-  const SBool  s2972 = s2970 || s2971;-  const SWord8 s2973 = (s2969 >> 1) | (s2969 << 7);-  const SWord8 s2974 = 128 | s2973;-  const SWord8 s2975 = 127 & s2973;-  const SWord8 s2976 = s2972 ? s2974 : s2975;-  const SWord8 s2977 = s2949 ? s2968 : s2976;-  const SWord8 s2978 = s1 + s2960;-  const SBool  s2979 = s2978 < s1;-  const SBool  s2980 = s2978 < s2960;-  const SBool  s2981 = s2979 || s2980;-  const SWord8 s2982 = (s2978 >> 1) | (s2978 << 7);-  const SWord8 s2983 = 128 | s2982;-  const SWord8 s2984 = 127 & s2982;-  const SWord8 s2985 = s2981 ? s2983 : s2984;-  const SWord8 s2986 = (s2985 >> 1) | (s2985 << 7);-  const SWord8 s2987 = 128 | s2986;-  const SWord8 s2988 = 127 & s2986;-  const SWord8 s2989 = s2948 ? s2987 : s2988;-  const SWord8 s2990 = s1 + s2985;-  const SBool  s2991 = s2990 < s1;-  const SBool  s2992 = s2990 < s2985;-  const SBool  s2993 = s2991 || s2992;-  const SWord8 s2994 = (s2990 >> 1) | (s2990 << 7);-  const SWord8 s2995 = 128 | s2994;-  const SWord8 s2996 = 127 & s2994;-  const SWord8 s2997 = s2993 ? s2995 : s2996;-  const SWord8 s2998 = s2949 ? s2989 : s2997;-  const SWord8 s2999 = s2822 ? s2977 : s2998;-  const SWord8 s3000 = s1 + s2956;-  const SBool  s3001 = s3000 < s1;-  const SBool  s3002 = s3000 < s2956;-  const SBool  s3003 = s3001 || s3002;-  const SWord8 s3004 = (s3000 >> 1) | (s3000 << 7);-  const SWord8 s3005 = 128 | s3004;-  const SWord8 s3006 = 127 & s3004;-  const SWord8 s3007 = s3003 ? s3005 : s3006;-  const SWord8 s3008 = (s3007 >> 1) | (s3007 << 7);-  const SWord8 s3009 = 128 | s3008;-  const SWord8 s3010 = 127 & s3008;-  const SWord8 s3011 = s2821 ? s3009 : s3010;-  const SWord8 s3012 = (s3011 >> 1) | (s3011 << 7);-  const SWord8 s3013 = 128 | s3012;-  const SWord8 s3014 = 127 & s3012;-  const SWord8 s3015 = s2948 ? s3013 : s3014;-  const SWord8 s3016 = s1 + s3011;-  const SBool  s3017 = s3016 < s1;-  const SBool  s3018 = s3016 < s3011;-  const SBool  s3019 = s3017 || s3018;-  const SWord8 s3020 = (s3016 >> 1) | (s3016 << 7);-  const SWord8 s3021 = 128 | s3020;-  const SWord8 s3022 = 127 & s3020;-  const SWord8 s3023 = s3019 ? s3021 : s3022;-  const SWord8 s3024 = s2949 ? s3015 : s3023;-  const SWord8 s3025 = s1 + s3007;-  const SBool  s3026 = s3025 < s1;-  const SBool  s3027 = s3025 < s3007;-  const SBool  s3028 = s3026 || s3027;-  const SWord8 s3029 = (s3025 >> 1) | (s3025 << 7);-  const SWord8 s3030 = 128 | s3029;-  const SWord8 s3031 = 127 & s3029;-  const SWord8 s3032 = s3028 ? s3030 : s3031;-  const SWord8 s3033 = (s3032 >> 1) | (s3032 << 7);-  const SWord8 s3034 = 128 | s3033;-  const SWord8 s3035 = 127 & s3033;-  const SWord8 s3036 = s2948 ? s3034 : s3035;-  const SWord8 s3037 = s1 + s3032;-  const SBool  s3038 = s3037 < s1;-  const SBool  s3039 = s3037 < s3032;-  const SBool  s3040 = s3038 || s3039;-  const SWord8 s3041 = (s3037 >> 1) | (s3037 << 7);-  const SWord8 s3042 = 128 | s3041;-  const SWord8 s3043 = 127 & s3041;-  const SWord8 s3044 = s3040 ? s3042 : s3043;-  const SWord8 s3045 = s2949 ? s3036 : s3044;-  const SWord8 s3046 = s2822 ? s3024 : s3045;-  const SWord8 s3047 = s2567 ? s2999 : s3046;-  const SWord8 s3048 = s2059 ? s2939 : s3047;-  const SWord8 s3049 = s2042 ? s2812 : s3048;-  const SWord8 s3050 = s16 ? s2557 : s3049;-  const SWord8 s3051 = s1 + s2044;-  const SBool  s3052 = (SBool) (s3051 & 1);-  const SBool  s3053 = false != s3052;-  const SWord8 s3054 = s3053 ? s2048 : s2049;-  const SBool  s3055 = (SBool) (s3054 & 1);-  const SBool  s3056 = false != s3055;-  const SWord8 s3057 = s3056 ? s2054 : s2055;-  const SBool  s3058 = (SBool) (s3057 & 1);-  const SBool  s3059 = false != s3058;-  const SBool  s3060 = !s3059;-  const SBool  s3061 = s3051 < s1;-  const SBool  s3062 = s3051 < s2044;-  const SBool  s3063 = s3061 || s3062;-  const SWord8 s3064 = (s3051 >> 1) | (s3051 << 7);-  const SWord8 s3065 = 128 | s3064;-  const SWord8 s3066 = 127 & s3064;-  const SWord8 s3067 = s3063 ? s3065 : s3066;-  const SBool  s3068 = (SBool) (s3067 & 1);-  const SBool  s3069 = false != s3068;-  const SWord8 s3070 = (s3054 >> 1) | (s3054 << 7);-  const SWord8 s3071 = 128 | s3070;-  const SWord8 s3072 = 127 & s3070;-  const SWord8 s3073 = s3069 ? s3071 : s3072;-  const SBool  s3074 = (SBool) (s3073 & 1);-  const SBool  s3075 = false != s3074;-  const SWord8 s3076 = (s3057 >> 1) | (s3057 << 7);-  const SWord8 s3077 = 128 | s3076;-  const SWord8 s3078 = 127 & s3076;-  const SWord8 s3079 = s3075 ? s3077 : s3078;-  const SBool  s3080 = (SBool) (s3079 & 1);-  const SBool  s3081 = false != s3080;-  const SBool  s3082 = !s3081;-  const SWord8 s3083 = (s3067 >> 1) | (s3067 << 7);-  const SWord8 s3084 = 128 | s3083;-  const SWord8 s3085 = 127 & s3083;-  const SWord8 s3086 = s15 ? s3084 : s3085;-  const SBool  s3087 = (SBool) (s3086 & 1);-  const SBool  s3088 = false != s3087;-  const SWord8 s3089 = (s3073 >> 1) | (s3073 << 7);-  const SWord8 s3090 = 128 | s3089;-  const SWord8 s3091 = 127 & s3089;-  const SWord8 s3092 = s3088 ? s3090 : s3091;-  const SBool  s3093 = (SBool) (s3092 & 1);-  const SBool  s3094 = false != s3093;-  const SWord8 s3095 = (s3079 >> 1) | (s3079 << 7);-  const SWord8 s3096 = 128 | s3095;-  const SWord8 s3097 = 127 & s3095;-  const SWord8 s3098 = s3094 ? s3096 : s3097;-  const SBool  s3099 = (SBool) (s3098 & 1);-  const SBool  s3100 = false != s3099;-  const SBool  s3101 = !s3100;-  const SWord8 s3102 = (s3086 >> 1) | (s3086 << 7);-  const SWord8 s3103 = 128 | s3102;-  const SWord8 s3104 = 127 & s3102;-  const SWord8 s3105 = s2041 ? s3103 : s3104;-  const SBool  s3106 = (SBool) (s3105 & 1);-  const SBool  s3107 = false != s3106;-  const SWord8 s3108 = (s3092 >> 1) | (s3092 << 7);-  const SWord8 s3109 = 128 | s3108;-  const SWord8 s3110 = 127 & s3108;-  const SWord8 s3111 = s3107 ? s3109 : s3110;-  const SBool  s3112 = (SBool) (s3111 & 1);-  const SBool  s3113 = false != s3112;-  const SWord8 s3114 = (s3098 >> 1) | (s3098 << 7);-  const SWord8 s3115 = 128 | s3114;-  const SWord8 s3116 = 127 & s3114;-  const SWord8 s3117 = s3113 ? s3115 : s3116;-  const SBool  s3118 = (SBool) (s3117 & 1);-  const SBool  s3119 = false != s3118;-  const SBool  s3120 = !s3119;-  const SWord8 s3121 = (s3105 >> 1) | (s3105 << 7);-  const SWord8 s3122 = 128 | s3121;-  const SWord8 s3123 = 127 & s3121;-  const SWord8 s3124 = s3059 ? s3122 : s3123;-  const SWord8 s3125 = (s3124 >> 1) | (s3124 << 7);-  const SWord8 s3126 = 128 | s3125;-  const SWord8 s3127 = 127 & s3125;-  const SWord8 s3128 = s3081 ? s3126 : s3127;-  const SWord8 s3129 = (s3128 >> 1) | (s3128 << 7);-  const SWord8 s3130 = 128 | s3129;-  const SWord8 s3131 = 127 & s3129;-  const SWord8 s3132 = s3100 ? s3130 : s3131;-  const SWord8 s3133 = (s3132 >> 1) | (s3132 << 7);-  const SWord8 s3134 = 128 | s3133;-  const SWord8 s3135 = 127 & s3133;-  const SWord8 s3136 = s3119 ? s3134 : s3135;-  const SWord8 s3137 = s1 + s3132;-  const SBool  s3138 = s3137 < s1;-  const SBool  s3139 = s3137 < s3132;-  const SBool  s3140 = s3138 || s3139;-  const SWord8 s3141 = (s3137 >> 1) | (s3137 << 7);-  const SWord8 s3142 = 128 | s3141;-  const SWord8 s3143 = 127 & s3141;-  const SWord8 s3144 = s3140 ? s3142 : s3143;-  const SWord8 s3145 = s3120 ? s3136 : s3144;-  const SWord8 s3146 = s1 + s3128;-  const SBool  s3147 = s3146 < s1;-  const SBool  s3148 = s3146 < s3128;-  const SBool  s3149 = s3147 || s3148;-  const SWord8 s3150 = (s3146 >> 1) | (s3146 << 7);-  const SWord8 s3151 = 128 | s3150;-  const SWord8 s3152 = 127 & s3150;-  const SWord8 s3153 = s3149 ? s3151 : s3152;-  const SWord8 s3154 = (s3153 >> 1) | (s3153 << 7);-  const SWord8 s3155 = 128 | s3154;-  const SWord8 s3156 = 127 & s3154;-  const SWord8 s3157 = s3119 ? s3155 : s3156;-  const SWord8 s3158 = s1 + s3153;-  const SBool  s3159 = s3158 < s1;-  const SBool  s3160 = s3158 < s3153;-  const SBool  s3161 = s3159 || s3160;-  const SWord8 s3162 = (s3158 >> 1) | (s3158 << 7);-  const SWord8 s3163 = 128 | s3162;-  const SWord8 s3164 = 127 & s3162;-  const SWord8 s3165 = s3161 ? s3163 : s3164;-  const SWord8 s3166 = s3120 ? s3157 : s3165;-  const SWord8 s3167 = s3101 ? s3145 : s3166;-  const SWord8 s3168 = s1 + s3124;-  const SBool  s3169 = s3168 < s1;-  const SBool  s3170 = s3168 < s3124;-  const SBool  s3171 = s3169 || s3170;-  const SWord8 s3172 = (s3168 >> 1) | (s3168 << 7);-  const SWord8 s3173 = 128 | s3172;-  const SWord8 s3174 = 127 & s3172;-  const SWord8 s3175 = s3171 ? s3173 : s3174;-  const SWord8 s3176 = (s3175 >> 1) | (s3175 << 7);-  const SWord8 s3177 = 128 | s3176;-  const SWord8 s3178 = 127 & s3176;-  const SWord8 s3179 = s3100 ? s3177 : s3178;-  const SWord8 s3180 = (s3179 >> 1) | (s3179 << 7);-  const SWord8 s3181 = 128 | s3180;-  const SWord8 s3182 = 127 & s3180;-  const SWord8 s3183 = s3119 ? s3181 : s3182;-  const SWord8 s3184 = s1 + s3179;-  const SBool  s3185 = s3184 < s1;-  const SBool  s3186 = s3184 < s3179;-  const SBool  s3187 = s3185 || s3186;-  const SWord8 s3188 = (s3184 >> 1) | (s3184 << 7);-  const SWord8 s3189 = 128 | s3188;-  const SWord8 s3190 = 127 & s3188;-  const SWord8 s3191 = s3187 ? s3189 : s3190;-  const SWord8 s3192 = s3120 ? s3183 : s3191;-  const SWord8 s3193 = s1 + s3175;-  const SBool  s3194 = s3193 < s1;-  const SBool  s3195 = s3193 < s3175;-  const SBool  s3196 = s3194 || s3195;-  const SWord8 s3197 = (s3193 >> 1) | (s3193 << 7);-  const SWord8 s3198 = 128 | s3197;-  const SWord8 s3199 = 127 & s3197;-  const SWord8 s3200 = s3196 ? s3198 : s3199;-  const SWord8 s3201 = (s3200 >> 1) | (s3200 << 7);-  const SWord8 s3202 = 128 | s3201;-  const SWord8 s3203 = 127 & s3201;-  const SWord8 s3204 = s3119 ? s3202 : s3203;-  const SWord8 s3205 = s1 + s3200;-  const SBool  s3206 = s3205 < s1;-  const SBool  s3207 = s3205 < s3200;-  const SBool  s3208 = s3206 || s3207;-  const SWord8 s3209 = (s3205 >> 1) | (s3205 << 7);-  const SWord8 s3210 = 128 | s3209;-  const SWord8 s3211 = 127 & s3209;-  const SWord8 s3212 = s3208 ? s3210 : s3211;-  const SWord8 s3213 = s3120 ? s3204 : s3212;-  const SWord8 s3214 = s3101 ? s3192 : s3213;-  const SWord8 s3215 = s3082 ? s3167 : s3214;-  const SWord8 s3216 = s1 + s3105;-  const SBool  s3217 = (SBool) (s3216 & 1);-  const SBool  s3218 = false != s3217;-  const SWord8 s3219 = s3218 ? s3109 : s3110;-  const SBool  s3220 = (SBool) (s3219 & 1);-  const SBool  s3221 = false != s3220;-  const SWord8 s3222 = s3221 ? s3115 : s3116;-  const SBool  s3223 = (SBool) (s3222 & 1);-  const SBool  s3224 = false != s3223;-  const SBool  s3225 = !s3224;-  const SBool  s3226 = s3216 < s1;-  const SBool  s3227 = s3216 < s3105;-  const SBool  s3228 = s3226 || s3227;-  const SWord8 s3229 = (s3216 >> 1) | (s3216 << 7);-  const SWord8 s3230 = 128 | s3229;-  const SWord8 s3231 = 127 & s3229;-  const SWord8 s3232 = s3228 ? s3230 : s3231;-  const SWord8 s3233 = (s3232 >> 1) | (s3232 << 7);-  const SWord8 s3234 = 128 | s3233;-  const SWord8 s3235 = 127 & s3233;-  const SWord8 s3236 = s3081 ? s3234 : s3235;-  const SWord8 s3237 = (s3236 >> 1) | (s3236 << 7);-  const SWord8 s3238 = 128 | s3237;-  const SWord8 s3239 = 127 & s3237;-  const SWord8 s3240 = s3100 ? s3238 : s3239;-  const SWord8 s3241 = (s3240 >> 1) | (s3240 << 7);-  const SWord8 s3242 = 128 | s3241;-  const SWord8 s3243 = 127 & s3241;-  const SWord8 s3244 = s3224 ? s3242 : s3243;-  const SWord8 s3245 = s1 + s3240;-  const SBool  s3246 = s3245 < s1;-  const SBool  s3247 = s3245 < s3240;-  const SBool  s3248 = s3246 || s3247;-  const SWord8 s3249 = (s3245 >> 1) | (s3245 << 7);-  const SWord8 s3250 = 128 | s3249;-  const SWord8 s3251 = 127 & s3249;-  const SWord8 s3252 = s3248 ? s3250 : s3251;-  const SWord8 s3253 = s3225 ? s3244 : s3252;-  const SWord8 s3254 = s1 + s3236;-  const SBool  s3255 = s3254 < s1;-  const SBool  s3256 = s3254 < s3236;-  const SBool  s3257 = s3255 || s3256;-  const SWord8 s3258 = (s3254 >> 1) | (s3254 << 7);-  const SWord8 s3259 = 128 | s3258;-  const SWord8 s3260 = 127 & s3258;-  const SWord8 s3261 = s3257 ? s3259 : s3260;-  const SWord8 s3262 = (s3261 >> 1) | (s3261 << 7);-  const SWord8 s3263 = 128 | s3262;-  const SWord8 s3264 = 127 & s3262;-  const SWord8 s3265 = s3224 ? s3263 : s3264;-  const SWord8 s3266 = s1 + s3261;-  const SBool  s3267 = s3266 < s1;-  const SBool  s3268 = s3266 < s3261;-  const SBool  s3269 = s3267 || s3268;-  const SWord8 s3270 = (s3266 >> 1) | (s3266 << 7);-  const SWord8 s3271 = 128 | s3270;-  const SWord8 s3272 = 127 & s3270;-  const SWord8 s3273 = s3269 ? s3271 : s3272;-  const SWord8 s3274 = s3225 ? s3265 : s3273;-  const SWord8 s3275 = s3101 ? s3253 : s3274;-  const SWord8 s3276 = s1 + s3232;-  const SBool  s3277 = s3276 < s1;-  const SBool  s3278 = s3276 < s3232;-  const SBool  s3279 = s3277 || s3278;-  const SWord8 s3280 = (s3276 >> 1) | (s3276 << 7);-  const SWord8 s3281 = 128 | s3280;-  const SWord8 s3282 = 127 & s3280;-  const SWord8 s3283 = s3279 ? s3281 : s3282;-  const SWord8 s3284 = (s3283 >> 1) | (s3283 << 7);-  const SWord8 s3285 = 128 | s3284;-  const SWord8 s3286 = 127 & s3284;-  const SWord8 s3287 = s3100 ? s3285 : s3286;-  const SWord8 s3288 = (s3287 >> 1) | (s3287 << 7);-  const SWord8 s3289 = 128 | s3288;-  const SWord8 s3290 = 127 & s3288;-  const SWord8 s3291 = s3224 ? s3289 : s3290;-  const SWord8 s3292 = s1 + s3287;-  const SBool  s3293 = s3292 < s1;-  const SBool  s3294 = s3292 < s3287;-  const SBool  s3295 = s3293 || s3294;-  const SWord8 s3296 = (s3292 >> 1) | (s3292 << 7);-  const SWord8 s3297 = 128 | s3296;-  const SWord8 s3298 = 127 & s3296;-  const SWord8 s3299 = s3295 ? s3297 : s3298;-  const SWord8 s3300 = s3225 ? s3291 : s3299;-  const SWord8 s3301 = s1 + s3283;-  const SBool  s3302 = s3301 < s1;-  const SBool  s3303 = s3301 < s3283;-  const SBool  s3304 = s3302 || s3303;-  const SWord8 s3305 = (s3301 >> 1) | (s3301 << 7);-  const SWord8 s3306 = 128 | s3305;-  const SWord8 s3307 = 127 & s3305;-  const SWord8 s3308 = s3304 ? s3306 : s3307;-  const SWord8 s3309 = (s3308 >> 1) | (s3308 << 7);-  const SWord8 s3310 = 128 | s3309;-  const SWord8 s3311 = 127 & s3309;-  const SWord8 s3312 = s3224 ? s3310 : s3311;-  const SWord8 s3313 = s1 + s3308;-  const SBool  s3314 = s3313 < s1;-  const SBool  s3315 = s3313 < s3308;-  const SBool  s3316 = s3314 || s3315;-  const SWord8 s3317 = (s3313 >> 1) | (s3313 << 7);-  const SWord8 s3318 = 128 | s3317;-  const SWord8 s3319 = 127 & s3317;-  const SWord8 s3320 = s3316 ? s3318 : s3319;-  const SWord8 s3321 = s3225 ? s3312 : s3320;-  const SWord8 s3322 = s3101 ? s3300 : s3321;-  const SWord8 s3323 = s3082 ? s3275 : s3322;-  const SWord8 s3324 = s3060 ? s3215 : s3323;-  const SWord8 s3325 = s1 + s3086;-  const SBool  s3326 = (SBool) (s3325 & 1);-  const SBool  s3327 = false != s3326;-  const SWord8 s3328 = s3327 ? s3090 : s3091;-  const SBool  s3329 = (SBool) (s3328 & 1);-  const SBool  s3330 = false != s3329;-  const SWord8 s3331 = s3330 ? s3096 : s3097;-  const SBool  s3332 = (SBool) (s3331 & 1);-  const SBool  s3333 = false != s3332;-  const SBool  s3334 = !s3333;-  const SBool  s3335 = s3325 < s1;-  const SBool  s3336 = s3325 < s3086;-  const SBool  s3337 = s3335 || s3336;-  const SWord8 s3338 = (s3325 >> 1) | (s3325 << 7);-  const SWord8 s3339 = 128 | s3338;-  const SWord8 s3340 = 127 & s3338;-  const SWord8 s3341 = s3337 ? s3339 : s3340;-  const SBool  s3342 = (SBool) (s3341 & 1);-  const SBool  s3343 = false != s3342;-  const SWord8 s3344 = (s3328 >> 1) | (s3328 << 7);-  const SWord8 s3345 = 128 | s3344;-  const SWord8 s3346 = 127 & s3344;-  const SWord8 s3347 = s3343 ? s3345 : s3346;-  const SBool  s3348 = (SBool) (s3347 & 1);-  const SBool  s3349 = false != s3348;-  const SWord8 s3350 = (s3331 >> 1) | (s3331 << 7);-  const SWord8 s3351 = 128 | s3350;-  const SWord8 s3352 = 127 & s3350;-  const SWord8 s3353 = s3349 ? s3351 : s3352;-  const SBool  s3354 = (SBool) (s3353 & 1);-  const SBool  s3355 = false != s3354;-  const SBool  s3356 = !s3355;-  const SWord8 s3357 = (s3341 >> 1) | (s3341 << 7);-  const SWord8 s3358 = 128 | s3357;-  const SWord8 s3359 = 127 & s3357;-  const SWord8 s3360 = s3059 ? s3358 : s3359;-  const SWord8 s3361 = (s3360 >> 1) | (s3360 << 7);-  const SWord8 s3362 = 128 | s3361;-  const SWord8 s3363 = 127 & s3361;-  const SWord8 s3364 = s3081 ? s3362 : s3363;-  const SWord8 s3365 = (s3364 >> 1) | (s3364 << 7);-  const SWord8 s3366 = 128 | s3365;-  const SWord8 s3367 = 127 & s3365;-  const SWord8 s3368 = s3333 ? s3366 : s3367;-  const SWord8 s3369 = (s3368 >> 1) | (s3368 << 7);-  const SWord8 s3370 = 128 | s3369;-  const SWord8 s3371 = 127 & s3369;-  const SWord8 s3372 = s3355 ? s3370 : s3371;-  const SWord8 s3373 = s1 + s3368;-  const SBool  s3374 = s3373 < s1;-  const SBool  s3375 = s3373 < s3368;-  const SBool  s3376 = s3374 || s3375;-  const SWord8 s3377 = (s3373 >> 1) | (s3373 << 7);-  const SWord8 s3378 = 128 | s3377;-  const SWord8 s3379 = 127 & s3377;-  const SWord8 s3380 = s3376 ? s3378 : s3379;-  const SWord8 s3381 = s3356 ? s3372 : s3380;-  const SWord8 s3382 = s1 + s3364;-  const SBool  s3383 = s3382 < s1;-  const SBool  s3384 = s3382 < s3364;-  const SBool  s3385 = s3383 || s3384;-  const SWord8 s3386 = (s3382 >> 1) | (s3382 << 7);-  const SWord8 s3387 = 128 | s3386;-  const SWord8 s3388 = 127 & s3386;-  const SWord8 s3389 = s3385 ? s3387 : s3388;-  const SWord8 s3390 = (s3389 >> 1) | (s3389 << 7);-  const SWord8 s3391 = 128 | s3390;-  const SWord8 s3392 = 127 & s3390;-  const SWord8 s3393 = s3355 ? s3391 : s3392;-  const SWord8 s3394 = s1 + s3389;-  const SBool  s3395 = s3394 < s1;-  const SBool  s3396 = s3394 < s3389;-  const SBool  s3397 = s3395 || s3396;-  const SWord8 s3398 = (s3394 >> 1) | (s3394 << 7);-  const SWord8 s3399 = 128 | s3398;-  const SWord8 s3400 = 127 & s3398;-  const SWord8 s3401 = s3397 ? s3399 : s3400;-  const SWord8 s3402 = s3356 ? s3393 : s3401;-  const SWord8 s3403 = s3334 ? s3381 : s3402;-  const SWord8 s3404 = s1 + s3360;-  const SBool  s3405 = s3404 < s1;-  const SBool  s3406 = s3404 < s3360;-  const SBool  s3407 = s3405 || s3406;-  const SWord8 s3408 = (s3404 >> 1) | (s3404 << 7);-  const SWord8 s3409 = 128 | s3408;-  const SWord8 s3410 = 127 & s3408;-  const SWord8 s3411 = s3407 ? s3409 : s3410;-  const SWord8 s3412 = (s3411 >> 1) | (s3411 << 7);-  const SWord8 s3413 = 128 | s3412;-  const SWord8 s3414 = 127 & s3412;-  const SWord8 s3415 = s3333 ? s3413 : s3414;-  const SWord8 s3416 = (s3415 >> 1) | (s3415 << 7);-  const SWord8 s3417 = 128 | s3416;-  const SWord8 s3418 = 127 & s3416;-  const SWord8 s3419 = s3355 ? s3417 : s3418;-  const SWord8 s3420 = s1 + s3415;-  const SBool  s3421 = s3420 < s1;-  const SBool  s3422 = s3420 < s3415;-  const SBool  s3423 = s3421 || s3422;-  const SWord8 s3424 = (s3420 >> 1) | (s3420 << 7);-  const SWord8 s3425 = 128 | s3424;-  const SWord8 s3426 = 127 & s3424;-  const SWord8 s3427 = s3423 ? s3425 : s3426;-  const SWord8 s3428 = s3356 ? s3419 : s3427;-  const SWord8 s3429 = s1 + s3411;-  const SBool  s3430 = s3429 < s1;-  const SBool  s3431 = s3429 < s3411;-  const SBool  s3432 = s3430 || s3431;-  const SWord8 s3433 = (s3429 >> 1) | (s3429 << 7);-  const SWord8 s3434 = 128 | s3433;-  const SWord8 s3435 = 127 & s3433;-  const SWord8 s3436 = s3432 ? s3434 : s3435;-  const SWord8 s3437 = (s3436 >> 1) | (s3436 << 7);-  const SWord8 s3438 = 128 | s3437;-  const SWord8 s3439 = 127 & s3437;-  const SWord8 s3440 = s3355 ? s3438 : s3439;-  const SWord8 s3441 = s1 + s3436;-  const SBool  s3442 = s3441 < s1;-  const SBool  s3443 = s3441 < s3436;-  const SBool  s3444 = s3442 || s3443;-  const SWord8 s3445 = (s3441 >> 1) | (s3441 << 7);-  const SWord8 s3446 = 128 | s3445;-  const SWord8 s3447 = 127 & s3445;-  const SWord8 s3448 = s3444 ? s3446 : s3447;-  const SWord8 s3449 = s3356 ? s3440 : s3448;-  const SWord8 s3450 = s3334 ? s3428 : s3449;-  const SWord8 s3451 = s3082 ? s3403 : s3450;-  const SWord8 s3452 = s1 + s3341;-  const SBool  s3453 = (SBool) (s3452 & 1);-  const SBool  s3454 = false != s3453;-  const SWord8 s3455 = s3454 ? s3345 : s3346;-  const SBool  s3456 = (SBool) (s3455 & 1);-  const SBool  s3457 = false != s3456;-  const SWord8 s3458 = s3457 ? s3351 : s3352;-  const SBool  s3459 = (SBool) (s3458 & 1);-  const SBool  s3460 = false != s3459;-  const SBool  s3461 = !s3460;-  const SBool  s3462 = s3452 < s1;-  const SBool  s3463 = s3452 < s3341;-  const SBool  s3464 = s3462 || s3463;-  const SWord8 s3465 = (s3452 >> 1) | (s3452 << 7);-  const SWord8 s3466 = 128 | s3465;-  const SWord8 s3467 = 127 & s3465;-  const SWord8 s3468 = s3464 ? s3466 : s3467;-  const SWord8 s3469 = (s3468 >> 1) | (s3468 << 7);-  const SWord8 s3470 = 128 | s3469;-  const SWord8 s3471 = 127 & s3469;-  const SWord8 s3472 = s3081 ? s3470 : s3471;-  const SWord8 s3473 = (s3472 >> 1) | (s3472 << 7);-  const SWord8 s3474 = 128 | s3473;-  const SWord8 s3475 = 127 & s3473;-  const SWord8 s3476 = s3333 ? s3474 : s3475;-  const SWord8 s3477 = (s3476 >> 1) | (s3476 << 7);-  const SWord8 s3478 = 128 | s3477;-  const SWord8 s3479 = 127 & s3477;-  const SWord8 s3480 = s3460 ? s3478 : s3479;-  const SWord8 s3481 = s1 + s3476;-  const SBool  s3482 = s3481 < s1;-  const SBool  s3483 = s3481 < s3476;-  const SBool  s3484 = s3482 || s3483;-  const SWord8 s3485 = (s3481 >> 1) | (s3481 << 7);-  const SWord8 s3486 = 128 | s3485;-  const SWord8 s3487 = 127 & s3485;-  const SWord8 s3488 = s3484 ? s3486 : s3487;-  const SWord8 s3489 = s3461 ? s3480 : s3488;-  const SWord8 s3490 = s1 + s3472;-  const SBool  s3491 = s3490 < s1;-  const SBool  s3492 = s3490 < s3472;-  const SBool  s3493 = s3491 || s3492;-  const SWord8 s3494 = (s3490 >> 1) | (s3490 << 7);-  const SWord8 s3495 = 128 | s3494;-  const SWord8 s3496 = 127 & s3494;-  const SWord8 s3497 = s3493 ? s3495 : s3496;-  const SWord8 s3498 = (s3497 >> 1) | (s3497 << 7);-  const SWord8 s3499 = 128 | s3498;-  const SWord8 s3500 = 127 & s3498;-  const SWord8 s3501 = s3460 ? s3499 : s3500;-  const SWord8 s3502 = s1 + s3497;-  const SBool  s3503 = s3502 < s1;-  const SBool  s3504 = s3502 < s3497;-  const SBool  s3505 = s3503 || s3504;-  const SWord8 s3506 = (s3502 >> 1) | (s3502 << 7);-  const SWord8 s3507 = 128 | s3506;-  const SWord8 s3508 = 127 & s3506;-  const SWord8 s3509 = s3505 ? s3507 : s3508;-  const SWord8 s3510 = s3461 ? s3501 : s3509;-  const SWord8 s3511 = s3334 ? s3489 : s3510;-  const SWord8 s3512 = s1 + s3468;-  const SBool  s3513 = s3512 < s1;-  const SBool  s3514 = s3512 < s3468;-  const SBool  s3515 = s3513 || s3514;-  const SWord8 s3516 = (s3512 >> 1) | (s3512 << 7);-  const SWord8 s3517 = 128 | s3516;-  const SWord8 s3518 = 127 & s3516;-  const SWord8 s3519 = s3515 ? s3517 : s3518;-  const SWord8 s3520 = (s3519 >> 1) | (s3519 << 7);-  const SWord8 s3521 = 128 | s3520;-  const SWord8 s3522 = 127 & s3520;-  const SWord8 s3523 = s3333 ? s3521 : s3522;-  const SWord8 s3524 = (s3523 >> 1) | (s3523 << 7);-  const SWord8 s3525 = 128 | s3524;-  const SWord8 s3526 = 127 & s3524;-  const SWord8 s3527 = s3460 ? s3525 : s3526;-  const SWord8 s3528 = s1 + s3523;-  const SBool  s3529 = s3528 < s1;-  const SBool  s3530 = s3528 < s3523;-  const SBool  s3531 = s3529 || s3530;-  const SWord8 s3532 = (s3528 >> 1) | (s3528 << 7);-  const SWord8 s3533 = 128 | s3532;-  const SWord8 s3534 = 127 & s3532;-  const SWord8 s3535 = s3531 ? s3533 : s3534;-  const SWord8 s3536 = s3461 ? s3527 : s3535;-  const SWord8 s3537 = s1 + s3519;-  const SBool  s3538 = s3537 < s1;-  const SBool  s3539 = s3537 < s3519;-  const SBool  s3540 = s3538 || s3539;-  const SWord8 s3541 = (s3537 >> 1) | (s3537 << 7);-  const SWord8 s3542 = 128 | s3541;-  const SWord8 s3543 = 127 & s3541;-  const SWord8 s3544 = s3540 ? s3542 : s3543;-  const SWord8 s3545 = (s3544 >> 1) | (s3544 << 7);-  const SWord8 s3546 = 128 | s3545;-  const SWord8 s3547 = 127 & s3545;-  const SWord8 s3548 = s3460 ? s3546 : s3547;-  const SWord8 s3549 = s1 + s3544;-  const SBool  s3550 = s3549 < s1;-  const SBool  s3551 = s3549 < s3544;-  const SBool  s3552 = s3550 || s3551;-  const SWord8 s3553 = (s3549 >> 1) | (s3549 << 7);-  const SWord8 s3554 = 128 | s3553;-  const SWord8 s3555 = 127 & s3553;-  const SWord8 s3556 = s3552 ? s3554 : s3555;-  const SWord8 s3557 = s3461 ? s3548 : s3556;-  const SWord8 s3558 = s3334 ? s3536 : s3557;-  const SWord8 s3559 = s3082 ? s3511 : s3558;-  const SWord8 s3560 = s3060 ? s3451 : s3559;-  const SWord8 s3561 = s2042 ? s3324 : s3560;-  const SWord8 s3562 = s1 + s3067;-  const SBool  s3563 = (SBool) (s3562 & 1);-  const SBool  s3564 = false != s3563;-  const SWord8 s3565 = s3564 ? s3071 : s3072;-  const SBool  s3566 = (SBool) (s3565 & 1);-  const SBool  s3567 = false != s3566;-  const SWord8 s3568 = s3567 ? s3077 : s3078;-  const SBool  s3569 = (SBool) (s3568 & 1);-  const SBool  s3570 = false != s3569;-  const SBool  s3571 = !s3570;-  const SBool  s3572 = s3562 < s1;-  const SBool  s3573 = s3562 < s3067;-  const SBool  s3574 = s3572 || s3573;-  const SWord8 s3575 = (s3562 >> 1) | (s3562 << 7);-  const SWord8 s3576 = 128 | s3575;-  const SWord8 s3577 = 127 & s3575;-  const SWord8 s3578 = s3574 ? s3576 : s3577;-  const SBool  s3579 = (SBool) (s3578 & 1);-  const SBool  s3580 = false != s3579;-  const SWord8 s3581 = (s3565 >> 1) | (s3565 << 7);-  const SWord8 s3582 = 128 | s3581;-  const SWord8 s3583 = 127 & s3581;-  const SWord8 s3584 = s3580 ? s3582 : s3583;-  const SBool  s3585 = (SBool) (s3584 & 1);-  const SBool  s3586 = false != s3585;-  const SWord8 s3587 = (s3568 >> 1) | (s3568 << 7);-  const SWord8 s3588 = 128 | s3587;-  const SWord8 s3589 = 127 & s3587;-  const SWord8 s3590 = s3586 ? s3588 : s3589;-  const SBool  s3591 = (SBool) (s3590 & 1);-  const SBool  s3592 = false != s3591;-  const SBool  s3593 = !s3592;-  const SWord8 s3594 = (s3578 >> 1) | (s3578 << 7);-  const SWord8 s3595 = 128 | s3594;-  const SWord8 s3596 = 127 & s3594;-  const SWord8 s3597 = s2041 ? s3595 : s3596;-  const SBool  s3598 = (SBool) (s3597 & 1);-  const SBool  s3599 = false != s3598;-  const SWord8 s3600 = (s3584 >> 1) | (s3584 << 7);-  const SWord8 s3601 = 128 | s3600;-  const SWord8 s3602 = 127 & s3600;-  const SWord8 s3603 = s3599 ? s3601 : s3602;-  const SBool  s3604 = (SBool) (s3603 & 1);-  const SBool  s3605 = false != s3604;-  const SWord8 s3606 = (s3590 >> 1) | (s3590 << 7);-  const SWord8 s3607 = 128 | s3606;-  const SWord8 s3608 = 127 & s3606;-  const SWord8 s3609 = s3605 ? s3607 : s3608;-  const SBool  s3610 = (SBool) (s3609 & 1);-  const SBool  s3611 = false != s3610;-  const SBool  s3612 = !s3611;-  const SWord8 s3613 = (s3597 >> 1) | (s3597 << 7);-  const SWord8 s3614 = 128 | s3613;-  const SWord8 s3615 = 127 & s3613;-  const SWord8 s3616 = s3059 ? s3614 : s3615;-  const SWord8 s3617 = (s3616 >> 1) | (s3616 << 7);-  const SWord8 s3618 = 128 | s3617;-  const SWord8 s3619 = 127 & s3617;-  const SWord8 s3620 = s3570 ? s3618 : s3619;-  const SWord8 s3621 = (s3620 >> 1) | (s3620 << 7);-  const SWord8 s3622 = 128 | s3621;-  const SWord8 s3623 = 127 & s3621;-  const SWord8 s3624 = s3592 ? s3622 : s3623;-  const SWord8 s3625 = (s3624 >> 1) | (s3624 << 7);-  const SWord8 s3626 = 128 | s3625;-  const SWord8 s3627 = 127 & s3625;-  const SWord8 s3628 = s3611 ? s3626 : s3627;-  const SWord8 s3629 = s1 + s3624;-  const SBool  s3630 = s3629 < s1;-  const SBool  s3631 = s3629 < s3624;-  const SBool  s3632 = s3630 || s3631;-  const SWord8 s3633 = (s3629 >> 1) | (s3629 << 7);-  const SWord8 s3634 = 128 | s3633;-  const SWord8 s3635 = 127 & s3633;-  const SWord8 s3636 = s3632 ? s3634 : s3635;-  const SWord8 s3637 = s3612 ? s3628 : s3636;-  const SWord8 s3638 = s1 + s3620;-  const SBool  s3639 = s3638 < s1;-  const SBool  s3640 = s3638 < s3620;-  const SBool  s3641 = s3639 || s3640;-  const SWord8 s3642 = (s3638 >> 1) | (s3638 << 7);-  const SWord8 s3643 = 128 | s3642;-  const SWord8 s3644 = 127 & s3642;-  const SWord8 s3645 = s3641 ? s3643 : s3644;-  const SWord8 s3646 = (s3645 >> 1) | (s3645 << 7);-  const SWord8 s3647 = 128 | s3646;-  const SWord8 s3648 = 127 & s3646;-  const SWord8 s3649 = s3611 ? s3647 : s3648;-  const SWord8 s3650 = s1 + s3645;-  const SBool  s3651 = s3650 < s1;-  const SBool  s3652 = s3650 < s3645;-  const SBool  s3653 = s3651 || s3652;-  const SWord8 s3654 = (s3650 >> 1) | (s3650 << 7);-  const SWord8 s3655 = 128 | s3654;-  const SWord8 s3656 = 127 & s3654;-  const SWord8 s3657 = s3653 ? s3655 : s3656;-  const SWord8 s3658 = s3612 ? s3649 : s3657;-  const SWord8 s3659 = s3593 ? s3637 : s3658;-  const SWord8 s3660 = s1 + s3616;-  const SBool  s3661 = s3660 < s1;-  const SBool  s3662 = s3660 < s3616;-  const SBool  s3663 = s3661 || s3662;-  const SWord8 s3664 = (s3660 >> 1) | (s3660 << 7);-  const SWord8 s3665 = 128 | s3664;-  const SWord8 s3666 = 127 & s3664;-  const SWord8 s3667 = s3663 ? s3665 : s3666;-  const SWord8 s3668 = (s3667 >> 1) | (s3667 << 7);-  const SWord8 s3669 = 128 | s3668;-  const SWord8 s3670 = 127 & s3668;-  const SWord8 s3671 = s3592 ? s3669 : s3670;-  const SWord8 s3672 = (s3671 >> 1) | (s3671 << 7);-  const SWord8 s3673 = 128 | s3672;-  const SWord8 s3674 = 127 & s3672;-  const SWord8 s3675 = s3611 ? s3673 : s3674;-  const SWord8 s3676 = s1 + s3671;-  const SBool  s3677 = s3676 < s1;-  const SBool  s3678 = s3676 < s3671;-  const SBool  s3679 = s3677 || s3678;-  const SWord8 s3680 = (s3676 >> 1) | (s3676 << 7);-  const SWord8 s3681 = 128 | s3680;-  const SWord8 s3682 = 127 & s3680;-  const SWord8 s3683 = s3679 ? s3681 : s3682;-  const SWord8 s3684 = s3612 ? s3675 : s3683;-  const SWord8 s3685 = s1 + s3667;-  const SBool  s3686 = s3685 < s1;-  const SBool  s3687 = s3685 < s3667;-  const SBool  s3688 = s3686 || s3687;-  const SWord8 s3689 = (s3685 >> 1) | (s3685 << 7);-  const SWord8 s3690 = 128 | s3689;-  const SWord8 s3691 = 127 & s3689;-  const SWord8 s3692 = s3688 ? s3690 : s3691;-  const SWord8 s3693 = (s3692 >> 1) | (s3692 << 7);-  const SWord8 s3694 = 128 | s3693;-  const SWord8 s3695 = 127 & s3693;-  const SWord8 s3696 = s3611 ? s3694 : s3695;-  const SWord8 s3697 = s1 + s3692;-  const SBool  s3698 = s3697 < s1;-  const SBool  s3699 = s3697 < s3692;-  const SBool  s3700 = s3698 || s3699;-  const SWord8 s3701 = (s3697 >> 1) | (s3697 << 7);-  const SWord8 s3702 = 128 | s3701;-  const SWord8 s3703 = 127 & s3701;-  const SWord8 s3704 = s3700 ? s3702 : s3703;-  const SWord8 s3705 = s3612 ? s3696 : s3704;-  const SWord8 s3706 = s3593 ? s3684 : s3705;-  const SWord8 s3707 = s3571 ? s3659 : s3706;-  const SWord8 s3708 = s1 + s3597;-  const SBool  s3709 = (SBool) (s3708 & 1);-  const SBool  s3710 = false != s3709;-  const SWord8 s3711 = s3710 ? s3601 : s3602;-  const SBool  s3712 = (SBool) (s3711 & 1);-  const SBool  s3713 = false != s3712;-  const SWord8 s3714 = s3713 ? s3607 : s3608;-  const SBool  s3715 = (SBool) (s3714 & 1);-  const SBool  s3716 = false != s3715;-  const SBool  s3717 = !s3716;-  const SBool  s3718 = s3708 < s1;-  const SBool  s3719 = s3708 < s3597;-  const SBool  s3720 = s3718 || s3719;-  const SWord8 s3721 = (s3708 >> 1) | (s3708 << 7);-  const SWord8 s3722 = 128 | s3721;-  const SWord8 s3723 = 127 & s3721;-  const SWord8 s3724 = s3720 ? s3722 : s3723;-  const SWord8 s3725 = (s3724 >> 1) | (s3724 << 7);-  const SWord8 s3726 = 128 | s3725;-  const SWord8 s3727 = 127 & s3725;-  const SWord8 s3728 = s3570 ? s3726 : s3727;-  const SWord8 s3729 = (s3728 >> 1) | (s3728 << 7);-  const SWord8 s3730 = 128 | s3729;-  const SWord8 s3731 = 127 & s3729;-  const SWord8 s3732 = s3592 ? s3730 : s3731;-  const SWord8 s3733 = (s3732 >> 1) | (s3732 << 7);-  const SWord8 s3734 = 128 | s3733;-  const SWord8 s3735 = 127 & s3733;-  const SWord8 s3736 = s3716 ? s3734 : s3735;-  const SWord8 s3737 = s1 + s3732;-  const SBool  s3738 = s3737 < s1;-  const SBool  s3739 = s3737 < s3732;-  const SBool  s3740 = s3738 || s3739;-  const SWord8 s3741 = (s3737 >> 1) | (s3737 << 7);-  const SWord8 s3742 = 128 | s3741;-  const SWord8 s3743 = 127 & s3741;-  const SWord8 s3744 = s3740 ? s3742 : s3743;-  const SWord8 s3745 = s3717 ? s3736 : s3744;-  const SWord8 s3746 = s1 + s3728;-  const SBool  s3747 = s3746 < s1;-  const SBool  s3748 = s3746 < s3728;-  const SBool  s3749 = s3747 || s3748;-  const SWord8 s3750 = (s3746 >> 1) | (s3746 << 7);-  const SWord8 s3751 = 128 | s3750;-  const SWord8 s3752 = 127 & s3750;-  const SWord8 s3753 = s3749 ? s3751 : s3752;-  const SWord8 s3754 = (s3753 >> 1) | (s3753 << 7);-  const SWord8 s3755 = 128 | s3754;-  const SWord8 s3756 = 127 & s3754;-  const SWord8 s3757 = s3716 ? s3755 : s3756;-  const SWord8 s3758 = s1 + s3753;-  const SBool  s3759 = s3758 < s1;-  const SBool  s3760 = s3758 < s3753;-  const SBool  s3761 = s3759 || s3760;-  const SWord8 s3762 = (s3758 >> 1) | (s3758 << 7);-  const SWord8 s3763 = 128 | s3762;-  const SWord8 s3764 = 127 & s3762;-  const SWord8 s3765 = s3761 ? s3763 : s3764;-  const SWord8 s3766 = s3717 ? s3757 : s3765;-  const SWord8 s3767 = s3593 ? s3745 : s3766;-  const SWord8 s3768 = s1 + s3724;-  const SBool  s3769 = s3768 < s1;-  const SBool  s3770 = s3768 < s3724;-  const SBool  s3771 = s3769 || s3770;-  const SWord8 s3772 = (s3768 >> 1) | (s3768 << 7);-  const SWord8 s3773 = 128 | s3772;-  const SWord8 s3774 = 127 & s3772;-  const SWord8 s3775 = s3771 ? s3773 : s3774;-  const SWord8 s3776 = (s3775 >> 1) | (s3775 << 7);-  const SWord8 s3777 = 128 | s3776;-  const SWord8 s3778 = 127 & s3776;-  const SWord8 s3779 = s3592 ? s3777 : s3778;-  const SWord8 s3780 = (s3779 >> 1) | (s3779 << 7);-  const SWord8 s3781 = 128 | s3780;-  const SWord8 s3782 = 127 & s3780;-  const SWord8 s3783 = s3716 ? s3781 : s3782;-  const SWord8 s3784 = s1 + s3779;-  const SBool  s3785 = s3784 < s1;-  const SBool  s3786 = s3784 < s3779;-  const SBool  s3787 = s3785 || s3786;-  const SWord8 s3788 = (s3784 >> 1) | (s3784 << 7);-  const SWord8 s3789 = 128 | s3788;-  const SWord8 s3790 = 127 & s3788;-  const SWord8 s3791 = s3787 ? s3789 : s3790;-  const SWord8 s3792 = s3717 ? s3783 : s3791;-  const SWord8 s3793 = s1 + s3775;-  const SBool  s3794 = s3793 < s1;-  const SBool  s3795 = s3793 < s3775;-  const SBool  s3796 = s3794 || s3795;-  const SWord8 s3797 = (s3793 >> 1) | (s3793 << 7);-  const SWord8 s3798 = 128 | s3797;-  const SWord8 s3799 = 127 & s3797;-  const SWord8 s3800 = s3796 ? s3798 : s3799;-  const SWord8 s3801 = (s3800 >> 1) | (s3800 << 7);-  const SWord8 s3802 = 128 | s3801;-  const SWord8 s3803 = 127 & s3801;-  const SWord8 s3804 = s3716 ? s3802 : s3803;-  const SWord8 s3805 = s1 + s3800;-  const SBool  s3806 = s3805 < s1;-  const SBool  s3807 = s3805 < s3800;-  const SBool  s3808 = s3806 || s3807;-  const SWord8 s3809 = (s3805 >> 1) | (s3805 << 7);-  const SWord8 s3810 = 128 | s3809;-  const SWord8 s3811 = 127 & s3809;-  const SWord8 s3812 = s3808 ? s3810 : s3811;-  const SWord8 s3813 = s3717 ? s3804 : s3812;-  const SWord8 s3814 = s3593 ? s3792 : s3813;-  const SWord8 s3815 = s3571 ? s3767 : s3814;-  const SWord8 s3816 = s3060 ? s3707 : s3815;-  const SWord8 s3817 = s1 + s3578;-  const SBool  s3818 = (SBool) (s3817 & 1);-  const SBool  s3819 = false != s3818;-  const SWord8 s3820 = s3819 ? s3582 : s3583;-  const SBool  s3821 = (SBool) (s3820 & 1);-  const SBool  s3822 = false != s3821;-  const SWord8 s3823 = s3822 ? s3588 : s3589;-  const SBool  s3824 = (SBool) (s3823 & 1);-  const SBool  s3825 = false != s3824;-  const SBool  s3826 = !s3825;-  const SBool  s3827 = s3817 < s1;-  const SBool  s3828 = s3817 < s3578;-  const SBool  s3829 = s3827 || s3828;-  const SWord8 s3830 = (s3817 >> 1) | (s3817 << 7);-  const SWord8 s3831 = 128 | s3830;-  const SWord8 s3832 = 127 & s3830;-  const SWord8 s3833 = s3829 ? s3831 : s3832;-  const SBool  s3834 = (SBool) (s3833 & 1);-  const SBool  s3835 = false != s3834;-  const SWord8 s3836 = (s3820 >> 1) | (s3820 << 7);-  const SWord8 s3837 = 128 | s3836;-  const SWord8 s3838 = 127 & s3836;-  const SWord8 s3839 = s3835 ? s3837 : s3838;-  const SBool  s3840 = (SBool) (s3839 & 1);-  const SBool  s3841 = false != s3840;-  const SWord8 s3842 = (s3823 >> 1) | (s3823 << 7);-  const SWord8 s3843 = 128 | s3842;-  const SWord8 s3844 = 127 & s3842;-  const SWord8 s3845 = s3841 ? s3843 : s3844;-  const SBool  s3846 = (SBool) (s3845 & 1);-  const SBool  s3847 = false != s3846;-  const SBool  s3848 = !s3847;-  const SWord8 s3849 = (s3833 >> 1) | (s3833 << 7);-  const SWord8 s3850 = 128 | s3849;-  const SWord8 s3851 = 127 & s3849;-  const SWord8 s3852 = s3059 ? s3850 : s3851;-  const SWord8 s3853 = (s3852 >> 1) | (s3852 << 7);-  const SWord8 s3854 = 128 | s3853;-  const SWord8 s3855 = 127 & s3853;-  const SWord8 s3856 = s3570 ? s3854 : s3855;-  const SWord8 s3857 = (s3856 >> 1) | (s3856 << 7);-  const SWord8 s3858 = 128 | s3857;-  const SWord8 s3859 = 127 & s3857;-  const SWord8 s3860 = s3825 ? s3858 : s3859;-  const SWord8 s3861 = (s3860 >> 1) | (s3860 << 7);-  const SWord8 s3862 = 128 | s3861;-  const SWord8 s3863 = 127 & s3861;-  const SWord8 s3864 = s3847 ? s3862 : s3863;-  const SWord8 s3865 = s1 + s3860;-  const SBool  s3866 = s3865 < s1;-  const SBool  s3867 = s3865 < s3860;-  const SBool  s3868 = s3866 || s3867;-  const SWord8 s3869 = (s3865 >> 1) | (s3865 << 7);-  const SWord8 s3870 = 128 | s3869;-  const SWord8 s3871 = 127 & s3869;-  const SWord8 s3872 = s3868 ? s3870 : s3871;-  const SWord8 s3873 = s3848 ? s3864 : s3872;-  const SWord8 s3874 = s1 + s3856;-  const SBool  s3875 = s3874 < s1;-  const SBool  s3876 = s3874 < s3856;-  const SBool  s3877 = s3875 || s3876;-  const SWord8 s3878 = (s3874 >> 1) | (s3874 << 7);-  const SWord8 s3879 = 128 | s3878;-  const SWord8 s3880 = 127 & s3878;-  const SWord8 s3881 = s3877 ? s3879 : s3880;-  const SWord8 s3882 = (s3881 >> 1) | (s3881 << 7);-  const SWord8 s3883 = 128 | s3882;-  const SWord8 s3884 = 127 & s3882;-  const SWord8 s3885 = s3847 ? s3883 : s3884;-  const SWord8 s3886 = s1 + s3881;-  const SBool  s3887 = s3886 < s1;-  const SBool  s3888 = s3886 < s3881;-  const SBool  s3889 = s3887 || s3888;-  const SWord8 s3890 = (s3886 >> 1) | (s3886 << 7);-  const SWord8 s3891 = 128 | s3890;-  const SWord8 s3892 = 127 & s3890;-  const SWord8 s3893 = s3889 ? s3891 : s3892;-  const SWord8 s3894 = s3848 ? s3885 : s3893;-  const SWord8 s3895 = s3826 ? s3873 : s3894;-  const SWord8 s3896 = s1 + s3852;-  const SBool  s3897 = s3896 < s1;-  const SBool  s3898 = s3896 < s3852;-  const SBool  s3899 = s3897 || s3898;-  const SWord8 s3900 = (s3896 >> 1) | (s3896 << 7);-  const SWord8 s3901 = 128 | s3900;-  const SWord8 s3902 = 127 & s3900;-  const SWord8 s3903 = s3899 ? s3901 : s3902;-  const SWord8 s3904 = (s3903 >> 1) | (s3903 << 7);-  const SWord8 s3905 = 128 | s3904;-  const SWord8 s3906 = 127 & s3904;-  const SWord8 s3907 = s3825 ? s3905 : s3906;-  const SWord8 s3908 = (s3907 >> 1) | (s3907 << 7);-  const SWord8 s3909 = 128 | s3908;-  const SWord8 s3910 = 127 & s3908;-  const SWord8 s3911 = s3847 ? s3909 : s3910;-  const SWord8 s3912 = s1 + s3907;-  const SBool  s3913 = s3912 < s1;-  const SBool  s3914 = s3912 < s3907;-  const SBool  s3915 = s3913 || s3914;-  const SWord8 s3916 = (s3912 >> 1) | (s3912 << 7);-  const SWord8 s3917 = 128 | s3916;-  const SWord8 s3918 = 127 & s3916;-  const SWord8 s3919 = s3915 ? s3917 : s3918;-  const SWord8 s3920 = s3848 ? s3911 : s3919;-  const SWord8 s3921 = s1 + s3903;-  const SBool  s3922 = s3921 < s1;-  const SBool  s3923 = s3921 < s3903;-  const SBool  s3924 = s3922 || s3923;-  const SWord8 s3925 = (s3921 >> 1) | (s3921 << 7);-  const SWord8 s3926 = 128 | s3925;-  const SWord8 s3927 = 127 & s3925;-  const SWord8 s3928 = s3924 ? s3926 : s3927;-  const SWord8 s3929 = (s3928 >> 1) | (s3928 << 7);-  const SWord8 s3930 = 128 | s3929;-  const SWord8 s3931 = 127 & s3929;-  const SWord8 s3932 = s3847 ? s3930 : s3931;-  const SWord8 s3933 = s1 + s3928;-  const SBool  s3934 = s3933 < s1;-  const SBool  s3935 = s3933 < s3928;-  const SBool  s3936 = s3934 || s3935;-  const SWord8 s3937 = (s3933 >> 1) | (s3933 << 7);-  const SWord8 s3938 = 128 | s3937;-  const SWord8 s3939 = 127 & s3937;-  const SWord8 s3940 = s3936 ? s3938 : s3939;-  const SWord8 s3941 = s3848 ? s3932 : s3940;-  const SWord8 s3942 = s3826 ? s3920 : s3941;-  const SWord8 s3943 = s3571 ? s3895 : s3942;-  const SWord8 s3944 = s1 + s3833;-  const SBool  s3945 = (SBool) (s3944 & 1);-  const SBool  s3946 = false != s3945;-  const SWord8 s3947 = s3946 ? s3837 : s3838;-  const SBool  s3948 = (SBool) (s3947 & 1);-  const SBool  s3949 = false != s3948;-  const SWord8 s3950 = s3949 ? s3843 : s3844;-  const SBool  s3951 = (SBool) (s3950 & 1);-  const SBool  s3952 = false != s3951;-  const SBool  s3953 = !s3952;-  const SBool  s3954 = s3944 < s1;-  const SBool  s3955 = s3944 < s3833;-  const SBool  s3956 = s3954 || s3955;-  const SWord8 s3957 = (s3944 >> 1) | (s3944 << 7);-  const SWord8 s3958 = 128 | s3957;-  const SWord8 s3959 = 127 & s3957;-  const SWord8 s3960 = s3956 ? s3958 : s3959;-  const SWord8 s3961 = (s3960 >> 1) | (s3960 << 7);-  const SWord8 s3962 = 128 | s3961;-  const SWord8 s3963 = 127 & s3961;-  const SWord8 s3964 = s3570 ? s3962 : s3963;-  const SWord8 s3965 = (s3964 >> 1) | (s3964 << 7);-  const SWord8 s3966 = 128 | s3965;-  const SWord8 s3967 = 127 & s3965;-  const SWord8 s3968 = s3825 ? s3966 : s3967;-  const SWord8 s3969 = (s3968 >> 1) | (s3968 << 7);-  const SWord8 s3970 = 128 | s3969;-  const SWord8 s3971 = 127 & s3969;-  const SWord8 s3972 = s3952 ? s3970 : s3971;-  const SWord8 s3973 = s1 + s3968;-  const SBool  s3974 = s3973 < s1;-  const SBool  s3975 = s3973 < s3968;-  const SBool  s3976 = s3974 || s3975;-  const SWord8 s3977 = (s3973 >> 1) | (s3973 << 7);-  const SWord8 s3978 = 128 | s3977;-  const SWord8 s3979 = 127 & s3977;-  const SWord8 s3980 = s3976 ? s3978 : s3979;-  const SWord8 s3981 = s3953 ? s3972 : s3980;-  const SWord8 s3982 = s1 + s3964;-  const SBool  s3983 = s3982 < s1;-  const SBool  s3984 = s3982 < s3964;-  const SBool  s3985 = s3983 || s3984;-  const SWord8 s3986 = (s3982 >> 1) | (s3982 << 7);-  const SWord8 s3987 = 128 | s3986;-  const SWord8 s3988 = 127 & s3986;-  const SWord8 s3989 = s3985 ? s3987 : s3988;-  const SWord8 s3990 = (s3989 >> 1) | (s3989 << 7);-  const SWord8 s3991 = 128 | s3990;-  const SWord8 s3992 = 127 & s3990;-  const SWord8 s3993 = s3952 ? s3991 : s3992;-  const SWord8 s3994 = s1 + s3989;-  const SBool  s3995 = s3994 < s1;-  const SBool  s3996 = s3994 < s3989;-  const SBool  s3997 = s3995 || s3996;-  const SWord8 s3998 = (s3994 >> 1) | (s3994 << 7);-  const SWord8 s3999 = 128 | s3998;-  const SWord8 s4000 = 127 & s3998;-  const SWord8 s4001 = s3997 ? s3999 : s4000;-  const SWord8 s4002 = s3953 ? s3993 : s4001;-  const SWord8 s4003 = s3826 ? s3981 : s4002;-  const SWord8 s4004 = s1 + s3960;-  const SBool  s4005 = s4004 < s1;-  const SBool  s4006 = s4004 < s3960;-  const SBool  s4007 = s4005 || s4006;-  const SWord8 s4008 = (s4004 >> 1) | (s4004 << 7);-  const SWord8 s4009 = 128 | s4008;-  const SWord8 s4010 = 127 & s4008;-  const SWord8 s4011 = s4007 ? s4009 : s4010;-  const SWord8 s4012 = (s4011 >> 1) | (s4011 << 7);-  const SWord8 s4013 = 128 | s4012;-  const SWord8 s4014 = 127 & s4012;-  const SWord8 s4015 = s3825 ? s4013 : s4014;-  const SWord8 s4016 = (s4015 >> 1) | (s4015 << 7);-  const SWord8 s4017 = 128 | s4016;-  const SWord8 s4018 = 127 & s4016;-  const SWord8 s4019 = s3952 ? s4017 : s4018;-  const SWord8 s4020 = s1 + s4015;-  const SBool  s4021 = s4020 < s1;-  const SBool  s4022 = s4020 < s4015;-  const SBool  s4023 = s4021 || s4022;-  const SWord8 s4024 = (s4020 >> 1) | (s4020 << 7);-  const SWord8 s4025 = 128 | s4024;-  const SWord8 s4026 = 127 & s4024;-  const SWord8 s4027 = s4023 ? s4025 : s4026;-  const SWord8 s4028 = s3953 ? s4019 : s4027;-  const SWord8 s4029 = s1 + s4011;-  const SBool  s4030 = s4029 < s1;-  const SBool  s4031 = s4029 < s4011;-  const SBool  s4032 = s4030 || s4031;-  const SWord8 s4033 = (s4029 >> 1) | (s4029 << 7);-  const SWord8 s4034 = 128 | s4033;-  const SWord8 s4035 = 127 & s4033;-  const SWord8 s4036 = s4032 ? s4034 : s4035;-  const SWord8 s4037 = (s4036 >> 1) | (s4036 << 7);-  const SWord8 s4038 = 128 | s4037;-  const SWord8 s4039 = 127 & s4037;-  const SWord8 s4040 = s3952 ? s4038 : s4039;-  const SWord8 s4041 = s1 + s4036;-  const SBool  s4042 = s4041 < s1;-  const SBool  s4043 = s4041 < s4036;-  const SBool  s4044 = s4042 || s4043;-  const SWord8 s4045 = (s4041 >> 1) | (s4041 << 7);-  const SWord8 s4046 = 128 | s4045;-  const SWord8 s4047 = 127 & s4045;-  const SWord8 s4048 = s4044 ? s4046 : s4047;-  const SWord8 s4049 = s3953 ? s4040 : s4048;-  const SWord8 s4050 = s3826 ? s4028 : s4049;-  const SWord8 s4051 = s3571 ? s4003 : s4050;-  const SWord8 s4052 = s3060 ? s3943 : s4051;-  const SWord8 s4053 = s2042 ? s3816 : s4052;-  const SWord8 s4054 = s16 ? s3561 : s4053;-  const SWord8 s4055 = s11 ? s3050 : s4054;-  const SWord8 s4056 = s5 ? s2032 : s4055;-  const SBool  s4057 = (SBool) (s105 & 1);-  const SBool  s4058 = false != s4057;-  const SBool  s4059 = (SBool) (s101 & 1);-  const SBool  s4060 = false != s4059;-  const SBool  s4061 = (SBool) (s97 & 1);-  const SBool  s4062 = false != s4061;-  const SWord8 s4063 = (s84 >> 1) | (s84 << 7);-  const SWord8 s4064 = 128 | s4063;-  const SWord8 s4065 = 127 & s4063;-  const SWord8 s4066 = s4062 ? s4064 : s4065;-  const SWord8 s4067 = (s4066 >> 1) | (s4066 << 7);-  const SWord8 s4068 = 128 | s4067;-  const SWord8 s4069 = 127 & s4067;-  const SWord8 s4070 = s4060 ? s4068 : s4069;-  const SWord8 s4071 = (s4070 >> 1) | (s4070 << 7);-  const SWord8 s4072 = 128 | s4071;-  const SWord8 s4073 = 127 & s4071;-  const SWord8 s4074 = s4058 ? s4072 : s4073;-  const SBool  s4075 = (SBool) (s110 & 1);-  const SBool  s4076 = false != s4075;-  const SWord8 s4077 = s4076 ? s4072 : s4073;-  const SWord8 s4078 = s93 ? s4074 : s4077;-  const SBool  s4079 = (SBool) (s126 & 1);-  const SBool  s4080 = false != s4079;-  const SBool  s4081 = (SBool) (s119 & 1);-  const SBool  s4082 = false != s4081;-  const SWord8 s4083 = s4082 ? s4068 : s4069;-  const SWord8 s4084 = (s4083 >> 1) | (s4083 << 7);-  const SWord8 s4085 = 128 | s4084;-  const SWord8 s4086 = 127 & s4084;-  const SWord8 s4087 = s4080 ? s4085 : s4086;-  const SBool  s4088 = (SBool) (s131 & 1);-  const SBool  s4089 = false != s4088;-  const SWord8 s4090 = s4089 ? s4085 : s4086;-  const SWord8 s4091 = s93 ? s4087 : s4090;-  const SWord8 s4092 = s74 ? s4078 : s4091;-  const SBool  s4093 = (SBool) (s152 & 1);-  const SBool  s4094 = false != s4093;-  const SBool  s4095 = (SBool) (s148 & 1);-  const SBool  s4096 = false != s4095;-  const SBool  s4097 = (SBool) (s141 & 1);-  const SBool  s4098 = false != s4097;-  const SWord8 s4099 = s4098 ? s4064 : s4065;-  const SWord8 s4100 = (s4099 >> 1) | (s4099 << 7);-  const SWord8 s4101 = 128 | s4100;-  const SWord8 s4102 = 127 & s4100;-  const SWord8 s4103 = s4096 ? s4101 : s4102;-  const SWord8 s4104 = (s4103 >> 1) | (s4103 << 7);-  const SWord8 s4105 = 128 | s4104;-  const SWord8 s4106 = 127 & s4104;-  const SWord8 s4107 = s4094 ? s4105 : s4106;-  const SBool  s4108 = (SBool) (s157 & 1);-  const SBool  s4109 = false != s4108;-  const SWord8 s4110 = s4109 ? s4105 : s4106;-  const SWord8 s4111 = s93 ? s4107 : s4110;-  const SBool  s4112 = (SBool) (s173 & 1);-  const SBool  s4113 = false != s4112;-  const SBool  s4114 = (SBool) (s166 & 1);-  const SBool  s4115 = false != s4114;-  const SWord8 s4116 = s4115 ? s4101 : s4102;-  const SWord8 s4117 = (s4116 >> 1) | (s4116 << 7);-  const SWord8 s4118 = 128 | s4117;-  const SWord8 s4119 = 127 & s4117;-  const SWord8 s4120 = s4113 ? s4118 : s4119;-  const SBool  s4121 = (SBool) (s178 & 1);-  const SBool  s4122 = false != s4121;-  const SWord8 s4123 = s4122 ? s4118 : s4119;-  const SWord8 s4124 = s93 ? s4120 : s4123;-  const SWord8 s4125 = s74 ? s4111 : s4124;-  const SWord8 s4126 = s55 ? s4092 : s4125;-  const SBool  s4127 = (SBool) (s213 & 1);-  const SBool  s4128 = false != s4127;-  const SBool  s4129 = (SBool) (s209 & 1);-  const SBool  s4130 = false != s4129;-  const SBool  s4131 = (SBool) (s205 & 1);-  const SBool  s4132 = false != s4131;-  const SWord8 s4133 = (s192 >> 1) | (s192 << 7);-  const SWord8 s4134 = 128 | s4133;-  const SWord8 s4135 = 127 & s4133;-  const SWord8 s4136 = s4132 ? s4134 : s4135;-  const SWord8 s4137 = (s4136 >> 1) | (s4136 << 7);-  const SWord8 s4138 = 128 | s4137;-  const SWord8 s4139 = 127 & s4137;-  const SWord8 s4140 = s4130 ? s4138 : s4139;-  const SWord8 s4141 = (s4140 >> 1) | (s4140 << 7);-  const SWord8 s4142 = 128 | s4141;-  const SWord8 s4143 = 127 & s4141;-  const SWord8 s4144 = s4128 ? s4142 : s4143;-  const SBool  s4145 = (SBool) (s218 & 1);-  const SBool  s4146 = false != s4145;-  const SWord8 s4147 = s4146 ? s4142 : s4143;-  const SWord8 s4148 = s198 ? s4144 : s4147;-  const SBool  s4149 = (SBool) (s234 & 1);-  const SBool  s4150 = false != s4149;-  const SBool  s4151 = (SBool) (s227 & 1);-  const SBool  s4152 = false != s4151;-  const SWord8 s4153 = s4152 ? s4138 : s4139;-  const SWord8 s4154 = (s4153 >> 1) | (s4153 << 7);-  const SWord8 s4155 = 128 | s4154;-  const SWord8 s4156 = 127 & s4154;-  const SWord8 s4157 = s4150 ? s4155 : s4156;-  const SBool  s4158 = (SBool) (s239 & 1);-  const SBool  s4159 = false != s4158;-  const SWord8 s4160 = s4159 ? s4155 : s4156;-  const SWord8 s4161 = s198 ? s4157 : s4160;-  const SWord8 s4162 = s74 ? s4148 : s4161;-  const SBool  s4163 = (SBool) (s260 & 1);-  const SBool  s4164 = false != s4163;-  const SBool  s4165 = (SBool) (s256 & 1);-  const SBool  s4166 = false != s4165;-  const SBool  s4167 = (SBool) (s249 & 1);-  const SBool  s4168 = false != s4167;-  const SWord8 s4169 = s4168 ? s4134 : s4135;-  const SWord8 s4170 = (s4169 >> 1) | (s4169 << 7);-  const SWord8 s4171 = 128 | s4170;-  const SWord8 s4172 = 127 & s4170;-  const SWord8 s4173 = s4166 ? s4171 : s4172;-  const SWord8 s4174 = (s4173 >> 1) | (s4173 << 7);-  const SWord8 s4175 = 128 | s4174;-  const SWord8 s4176 = 127 & s4174;-  const SWord8 s4177 = s4164 ? s4175 : s4176;-  const SBool  s4178 = (SBool) (s265 & 1);-  const SBool  s4179 = false != s4178;-  const SWord8 s4180 = s4179 ? s4175 : s4176;-  const SWord8 s4181 = s198 ? s4177 : s4180;-  const SBool  s4182 = (SBool) (s281 & 1);-  const SBool  s4183 = false != s4182;-  const SBool  s4184 = (SBool) (s274 & 1);-  const SBool  s4185 = false != s4184;-  const SWord8 s4186 = s4185 ? s4171 : s4172;-  const SWord8 s4187 = (s4186 >> 1) | (s4186 << 7);-  const SWord8 s4188 = 128 | s4187;-  const SWord8 s4189 = 127 & s4187;-  const SWord8 s4190 = s4183 ? s4188 : s4189;-  const SBool  s4191 = (SBool) (s286 & 1);-  const SBool  s4192 = false != s4191;-  const SWord8 s4193 = s4192 ? s4188 : s4189;-  const SWord8 s4194 = s198 ? s4190 : s4193;-  const SWord8 s4195 = s74 ? s4181 : s4194;-  const SWord8 s4196 = s55 ? s4162 : s4195;-  const SWord8 s4197 = s36 ? s4126 : s4196;-  const SBool  s4198 = (SBool) (s341 & 1);-  const SBool  s4199 = false != s4198;-  const SBool  s4200 = (SBool) (s337 & 1);-  const SBool  s4201 = false != s4200;-  const SBool  s4202 = (SBool) (s333 & 1);-  const SBool  s4203 = false != s4202;-  const SWord8 s4204 = (s320 >> 1) | (s320 << 7);-  const SWord8 s4205 = 128 | s4204;-  const SWord8 s4206 = 127 & s4204;-  const SWord8 s4207 = s4203 ? s4205 : s4206;-  const SWord8 s4208 = (s4207 >> 1) | (s4207 << 7);-  const SWord8 s4209 = 128 | s4208;-  const SWord8 s4210 = 127 & s4208;-  const SWord8 s4211 = s4201 ? s4209 : s4210;-  const SWord8 s4212 = (s4211 >> 1) | (s4211 << 7);-  const SWord8 s4213 = 128 | s4212;-  const SWord8 s4214 = 127 & s4212;-  const SWord8 s4215 = s4199 ? s4213 : s4214;-  const SBool  s4216 = (SBool) (s346 & 1);-  const SBool  s4217 = false != s4216;-  const SWord8 s4218 = s4217 ? s4213 : s4214;-  const SWord8 s4219 = s329 ? s4215 : s4218;-  const SBool  s4220 = (SBool) (s362 & 1);-  const SBool  s4221 = false != s4220;-  const SBool  s4222 = (SBool) (s355 & 1);-  const SBool  s4223 = false != s4222;-  const SWord8 s4224 = s4223 ? s4209 : s4210;-  const SWord8 s4225 = (s4224 >> 1) | (s4224 << 7);-  const SWord8 s4226 = 128 | s4225;-  const SWord8 s4227 = 127 & s4225;-  const SWord8 s4228 = s4221 ? s4226 : s4227;-  const SBool  s4229 = (SBool) (s367 & 1);-  const SBool  s4230 = false != s4229;-  const SWord8 s4231 = s4230 ? s4226 : s4227;-  const SWord8 s4232 = s329 ? s4228 : s4231;-  const SWord8 s4233 = s307 ? s4219 : s4232;-  const SBool  s4234 = (SBool) (s388 & 1);-  const SBool  s4235 = false != s4234;-  const SBool  s4236 = (SBool) (s384 & 1);-  const SBool  s4237 = false != s4236;-  const SBool  s4238 = (SBool) (s377 & 1);-  const SBool  s4239 = false != s4238;-  const SWord8 s4240 = s4239 ? s4205 : s4206;-  const SWord8 s4241 = (s4240 >> 1) | (s4240 << 7);-  const SWord8 s4242 = 128 | s4241;-  const SWord8 s4243 = 127 & s4241;-  const SWord8 s4244 = s4237 ? s4242 : s4243;-  const SWord8 s4245 = (s4244 >> 1) | (s4244 << 7);-  const SWord8 s4246 = 128 | s4245;-  const SWord8 s4247 = 127 & s4245;-  const SWord8 s4248 = s4235 ? s4246 : s4247;-  const SBool  s4249 = (SBool) (s393 & 1);-  const SBool  s4250 = false != s4249;-  const SWord8 s4251 = s4250 ? s4246 : s4247;-  const SWord8 s4252 = s329 ? s4248 : s4251;-  const SBool  s4253 = (SBool) (s409 & 1);-  const SBool  s4254 = false != s4253;-  const SBool  s4255 = (SBool) (s402 & 1);-  const SBool  s4256 = false != s4255;-  const SWord8 s4257 = s4256 ? s4242 : s4243;-  const SWord8 s4258 = (s4257 >> 1) | (s4257 << 7);-  const SWord8 s4259 = 128 | s4258;-  const SWord8 s4260 = 127 & s4258;-  const SWord8 s4261 = s4254 ? s4259 : s4260;-  const SBool  s4262 = (SBool) (s414 & 1);-  const SBool  s4263 = false != s4262;-  const SWord8 s4264 = s4263 ? s4259 : s4260;-  const SWord8 s4265 = s329 ? s4261 : s4264;-  const SWord8 s4266 = s307 ? s4252 : s4265;-  const SWord8 s4267 = s55 ? s4233 : s4266;-  const SBool  s4268 = (SBool) (s449 & 1);-  const SBool  s4269 = false != s4268;-  const SBool  s4270 = (SBool) (s445 & 1);-  const SBool  s4271 = false != s4270;-  const SBool  s4272 = (SBool) (s441 & 1);-  const SBool  s4273 = false != s4272;-  const SWord8 s4274 = (s428 >> 1) | (s428 << 7);-  const SWord8 s4275 = 128 | s4274;-  const SWord8 s4276 = 127 & s4274;-  const SWord8 s4277 = s4273 ? s4275 : s4276;-  const SWord8 s4278 = (s4277 >> 1) | (s4277 << 7);-  const SWord8 s4279 = 128 | s4278;-  const SWord8 s4280 = 127 & s4278;-  const SWord8 s4281 = s4271 ? s4279 : s4280;-  const SWord8 s4282 = (s4281 >> 1) | (s4281 << 7);-  const SWord8 s4283 = 128 | s4282;-  const SWord8 s4284 = 127 & s4282;-  const SWord8 s4285 = s4269 ? s4283 : s4284;-  const SBool  s4286 = (SBool) (s454 & 1);-  const SBool  s4287 = false != s4286;-  const SWord8 s4288 = s4287 ? s4283 : s4284;-  const SWord8 s4289 = s434 ? s4285 : s4288;-  const SBool  s4290 = (SBool) (s470 & 1);-  const SBool  s4291 = false != s4290;-  const SBool  s4292 = (SBool) (s463 & 1);-  const SBool  s4293 = false != s4292;-  const SWord8 s4294 = s4293 ? s4279 : s4280;-  const SWord8 s4295 = (s4294 >> 1) | (s4294 << 7);-  const SWord8 s4296 = 128 | s4295;-  const SWord8 s4297 = 127 & s4295;-  const SWord8 s4298 = s4291 ? s4296 : s4297;-  const SBool  s4299 = (SBool) (s475 & 1);-  const SBool  s4300 = false != s4299;-  const SWord8 s4301 = s4300 ? s4296 : s4297;-  const SWord8 s4302 = s434 ? s4298 : s4301;-  const SWord8 s4303 = s307 ? s4289 : s4302;-  const SBool  s4304 = (SBool) (s496 & 1);-  const SBool  s4305 = false != s4304;-  const SBool  s4306 = (SBool) (s492 & 1);-  const SBool  s4307 = false != s4306;-  const SBool  s4308 = (SBool) (s485 & 1);-  const SBool  s4309 = false != s4308;-  const SWord8 s4310 = s4309 ? s4275 : s4276;-  const SWord8 s4311 = (s4310 >> 1) | (s4310 << 7);-  const SWord8 s4312 = 128 | s4311;-  const SWord8 s4313 = 127 & s4311;-  const SWord8 s4314 = s4307 ? s4312 : s4313;-  const SWord8 s4315 = (s4314 >> 1) | (s4314 << 7);-  const SWord8 s4316 = 128 | s4315;-  const SWord8 s4317 = 127 & s4315;-  const SWord8 s4318 = s4305 ? s4316 : s4317;-  const SBool  s4319 = (SBool) (s501 & 1);-  const SBool  s4320 = false != s4319;-  const SWord8 s4321 = s4320 ? s4316 : s4317;-  const SWord8 s4322 = s434 ? s4318 : s4321;-  const SBool  s4323 = (SBool) (s517 & 1);-  const SBool  s4324 = false != s4323;-  const SBool  s4325 = (SBool) (s510 & 1);-  const SBool  s4326 = false != s4325;-  const SWord8 s4327 = s4326 ? s4312 : s4313;-  const SWord8 s4328 = (s4327 >> 1) | (s4327 << 7);-  const SWord8 s4329 = 128 | s4328;-  const SWord8 s4330 = 127 & s4328;-  const SWord8 s4331 = s4324 ? s4329 : s4330;-  const SBool  s4332 = (SBool) (s522 & 1);-  const SBool  s4333 = false != s4332;-  const SWord8 s4334 = s4333 ? s4329 : s4330;-  const SWord8 s4335 = s434 ? s4331 : s4334;-  const SWord8 s4336 = s307 ? s4322 : s4335;-  const SWord8 s4337 = s55 ? s4303 : s4336;-  const SWord8 s4338 = s36 ? s4267 : s4337;-  const SWord8 s4339 = s21 ? s4197 : s4338;-  const SBool  s4340 = (SBool) (s597 & 1);-  const SBool  s4341 = false != s4340;-  const SBool  s4342 = (SBool) (s593 & 1);-  const SBool  s4343 = false != s4342;-  const SBool  s4344 = (SBool) (s589 & 1);-  const SBool  s4345 = false != s4344;-  const SWord8 s4346 = (s576 >> 1) | (s576 << 7);-  const SWord8 s4347 = 128 | s4346;-  const SWord8 s4348 = 127 & s4346;-  const SWord8 s4349 = s4345 ? s4347 : s4348;-  const SWord8 s4350 = (s4349 >> 1) | (s4349 << 7);-  const SWord8 s4351 = 128 | s4350;-  const SWord8 s4352 = 127 & s4350;-  const SWord8 s4353 = s4343 ? s4351 : s4352;-  const SWord8 s4354 = (s4353 >> 1) | (s4353 << 7);-  const SWord8 s4355 = 128 | s4354;-  const SWord8 s4356 = 127 & s4354;-  const SWord8 s4357 = s4341 ? s4355 : s4356;-  const SBool  s4358 = (SBool) (s602 & 1);-  const SBool  s4359 = false != s4358;-  const SWord8 s4360 = s4359 ? s4355 : s4356;-  const SWord8 s4361 = s585 ? s4357 : s4360;-  const SBool  s4362 = (SBool) (s618 & 1);-  const SBool  s4363 = false != s4362;-  const SBool  s4364 = (SBool) (s611 & 1);-  const SBool  s4365 = false != s4364;-  const SWord8 s4366 = s4365 ? s4351 : s4352;-  const SWord8 s4367 = (s4366 >> 1) | (s4366 << 7);-  const SWord8 s4368 = 128 | s4367;-  const SWord8 s4369 = 127 & s4367;-  const SWord8 s4370 = s4363 ? s4368 : s4369;-  const SBool  s4371 = (SBool) (s623 & 1);-  const SBool  s4372 = false != s4371;-  const SWord8 s4373 = s4372 ? s4368 : s4369;-  const SWord8 s4374 = s585 ? s4370 : s4373;-  const SWord8 s4375 = s566 ? s4361 : s4374;-  const SBool  s4376 = (SBool) (s644 & 1);-  const SBool  s4377 = false != s4376;-  const SBool  s4378 = (SBool) (s640 & 1);-  const SBool  s4379 = false != s4378;-  const SBool  s4380 = (SBool) (s633 & 1);-  const SBool  s4381 = false != s4380;-  const SWord8 s4382 = s4381 ? s4347 : s4348;-  const SWord8 s4383 = (s4382 >> 1) | (s4382 << 7);-  const SWord8 s4384 = 128 | s4383;-  const SWord8 s4385 = 127 & s4383;-  const SWord8 s4386 = s4379 ? s4384 : s4385;-  const SWord8 s4387 = (s4386 >> 1) | (s4386 << 7);-  const SWord8 s4388 = 128 | s4387;-  const SWord8 s4389 = 127 & s4387;-  const SWord8 s4390 = s4377 ? s4388 : s4389;-  const SBool  s4391 = (SBool) (s649 & 1);-  const SBool  s4392 = false != s4391;-  const SWord8 s4393 = s4392 ? s4388 : s4389;-  const SWord8 s4394 = s585 ? s4390 : s4393;-  const SBool  s4395 = (SBool) (s665 & 1);-  const SBool  s4396 = false != s4395;-  const SBool  s4397 = (SBool) (s658 & 1);-  const SBool  s4398 = false != s4397;-  const SWord8 s4399 = s4398 ? s4384 : s4385;-  const SWord8 s4400 = (s4399 >> 1) | (s4399 << 7);-  const SWord8 s4401 = 128 | s4400;-  const SWord8 s4402 = 127 & s4400;-  const SWord8 s4403 = s4396 ? s4401 : s4402;-  const SBool  s4404 = (SBool) (s670 & 1);-  const SBool  s4405 = false != s4404;-  const SWord8 s4406 = s4405 ? s4401 : s4402;-  const SWord8 s4407 = s585 ? s4403 : s4406;-  const SWord8 s4408 = s566 ? s4394 : s4407;-  const SWord8 s4409 = s544 ? s4375 : s4408;-  const SBool  s4410 = (SBool) (s705 & 1);-  const SBool  s4411 = false != s4410;-  const SBool  s4412 = (SBool) (s701 & 1);-  const SBool  s4413 = false != s4412;-  const SBool  s4414 = (SBool) (s697 & 1);-  const SBool  s4415 = false != s4414;-  const SWord8 s4416 = (s684 >> 1) | (s684 << 7);-  const SWord8 s4417 = 128 | s4416;-  const SWord8 s4418 = 127 & s4416;-  const SWord8 s4419 = s4415 ? s4417 : s4418;-  const SWord8 s4420 = (s4419 >> 1) | (s4419 << 7);-  const SWord8 s4421 = 128 | s4420;-  const SWord8 s4422 = 127 & s4420;-  const SWord8 s4423 = s4413 ? s4421 : s4422;-  const SWord8 s4424 = (s4423 >> 1) | (s4423 << 7);-  const SWord8 s4425 = 128 | s4424;-  const SWord8 s4426 = 127 & s4424;-  const SWord8 s4427 = s4411 ? s4425 : s4426;-  const SBool  s4428 = (SBool) (s710 & 1);-  const SBool  s4429 = false != s4428;-  const SWord8 s4430 = s4429 ? s4425 : s4426;-  const SWord8 s4431 = s690 ? s4427 : s4430;-  const SBool  s4432 = (SBool) (s726 & 1);-  const SBool  s4433 = false != s4432;-  const SBool  s4434 = (SBool) (s719 & 1);-  const SBool  s4435 = false != s4434;-  const SWord8 s4436 = s4435 ? s4421 : s4422;-  const SWord8 s4437 = (s4436 >> 1) | (s4436 << 7);-  const SWord8 s4438 = 128 | s4437;-  const SWord8 s4439 = 127 & s4437;-  const SWord8 s4440 = s4433 ? s4438 : s4439;-  const SBool  s4441 = (SBool) (s731 & 1);-  const SBool  s4442 = false != s4441;-  const SWord8 s4443 = s4442 ? s4438 : s4439;-  const SWord8 s4444 = s690 ? s4440 : s4443;-  const SWord8 s4445 = s566 ? s4431 : s4444;-  const SBool  s4446 = (SBool) (s752 & 1);-  const SBool  s4447 = false != s4446;-  const SBool  s4448 = (SBool) (s748 & 1);-  const SBool  s4449 = false != s4448;-  const SBool  s4450 = (SBool) (s741 & 1);-  const SBool  s4451 = false != s4450;-  const SWord8 s4452 = s4451 ? s4417 : s4418;-  const SWord8 s4453 = (s4452 >> 1) | (s4452 << 7);-  const SWord8 s4454 = 128 | s4453;-  const SWord8 s4455 = 127 & s4453;-  const SWord8 s4456 = s4449 ? s4454 : s4455;-  const SWord8 s4457 = (s4456 >> 1) | (s4456 << 7);-  const SWord8 s4458 = 128 | s4457;-  const SWord8 s4459 = 127 & s4457;-  const SWord8 s4460 = s4447 ? s4458 : s4459;-  const SBool  s4461 = (SBool) (s757 & 1);-  const SBool  s4462 = false != s4461;-  const SWord8 s4463 = s4462 ? s4458 : s4459;-  const SWord8 s4464 = s690 ? s4460 : s4463;-  const SBool  s4465 = (SBool) (s773 & 1);-  const SBool  s4466 = false != s4465;-  const SBool  s4467 = (SBool) (s766 & 1);-  const SBool  s4468 = false != s4467;-  const SWord8 s4469 = s4468 ? s4454 : s4455;-  const SWord8 s4470 = (s4469 >> 1) | (s4469 << 7);-  const SWord8 s4471 = 128 | s4470;-  const SWord8 s4472 = 127 & s4470;-  const SWord8 s4473 = s4466 ? s4471 : s4472;-  const SBool  s4474 = (SBool) (s778 & 1);-  const SBool  s4475 = false != s4474;-  const SWord8 s4476 = s4475 ? s4471 : s4472;-  const SWord8 s4477 = s690 ? s4473 : s4476;-  const SWord8 s4478 = s566 ? s4464 : s4477;-  const SWord8 s4479 = s544 ? s4445 : s4478;-  const SWord8 s4480 = s36 ? s4409 : s4479;-  const SBool  s4481 = (SBool) (s833 & 1);-  const SBool  s4482 = false != s4481;-  const SBool  s4483 = (SBool) (s829 & 1);-  const SBool  s4484 = false != s4483;-  const SBool  s4485 = (SBool) (s825 & 1);-  const SBool  s4486 = false != s4485;-  const SWord8 s4487 = (s812 >> 1) | (s812 << 7);-  const SWord8 s4488 = 128 | s4487;-  const SWord8 s4489 = 127 & s4487;-  const SWord8 s4490 = s4486 ? s4488 : s4489;-  const SWord8 s4491 = (s4490 >> 1) | (s4490 << 7);-  const SWord8 s4492 = 128 | s4491;-  const SWord8 s4493 = 127 & s4491;-  const SWord8 s4494 = s4484 ? s4492 : s4493;-  const SWord8 s4495 = (s4494 >> 1) | (s4494 << 7);-  const SWord8 s4496 = 128 | s4495;-  const SWord8 s4497 = 127 & s4495;-  const SWord8 s4498 = s4482 ? s4496 : s4497;-  const SBool  s4499 = (SBool) (s838 & 1);-  const SBool  s4500 = false != s4499;-  const SWord8 s4501 = s4500 ? s4496 : s4497;-  const SWord8 s4502 = s821 ? s4498 : s4501;-  const SBool  s4503 = (SBool) (s854 & 1);-  const SBool  s4504 = false != s4503;-  const SBool  s4505 = (SBool) (s847 & 1);-  const SBool  s4506 = false != s4505;-  const SWord8 s4507 = s4506 ? s4492 : s4493;-  const SWord8 s4508 = (s4507 >> 1) | (s4507 << 7);-  const SWord8 s4509 = 128 | s4508;-  const SWord8 s4510 = 127 & s4508;-  const SWord8 s4511 = s4504 ? s4509 : s4510;-  const SBool  s4512 = (SBool) (s859 & 1);-  const SBool  s4513 = false != s4512;-  const SWord8 s4514 = s4513 ? s4509 : s4510;-  const SWord8 s4515 = s821 ? s4511 : s4514;-  const SWord8 s4516 = s799 ? s4502 : s4515;-  const SBool  s4517 = (SBool) (s880 & 1);-  const SBool  s4518 = false != s4517;-  const SBool  s4519 = (SBool) (s876 & 1);-  const SBool  s4520 = false != s4519;-  const SBool  s4521 = (SBool) (s869 & 1);-  const SBool  s4522 = false != s4521;-  const SWord8 s4523 = s4522 ? s4488 : s4489;-  const SWord8 s4524 = (s4523 >> 1) | (s4523 << 7);-  const SWord8 s4525 = 128 | s4524;-  const SWord8 s4526 = 127 & s4524;-  const SWord8 s4527 = s4520 ? s4525 : s4526;-  const SWord8 s4528 = (s4527 >> 1) | (s4527 << 7);-  const SWord8 s4529 = 128 | s4528;-  const SWord8 s4530 = 127 & s4528;-  const SWord8 s4531 = s4518 ? s4529 : s4530;-  const SBool  s4532 = (SBool) (s885 & 1);-  const SBool  s4533 = false != s4532;-  const SWord8 s4534 = s4533 ? s4529 : s4530;-  const SWord8 s4535 = s821 ? s4531 : s4534;-  const SBool  s4536 = (SBool) (s901 & 1);-  const SBool  s4537 = false != s4536;-  const SBool  s4538 = (SBool) (s894 & 1);-  const SBool  s4539 = false != s4538;-  const SWord8 s4540 = s4539 ? s4525 : s4526;-  const SWord8 s4541 = (s4540 >> 1) | (s4540 << 7);-  const SWord8 s4542 = 128 | s4541;-  const SWord8 s4543 = 127 & s4541;-  const SWord8 s4544 = s4537 ? s4542 : s4543;-  const SBool  s4545 = (SBool) (s906 & 1);-  const SBool  s4546 = false != s4545;-  const SWord8 s4547 = s4546 ? s4542 : s4543;-  const SWord8 s4548 = s821 ? s4544 : s4547;-  const SWord8 s4549 = s799 ? s4535 : s4548;-  const SWord8 s4550 = s544 ? s4516 : s4549;-  const SBool  s4551 = (SBool) (s941 & 1);-  const SBool  s4552 = false != s4551;-  const SBool  s4553 = (SBool) (s937 & 1);-  const SBool  s4554 = false != s4553;-  const SBool  s4555 = (SBool) (s933 & 1);-  const SBool  s4556 = false != s4555;-  const SWord8 s4557 = (s920 >> 1) | (s920 << 7);-  const SWord8 s4558 = 128 | s4557;-  const SWord8 s4559 = 127 & s4557;-  const SWord8 s4560 = s4556 ? s4558 : s4559;-  const SWord8 s4561 = (s4560 >> 1) | (s4560 << 7);-  const SWord8 s4562 = 128 | s4561;-  const SWord8 s4563 = 127 & s4561;-  const SWord8 s4564 = s4554 ? s4562 : s4563;-  const SWord8 s4565 = (s4564 >> 1) | (s4564 << 7);-  const SWord8 s4566 = 128 | s4565;-  const SWord8 s4567 = 127 & s4565;-  const SWord8 s4568 = s4552 ? s4566 : s4567;-  const SBool  s4569 = (SBool) (s946 & 1);-  const SBool  s4570 = false != s4569;-  const SWord8 s4571 = s4570 ? s4566 : s4567;-  const SWord8 s4572 = s926 ? s4568 : s4571;-  const SBool  s4573 = (SBool) (s962 & 1);-  const SBool  s4574 = false != s4573;-  const SBool  s4575 = (SBool) (s955 & 1);-  const SBool  s4576 = false != s4575;-  const SWord8 s4577 = s4576 ? s4562 : s4563;-  const SWord8 s4578 = (s4577 >> 1) | (s4577 << 7);-  const SWord8 s4579 = 128 | s4578;-  const SWord8 s4580 = 127 & s4578;-  const SWord8 s4581 = s4574 ? s4579 : s4580;-  const SBool  s4582 = (SBool) (s967 & 1);-  const SBool  s4583 = false != s4582;-  const SWord8 s4584 = s4583 ? s4579 : s4580;-  const SWord8 s4585 = s926 ? s4581 : s4584;-  const SWord8 s4586 = s799 ? s4572 : s4585;-  const SBool  s4587 = (SBool) (s988 & 1);-  const SBool  s4588 = false != s4587;-  const SBool  s4589 = (SBool) (s984 & 1);-  const SBool  s4590 = false != s4589;-  const SBool  s4591 = (SBool) (s977 & 1);-  const SBool  s4592 = false != s4591;-  const SWord8 s4593 = s4592 ? s4558 : s4559;-  const SWord8 s4594 = (s4593 >> 1) | (s4593 << 7);-  const SWord8 s4595 = 128 | s4594;-  const SWord8 s4596 = 127 & s4594;-  const SWord8 s4597 = s4590 ? s4595 : s4596;-  const SWord8 s4598 = (s4597 >> 1) | (s4597 << 7);-  const SWord8 s4599 = 128 | s4598;-  const SWord8 s4600 = 127 & s4598;-  const SWord8 s4601 = s4588 ? s4599 : s4600;-  const SBool  s4602 = (SBool) (s993 & 1);-  const SBool  s4603 = false != s4602;-  const SWord8 s4604 = s4603 ? s4599 : s4600;-  const SWord8 s4605 = s926 ? s4601 : s4604;-  const SBool  s4606 = (SBool) (s1009 & 1);-  const SBool  s4607 = false != s4606;-  const SBool  s4608 = (SBool) (s1002 & 1);-  const SBool  s4609 = false != s4608;-  const SWord8 s4610 = s4609 ? s4595 : s4596;-  const SWord8 s4611 = (s4610 >> 1) | (s4610 << 7);-  const SWord8 s4612 = 128 | s4611;-  const SWord8 s4613 = 127 & s4611;-  const SWord8 s4614 = s4607 ? s4612 : s4613;-  const SBool  s4615 = (SBool) (s1014 & 1);-  const SBool  s4616 = false != s4615;-  const SWord8 s4617 = s4616 ? s4612 : s4613;-  const SWord8 s4618 = s926 ? s4614 : s4617;-  const SWord8 s4619 = s799 ? s4605 : s4618;-  const SWord8 s4620 = s544 ? s4586 : s4619;-  const SWord8 s4621 = s36 ? s4550 : s4620;-  const SWord8 s4622 = s21 ? s4480 : s4621;-  const SWord8 s4623 = s16 ? s4339 : s4622;-  const SBool  s4624 = (SBool) (s1109 & 1);-  const SBool  s4625 = false != s4624;-  const SBool  s4626 = (SBool) (s1105 & 1);-  const SBool  s4627 = false != s4626;-  const SBool  s4628 = (SBool) (s1101 & 1);-  const SBool  s4629 = false != s4628;-  const SWord8 s4630 = (s1088 >> 1) | (s1088 << 7);-  const SWord8 s4631 = 128 | s4630;-  const SWord8 s4632 = 127 & s4630;-  const SWord8 s4633 = s4629 ? s4631 : s4632;-  const SWord8 s4634 = (s4633 >> 1) | (s4633 << 7);-  const SWord8 s4635 = 128 | s4634;-  const SWord8 s4636 = 127 & s4634;-  const SWord8 s4637 = s4627 ? s4635 : s4636;-  const SWord8 s4638 = (s4637 >> 1) | (s4637 << 7);-  const SWord8 s4639 = 128 | s4638;-  const SWord8 s4640 = 127 & s4638;-  const SWord8 s4641 = s4625 ? s4639 : s4640;-  const SBool  s4642 = (SBool) (s1114 & 1);-  const SBool  s4643 = false != s4642;-  const SWord8 s4644 = s4643 ? s4639 : s4640;-  const SWord8 s4645 = s1097 ? s4641 : s4644;-  const SBool  s4646 = (SBool) (s1130 & 1);-  const SBool  s4647 = false != s4646;-  const SBool  s4648 = (SBool) (s1123 & 1);-  const SBool  s4649 = false != s4648;-  const SWord8 s4650 = s4649 ? s4635 : s4636;-  const SWord8 s4651 = (s4650 >> 1) | (s4650 << 7);-  const SWord8 s4652 = 128 | s4651;-  const SWord8 s4653 = 127 & s4651;-  const SWord8 s4654 = s4647 ? s4652 : s4653;-  const SBool  s4655 = (SBool) (s1135 & 1);-  const SBool  s4656 = false != s4655;-  const SWord8 s4657 = s4656 ? s4652 : s4653;-  const SWord8 s4658 = s1097 ? s4654 : s4657;-  const SWord8 s4659 = s1078 ? s4645 : s4658;-  const SBool  s4660 = (SBool) (s1156 & 1);-  const SBool  s4661 = false != s4660;-  const SBool  s4662 = (SBool) (s1152 & 1);-  const SBool  s4663 = false != s4662;-  const SBool  s4664 = (SBool) (s1145 & 1);-  const SBool  s4665 = false != s4664;-  const SWord8 s4666 = s4665 ? s4631 : s4632;-  const SWord8 s4667 = (s4666 >> 1) | (s4666 << 7);-  const SWord8 s4668 = 128 | s4667;-  const SWord8 s4669 = 127 & s4667;-  const SWord8 s4670 = s4663 ? s4668 : s4669;-  const SWord8 s4671 = (s4670 >> 1) | (s4670 << 7);-  const SWord8 s4672 = 128 | s4671;-  const SWord8 s4673 = 127 & s4671;-  const SWord8 s4674 = s4661 ? s4672 : s4673;-  const SBool  s4675 = (SBool) (s1161 & 1);-  const SBool  s4676 = false != s4675;-  const SWord8 s4677 = s4676 ? s4672 : s4673;-  const SWord8 s4678 = s1097 ? s4674 : s4677;-  const SBool  s4679 = (SBool) (s1177 & 1);-  const SBool  s4680 = false != s4679;-  const SBool  s4681 = (SBool) (s1170 & 1);-  const SBool  s4682 = false != s4681;-  const SWord8 s4683 = s4682 ? s4668 : s4669;-  const SWord8 s4684 = (s4683 >> 1) | (s4683 << 7);-  const SWord8 s4685 = 128 | s4684;-  const SWord8 s4686 = 127 & s4684;-  const SWord8 s4687 = s4680 ? s4685 : s4686;-  const SBool  s4688 = (SBool) (s1182 & 1);-  const SBool  s4689 = false != s4688;-  const SWord8 s4690 = s4689 ? s4685 : s4686;-  const SWord8 s4691 = s1097 ? s4687 : s4690;-  const SWord8 s4692 = s1078 ? s4678 : s4691;-  const SWord8 s4693 = s1059 ? s4659 : s4692;-  const SBool  s4694 = (SBool) (s1217 & 1);-  const SBool  s4695 = false != s4694;-  const SBool  s4696 = (SBool) (s1213 & 1);-  const SBool  s4697 = false != s4696;-  const SBool  s4698 = (SBool) (s1209 & 1);-  const SBool  s4699 = false != s4698;-  const SWord8 s4700 = (s1196 >> 1) | (s1196 << 7);-  const SWord8 s4701 = 128 | s4700;-  const SWord8 s4702 = 127 & s4700;-  const SWord8 s4703 = s4699 ? s4701 : s4702;-  const SWord8 s4704 = (s4703 >> 1) | (s4703 << 7);-  const SWord8 s4705 = 128 | s4704;-  const SWord8 s4706 = 127 & s4704;-  const SWord8 s4707 = s4697 ? s4705 : s4706;-  const SWord8 s4708 = (s4707 >> 1) | (s4707 << 7);-  const SWord8 s4709 = 128 | s4708;-  const SWord8 s4710 = 127 & s4708;-  const SWord8 s4711 = s4695 ? s4709 : s4710;-  const SBool  s4712 = (SBool) (s1222 & 1);-  const SBool  s4713 = false != s4712;-  const SWord8 s4714 = s4713 ? s4709 : s4710;-  const SWord8 s4715 = s1202 ? s4711 : s4714;-  const SBool  s4716 = (SBool) (s1238 & 1);-  const SBool  s4717 = false != s4716;-  const SBool  s4718 = (SBool) (s1231 & 1);-  const SBool  s4719 = false != s4718;-  const SWord8 s4720 = s4719 ? s4705 : s4706;-  const SWord8 s4721 = (s4720 >> 1) | (s4720 << 7);-  const SWord8 s4722 = 128 | s4721;-  const SWord8 s4723 = 127 & s4721;-  const SWord8 s4724 = s4717 ? s4722 : s4723;-  const SBool  s4725 = (SBool) (s1243 & 1);-  const SBool  s4726 = false != s4725;-  const SWord8 s4727 = s4726 ? s4722 : s4723;-  const SWord8 s4728 = s1202 ? s4724 : s4727;-  const SWord8 s4729 = s1078 ? s4715 : s4728;-  const SBool  s4730 = (SBool) (s1264 & 1);-  const SBool  s4731 = false != s4730;-  const SBool  s4732 = (SBool) (s1260 & 1);-  const SBool  s4733 = false != s4732;-  const SBool  s4734 = (SBool) (s1253 & 1);-  const SBool  s4735 = false != s4734;-  const SWord8 s4736 = s4735 ? s4701 : s4702;-  const SWord8 s4737 = (s4736 >> 1) | (s4736 << 7);-  const SWord8 s4738 = 128 | s4737;-  const SWord8 s4739 = 127 & s4737;-  const SWord8 s4740 = s4733 ? s4738 : s4739;-  const SWord8 s4741 = (s4740 >> 1) | (s4740 << 7);-  const SWord8 s4742 = 128 | s4741;-  const SWord8 s4743 = 127 & s4741;-  const SWord8 s4744 = s4731 ? s4742 : s4743;-  const SBool  s4745 = (SBool) (s1269 & 1);-  const SBool  s4746 = false != s4745;-  const SWord8 s4747 = s4746 ? s4742 : s4743;-  const SWord8 s4748 = s1202 ? s4744 : s4747;-  const SBool  s4749 = (SBool) (s1285 & 1);-  const SBool  s4750 = false != s4749;-  const SBool  s4751 = (SBool) (s1278 & 1);-  const SBool  s4752 = false != s4751;-  const SWord8 s4753 = s4752 ? s4738 : s4739;-  const SWord8 s4754 = (s4753 >> 1) | (s4753 << 7);-  const SWord8 s4755 = 128 | s4754;-  const SWord8 s4756 = 127 & s4754;-  const SWord8 s4757 = s4750 ? s4755 : s4756;-  const SBool  s4758 = (SBool) (s1290 & 1);-  const SBool  s4759 = false != s4758;-  const SWord8 s4760 = s4759 ? s4755 : s4756;-  const SWord8 s4761 = s1202 ? s4757 : s4760;-  const SWord8 s4762 = s1078 ? s4748 : s4761;-  const SWord8 s4763 = s1059 ? s4729 : s4762;-  const SWord8 s4764 = s1037 ? s4693 : s4763;-  const SBool  s4765 = (SBool) (s1345 & 1);-  const SBool  s4766 = false != s4765;-  const SBool  s4767 = (SBool) (s1341 & 1);-  const SBool  s4768 = false != s4767;-  const SBool  s4769 = (SBool) (s1337 & 1);-  const SBool  s4770 = false != s4769;-  const SWord8 s4771 = (s1324 >> 1) | (s1324 << 7);-  const SWord8 s4772 = 128 | s4771;-  const SWord8 s4773 = 127 & s4771;-  const SWord8 s4774 = s4770 ? s4772 : s4773;-  const SWord8 s4775 = (s4774 >> 1) | (s4774 << 7);-  const SWord8 s4776 = 128 | s4775;-  const SWord8 s4777 = 127 & s4775;-  const SWord8 s4778 = s4768 ? s4776 : s4777;-  const SWord8 s4779 = (s4778 >> 1) | (s4778 << 7);-  const SWord8 s4780 = 128 | s4779;-  const SWord8 s4781 = 127 & s4779;-  const SWord8 s4782 = s4766 ? s4780 : s4781;-  const SBool  s4783 = (SBool) (s1350 & 1);-  const SBool  s4784 = false != s4783;-  const SWord8 s4785 = s4784 ? s4780 : s4781;-  const SWord8 s4786 = s1333 ? s4782 : s4785;-  const SBool  s4787 = (SBool) (s1366 & 1);-  const SBool  s4788 = false != s4787;-  const SBool  s4789 = (SBool) (s1359 & 1);-  const SBool  s4790 = false != s4789;-  const SWord8 s4791 = s4790 ? s4776 : s4777;-  const SWord8 s4792 = (s4791 >> 1) | (s4791 << 7);-  const SWord8 s4793 = 128 | s4792;-  const SWord8 s4794 = 127 & s4792;-  const SWord8 s4795 = s4788 ? s4793 : s4794;-  const SBool  s4796 = (SBool) (s1371 & 1);-  const SBool  s4797 = false != s4796;-  const SWord8 s4798 = s4797 ? s4793 : s4794;-  const SWord8 s4799 = s1333 ? s4795 : s4798;-  const SWord8 s4800 = s1311 ? s4786 : s4799;-  const SBool  s4801 = (SBool) (s1392 & 1);-  const SBool  s4802 = false != s4801;-  const SBool  s4803 = (SBool) (s1388 & 1);-  const SBool  s4804 = false != s4803;-  const SBool  s4805 = (SBool) (s1381 & 1);-  const SBool  s4806 = false != s4805;-  const SWord8 s4807 = s4806 ? s4772 : s4773;-  const SWord8 s4808 = (s4807 >> 1) | (s4807 << 7);-  const SWord8 s4809 = 128 | s4808;-  const SWord8 s4810 = 127 & s4808;-  const SWord8 s4811 = s4804 ? s4809 : s4810;-  const SWord8 s4812 = (s4811 >> 1) | (s4811 << 7);-  const SWord8 s4813 = 128 | s4812;-  const SWord8 s4814 = 127 & s4812;-  const SWord8 s4815 = s4802 ? s4813 : s4814;-  const SBool  s4816 = (SBool) (s1397 & 1);-  const SBool  s4817 = false != s4816;-  const SWord8 s4818 = s4817 ? s4813 : s4814;-  const SWord8 s4819 = s1333 ? s4815 : s4818;-  const SBool  s4820 = (SBool) (s1413 & 1);-  const SBool  s4821 = false != s4820;-  const SBool  s4822 = (SBool) (s1406 & 1);-  const SBool  s4823 = false != s4822;-  const SWord8 s4824 = s4823 ? s4809 : s4810;-  const SWord8 s4825 = (s4824 >> 1) | (s4824 << 7);-  const SWord8 s4826 = 128 | s4825;-  const SWord8 s4827 = 127 & s4825;-  const SWord8 s4828 = s4821 ? s4826 : s4827;-  const SBool  s4829 = (SBool) (s1418 & 1);-  const SBool  s4830 = false != s4829;-  const SWord8 s4831 = s4830 ? s4826 : s4827;-  const SWord8 s4832 = s1333 ? s4828 : s4831;-  const SWord8 s4833 = s1311 ? s4819 : s4832;-  const SWord8 s4834 = s1059 ? s4800 : s4833;-  const SBool  s4835 = (SBool) (s1453 & 1);-  const SBool  s4836 = false != s4835;-  const SBool  s4837 = (SBool) (s1449 & 1);-  const SBool  s4838 = false != s4837;-  const SBool  s4839 = (SBool) (s1445 & 1);-  const SBool  s4840 = false != s4839;-  const SWord8 s4841 = (s1432 >> 1) | (s1432 << 7);-  const SWord8 s4842 = 128 | s4841;-  const SWord8 s4843 = 127 & s4841;-  const SWord8 s4844 = s4840 ? s4842 : s4843;-  const SWord8 s4845 = (s4844 >> 1) | (s4844 << 7);-  const SWord8 s4846 = 128 | s4845;-  const SWord8 s4847 = 127 & s4845;-  const SWord8 s4848 = s4838 ? s4846 : s4847;-  const SWord8 s4849 = (s4848 >> 1) | (s4848 << 7);-  const SWord8 s4850 = 128 | s4849;-  const SWord8 s4851 = 127 & s4849;-  const SWord8 s4852 = s4836 ? s4850 : s4851;-  const SBool  s4853 = (SBool) (s1458 & 1);-  const SBool  s4854 = false != s4853;-  const SWord8 s4855 = s4854 ? s4850 : s4851;-  const SWord8 s4856 = s1438 ? s4852 : s4855;-  const SBool  s4857 = (SBool) (s1474 & 1);-  const SBool  s4858 = false != s4857;-  const SBool  s4859 = (SBool) (s1467 & 1);-  const SBool  s4860 = false != s4859;-  const SWord8 s4861 = s4860 ? s4846 : s4847;-  const SWord8 s4862 = (s4861 >> 1) | (s4861 << 7);-  const SWord8 s4863 = 128 | s4862;-  const SWord8 s4864 = 127 & s4862;-  const SWord8 s4865 = s4858 ? s4863 : s4864;-  const SBool  s4866 = (SBool) (s1479 & 1);-  const SBool  s4867 = false != s4866;-  const SWord8 s4868 = s4867 ? s4863 : s4864;-  const SWord8 s4869 = s1438 ? s4865 : s4868;-  const SWord8 s4870 = s1311 ? s4856 : s4869;-  const SBool  s4871 = (SBool) (s1500 & 1);-  const SBool  s4872 = false != s4871;-  const SBool  s4873 = (SBool) (s1496 & 1);-  const SBool  s4874 = false != s4873;-  const SBool  s4875 = (SBool) (s1489 & 1);-  const SBool  s4876 = false != s4875;-  const SWord8 s4877 = s4876 ? s4842 : s4843;-  const SWord8 s4878 = (s4877 >> 1) | (s4877 << 7);-  const SWord8 s4879 = 128 | s4878;-  const SWord8 s4880 = 127 & s4878;-  const SWord8 s4881 = s4874 ? s4879 : s4880;-  const SWord8 s4882 = (s4881 >> 1) | (s4881 << 7);-  const SWord8 s4883 = 128 | s4882;-  const SWord8 s4884 = 127 & s4882;-  const SWord8 s4885 = s4872 ? s4883 : s4884;-  const SBool  s4886 = (SBool) (s1505 & 1);-  const SBool  s4887 = false != s4886;-  const SWord8 s4888 = s4887 ? s4883 : s4884;-  const SWord8 s4889 = s1438 ? s4885 : s4888;-  const SBool  s4890 = (SBool) (s1521 & 1);-  const SBool  s4891 = false != s4890;-  const SBool  s4892 = (SBool) (s1514 & 1);-  const SBool  s4893 = false != s4892;-  const SWord8 s4894 = s4893 ? s4879 : s4880;-  const SWord8 s4895 = (s4894 >> 1) | (s4894 << 7);-  const SWord8 s4896 = 128 | s4895;-  const SWord8 s4897 = 127 & s4895;-  const SWord8 s4898 = s4891 ? s4896 : s4897;-  const SBool  s4899 = (SBool) (s1526 & 1);-  const SBool  s4900 = false != s4899;-  const SWord8 s4901 = s4900 ? s4896 : s4897;-  const SWord8 s4902 = s1438 ? s4898 : s4901;-  const SWord8 s4903 = s1311 ? s4889 : s4902;-  const SWord8 s4904 = s1059 ? s4870 : s4903;-  const SWord8 s4905 = s1037 ? s4834 : s4904;-  const SWord8 s4906 = s21 ? s4764 : s4905;-  const SBool  s4907 = (SBool) (s1601 & 1);-  const SBool  s4908 = false != s4907;-  const SBool  s4909 = (SBool) (s1597 & 1);-  const SBool  s4910 = false != s4909;-  const SBool  s4911 = (SBool) (s1593 & 1);-  const SBool  s4912 = false != s4911;-  const SWord8 s4913 = (s1580 >> 1) | (s1580 << 7);-  const SWord8 s4914 = 128 | s4913;-  const SWord8 s4915 = 127 & s4913;-  const SWord8 s4916 = s4912 ? s4914 : s4915;-  const SWord8 s4917 = (s4916 >> 1) | (s4916 << 7);-  const SWord8 s4918 = 128 | s4917;-  const SWord8 s4919 = 127 & s4917;-  const SWord8 s4920 = s4910 ? s4918 : s4919;-  const SWord8 s4921 = (s4920 >> 1) | (s4920 << 7);-  const SWord8 s4922 = 128 | s4921;-  const SWord8 s4923 = 127 & s4921;-  const SWord8 s4924 = s4908 ? s4922 : s4923;-  const SBool  s4925 = (SBool) (s1606 & 1);-  const SBool  s4926 = false != s4925;-  const SWord8 s4927 = s4926 ? s4922 : s4923;-  const SWord8 s4928 = s1589 ? s4924 : s4927;-  const SBool  s4929 = (SBool) (s1622 & 1);-  const SBool  s4930 = false != s4929;-  const SBool  s4931 = (SBool) (s1615 & 1);-  const SBool  s4932 = false != s4931;-  const SWord8 s4933 = s4932 ? s4918 : s4919;-  const SWord8 s4934 = (s4933 >> 1) | (s4933 << 7);-  const SWord8 s4935 = 128 | s4934;-  const SWord8 s4936 = 127 & s4934;-  const SWord8 s4937 = s4930 ? s4935 : s4936;-  const SBool  s4938 = (SBool) (s1627 & 1);-  const SBool  s4939 = false != s4938;-  const SWord8 s4940 = s4939 ? s4935 : s4936;-  const SWord8 s4941 = s1589 ? s4937 : s4940;-  const SWord8 s4942 = s1570 ? s4928 : s4941;-  const SBool  s4943 = (SBool) (s1648 & 1);-  const SBool  s4944 = false != s4943;-  const SBool  s4945 = (SBool) (s1644 & 1);-  const SBool  s4946 = false != s4945;-  const SBool  s4947 = (SBool) (s1637 & 1);-  const SBool  s4948 = false != s4947;-  const SWord8 s4949 = s4948 ? s4914 : s4915;-  const SWord8 s4950 = (s4949 >> 1) | (s4949 << 7);-  const SWord8 s4951 = 128 | s4950;-  const SWord8 s4952 = 127 & s4950;-  const SWord8 s4953 = s4946 ? s4951 : s4952;-  const SWord8 s4954 = (s4953 >> 1) | (s4953 << 7);-  const SWord8 s4955 = 128 | s4954;-  const SWord8 s4956 = 127 & s4954;-  const SWord8 s4957 = s4944 ? s4955 : s4956;-  const SBool  s4958 = (SBool) (s1653 & 1);-  const SBool  s4959 = false != s4958;-  const SWord8 s4960 = s4959 ? s4955 : s4956;-  const SWord8 s4961 = s1589 ? s4957 : s4960;-  const SBool  s4962 = (SBool) (s1669 & 1);-  const SBool  s4963 = false != s4962;-  const SBool  s4964 = (SBool) (s1662 & 1);-  const SBool  s4965 = false != s4964;-  const SWord8 s4966 = s4965 ? s4951 : s4952;-  const SWord8 s4967 = (s4966 >> 1) | (s4966 << 7);-  const SWord8 s4968 = 128 | s4967;-  const SWord8 s4969 = 127 & s4967;-  const SWord8 s4970 = s4963 ? s4968 : s4969;-  const SBool  s4971 = (SBool) (s1674 & 1);-  const SBool  s4972 = false != s4971;-  const SWord8 s4973 = s4972 ? s4968 : s4969;-  const SWord8 s4974 = s1589 ? s4970 : s4973;-  const SWord8 s4975 = s1570 ? s4961 : s4974;-  const SWord8 s4976 = s1548 ? s4942 : s4975;-  const SBool  s4977 = (SBool) (s1709 & 1);-  const SBool  s4978 = false != s4977;-  const SBool  s4979 = (SBool) (s1705 & 1);-  const SBool  s4980 = false != s4979;-  const SBool  s4981 = (SBool) (s1701 & 1);-  const SBool  s4982 = false != s4981;-  const SWord8 s4983 = (s1688 >> 1) | (s1688 << 7);-  const SWord8 s4984 = 128 | s4983;-  const SWord8 s4985 = 127 & s4983;-  const SWord8 s4986 = s4982 ? s4984 : s4985;-  const SWord8 s4987 = (s4986 >> 1) | (s4986 << 7);-  const SWord8 s4988 = 128 | s4987;-  const SWord8 s4989 = 127 & s4987;-  const SWord8 s4990 = s4980 ? s4988 : s4989;-  const SWord8 s4991 = (s4990 >> 1) | (s4990 << 7);-  const SWord8 s4992 = 128 | s4991;-  const SWord8 s4993 = 127 & s4991;-  const SWord8 s4994 = s4978 ? s4992 : s4993;-  const SBool  s4995 = (SBool) (s1714 & 1);-  const SBool  s4996 = false != s4995;-  const SWord8 s4997 = s4996 ? s4992 : s4993;-  const SWord8 s4998 = s1694 ? s4994 : s4997;-  const SBool  s4999 = (SBool) (s1730 & 1);-  const SBool  s5000 = false != s4999;-  const SBool  s5001 = (SBool) (s1723 & 1);-  const SBool  s5002 = false != s5001;-  const SWord8 s5003 = s5002 ? s4988 : s4989;-  const SWord8 s5004 = (s5003 >> 1) | (s5003 << 7);-  const SWord8 s5005 = 128 | s5004;-  const SWord8 s5006 = 127 & s5004;-  const SWord8 s5007 = s5000 ? s5005 : s5006;-  const SBool  s5008 = (SBool) (s1735 & 1);-  const SBool  s5009 = false != s5008;-  const SWord8 s5010 = s5009 ? s5005 : s5006;-  const SWord8 s5011 = s1694 ? s5007 : s5010;-  const SWord8 s5012 = s1570 ? s4998 : s5011;-  const SBool  s5013 = (SBool) (s1756 & 1);-  const SBool  s5014 = false != s5013;-  const SBool  s5015 = (SBool) (s1752 & 1);-  const SBool  s5016 = false != s5015;-  const SBool  s5017 = (SBool) (s1745 & 1);-  const SBool  s5018 = false != s5017;-  const SWord8 s5019 = s5018 ? s4984 : s4985;-  const SWord8 s5020 = (s5019 >> 1) | (s5019 << 7);-  const SWord8 s5021 = 128 | s5020;-  const SWord8 s5022 = 127 & s5020;-  const SWord8 s5023 = s5016 ? s5021 : s5022;-  const SWord8 s5024 = (s5023 >> 1) | (s5023 << 7);-  const SWord8 s5025 = 128 | s5024;-  const SWord8 s5026 = 127 & s5024;-  const SWord8 s5027 = s5014 ? s5025 : s5026;-  const SBool  s5028 = (SBool) (s1761 & 1);-  const SBool  s5029 = false != s5028;-  const SWord8 s5030 = s5029 ? s5025 : s5026;-  const SWord8 s5031 = s1694 ? s5027 : s5030;-  const SBool  s5032 = (SBool) (s1777 & 1);-  const SBool  s5033 = false != s5032;-  const SBool  s5034 = (SBool) (s1770 & 1);-  const SBool  s5035 = false != s5034;-  const SWord8 s5036 = s5035 ? s5021 : s5022;-  const SWord8 s5037 = (s5036 >> 1) | (s5036 << 7);-  const SWord8 s5038 = 128 | s5037;-  const SWord8 s5039 = 127 & s5037;-  const SWord8 s5040 = s5033 ? s5038 : s5039;-  const SBool  s5041 = (SBool) (s1782 & 1);-  const SBool  s5042 = false != s5041;-  const SWord8 s5043 = s5042 ? s5038 : s5039;-  const SWord8 s5044 = s1694 ? s5040 : s5043;-  const SWord8 s5045 = s1570 ? s5031 : s5044;-  const SWord8 s5046 = s1548 ? s5012 : s5045;-  const SWord8 s5047 = s1037 ? s4976 : s5046;-  const SBool  s5048 = (SBool) (s1837 & 1);-  const SBool  s5049 = false != s5048;-  const SBool  s5050 = (SBool) (s1833 & 1);-  const SBool  s5051 = false != s5050;-  const SBool  s5052 = (SBool) (s1829 & 1);-  const SBool  s5053 = false != s5052;-  const SWord8 s5054 = (s1816 >> 1) | (s1816 << 7);-  const SWord8 s5055 = 128 | s5054;-  const SWord8 s5056 = 127 & s5054;-  const SWord8 s5057 = s5053 ? s5055 : s5056;-  const SWord8 s5058 = (s5057 >> 1) | (s5057 << 7);-  const SWord8 s5059 = 128 | s5058;-  const SWord8 s5060 = 127 & s5058;-  const SWord8 s5061 = s5051 ? s5059 : s5060;-  const SWord8 s5062 = (s5061 >> 1) | (s5061 << 7);-  const SWord8 s5063 = 128 | s5062;-  const SWord8 s5064 = 127 & s5062;-  const SWord8 s5065 = s5049 ? s5063 : s5064;-  const SBool  s5066 = (SBool) (s1842 & 1);-  const SBool  s5067 = false != s5066;-  const SWord8 s5068 = s5067 ? s5063 : s5064;-  const SWord8 s5069 = s1825 ? s5065 : s5068;-  const SBool  s5070 = (SBool) (s1858 & 1);-  const SBool  s5071 = false != s5070;-  const SBool  s5072 = (SBool) (s1851 & 1);-  const SBool  s5073 = false != s5072;-  const SWord8 s5074 = s5073 ? s5059 : s5060;-  const SWord8 s5075 = (s5074 >> 1) | (s5074 << 7);-  const SWord8 s5076 = 128 | s5075;-  const SWord8 s5077 = 127 & s5075;-  const SWord8 s5078 = s5071 ? s5076 : s5077;-  const SBool  s5079 = (SBool) (s1863 & 1);-  const SBool  s5080 = false != s5079;-  const SWord8 s5081 = s5080 ? s5076 : s5077;-  const SWord8 s5082 = s1825 ? s5078 : s5081;-  const SWord8 s5083 = s1803 ? s5069 : s5082;-  const SBool  s5084 = (SBool) (s1884 & 1);-  const SBool  s5085 = false != s5084;-  const SBool  s5086 = (SBool) (s1880 & 1);-  const SBool  s5087 = false != s5086;-  const SBool  s5088 = (SBool) (s1873 & 1);-  const SBool  s5089 = false != s5088;-  const SWord8 s5090 = s5089 ? s5055 : s5056;-  const SWord8 s5091 = (s5090 >> 1) | (s5090 << 7);-  const SWord8 s5092 = 128 | s5091;-  const SWord8 s5093 = 127 & s5091;-  const SWord8 s5094 = s5087 ? s5092 : s5093;-  const SWord8 s5095 = (s5094 >> 1) | (s5094 << 7);-  const SWord8 s5096 = 128 | s5095;-  const SWord8 s5097 = 127 & s5095;-  const SWord8 s5098 = s5085 ? s5096 : s5097;-  const SBool  s5099 = (SBool) (s1889 & 1);-  const SBool  s5100 = false != s5099;-  const SWord8 s5101 = s5100 ? s5096 : s5097;-  const SWord8 s5102 = s1825 ? s5098 : s5101;-  const SBool  s5103 = (SBool) (s1905 & 1);-  const SBool  s5104 = false != s5103;-  const SBool  s5105 = (SBool) (s1898 & 1);-  const SBool  s5106 = false != s5105;-  const SWord8 s5107 = s5106 ? s5092 : s5093;-  const SWord8 s5108 = (s5107 >> 1) | (s5107 << 7);-  const SWord8 s5109 = 128 | s5108;-  const SWord8 s5110 = 127 & s5108;-  const SWord8 s5111 = s5104 ? s5109 : s5110;-  const SBool  s5112 = (SBool) (s1910 & 1);-  const SBool  s5113 = false != s5112;-  const SWord8 s5114 = s5113 ? s5109 : s5110;-  const SWord8 s5115 = s1825 ? s5111 : s5114;-  const SWord8 s5116 = s1803 ? s5102 : s5115;-  const SWord8 s5117 = s1548 ? s5083 : s5116;-  const SBool  s5118 = (SBool) (s1945 & 1);-  const SBool  s5119 = false != s5118;-  const SBool  s5120 = (SBool) (s1941 & 1);-  const SBool  s5121 = false != s5120;-  const SBool  s5122 = (SBool) (s1937 & 1);-  const SBool  s5123 = false != s5122;-  const SWord8 s5124 = (s1924 >> 1) | (s1924 << 7);-  const SWord8 s5125 = 128 | s5124;-  const SWord8 s5126 = 127 & s5124;-  const SWord8 s5127 = s5123 ? s5125 : s5126;-  const SWord8 s5128 = (s5127 >> 1) | (s5127 << 7);-  const SWord8 s5129 = 128 | s5128;-  const SWord8 s5130 = 127 & s5128;-  const SWord8 s5131 = s5121 ? s5129 : s5130;-  const SWord8 s5132 = (s5131 >> 1) | (s5131 << 7);-  const SWord8 s5133 = 128 | s5132;-  const SWord8 s5134 = 127 & s5132;-  const SWord8 s5135 = s5119 ? s5133 : s5134;-  const SBool  s5136 = (SBool) (s1950 & 1);-  const SBool  s5137 = false != s5136;-  const SWord8 s5138 = s5137 ? s5133 : s5134;-  const SWord8 s5139 = s1930 ? s5135 : s5138;-  const SBool  s5140 = (SBool) (s1966 & 1);-  const SBool  s5141 = false != s5140;-  const SBool  s5142 = (SBool) (s1959 & 1);-  const SBool  s5143 = false != s5142;-  const SWord8 s5144 = s5143 ? s5129 : s5130;-  const SWord8 s5145 = (s5144 >> 1) | (s5144 << 7);-  const SWord8 s5146 = 128 | s5145;-  const SWord8 s5147 = 127 & s5145;-  const SWord8 s5148 = s5141 ? s5146 : s5147;-  const SBool  s5149 = (SBool) (s1971 & 1);-  const SBool  s5150 = false != s5149;-  const SWord8 s5151 = s5150 ? s5146 : s5147;-  const SWord8 s5152 = s1930 ? s5148 : s5151;-  const SWord8 s5153 = s1803 ? s5139 : s5152;-  const SBool  s5154 = (SBool) (s1992 & 1);-  const SBool  s5155 = false != s5154;-  const SBool  s5156 = (SBool) (s1988 & 1);-  const SBool  s5157 = false != s5156;-  const SBool  s5158 = (SBool) (s1981 & 1);-  const SBool  s5159 = false != s5158;-  const SWord8 s5160 = s5159 ? s5125 : s5126;-  const SWord8 s5161 = (s5160 >> 1) | (s5160 << 7);-  const SWord8 s5162 = 128 | s5161;-  const SWord8 s5163 = 127 & s5161;-  const SWord8 s5164 = s5157 ? s5162 : s5163;-  const SWord8 s5165 = (s5164 >> 1) | (s5164 << 7);-  const SWord8 s5166 = 128 | s5165;-  const SWord8 s5167 = 127 & s5165;-  const SWord8 s5168 = s5155 ? s5166 : s5167;-  const SBool  s5169 = (SBool) (s1997 & 1);-  const SBool  s5170 = false != s5169;-  const SWord8 s5171 = s5170 ? s5166 : s5167;-  const SWord8 s5172 = s1930 ? s5168 : s5171;-  const SBool  s5173 = (SBool) (s2013 & 1);-  const SBool  s5174 = false != s5173;-  const SBool  s5175 = (SBool) (s2006 & 1);-  const SBool  s5176 = false != s5175;-  const SWord8 s5177 = s5176 ? s5162 : s5163;-  const SWord8 s5178 = (s5177 >> 1) | (s5177 << 7);-  const SWord8 s5179 = 128 | s5178;-  const SWord8 s5180 = 127 & s5178;-  const SWord8 s5181 = s5174 ? s5179 : s5180;-  const SBool  s5182 = (SBool) (s2018 & 1);-  const SBool  s5183 = false != s5182;-  const SWord8 s5184 = s5183 ? s5179 : s5180;-  const SWord8 s5185 = s1930 ? s5181 : s5184;-  const SWord8 s5186 = s1803 ? s5172 : s5185;-  const SWord8 s5187 = s1548 ? s5153 : s5186;-  const SWord8 s5188 = s1037 ? s5117 : s5187;-  const SWord8 s5189 = s21 ? s5047 : s5188;-  const SWord8 s5190 = s16 ? s4906 : s5189;-  const SWord8 s5191 = s11 ? s4623 : s5190;-  const SBool  s5192 = (SBool) (s2128 & 1);-  const SBool  s5193 = false != s5192;-  const SBool  s5194 = (SBool) (s2124 & 1);-  const SBool  s5195 = false != s5194;-  const SBool  s5196 = (SBool) (s2120 & 1);-  const SBool  s5197 = false != s5196;-  const SWord8 s5198 = (s2107 >> 1) | (s2107 << 7);-  const SWord8 s5199 = 128 | s5198;-  const SWord8 s5200 = 127 & s5198;-  const SWord8 s5201 = s5197 ? s5199 : s5200;-  const SWord8 s5202 = (s5201 >> 1) | (s5201 << 7);-  const SWord8 s5203 = 128 | s5202;-  const SWord8 s5204 = 127 & s5202;-  const SWord8 s5205 = s5195 ? s5203 : s5204;-  const SWord8 s5206 = (s5205 >> 1) | (s5205 << 7);-  const SWord8 s5207 = 128 | s5206;-  const SWord8 s5208 = 127 & s5206;-  const SWord8 s5209 = s5193 ? s5207 : s5208;-  const SBool  s5210 = (SBool) (s2133 & 1);-  const SBool  s5211 = false != s5210;-  const SWord8 s5212 = s5211 ? s5207 : s5208;-  const SWord8 s5213 = s2116 ? s5209 : s5212;-  const SBool  s5214 = (SBool) (s2149 & 1);-  const SBool  s5215 = false != s5214;-  const SBool  s5216 = (SBool) (s2142 & 1);-  const SBool  s5217 = false != s5216;-  const SWord8 s5218 = s5217 ? s5203 : s5204;-  const SWord8 s5219 = (s5218 >> 1) | (s5218 << 7);-  const SWord8 s5220 = 128 | s5219;-  const SWord8 s5221 = 127 & s5219;-  const SWord8 s5222 = s5215 ? s5220 : s5221;-  const SBool  s5223 = (SBool) (s2154 & 1);-  const SBool  s5224 = false != s5223;-  const SWord8 s5225 = s5224 ? s5220 : s5221;-  const SWord8 s5226 = s2116 ? s5222 : s5225;-  const SWord8 s5227 = s2097 ? s5213 : s5226;-  const SBool  s5228 = (SBool) (s2175 & 1);-  const SBool  s5229 = false != s5228;-  const SBool  s5230 = (SBool) (s2171 & 1);-  const SBool  s5231 = false != s5230;-  const SBool  s5232 = (SBool) (s2164 & 1);-  const SBool  s5233 = false != s5232;-  const SWord8 s5234 = s5233 ? s5199 : s5200;-  const SWord8 s5235 = (s5234 >> 1) | (s5234 << 7);-  const SWord8 s5236 = 128 | s5235;-  const SWord8 s5237 = 127 & s5235;-  const SWord8 s5238 = s5231 ? s5236 : s5237;-  const SWord8 s5239 = (s5238 >> 1) | (s5238 << 7);-  const SWord8 s5240 = 128 | s5239;-  const SWord8 s5241 = 127 & s5239;-  const SWord8 s5242 = s5229 ? s5240 : s5241;-  const SBool  s5243 = (SBool) (s2180 & 1);-  const SBool  s5244 = false != s5243;-  const SWord8 s5245 = s5244 ? s5240 : s5241;-  const SWord8 s5246 = s2116 ? s5242 : s5245;-  const SBool  s5247 = (SBool) (s2196 & 1);-  const SBool  s5248 = false != s5247;-  const SBool  s5249 = (SBool) (s2189 & 1);-  const SBool  s5250 = false != s5249;-  const SWord8 s5251 = s5250 ? s5236 : s5237;-  const SWord8 s5252 = (s5251 >> 1) | (s5251 << 7);-  const SWord8 s5253 = 128 | s5252;-  const SWord8 s5254 = 127 & s5252;-  const SWord8 s5255 = s5248 ? s5253 : s5254;-  const SBool  s5256 = (SBool) (s2201 & 1);-  const SBool  s5257 = false != s5256;-  const SWord8 s5258 = s5257 ? s5253 : s5254;-  const SWord8 s5259 = s2116 ? s5255 : s5258;-  const SWord8 s5260 = s2097 ? s5246 : s5259;-  const SWord8 s5261 = s2078 ? s5227 : s5260;-  const SBool  s5262 = (SBool) (s2236 & 1);-  const SBool  s5263 = false != s5262;-  const SBool  s5264 = (SBool) (s2232 & 1);-  const SBool  s5265 = false != s5264;-  const SBool  s5266 = (SBool) (s2228 & 1);-  const SBool  s5267 = false != s5266;-  const SWord8 s5268 = (s2215 >> 1) | (s2215 << 7);-  const SWord8 s5269 = 128 | s5268;-  const SWord8 s5270 = 127 & s5268;-  const SWord8 s5271 = s5267 ? s5269 : s5270;-  const SWord8 s5272 = (s5271 >> 1) | (s5271 << 7);-  const SWord8 s5273 = 128 | s5272;-  const SWord8 s5274 = 127 & s5272;-  const SWord8 s5275 = s5265 ? s5273 : s5274;-  const SWord8 s5276 = (s5275 >> 1) | (s5275 << 7);-  const SWord8 s5277 = 128 | s5276;-  const SWord8 s5278 = 127 & s5276;-  const SWord8 s5279 = s5263 ? s5277 : s5278;-  const SBool  s5280 = (SBool) (s2241 & 1);-  const SBool  s5281 = false != s5280;-  const SWord8 s5282 = s5281 ? s5277 : s5278;-  const SWord8 s5283 = s2221 ? s5279 : s5282;-  const SBool  s5284 = (SBool) (s2257 & 1);-  const SBool  s5285 = false != s5284;-  const SBool  s5286 = (SBool) (s2250 & 1);-  const SBool  s5287 = false != s5286;-  const SWord8 s5288 = s5287 ? s5273 : s5274;-  const SWord8 s5289 = (s5288 >> 1) | (s5288 << 7);-  const SWord8 s5290 = 128 | s5289;-  const SWord8 s5291 = 127 & s5289;-  const SWord8 s5292 = s5285 ? s5290 : s5291;-  const SBool  s5293 = (SBool) (s2262 & 1);-  const SBool  s5294 = false != s5293;-  const SWord8 s5295 = s5294 ? s5290 : s5291;-  const SWord8 s5296 = s2221 ? s5292 : s5295;-  const SWord8 s5297 = s2097 ? s5283 : s5296;-  const SBool  s5298 = (SBool) (s2283 & 1);-  const SBool  s5299 = false != s5298;-  const SBool  s5300 = (SBool) (s2279 & 1);-  const SBool  s5301 = false != s5300;-  const SBool  s5302 = (SBool) (s2272 & 1);-  const SBool  s5303 = false != s5302;-  const SWord8 s5304 = s5303 ? s5269 : s5270;-  const SWord8 s5305 = (s5304 >> 1) | (s5304 << 7);-  const SWord8 s5306 = 128 | s5305;-  const SWord8 s5307 = 127 & s5305;-  const SWord8 s5308 = s5301 ? s5306 : s5307;-  const SWord8 s5309 = (s5308 >> 1) | (s5308 << 7);-  const SWord8 s5310 = 128 | s5309;-  const SWord8 s5311 = 127 & s5309;-  const SWord8 s5312 = s5299 ? s5310 : s5311;-  const SBool  s5313 = (SBool) (s2288 & 1);-  const SBool  s5314 = false != s5313;-  const SWord8 s5315 = s5314 ? s5310 : s5311;-  const SWord8 s5316 = s2221 ? s5312 : s5315;-  const SBool  s5317 = (SBool) (s2304 & 1);-  const SBool  s5318 = false != s5317;-  const SBool  s5319 = (SBool) (s2297 & 1);-  const SBool  s5320 = false != s5319;-  const SWord8 s5321 = s5320 ? s5306 : s5307;-  const SWord8 s5322 = (s5321 >> 1) | (s5321 << 7);-  const SWord8 s5323 = 128 | s5322;-  const SWord8 s5324 = 127 & s5322;-  const SWord8 s5325 = s5318 ? s5323 : s5324;-  const SBool  s5326 = (SBool) (s2309 & 1);-  const SBool  s5327 = false != s5326;-  const SWord8 s5328 = s5327 ? s5323 : s5324;-  const SWord8 s5329 = s2221 ? s5325 : s5328;-  const SWord8 s5330 = s2097 ? s5316 : s5329;-  const SWord8 s5331 = s2078 ? s5297 : s5330;-  const SWord8 s5332 = s2059 ? s5261 : s5331;-  const SBool  s5333 = (SBool) (s2364 & 1);-  const SBool  s5334 = false != s5333;-  const SBool  s5335 = (SBool) (s2360 & 1);-  const SBool  s5336 = false != s5335;-  const SBool  s5337 = (SBool) (s2356 & 1);-  const SBool  s5338 = false != s5337;-  const SWord8 s5339 = (s2343 >> 1) | (s2343 << 7);-  const SWord8 s5340 = 128 | s5339;-  const SWord8 s5341 = 127 & s5339;-  const SWord8 s5342 = s5338 ? s5340 : s5341;-  const SWord8 s5343 = (s5342 >> 1) | (s5342 << 7);-  const SWord8 s5344 = 128 | s5343;-  const SWord8 s5345 = 127 & s5343;-  const SWord8 s5346 = s5336 ? s5344 : s5345;-  const SWord8 s5347 = (s5346 >> 1) | (s5346 << 7);-  const SWord8 s5348 = 128 | s5347;-  const SWord8 s5349 = 127 & s5347;-  const SWord8 s5350 = s5334 ? s5348 : s5349;-  const SBool  s5351 = (SBool) (s2369 & 1);-  const SBool  s5352 = false != s5351;-  const SWord8 s5353 = s5352 ? s5348 : s5349;-  const SWord8 s5354 = s2352 ? s5350 : s5353;-  const SBool  s5355 = (SBool) (s2385 & 1);-  const SBool  s5356 = false != s5355;-  const SBool  s5357 = (SBool) (s2378 & 1);-  const SBool  s5358 = false != s5357;-  const SWord8 s5359 = s5358 ? s5344 : s5345;-  const SWord8 s5360 = (s5359 >> 1) | (s5359 << 7);-  const SWord8 s5361 = 128 | s5360;-  const SWord8 s5362 = 127 & s5360;-  const SWord8 s5363 = s5356 ? s5361 : s5362;-  const SBool  s5364 = (SBool) (s2390 & 1);-  const SBool  s5365 = false != s5364;-  const SWord8 s5366 = s5365 ? s5361 : s5362;-  const SWord8 s5367 = s2352 ? s5363 : s5366;-  const SWord8 s5368 = s2330 ? s5354 : s5367;-  const SBool  s5369 = (SBool) (s2411 & 1);-  const SBool  s5370 = false != s5369;-  const SBool  s5371 = (SBool) (s2407 & 1);-  const SBool  s5372 = false != s5371;-  const SBool  s5373 = (SBool) (s2400 & 1);-  const SBool  s5374 = false != s5373;-  const SWord8 s5375 = s5374 ? s5340 : s5341;-  const SWord8 s5376 = (s5375 >> 1) | (s5375 << 7);-  const SWord8 s5377 = 128 | s5376;-  const SWord8 s5378 = 127 & s5376;-  const SWord8 s5379 = s5372 ? s5377 : s5378;-  const SWord8 s5380 = (s5379 >> 1) | (s5379 << 7);-  const SWord8 s5381 = 128 | s5380;-  const SWord8 s5382 = 127 & s5380;-  const SWord8 s5383 = s5370 ? s5381 : s5382;-  const SBool  s5384 = (SBool) (s2416 & 1);-  const SBool  s5385 = false != s5384;-  const SWord8 s5386 = s5385 ? s5381 : s5382;-  const SWord8 s5387 = s2352 ? s5383 : s5386;-  const SBool  s5388 = (SBool) (s2432 & 1);-  const SBool  s5389 = false != s5388;-  const SBool  s5390 = (SBool) (s2425 & 1);-  const SBool  s5391 = false != s5390;-  const SWord8 s5392 = s5391 ? s5377 : s5378;-  const SWord8 s5393 = (s5392 >> 1) | (s5392 << 7);-  const SWord8 s5394 = 128 | s5393;-  const SWord8 s5395 = 127 & s5393;-  const SWord8 s5396 = s5389 ? s5394 : s5395;-  const SBool  s5397 = (SBool) (s2437 & 1);-  const SBool  s5398 = false != s5397;-  const SWord8 s5399 = s5398 ? s5394 : s5395;-  const SWord8 s5400 = s2352 ? s5396 : s5399;-  const SWord8 s5401 = s2330 ? s5387 : s5400;-  const SWord8 s5402 = s2078 ? s5368 : s5401;-  const SBool  s5403 = (SBool) (s2472 & 1);-  const SBool  s5404 = false != s5403;-  const SBool  s5405 = (SBool) (s2468 & 1);-  const SBool  s5406 = false != s5405;-  const SBool  s5407 = (SBool) (s2464 & 1);-  const SBool  s5408 = false != s5407;-  const SWord8 s5409 = (s2451 >> 1) | (s2451 << 7);-  const SWord8 s5410 = 128 | s5409;-  const SWord8 s5411 = 127 & s5409;-  const SWord8 s5412 = s5408 ? s5410 : s5411;-  const SWord8 s5413 = (s5412 >> 1) | (s5412 << 7);-  const SWord8 s5414 = 128 | s5413;-  const SWord8 s5415 = 127 & s5413;-  const SWord8 s5416 = s5406 ? s5414 : s5415;-  const SWord8 s5417 = (s5416 >> 1) | (s5416 << 7);-  const SWord8 s5418 = 128 | s5417;-  const SWord8 s5419 = 127 & s5417;-  const SWord8 s5420 = s5404 ? s5418 : s5419;-  const SBool  s5421 = (SBool) (s2477 & 1);-  const SBool  s5422 = false != s5421;-  const SWord8 s5423 = s5422 ? s5418 : s5419;-  const SWord8 s5424 = s2457 ? s5420 : s5423;-  const SBool  s5425 = (SBool) (s2493 & 1);-  const SBool  s5426 = false != s5425;-  const SBool  s5427 = (SBool) (s2486 & 1);-  const SBool  s5428 = false != s5427;-  const SWord8 s5429 = s5428 ? s5414 : s5415;-  const SWord8 s5430 = (s5429 >> 1) | (s5429 << 7);-  const SWord8 s5431 = 128 | s5430;-  const SWord8 s5432 = 127 & s5430;-  const SWord8 s5433 = s5426 ? s5431 : s5432;-  const SBool  s5434 = (SBool) (s2498 & 1);-  const SBool  s5435 = false != s5434;-  const SWord8 s5436 = s5435 ? s5431 : s5432;-  const SWord8 s5437 = s2457 ? s5433 : s5436;-  const SWord8 s5438 = s2330 ? s5424 : s5437;-  const SBool  s5439 = (SBool) (s2519 & 1);-  const SBool  s5440 = false != s5439;-  const SBool  s5441 = (SBool) (s2515 & 1);-  const SBool  s5442 = false != s5441;-  const SBool  s5443 = (SBool) (s2508 & 1);-  const SBool  s5444 = false != s5443;-  const SWord8 s5445 = s5444 ? s5410 : s5411;-  const SWord8 s5446 = (s5445 >> 1) | (s5445 << 7);-  const SWord8 s5447 = 128 | s5446;-  const SWord8 s5448 = 127 & s5446;-  const SWord8 s5449 = s5442 ? s5447 : s5448;-  const SWord8 s5450 = (s5449 >> 1) | (s5449 << 7);-  const SWord8 s5451 = 128 | s5450;-  const SWord8 s5452 = 127 & s5450;-  const SWord8 s5453 = s5440 ? s5451 : s5452;-  const SBool  s5454 = (SBool) (s2524 & 1);-  const SBool  s5455 = false != s5454;-  const SWord8 s5456 = s5455 ? s5451 : s5452;-  const SWord8 s5457 = s2457 ? s5453 : s5456;-  const SBool  s5458 = (SBool) (s2540 & 1);-  const SBool  s5459 = false != s5458;-  const SBool  s5460 = (SBool) (s2533 & 1);-  const SBool  s5461 = false != s5460;-  const SWord8 s5462 = s5461 ? s5447 : s5448;-  const SWord8 s5463 = (s5462 >> 1) | (s5462 << 7);-  const SWord8 s5464 = 128 | s5463;-  const SWord8 s5465 = 127 & s5463;-  const SWord8 s5466 = s5459 ? s5464 : s5465;-  const SBool  s5467 = (SBool) (s2545 & 1);-  const SBool  s5468 = false != s5467;-  const SWord8 s5469 = s5468 ? s5464 : s5465;-  const SWord8 s5470 = s2457 ? s5466 : s5469;-  const SWord8 s5471 = s2330 ? s5457 : s5470;-  const SWord8 s5472 = s2078 ? s5438 : s5471;-  const SWord8 s5473 = s2059 ? s5402 : s5472;-  const SWord8 s5474 = s2042 ? s5332 : s5473;-  const SBool  s5475 = (SBool) (s2620 & 1);-  const SBool  s5476 = false != s5475;-  const SBool  s5477 = (SBool) (s2616 & 1);-  const SBool  s5478 = false != s5477;-  const SBool  s5479 = (SBool) (s2612 & 1);-  const SBool  s5480 = false != s5479;-  const SWord8 s5481 = (s2599 >> 1) | (s2599 << 7);-  const SWord8 s5482 = 128 | s5481;-  const SWord8 s5483 = 127 & s5481;-  const SWord8 s5484 = s5480 ? s5482 : s5483;-  const SWord8 s5485 = (s5484 >> 1) | (s5484 << 7);-  const SWord8 s5486 = 128 | s5485;-  const SWord8 s5487 = 127 & s5485;-  const SWord8 s5488 = s5478 ? s5486 : s5487;-  const SWord8 s5489 = (s5488 >> 1) | (s5488 << 7);-  const SWord8 s5490 = 128 | s5489;-  const SWord8 s5491 = 127 & s5489;-  const SWord8 s5492 = s5476 ? s5490 : s5491;-  const SBool  s5493 = (SBool) (s2625 & 1);-  const SBool  s5494 = false != s5493;-  const SWord8 s5495 = s5494 ? s5490 : s5491;-  const SWord8 s5496 = s2608 ? s5492 : s5495;-  const SBool  s5497 = (SBool) (s2641 & 1);-  const SBool  s5498 = false != s5497;-  const SBool  s5499 = (SBool) (s2634 & 1);-  const SBool  s5500 = false != s5499;-  const SWord8 s5501 = s5500 ? s5486 : s5487;-  const SWord8 s5502 = (s5501 >> 1) | (s5501 << 7);-  const SWord8 s5503 = 128 | s5502;-  const SWord8 s5504 = 127 & s5502;-  const SWord8 s5505 = s5498 ? s5503 : s5504;-  const SBool  s5506 = (SBool) (s2646 & 1);-  const SBool  s5507 = false != s5506;-  const SWord8 s5508 = s5507 ? s5503 : s5504;-  const SWord8 s5509 = s2608 ? s5505 : s5508;-  const SWord8 s5510 = s2589 ? s5496 : s5509;-  const SBool  s5511 = (SBool) (s2667 & 1);-  const SBool  s5512 = false != s5511;-  const SBool  s5513 = (SBool) (s2663 & 1);-  const SBool  s5514 = false != s5513;-  const SBool  s5515 = (SBool) (s2656 & 1);-  const SBool  s5516 = false != s5515;-  const SWord8 s5517 = s5516 ? s5482 : s5483;-  const SWord8 s5518 = (s5517 >> 1) | (s5517 << 7);-  const SWord8 s5519 = 128 | s5518;-  const SWord8 s5520 = 127 & s5518;-  const SWord8 s5521 = s5514 ? s5519 : s5520;-  const SWord8 s5522 = (s5521 >> 1) | (s5521 << 7);-  const SWord8 s5523 = 128 | s5522;-  const SWord8 s5524 = 127 & s5522;-  const SWord8 s5525 = s5512 ? s5523 : s5524;-  const SBool  s5526 = (SBool) (s2672 & 1);-  const SBool  s5527 = false != s5526;-  const SWord8 s5528 = s5527 ? s5523 : s5524;-  const SWord8 s5529 = s2608 ? s5525 : s5528;-  const SBool  s5530 = (SBool) (s2688 & 1);-  const SBool  s5531 = false != s5530;-  const SBool  s5532 = (SBool) (s2681 & 1);-  const SBool  s5533 = false != s5532;-  const SWord8 s5534 = s5533 ? s5519 : s5520;-  const SWord8 s5535 = (s5534 >> 1) | (s5534 << 7);-  const SWord8 s5536 = 128 | s5535;-  const SWord8 s5537 = 127 & s5535;-  const SWord8 s5538 = s5531 ? s5536 : s5537;-  const SBool  s5539 = (SBool) (s2693 & 1);-  const SBool  s5540 = false != s5539;-  const SWord8 s5541 = s5540 ? s5536 : s5537;-  const SWord8 s5542 = s2608 ? s5538 : s5541;-  const SWord8 s5543 = s2589 ? s5529 : s5542;-  const SWord8 s5544 = s2567 ? s5510 : s5543;-  const SBool  s5545 = (SBool) (s2728 & 1);-  const SBool  s5546 = false != s5545;-  const SBool  s5547 = (SBool) (s2724 & 1);-  const SBool  s5548 = false != s5547;-  const SBool  s5549 = (SBool) (s2720 & 1);-  const SBool  s5550 = false != s5549;-  const SWord8 s5551 = (s2707 >> 1) | (s2707 << 7);-  const SWord8 s5552 = 128 | s5551;-  const SWord8 s5553 = 127 & s5551;-  const SWord8 s5554 = s5550 ? s5552 : s5553;-  const SWord8 s5555 = (s5554 >> 1) | (s5554 << 7);-  const SWord8 s5556 = 128 | s5555;-  const SWord8 s5557 = 127 & s5555;-  const SWord8 s5558 = s5548 ? s5556 : s5557;-  const SWord8 s5559 = (s5558 >> 1) | (s5558 << 7);-  const SWord8 s5560 = 128 | s5559;-  const SWord8 s5561 = 127 & s5559;-  const SWord8 s5562 = s5546 ? s5560 : s5561;-  const SBool  s5563 = (SBool) (s2733 & 1);-  const SBool  s5564 = false != s5563;-  const SWord8 s5565 = s5564 ? s5560 : s5561;-  const SWord8 s5566 = s2713 ? s5562 : s5565;-  const SBool  s5567 = (SBool) (s2749 & 1);-  const SBool  s5568 = false != s5567;-  const SBool  s5569 = (SBool) (s2742 & 1);-  const SBool  s5570 = false != s5569;-  const SWord8 s5571 = s5570 ? s5556 : s5557;-  const SWord8 s5572 = (s5571 >> 1) | (s5571 << 7);-  const SWord8 s5573 = 128 | s5572;-  const SWord8 s5574 = 127 & s5572;-  const SWord8 s5575 = s5568 ? s5573 : s5574;-  const SBool  s5576 = (SBool) (s2754 & 1);-  const SBool  s5577 = false != s5576;-  const SWord8 s5578 = s5577 ? s5573 : s5574;-  const SWord8 s5579 = s2713 ? s5575 : s5578;-  const SWord8 s5580 = s2589 ? s5566 : s5579;-  const SBool  s5581 = (SBool) (s2775 & 1);-  const SBool  s5582 = false != s5581;-  const SBool  s5583 = (SBool) (s2771 & 1);-  const SBool  s5584 = false != s5583;-  const SBool  s5585 = (SBool) (s2764 & 1);-  const SBool  s5586 = false != s5585;-  const SWord8 s5587 = s5586 ? s5552 : s5553;-  const SWord8 s5588 = (s5587 >> 1) | (s5587 << 7);-  const SWord8 s5589 = 128 | s5588;-  const SWord8 s5590 = 127 & s5588;-  const SWord8 s5591 = s5584 ? s5589 : s5590;-  const SWord8 s5592 = (s5591 >> 1) | (s5591 << 7);-  const SWord8 s5593 = 128 | s5592;-  const SWord8 s5594 = 127 & s5592;-  const SWord8 s5595 = s5582 ? s5593 : s5594;-  const SBool  s5596 = (SBool) (s2780 & 1);-  const SBool  s5597 = false != s5596;-  const SWord8 s5598 = s5597 ? s5593 : s5594;-  const SWord8 s5599 = s2713 ? s5595 : s5598;-  const SBool  s5600 = (SBool) (s2796 & 1);-  const SBool  s5601 = false != s5600;-  const SBool  s5602 = (SBool) (s2789 & 1);-  const SBool  s5603 = false != s5602;-  const SWord8 s5604 = s5603 ? s5589 : s5590;-  const SWord8 s5605 = (s5604 >> 1) | (s5604 << 7);-  const SWord8 s5606 = 128 | s5605;-  const SWord8 s5607 = 127 & s5605;-  const SWord8 s5608 = s5601 ? s5606 : s5607;-  const SBool  s5609 = (SBool) (s2801 & 1);-  const SBool  s5610 = false != s5609;-  const SWord8 s5611 = s5610 ? s5606 : s5607;-  const SWord8 s5612 = s2713 ? s5608 : s5611;-  const SWord8 s5613 = s2589 ? s5599 : s5612;-  const SWord8 s5614 = s2567 ? s5580 : s5613;-  const SWord8 s5615 = s2059 ? s5544 : s5614;-  const SBool  s5616 = (SBool) (s2856 & 1);-  const SBool  s5617 = false != s5616;-  const SBool  s5618 = (SBool) (s2852 & 1);-  const SBool  s5619 = false != s5618;-  const SBool  s5620 = (SBool) (s2848 & 1);-  const SBool  s5621 = false != s5620;-  const SWord8 s5622 = (s2835 >> 1) | (s2835 << 7);-  const SWord8 s5623 = 128 | s5622;-  const SWord8 s5624 = 127 & s5622;-  const SWord8 s5625 = s5621 ? s5623 : s5624;-  const SWord8 s5626 = (s5625 >> 1) | (s5625 << 7);-  const SWord8 s5627 = 128 | s5626;-  const SWord8 s5628 = 127 & s5626;-  const SWord8 s5629 = s5619 ? s5627 : s5628;-  const SWord8 s5630 = (s5629 >> 1) | (s5629 << 7);-  const SWord8 s5631 = 128 | s5630;-  const SWord8 s5632 = 127 & s5630;-  const SWord8 s5633 = s5617 ? s5631 : s5632;-  const SBool  s5634 = (SBool) (s2861 & 1);-  const SBool  s5635 = false != s5634;-  const SWord8 s5636 = s5635 ? s5631 : s5632;-  const SWord8 s5637 = s2844 ? s5633 : s5636;-  const SBool  s5638 = (SBool) (s2877 & 1);-  const SBool  s5639 = false != s5638;-  const SBool  s5640 = (SBool) (s2870 & 1);-  const SBool  s5641 = false != s5640;-  const SWord8 s5642 = s5641 ? s5627 : s5628;-  const SWord8 s5643 = (s5642 >> 1) | (s5642 << 7);-  const SWord8 s5644 = 128 | s5643;-  const SWord8 s5645 = 127 & s5643;-  const SWord8 s5646 = s5639 ? s5644 : s5645;-  const SBool  s5647 = (SBool) (s2882 & 1);-  const SBool  s5648 = false != s5647;-  const SWord8 s5649 = s5648 ? s5644 : s5645;-  const SWord8 s5650 = s2844 ? s5646 : s5649;-  const SWord8 s5651 = s2822 ? s5637 : s5650;-  const SBool  s5652 = (SBool) (s2903 & 1);-  const SBool  s5653 = false != s5652;-  const SBool  s5654 = (SBool) (s2899 & 1);-  const SBool  s5655 = false != s5654;-  const SBool  s5656 = (SBool) (s2892 & 1);-  const SBool  s5657 = false != s5656;-  const SWord8 s5658 = s5657 ? s5623 : s5624;-  const SWord8 s5659 = (s5658 >> 1) | (s5658 << 7);-  const SWord8 s5660 = 128 | s5659;-  const SWord8 s5661 = 127 & s5659;-  const SWord8 s5662 = s5655 ? s5660 : s5661;-  const SWord8 s5663 = (s5662 >> 1) | (s5662 << 7);-  const SWord8 s5664 = 128 | s5663;-  const SWord8 s5665 = 127 & s5663;-  const SWord8 s5666 = s5653 ? s5664 : s5665;-  const SBool  s5667 = (SBool) (s2908 & 1);-  const SBool  s5668 = false != s5667;-  const SWord8 s5669 = s5668 ? s5664 : s5665;-  const SWord8 s5670 = s2844 ? s5666 : s5669;-  const SBool  s5671 = (SBool) (s2924 & 1);-  const SBool  s5672 = false != s5671;-  const SBool  s5673 = (SBool) (s2917 & 1);-  const SBool  s5674 = false != s5673;-  const SWord8 s5675 = s5674 ? s5660 : s5661;-  const SWord8 s5676 = (s5675 >> 1) | (s5675 << 7);-  const SWord8 s5677 = 128 | s5676;-  const SWord8 s5678 = 127 & s5676;-  const SWord8 s5679 = s5672 ? s5677 : s5678;-  const SBool  s5680 = (SBool) (s2929 & 1);-  const SBool  s5681 = false != s5680;-  const SWord8 s5682 = s5681 ? s5677 : s5678;-  const SWord8 s5683 = s2844 ? s5679 : s5682;-  const SWord8 s5684 = s2822 ? s5670 : s5683;-  const SWord8 s5685 = s2567 ? s5651 : s5684;-  const SBool  s5686 = (SBool) (s2964 & 1);-  const SBool  s5687 = false != s5686;-  const SBool  s5688 = (SBool) (s2960 & 1);-  const SBool  s5689 = false != s5688;-  const SBool  s5690 = (SBool) (s2956 & 1);-  const SBool  s5691 = false != s5690;-  const SWord8 s5692 = (s2943 >> 1) | (s2943 << 7);-  const SWord8 s5693 = 128 | s5692;-  const SWord8 s5694 = 127 & s5692;-  const SWord8 s5695 = s5691 ? s5693 : s5694;-  const SWord8 s5696 = (s5695 >> 1) | (s5695 << 7);-  const SWord8 s5697 = 128 | s5696;-  const SWord8 s5698 = 127 & s5696;-  const SWord8 s5699 = s5689 ? s5697 : s5698;-  const SWord8 s5700 = (s5699 >> 1) | (s5699 << 7);-  const SWord8 s5701 = 128 | s5700;-  const SWord8 s5702 = 127 & s5700;-  const SWord8 s5703 = s5687 ? s5701 : s5702;-  const SBool  s5704 = (SBool) (s2969 & 1);-  const SBool  s5705 = false != s5704;-  const SWord8 s5706 = s5705 ? s5701 : s5702;-  const SWord8 s5707 = s2949 ? s5703 : s5706;-  const SBool  s5708 = (SBool) (s2985 & 1);-  const SBool  s5709 = false != s5708;-  const SBool  s5710 = (SBool) (s2978 & 1);-  const SBool  s5711 = false != s5710;-  const SWord8 s5712 = s5711 ? s5697 : s5698;-  const SWord8 s5713 = (s5712 >> 1) | (s5712 << 7);-  const SWord8 s5714 = 128 | s5713;-  const SWord8 s5715 = 127 & s5713;-  const SWord8 s5716 = s5709 ? s5714 : s5715;-  const SBool  s5717 = (SBool) (s2990 & 1);-  const SBool  s5718 = false != s5717;-  const SWord8 s5719 = s5718 ? s5714 : s5715;-  const SWord8 s5720 = s2949 ? s5716 : s5719;-  const SWord8 s5721 = s2822 ? s5707 : s5720;-  const SBool  s5722 = (SBool) (s3011 & 1);-  const SBool  s5723 = false != s5722;-  const SBool  s5724 = (SBool) (s3007 & 1);-  const SBool  s5725 = false != s5724;-  const SBool  s5726 = (SBool) (s3000 & 1);-  const SBool  s5727 = false != s5726;-  const SWord8 s5728 = s5727 ? s5693 : s5694;-  const SWord8 s5729 = (s5728 >> 1) | (s5728 << 7);-  const SWord8 s5730 = 128 | s5729;-  const SWord8 s5731 = 127 & s5729;-  const SWord8 s5732 = s5725 ? s5730 : s5731;-  const SWord8 s5733 = (s5732 >> 1) | (s5732 << 7);-  const SWord8 s5734 = 128 | s5733;-  const SWord8 s5735 = 127 & s5733;-  const SWord8 s5736 = s5723 ? s5734 : s5735;-  const SBool  s5737 = (SBool) (s3016 & 1);-  const SBool  s5738 = false != s5737;-  const SWord8 s5739 = s5738 ? s5734 : s5735;-  const SWord8 s5740 = s2949 ? s5736 : s5739;-  const SBool  s5741 = (SBool) (s3032 & 1);-  const SBool  s5742 = false != s5741;-  const SBool  s5743 = (SBool) (s3025 & 1);-  const SBool  s5744 = false != s5743;-  const SWord8 s5745 = s5744 ? s5730 : s5731;-  const SWord8 s5746 = (s5745 >> 1) | (s5745 << 7);-  const SWord8 s5747 = 128 | s5746;-  const SWord8 s5748 = 127 & s5746;-  const SWord8 s5749 = s5742 ? s5747 : s5748;-  const SBool  s5750 = (SBool) (s3037 & 1);-  const SBool  s5751 = false != s5750;-  const SWord8 s5752 = s5751 ? s5747 : s5748;-  const SWord8 s5753 = s2949 ? s5749 : s5752;-  const SWord8 s5754 = s2822 ? s5740 : s5753;-  const SWord8 s5755 = s2567 ? s5721 : s5754;-  const SWord8 s5756 = s2059 ? s5685 : s5755;-  const SWord8 s5757 = s2042 ? s5615 : s5756;-  const SWord8 s5758 = s16 ? s5474 : s5757;-  const SBool  s5759 = (SBool) (s3132 & 1);-  const SBool  s5760 = false != s5759;-  const SBool  s5761 = (SBool) (s3128 & 1);-  const SBool  s5762 = false != s5761;-  const SBool  s5763 = (SBool) (s3124 & 1);-  const SBool  s5764 = false != s5763;-  const SWord8 s5765 = (s3111 >> 1) | (s3111 << 7);-  const SWord8 s5766 = 128 | s5765;-  const SWord8 s5767 = 127 & s5765;-  const SWord8 s5768 = s5764 ? s5766 : s5767;-  const SWord8 s5769 = (s5768 >> 1) | (s5768 << 7);-  const SWord8 s5770 = 128 | s5769;-  const SWord8 s5771 = 127 & s5769;-  const SWord8 s5772 = s5762 ? s5770 : s5771;-  const SWord8 s5773 = (s5772 >> 1) | (s5772 << 7);-  const SWord8 s5774 = 128 | s5773;-  const SWord8 s5775 = 127 & s5773;-  const SWord8 s5776 = s5760 ? s5774 : s5775;-  const SBool  s5777 = (SBool) (s3137 & 1);-  const SBool  s5778 = false != s5777;-  const SWord8 s5779 = s5778 ? s5774 : s5775;-  const SWord8 s5780 = s3120 ? s5776 : s5779;-  const SBool  s5781 = (SBool) (s3153 & 1);-  const SBool  s5782 = false != s5781;-  const SBool  s5783 = (SBool) (s3146 & 1);-  const SBool  s5784 = false != s5783;-  const SWord8 s5785 = s5784 ? s5770 : s5771;-  const SWord8 s5786 = (s5785 >> 1) | (s5785 << 7);-  const SWord8 s5787 = 128 | s5786;-  const SWord8 s5788 = 127 & s5786;-  const SWord8 s5789 = s5782 ? s5787 : s5788;-  const SBool  s5790 = (SBool) (s3158 & 1);-  const SBool  s5791 = false != s5790;-  const SWord8 s5792 = s5791 ? s5787 : s5788;-  const SWord8 s5793 = s3120 ? s5789 : s5792;-  const SWord8 s5794 = s3101 ? s5780 : s5793;-  const SBool  s5795 = (SBool) (s3179 & 1);-  const SBool  s5796 = false != s5795;-  const SBool  s5797 = (SBool) (s3175 & 1);-  const SBool  s5798 = false != s5797;-  const SBool  s5799 = (SBool) (s3168 & 1);-  const SBool  s5800 = false != s5799;-  const SWord8 s5801 = s5800 ? s5766 : s5767;-  const SWord8 s5802 = (s5801 >> 1) | (s5801 << 7);-  const SWord8 s5803 = 128 | s5802;-  const SWord8 s5804 = 127 & s5802;-  const SWord8 s5805 = s5798 ? s5803 : s5804;-  const SWord8 s5806 = (s5805 >> 1) | (s5805 << 7);-  const SWord8 s5807 = 128 | s5806;-  const SWord8 s5808 = 127 & s5806;-  const SWord8 s5809 = s5796 ? s5807 : s5808;-  const SBool  s5810 = (SBool) (s3184 & 1);-  const SBool  s5811 = false != s5810;-  const SWord8 s5812 = s5811 ? s5807 : s5808;-  const SWord8 s5813 = s3120 ? s5809 : s5812;-  const SBool  s5814 = (SBool) (s3200 & 1);-  const SBool  s5815 = false != s5814;-  const SBool  s5816 = (SBool) (s3193 & 1);-  const SBool  s5817 = false != s5816;-  const SWord8 s5818 = s5817 ? s5803 : s5804;-  const SWord8 s5819 = (s5818 >> 1) | (s5818 << 7);-  const SWord8 s5820 = 128 | s5819;-  const SWord8 s5821 = 127 & s5819;-  const SWord8 s5822 = s5815 ? s5820 : s5821;-  const SBool  s5823 = (SBool) (s3205 & 1);-  const SBool  s5824 = false != s5823;-  const SWord8 s5825 = s5824 ? s5820 : s5821;-  const SWord8 s5826 = s3120 ? s5822 : s5825;-  const SWord8 s5827 = s3101 ? s5813 : s5826;-  const SWord8 s5828 = s3082 ? s5794 : s5827;-  const SBool  s5829 = (SBool) (s3240 & 1);-  const SBool  s5830 = false != s5829;-  const SBool  s5831 = (SBool) (s3236 & 1);-  const SBool  s5832 = false != s5831;-  const SBool  s5833 = (SBool) (s3232 & 1);-  const SBool  s5834 = false != s5833;-  const SWord8 s5835 = (s3219 >> 1) | (s3219 << 7);-  const SWord8 s5836 = 128 | s5835;-  const SWord8 s5837 = 127 & s5835;-  const SWord8 s5838 = s5834 ? s5836 : s5837;-  const SWord8 s5839 = (s5838 >> 1) | (s5838 << 7);-  const SWord8 s5840 = 128 | s5839;-  const SWord8 s5841 = 127 & s5839;-  const SWord8 s5842 = s5832 ? s5840 : s5841;-  const SWord8 s5843 = (s5842 >> 1) | (s5842 << 7);-  const SWord8 s5844 = 128 | s5843;-  const SWord8 s5845 = 127 & s5843;-  const SWord8 s5846 = s5830 ? s5844 : s5845;-  const SBool  s5847 = (SBool) (s3245 & 1);-  const SBool  s5848 = false != s5847;-  const SWord8 s5849 = s5848 ? s5844 : s5845;-  const SWord8 s5850 = s3225 ? s5846 : s5849;-  const SBool  s5851 = (SBool) (s3261 & 1);-  const SBool  s5852 = false != s5851;-  const SBool  s5853 = (SBool) (s3254 & 1);-  const SBool  s5854 = false != s5853;-  const SWord8 s5855 = s5854 ? s5840 : s5841;-  const SWord8 s5856 = (s5855 >> 1) | (s5855 << 7);-  const SWord8 s5857 = 128 | s5856;-  const SWord8 s5858 = 127 & s5856;-  const SWord8 s5859 = s5852 ? s5857 : s5858;-  const SBool  s5860 = (SBool) (s3266 & 1);-  const SBool  s5861 = false != s5860;-  const SWord8 s5862 = s5861 ? s5857 : s5858;-  const SWord8 s5863 = s3225 ? s5859 : s5862;-  const SWord8 s5864 = s3101 ? s5850 : s5863;-  const SBool  s5865 = (SBool) (s3287 & 1);-  const SBool  s5866 = false != s5865;-  const SBool  s5867 = (SBool) (s3283 & 1);-  const SBool  s5868 = false != s5867;-  const SBool  s5869 = (SBool) (s3276 & 1);-  const SBool  s5870 = false != s5869;-  const SWord8 s5871 = s5870 ? s5836 : s5837;-  const SWord8 s5872 = (s5871 >> 1) | (s5871 << 7);-  const SWord8 s5873 = 128 | s5872;-  const SWord8 s5874 = 127 & s5872;-  const SWord8 s5875 = s5868 ? s5873 : s5874;-  const SWord8 s5876 = (s5875 >> 1) | (s5875 << 7);-  const SWord8 s5877 = 128 | s5876;-  const SWord8 s5878 = 127 & s5876;-  const SWord8 s5879 = s5866 ? s5877 : s5878;-  const SBool  s5880 = (SBool) (s3292 & 1);-  const SBool  s5881 = false != s5880;-  const SWord8 s5882 = s5881 ? s5877 : s5878;-  const SWord8 s5883 = s3225 ? s5879 : s5882;-  const SBool  s5884 = (SBool) (s3308 & 1);-  const SBool  s5885 = false != s5884;-  const SBool  s5886 = (SBool) (s3301 & 1);-  const SBool  s5887 = false != s5886;-  const SWord8 s5888 = s5887 ? s5873 : s5874;-  const SWord8 s5889 = (s5888 >> 1) | (s5888 << 7);-  const SWord8 s5890 = 128 | s5889;-  const SWord8 s5891 = 127 & s5889;-  const SWord8 s5892 = s5885 ? s5890 : s5891;-  const SBool  s5893 = (SBool) (s3313 & 1);-  const SBool  s5894 = false != s5893;-  const SWord8 s5895 = s5894 ? s5890 : s5891;-  const SWord8 s5896 = s3225 ? s5892 : s5895;-  const SWord8 s5897 = s3101 ? s5883 : s5896;-  const SWord8 s5898 = s3082 ? s5864 : s5897;-  const SWord8 s5899 = s3060 ? s5828 : s5898;-  const SBool  s5900 = (SBool) (s3368 & 1);-  const SBool  s5901 = false != s5900;-  const SBool  s5902 = (SBool) (s3364 & 1);-  const SBool  s5903 = false != s5902;-  const SBool  s5904 = (SBool) (s3360 & 1);-  const SBool  s5905 = false != s5904;-  const SWord8 s5906 = (s3347 >> 1) | (s3347 << 7);-  const SWord8 s5907 = 128 | s5906;-  const SWord8 s5908 = 127 & s5906;-  const SWord8 s5909 = s5905 ? s5907 : s5908;-  const SWord8 s5910 = (s5909 >> 1) | (s5909 << 7);-  const SWord8 s5911 = 128 | s5910;-  const SWord8 s5912 = 127 & s5910;-  const SWord8 s5913 = s5903 ? s5911 : s5912;-  const SWord8 s5914 = (s5913 >> 1) | (s5913 << 7);-  const SWord8 s5915 = 128 | s5914;-  const SWord8 s5916 = 127 & s5914;-  const SWord8 s5917 = s5901 ? s5915 : s5916;-  const SBool  s5918 = (SBool) (s3373 & 1);-  const SBool  s5919 = false != s5918;-  const SWord8 s5920 = s5919 ? s5915 : s5916;-  const SWord8 s5921 = s3356 ? s5917 : s5920;-  const SBool  s5922 = (SBool) (s3389 & 1);-  const SBool  s5923 = false != s5922;-  const SBool  s5924 = (SBool) (s3382 & 1);-  const SBool  s5925 = false != s5924;-  const SWord8 s5926 = s5925 ? s5911 : s5912;-  const SWord8 s5927 = (s5926 >> 1) | (s5926 << 7);-  const SWord8 s5928 = 128 | s5927;-  const SWord8 s5929 = 127 & s5927;-  const SWord8 s5930 = s5923 ? s5928 : s5929;-  const SBool  s5931 = (SBool) (s3394 & 1);-  const SBool  s5932 = false != s5931;-  const SWord8 s5933 = s5932 ? s5928 : s5929;-  const SWord8 s5934 = s3356 ? s5930 : s5933;-  const SWord8 s5935 = s3334 ? s5921 : s5934;-  const SBool  s5936 = (SBool) (s3415 & 1);-  const SBool  s5937 = false != s5936;-  const SBool  s5938 = (SBool) (s3411 & 1);-  const SBool  s5939 = false != s5938;-  const SBool  s5940 = (SBool) (s3404 & 1);-  const SBool  s5941 = false != s5940;-  const SWord8 s5942 = s5941 ? s5907 : s5908;-  const SWord8 s5943 = (s5942 >> 1) | (s5942 << 7);-  const SWord8 s5944 = 128 | s5943;-  const SWord8 s5945 = 127 & s5943;-  const SWord8 s5946 = s5939 ? s5944 : s5945;-  const SWord8 s5947 = (s5946 >> 1) | (s5946 << 7);-  const SWord8 s5948 = 128 | s5947;-  const SWord8 s5949 = 127 & s5947;-  const SWord8 s5950 = s5937 ? s5948 : s5949;-  const SBool  s5951 = (SBool) (s3420 & 1);-  const SBool  s5952 = false != s5951;-  const SWord8 s5953 = s5952 ? s5948 : s5949;-  const SWord8 s5954 = s3356 ? s5950 : s5953;-  const SBool  s5955 = (SBool) (s3436 & 1);-  const SBool  s5956 = false != s5955;-  const SBool  s5957 = (SBool) (s3429 & 1);-  const SBool  s5958 = false != s5957;-  const SWord8 s5959 = s5958 ? s5944 : s5945;-  const SWord8 s5960 = (s5959 >> 1) | (s5959 << 7);-  const SWord8 s5961 = 128 | s5960;-  const SWord8 s5962 = 127 & s5960;-  const SWord8 s5963 = s5956 ? s5961 : s5962;-  const SBool  s5964 = (SBool) (s3441 & 1);-  const SBool  s5965 = false != s5964;-  const SWord8 s5966 = s5965 ? s5961 : s5962;-  const SWord8 s5967 = s3356 ? s5963 : s5966;-  const SWord8 s5968 = s3334 ? s5954 : s5967;-  const SWord8 s5969 = s3082 ? s5935 : s5968;-  const SBool  s5970 = (SBool) (s3476 & 1);-  const SBool  s5971 = false != s5970;-  const SBool  s5972 = (SBool) (s3472 & 1);-  const SBool  s5973 = false != s5972;-  const SBool  s5974 = (SBool) (s3468 & 1);-  const SBool  s5975 = false != s5974;-  const SWord8 s5976 = (s3455 >> 1) | (s3455 << 7);-  const SWord8 s5977 = 128 | s5976;-  const SWord8 s5978 = 127 & s5976;-  const SWord8 s5979 = s5975 ? s5977 : s5978;-  const SWord8 s5980 = (s5979 >> 1) | (s5979 << 7);-  const SWord8 s5981 = 128 | s5980;-  const SWord8 s5982 = 127 & s5980;-  const SWord8 s5983 = s5973 ? s5981 : s5982;-  const SWord8 s5984 = (s5983 >> 1) | (s5983 << 7);-  const SWord8 s5985 = 128 | s5984;-  const SWord8 s5986 = 127 & s5984;-  const SWord8 s5987 = s5971 ? s5985 : s5986;-  const SBool  s5988 = (SBool) (s3481 & 1);-  const SBool  s5989 = false != s5988;-  const SWord8 s5990 = s5989 ? s5985 : s5986;-  const SWord8 s5991 = s3461 ? s5987 : s5990;-  const SBool  s5992 = (SBool) (s3497 & 1);-  const SBool  s5993 = false != s5992;-  const SBool  s5994 = (SBool) (s3490 & 1);-  const SBool  s5995 = false != s5994;-  const SWord8 s5996 = s5995 ? s5981 : s5982;-  const SWord8 s5997 = (s5996 >> 1) | (s5996 << 7);-  const SWord8 s5998 = 128 | s5997;-  const SWord8 s5999 = 127 & s5997;-  const SWord8 s6000 = s5993 ? s5998 : s5999;-  const SBool  s6001 = (SBool) (s3502 & 1);-  const SBool  s6002 = false != s6001;-  const SWord8 s6003 = s6002 ? s5998 : s5999;-  const SWord8 s6004 = s3461 ? s6000 : s6003;-  const SWord8 s6005 = s3334 ? s5991 : s6004;-  const SBool  s6006 = (SBool) (s3523 & 1);-  const SBool  s6007 = false != s6006;-  const SBool  s6008 = (SBool) (s3519 & 1);-  const SBool  s6009 = false != s6008;-  const SBool  s6010 = (SBool) (s3512 & 1);-  const SBool  s6011 = false != s6010;-  const SWord8 s6012 = s6011 ? s5977 : s5978;-  const SWord8 s6013 = (s6012 >> 1) | (s6012 << 7);-  const SWord8 s6014 = 128 | s6013;-  const SWord8 s6015 = 127 & s6013;-  const SWord8 s6016 = s6009 ? s6014 : s6015;-  const SWord8 s6017 = (s6016 >> 1) | (s6016 << 7);-  const SWord8 s6018 = 128 | s6017;-  const SWord8 s6019 = 127 & s6017;-  const SWord8 s6020 = s6007 ? s6018 : s6019;-  const SBool  s6021 = (SBool) (s3528 & 1);-  const SBool  s6022 = false != s6021;-  const SWord8 s6023 = s6022 ? s6018 : s6019;-  const SWord8 s6024 = s3461 ? s6020 : s6023;-  const SBool  s6025 = (SBool) (s3544 & 1);-  const SBool  s6026 = false != s6025;-  const SBool  s6027 = (SBool) (s3537 & 1);-  const SBool  s6028 = false != s6027;-  const SWord8 s6029 = s6028 ? s6014 : s6015;-  const SWord8 s6030 = (s6029 >> 1) | (s6029 << 7);-  const SWord8 s6031 = 128 | s6030;-  const SWord8 s6032 = 127 & s6030;-  const SWord8 s6033 = s6026 ? s6031 : s6032;-  const SBool  s6034 = (SBool) (s3549 & 1);-  const SBool  s6035 = false != s6034;-  const SWord8 s6036 = s6035 ? s6031 : s6032;-  const SWord8 s6037 = s3461 ? s6033 : s6036;-  const SWord8 s6038 = s3334 ? s6024 : s6037;-  const SWord8 s6039 = s3082 ? s6005 : s6038;-  const SWord8 s6040 = s3060 ? s5969 : s6039;-  const SWord8 s6041 = s2042 ? s5899 : s6040;-  const SBool  s6042 = (SBool) (s3624 & 1);-  const SBool  s6043 = false != s6042;-  const SBool  s6044 = (SBool) (s3620 & 1);-  const SBool  s6045 = false != s6044;-  const SBool  s6046 = (SBool) (s3616 & 1);-  const SBool  s6047 = false != s6046;-  const SWord8 s6048 = (s3603 >> 1) | (s3603 << 7);-  const SWord8 s6049 = 128 | s6048;-  const SWord8 s6050 = 127 & s6048;-  const SWord8 s6051 = s6047 ? s6049 : s6050;-  const SWord8 s6052 = (s6051 >> 1) | (s6051 << 7);-  const SWord8 s6053 = 128 | s6052;-  const SWord8 s6054 = 127 & s6052;-  const SWord8 s6055 = s6045 ? s6053 : s6054;-  const SWord8 s6056 = (s6055 >> 1) | (s6055 << 7);-  const SWord8 s6057 = 128 | s6056;-  const SWord8 s6058 = 127 & s6056;-  const SWord8 s6059 = s6043 ? s6057 : s6058;-  const SBool  s6060 = (SBool) (s3629 & 1);-  const SBool  s6061 = false != s6060;-  const SWord8 s6062 = s6061 ? s6057 : s6058;-  const SWord8 s6063 = s3612 ? s6059 : s6062;-  const SBool  s6064 = (SBool) (s3645 & 1);-  const SBool  s6065 = false != s6064;-  const SBool  s6066 = (SBool) (s3638 & 1);-  const SBool  s6067 = false != s6066;-  const SWord8 s6068 = s6067 ? s6053 : s6054;-  const SWord8 s6069 = (s6068 >> 1) | (s6068 << 7);-  const SWord8 s6070 = 128 | s6069;-  const SWord8 s6071 = 127 & s6069;-  const SWord8 s6072 = s6065 ? s6070 : s6071;-  const SBool  s6073 = (SBool) (s3650 & 1);-  const SBool  s6074 = false != s6073;-  const SWord8 s6075 = s6074 ? s6070 : s6071;-  const SWord8 s6076 = s3612 ? s6072 : s6075;-  const SWord8 s6077 = s3593 ? s6063 : s6076;-  const SBool  s6078 = (SBool) (s3671 & 1);-  const SBool  s6079 = false != s6078;-  const SBool  s6080 = (SBool) (s3667 & 1);-  const SBool  s6081 = false != s6080;-  const SBool  s6082 = (SBool) (s3660 & 1);-  const SBool  s6083 = false != s6082;-  const SWord8 s6084 = s6083 ? s6049 : s6050;-  const SWord8 s6085 = (s6084 >> 1) | (s6084 << 7);-  const SWord8 s6086 = 128 | s6085;-  const SWord8 s6087 = 127 & s6085;-  const SWord8 s6088 = s6081 ? s6086 : s6087;-  const SWord8 s6089 = (s6088 >> 1) | (s6088 << 7);-  const SWord8 s6090 = 128 | s6089;-  const SWord8 s6091 = 127 & s6089;-  const SWord8 s6092 = s6079 ? s6090 : s6091;-  const SBool  s6093 = (SBool) (s3676 & 1);-  const SBool  s6094 = false != s6093;-  const SWord8 s6095 = s6094 ? s6090 : s6091;-  const SWord8 s6096 = s3612 ? s6092 : s6095;-  const SBool  s6097 = (SBool) (s3692 & 1);-  const SBool  s6098 = false != s6097;-  const SBool  s6099 = (SBool) (s3685 & 1);-  const SBool  s6100 = false != s6099;-  const SWord8 s6101 = s6100 ? s6086 : s6087;-  const SWord8 s6102 = (s6101 >> 1) | (s6101 << 7);-  const SWord8 s6103 = 128 | s6102;-  const SWord8 s6104 = 127 & s6102;-  const SWord8 s6105 = s6098 ? s6103 : s6104;-  const SBool  s6106 = (SBool) (s3697 & 1);-  const SBool  s6107 = false != s6106;-  const SWord8 s6108 = s6107 ? s6103 : s6104;-  const SWord8 s6109 = s3612 ? s6105 : s6108;-  const SWord8 s6110 = s3593 ? s6096 : s6109;-  const SWord8 s6111 = s3571 ? s6077 : s6110;-  const SBool  s6112 = (SBool) (s3732 & 1);-  const SBool  s6113 = false != s6112;-  const SBool  s6114 = (SBool) (s3728 & 1);-  const SBool  s6115 = false != s6114;-  const SBool  s6116 = (SBool) (s3724 & 1);-  const SBool  s6117 = false != s6116;-  const SWord8 s6118 = (s3711 >> 1) | (s3711 << 7);-  const SWord8 s6119 = 128 | s6118;-  const SWord8 s6120 = 127 & s6118;-  const SWord8 s6121 = s6117 ? s6119 : s6120;-  const SWord8 s6122 = (s6121 >> 1) | (s6121 << 7);-  const SWord8 s6123 = 128 | s6122;-  const SWord8 s6124 = 127 & s6122;-  const SWord8 s6125 = s6115 ? s6123 : s6124;-  const SWord8 s6126 = (s6125 >> 1) | (s6125 << 7);-  const SWord8 s6127 = 128 | s6126;-  const SWord8 s6128 = 127 & s6126;-  const SWord8 s6129 = s6113 ? s6127 : s6128;-  const SBool  s6130 = (SBool) (s3737 & 1);-  const SBool  s6131 = false != s6130;-  const SWord8 s6132 = s6131 ? s6127 : s6128;-  const SWord8 s6133 = s3717 ? s6129 : s6132;-  const SBool  s6134 = (SBool) (s3753 & 1);-  const SBool  s6135 = false != s6134;-  const SBool  s6136 = (SBool) (s3746 & 1);-  const SBool  s6137 = false != s6136;-  const SWord8 s6138 = s6137 ? s6123 : s6124;-  const SWord8 s6139 = (s6138 >> 1) | (s6138 << 7);-  const SWord8 s6140 = 128 | s6139;-  const SWord8 s6141 = 127 & s6139;-  const SWord8 s6142 = s6135 ? s6140 : s6141;-  const SBool  s6143 = (SBool) (s3758 & 1);-  const SBool  s6144 = false != s6143;-  const SWord8 s6145 = s6144 ? s6140 : s6141;-  const SWord8 s6146 = s3717 ? s6142 : s6145;-  const SWord8 s6147 = s3593 ? s6133 : s6146;-  const SBool  s6148 = (SBool) (s3779 & 1);-  const SBool  s6149 = false != s6148;-  const SBool  s6150 = (SBool) (s3775 & 1);-  const SBool  s6151 = false != s6150;-  const SBool  s6152 = (SBool) (s3768 & 1);-  const SBool  s6153 = false != s6152;-  const SWord8 s6154 = s6153 ? s6119 : s6120;-  const SWord8 s6155 = (s6154 >> 1) | (s6154 << 7);-  const SWord8 s6156 = 128 | s6155;-  const SWord8 s6157 = 127 & s6155;-  const SWord8 s6158 = s6151 ? s6156 : s6157;-  const SWord8 s6159 = (s6158 >> 1) | (s6158 << 7);-  const SWord8 s6160 = 128 | s6159;-  const SWord8 s6161 = 127 & s6159;-  const SWord8 s6162 = s6149 ? s6160 : s6161;-  const SBool  s6163 = (SBool) (s3784 & 1);-  const SBool  s6164 = false != s6163;-  const SWord8 s6165 = s6164 ? s6160 : s6161;-  const SWord8 s6166 = s3717 ? s6162 : s6165;-  const SBool  s6167 = (SBool) (s3800 & 1);-  const SBool  s6168 = false != s6167;-  const SBool  s6169 = (SBool) (s3793 & 1);-  const SBool  s6170 = false != s6169;-  const SWord8 s6171 = s6170 ? s6156 : s6157;-  const SWord8 s6172 = (s6171 >> 1) | (s6171 << 7);-  const SWord8 s6173 = 128 | s6172;-  const SWord8 s6174 = 127 & s6172;-  const SWord8 s6175 = s6168 ? s6173 : s6174;-  const SBool  s6176 = (SBool) (s3805 & 1);-  const SBool  s6177 = false != s6176;-  const SWord8 s6178 = s6177 ? s6173 : s6174;-  const SWord8 s6179 = s3717 ? s6175 : s6178;-  const SWord8 s6180 = s3593 ? s6166 : s6179;-  const SWord8 s6181 = s3571 ? s6147 : s6180;-  const SWord8 s6182 = s3060 ? s6111 : s6181;-  const SBool  s6183 = (SBool) (s3860 & 1);-  const SBool  s6184 = false != s6183;-  const SBool  s6185 = (SBool) (s3856 & 1);-  const SBool  s6186 = false != s6185;-  const SBool  s6187 = (SBool) (s3852 & 1);-  const SBool  s6188 = false != s6187;-  const SWord8 s6189 = (s3839 >> 1) | (s3839 << 7);-  const SWord8 s6190 = 128 | s6189;-  const SWord8 s6191 = 127 & s6189;-  const SWord8 s6192 = s6188 ? s6190 : s6191;-  const SWord8 s6193 = (s6192 >> 1) | (s6192 << 7);-  const SWord8 s6194 = 128 | s6193;-  const SWord8 s6195 = 127 & s6193;-  const SWord8 s6196 = s6186 ? s6194 : s6195;-  const SWord8 s6197 = (s6196 >> 1) | (s6196 << 7);-  const SWord8 s6198 = 128 | s6197;-  const SWord8 s6199 = 127 & s6197;-  const SWord8 s6200 = s6184 ? s6198 : s6199;-  const SBool  s6201 = (SBool) (s3865 & 1);-  const SBool  s6202 = false != s6201;-  const SWord8 s6203 = s6202 ? s6198 : s6199;-  const SWord8 s6204 = s3848 ? s6200 : s6203;-  const SBool  s6205 = (SBool) (s3881 & 1);-  const SBool  s6206 = false != s6205;-  const SBool  s6207 = (SBool) (s3874 & 1);-  const SBool  s6208 = false != s6207;-  const SWord8 s6209 = s6208 ? s6194 : s6195;-  const SWord8 s6210 = (s6209 >> 1) | (s6209 << 7);-  const SWord8 s6211 = 128 | s6210;-  const SWord8 s6212 = 127 & s6210;-  const SWord8 s6213 = s6206 ? s6211 : s6212;-  const SBool  s6214 = (SBool) (s3886 & 1);-  const SBool  s6215 = false != s6214;-  const SWord8 s6216 = s6215 ? s6211 : s6212;-  const SWord8 s6217 = s3848 ? s6213 : s6216;-  const SWord8 s6218 = s3826 ? s6204 : s6217;-  const SBool  s6219 = (SBool) (s3907 & 1);-  const SBool  s6220 = false != s6219;-  const SBool  s6221 = (SBool) (s3903 & 1);-  const SBool  s6222 = false != s6221;-  const SBool  s6223 = (SBool) (s3896 & 1);-  const SBool  s6224 = false != s6223;-  const SWord8 s6225 = s6224 ? s6190 : s6191;-  const SWord8 s6226 = (s6225 >> 1) | (s6225 << 7);-  const SWord8 s6227 = 128 | s6226;-  const SWord8 s6228 = 127 & s6226;-  const SWord8 s6229 = s6222 ? s6227 : s6228;-  const SWord8 s6230 = (s6229 >> 1) | (s6229 << 7);-  const SWord8 s6231 = 128 | s6230;-  const SWord8 s6232 = 127 & s6230;-  const SWord8 s6233 = s6220 ? s6231 : s6232;-  const SBool  s6234 = (SBool) (s3912 & 1);-  const SBool  s6235 = false != s6234;-  const SWord8 s6236 = s6235 ? s6231 : s6232;-  const SWord8 s6237 = s3848 ? s6233 : s6236;-  const SBool  s6238 = (SBool) (s3928 & 1);-  const SBool  s6239 = false != s6238;-  const SBool  s6240 = (SBool) (s3921 & 1);-  const SBool  s6241 = false != s6240;-  const SWord8 s6242 = s6241 ? s6227 : s6228;-  const SWord8 s6243 = (s6242 >> 1) | (s6242 << 7);-  const SWord8 s6244 = 128 | s6243;-  const SWord8 s6245 = 127 & s6243;-  const SWord8 s6246 = s6239 ? s6244 : s6245;-  const SBool  s6247 = (SBool) (s3933 & 1);-  const SBool  s6248 = false != s6247;-  const SWord8 s6249 = s6248 ? s6244 : s6245;-  const SWord8 s6250 = s3848 ? s6246 : s6249;-  const SWord8 s6251 = s3826 ? s6237 : s6250;-  const SWord8 s6252 = s3571 ? s6218 : s6251;-  const SBool  s6253 = (SBool) (s3968 & 1);-  const SBool  s6254 = false != s6253;-  const SBool  s6255 = (SBool) (s3964 & 1);-  const SBool  s6256 = false != s6255;-  const SBool  s6257 = (SBool) (s3960 & 1);-  const SBool  s6258 = false != s6257;-  const SWord8 s6259 = (s3947 >> 1) | (s3947 << 7);-  const SWord8 s6260 = 128 | s6259;-  const SWord8 s6261 = 127 & s6259;-  const SWord8 s6262 = s6258 ? s6260 : s6261;-  const SWord8 s6263 = (s6262 >> 1) | (s6262 << 7);-  const SWord8 s6264 = 128 | s6263;-  const SWord8 s6265 = 127 & s6263;-  const SWord8 s6266 = s6256 ? s6264 : s6265;-  const SWord8 s6267 = (s6266 >> 1) | (s6266 << 7);-  const SWord8 s6268 = 128 | s6267;-  const SWord8 s6269 = 127 & s6267;-  const SWord8 s6270 = s6254 ? s6268 : s6269;-  const SBool  s6271 = (SBool) (s3973 & 1);-  const SBool  s6272 = false != s6271;-  const SWord8 s6273 = s6272 ? s6268 : s6269;-  const SWord8 s6274 = s3953 ? s6270 : s6273;-  const SBool  s6275 = (SBool) (s3989 & 1);-  const SBool  s6276 = false != s6275;-  const SBool  s6277 = (SBool) (s3982 & 1);-  const SBool  s6278 = false != s6277;-  const SWord8 s6279 = s6278 ? s6264 : s6265;-  const SWord8 s6280 = (s6279 >> 1) | (s6279 << 7);-  const SWord8 s6281 = 128 | s6280;-  const SWord8 s6282 = 127 & s6280;-  const SWord8 s6283 = s6276 ? s6281 : s6282;-  const SBool  s6284 = (SBool) (s3994 & 1);-  const SBool  s6285 = false != s6284;-  const SWord8 s6286 = s6285 ? s6281 : s6282;-  const SWord8 s6287 = s3953 ? s6283 : s6286;-  const SWord8 s6288 = s3826 ? s6274 : s6287;-  const SBool  s6289 = (SBool) (s4015 & 1);-  const SBool  s6290 = false != s6289;-  const SBool  s6291 = (SBool) (s4011 & 1);-  const SBool  s6292 = false != s6291;-  const SBool  s6293 = (SBool) (s4004 & 1);-  const SBool  s6294 = false != s6293;-  const SWord8 s6295 = s6294 ? s6260 : s6261;-  const SWord8 s6296 = (s6295 >> 1) | (s6295 << 7);-  const SWord8 s6297 = 128 | s6296;-  const SWord8 s6298 = 127 & s6296;-  const SWord8 s6299 = s6292 ? s6297 : s6298;-  const SWord8 s6300 = (s6299 >> 1) | (s6299 << 7);-  const SWord8 s6301 = 128 | s6300;-  const SWord8 s6302 = 127 & s6300;-  const SWord8 s6303 = s6290 ? s6301 : s6302;-  const SBool  s6304 = (SBool) (s4020 & 1);-  const SBool  s6305 = false != s6304;-  const SWord8 s6306 = s6305 ? s6301 : s6302;-  const SWord8 s6307 = s3953 ? s6303 : s6306;-  const SBool  s6308 = (SBool) (s4036 & 1);-  const SBool  s6309 = false != s6308;-  const SBool  s6310 = (SBool) (s4029 & 1);-  const SBool  s6311 = false != s6310;-  const SWord8 s6312 = s6311 ? s6297 : s6298;-  const SWord8 s6313 = (s6312 >> 1) | (s6312 << 7);-  const SWord8 s6314 = 128 | s6313;-  const SWord8 s6315 = 127 & s6313;-  const SWord8 s6316 = s6309 ? s6314 : s6315;-  const SBool  s6317 = (SBool) (s4041 & 1);-  const SBool  s6318 = false != s6317;-  const SWord8 s6319 = s6318 ? s6314 : s6315;-  const SWord8 s6320 = s3953 ? s6316 : s6319;-  const SWord8 s6321 = s3826 ? s6307 : s6320;-  const SWord8 s6322 = s3571 ? s6288 : s6321;-  const SWord8 s6323 = s3060 ? s6252 : s6322;-  const SWord8 s6324 = s2042 ? s6182 : s6323;-  const SWord8 s6325 = s16 ? s6041 : s6324;-  const SWord8 s6326 = s11 ? s5758 : s6325;-  const SWord8 s6327 = s5 ? s5191 : s6326;--  *hi = s4056;-  *lo = s6327;+legatoMult_driver.o: legatoMult_driver.c legatoMult.h+	${CC} ${CCFLAGS} -c $< -o $@++legatoMult_driver: legatoMult.o legatoMult_driver.o+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}++clean:+	rm -f *.o++veryclean: clean+	rm -f legatoMult_driver+== END: "Makefile" ==================+== BEGIN: "legatoMult.h" ================+/* Header file for legatoMult. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_legatoMult_HEADER_INCLUDED+#define SBV_GENERATED_legatoMult_HEADER_INCLUDED+++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* Entry point prototype: */+void legatoMult(const SWord8 x, const SWord8 y, SWord8 *hi,+                SWord8 *lo);++#endif /* SBV_GENERATED_legatoMult_HEADER_INCLUDED */+== END: "legatoMult.h" ==================+== BEGIN: "legatoMult_driver.c" ================+/* Example driver program for legatoMult. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "legatoMult.h"++int main(void)+{+  SWord8 sbv_driver_output_0;+  SWord8 sbv_driver_output_1;++  legatoMult(87, 92, &sbv_driver_output_0, &sbv_driver_output_1);++  printf("legatoMult(87, 92, &hi, &lo) ->\n");+  printf("  hi = %"PRIu8"\n", sbv_driver_output_0);+  printf("  lo = %"PRIu8"\n", sbv_driver_output_1);++  return 0;+}+== END: "legatoMult_driver.c" ==================+== BEGIN: "legatoMult.c" ================+/* File: "legatoMult.c". Automatically generated by SBV. Do not edit! */++#include "legatoMult.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SBool sbv_bv_extract_u8_0_0_u1(SWord8 a)+{+  SBool r = (SBool) 0;+  uint64_t i;+  for (i = 0; i < 1; ++i) { r = (SBool) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_rotl(SWord8 a, uint64_t amount)+{+  amount %= 8;+  if (amount == 0) return a;+  return (SWord8) ((((uint64_t) (SWord8) a) << amount) | (((uint64_t) (SWord8) a) >> (8 - amount)));+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_rotr(SWord8 a, uint64_t amount)+{+  amount %= 8;+  if (amount == 0) return a;+  return (SWord8) ((((uint64_t) (SWord8) a) >> amount) | (((uint64_t) (SWord8) a) << (8 - amount)));+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b)+{+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++void legatoMult(const SWord8 sbv_input_0, const SWord8 sbv_input_1,+                SWord8 *sbv_output_0, SWord8 *sbv_output_1)+{+  const SWord8 s0 = sbv_input_0;+  const SWord8 s1 = sbv_input_1;+  const SBool  s2 = sbv_bv_extract_u8_0_0_u1(s0);+  const SBool  s4 = s2 != false;+  const SBool  s5 = !s4;+  const SWord8 s6 = sbv_bv_u8_rotr(s0, 1);+  const SWord8 s8 = s6 & 127;+  const SBool  s9 = sbv_bv_extract_u8_0_0_u1(s8);+  const SBool  s10 = false != s9;+  const SBool  s11 = !s10;+  const SWord8 s12 = sbv_bv_u8_rotr(s8, 1);+  const SWord8 s13 = 127 & s12;+  const SBool  s14 = sbv_bv_extract_u8_0_0_u1(s13);+  const SBool  s15 = false != s14;+  const SBool  s16 = !s15;+  const SWord8 s17 = sbv_bv_u8_rotr(s13, 1);+  const SWord8 s18 = 127 & s17;+  const SBool  s19 = sbv_bv_extract_u8_0_0_u1(s18);+  const SBool  s20 = false != s19;+  const SBool  s21 = !s20;+  const SWord8 s24 = s4 ? 128 : 0;+  const SBool  s25 = sbv_bv_extract_u8_0_0_u1(s24);+  const SBool  s26 = false != s25;+  const SWord8 s27 = s26 ? 128 : 0;+  const SBool  s28 = sbv_bv_extract_u8_0_0_u1(s27);+  const SBool  s29 = false != s28;+  const SWord8 s30 = sbv_bv_u8_rotr(s18, 1);+  const SWord8 s31 = 128 | s30;+  const SWord8 s32 = 127 & s30;+  const SWord8 s33 = s29 ? s31 : s32;+  const SBool  s34 = sbv_bv_extract_u8_0_0_u1(s33);+  const SBool  s35 = false != s34;+  const SBool  s36 = !s35;+  const SWord8 s37 = sbv_bv_u8_rotr(s24, 1);+  const SWord8 s38 = 128 | s37;+  const SWord8 s39 = 127 & s37;+  const SWord8 s40 = s10 ? s38 : s39;+  const SBool  s41 = sbv_bv_extract_u8_0_0_u1(s40);+  const SBool  s42 = false != s41;+  const SWord8 s43 = sbv_bv_u8_rotr(s27, 1);+  const SWord8 s44 = 128 | s43;+  const SWord8 s45 = 127 & s43;+  const SWord8 s46 = s42 ? s44 : s45;+  const SBool  s47 = sbv_bv_extract_u8_0_0_u1(s46);+  const SBool  s48 = false != s47;+  const SWord8 s49 = sbv_bv_u8_rotr(s33, 1);+  const SWord8 s50 = 128 | s49;+  const SWord8 s51 = 127 & s49;+  const SWord8 s52 = s48 ? s50 : s51;+  const SBool  s53 = sbv_bv_extract_u8_0_0_u1(s52);+  const SBool  s54 = false != s53;+  const SBool  s55 = !s54;+  const SWord8 s56 = sbv_bv_u8_rotr(s40, 1);+  const SWord8 s57 = 128 | s56;+  const SWord8 s58 = 127 & s56;+  const SWord8 s59 = s15 ? s57 : s58;+  const SBool  s60 = sbv_bv_extract_u8_0_0_u1(s59);+  const SBool  s61 = false != s60;+  const SWord8 s62 = sbv_bv_u8_rotr(s46, 1);+  const SWord8 s63 = 128 | s62;+  const SWord8 s64 = 127 & s62;+  const SWord8 s65 = s61 ? s63 : s64;+  const SBool  s66 = sbv_bv_extract_u8_0_0_u1(s65);+  const SBool  s67 = false != s66;+  const SWord8 s68 = sbv_bv_u8_rotr(s52, 1);+  const SWord8 s69 = 128 | s68;+  const SWord8 s70 = 127 & s68;+  const SWord8 s71 = s67 ? s69 : s70;+  const SBool  s72 = sbv_bv_extract_u8_0_0_u1(s71);+  const SBool  s73 = false != s72;+  const SBool  s74 = !s73;+  const SWord8 s75 = sbv_bv_u8_rotr(s59, 1);+  const SWord8 s76 = 128 | s75;+  const SWord8 s77 = 127 & s75;+  const SWord8 s78 = s20 ? s76 : s77;+  const SBool  s79 = sbv_bv_extract_u8_0_0_u1(s78);+  const SBool  s80 = false != s79;+  const SWord8 s81 = sbv_bv_u8_rotr(s65, 1);+  const SWord8 s82 = 128 | s81;+  const SWord8 s83 = 127 & s81;+  const SWord8 s84 = s80 ? s82 : s83;+  const SBool  s85 = sbv_bv_extract_u8_0_0_u1(s84);+  const SBool  s86 = false != s85;+  const SWord8 s87 = sbv_bv_u8_rotr(s71, 1);+  const SWord8 s88 = 128 | s87;+  const SWord8 s89 = 127 & s87;+  const SWord8 s90 = s86 ? s88 : s89;+  const SBool  s91 = sbv_bv_extract_u8_0_0_u1(s90);+  const SBool  s92 = false != s91;+  const SBool  s93 = !s92;+  const SWord8 s94 = sbv_bv_u8_rotr(s78, 1);+  const SWord8 s95 = 128 | s94;+  const SWord8 s96 = 127 & s94;+  const SWord8 s97 = s35 ? s95 : s96;+  const SWord8 s98 = sbv_bv_u8_rotr(s97, 1);+  const SWord8 s99 = 128 | s98;+  const SWord8 s100 = 127 & s98;+  const SWord8 s101 = s54 ? s99 : s100;+  const SWord8 s102 = sbv_bv_u8_rotr(s101, 1);+  const SWord8 s103 = 128 | s102;+  const SWord8 s104 = 127 & s102;+  const SWord8 s105 = s73 ? s103 : s104;+  const SWord8 s106 = sbv_bv_u8_rotr(s105, 1);+  const SWord8 s107 = 128 | s106;+  const SWord8 s108 = 127 & s106;+  const SWord8 s109 = s92 ? s107 : s108;+  const SWord8 s110 = sbv_bv_u8_add(s1, s105);+  const SBool  s111 = s110 < s1;+  const SBool  s112 = s110 < s105;+  const SBool  s113 = s111 || s112;+  const SWord8 s114 = sbv_bv_u8_rotr(s110, 1);+  const SWord8 s115 = 128 | s114;+  const SWord8 s116 = 127 & s114;+  const SWord8 s117 = s113 ? s115 : s116;+  const SWord8 s118 = s93 ? s109 : s117;+  const SWord8 s119 = sbv_bv_u8_add(s1, s101);+  const SBool  s120 = s119 < s1;+  const SBool  s121 = s119 < s101;+  const SBool  s122 = s120 || s121;+  const SWord8 s123 = sbv_bv_u8_rotr(s119, 1);+  const SWord8 s124 = 128 | s123;+  const SWord8 s125 = 127 & s123;+  const SWord8 s126 = s122 ? s124 : s125;+  const SWord8 s127 = sbv_bv_u8_rotr(s126, 1);+  const SWord8 s128 = 128 | s127;+  const SWord8 s129 = 127 & s127;+  const SWord8 s130 = s92 ? s128 : s129;+  const SWord8 s131 = sbv_bv_u8_add(s1, s126);+  const SBool  s132 = s131 < s1;+  const SBool  s133 = s131 < s126;+  const SBool  s134 = s132 || s133;+  const SWord8 s135 = sbv_bv_u8_rotr(s131, 1);+  const SWord8 s136 = 128 | s135;+  const SWord8 s137 = 127 & s135;+  const SWord8 s138 = s134 ? s136 : s137;+  const SWord8 s139 = s93 ? s130 : s138;+  const SWord8 s140 = s74 ? s118 : s139;+  const SWord8 s141 = sbv_bv_u8_add(s1, s97);+  const SBool  s142 = s141 < s1;+  const SBool  s143 = s141 < s97;+  const SBool  s144 = s142 || s143;+  const SWord8 s145 = sbv_bv_u8_rotr(s141, 1);+  const SWord8 s146 = 128 | s145;+  const SWord8 s147 = 127 & s145;+  const SWord8 s148 = s144 ? s146 : s147;+  const SWord8 s149 = sbv_bv_u8_rotr(s148, 1);+  const SWord8 s150 = 128 | s149;+  const SWord8 s151 = 127 & s149;+  const SWord8 s152 = s73 ? s150 : s151;+  const SWord8 s153 = sbv_bv_u8_rotr(s152, 1);+  const SWord8 s154 = 128 | s153;+  const SWord8 s155 = 127 & s153;+  const SWord8 s156 = s92 ? s154 : s155;+  const SWord8 s157 = sbv_bv_u8_add(s1, s152);+  const SBool  s158 = s157 < s1;+  const SBool  s159 = s157 < s152;+  const SBool  s160 = s158 || s159;+  const SWord8 s161 = sbv_bv_u8_rotr(s157, 1);+  const SWord8 s162 = 128 | s161;+  const SWord8 s163 = 127 & s161;+  const SWord8 s164 = s160 ? s162 : s163;+  const SWord8 s165 = s93 ? s156 : s164;+  const SWord8 s166 = sbv_bv_u8_add(s1, s148);+  const SBool  s167 = s166 < s1;+  const SBool  s168 = s166 < s148;+  const SBool  s169 = s167 || s168;+  const SWord8 s170 = sbv_bv_u8_rotr(s166, 1);+  const SWord8 s171 = 128 | s170;+  const SWord8 s172 = 127 & s170;+  const SWord8 s173 = s169 ? s171 : s172;+  const SWord8 s174 = sbv_bv_u8_rotr(s173, 1);+  const SWord8 s175 = 128 | s174;+  const SWord8 s176 = 127 & s174;+  const SWord8 s177 = s92 ? s175 : s176;+  const SWord8 s178 = sbv_bv_u8_add(s1, s173);+  const SBool  s179 = s178 < s1;+  const SBool  s180 = s178 < s173;+  const SBool  s181 = s179 || s180;+  const SWord8 s182 = sbv_bv_u8_rotr(s178, 1);+  const SWord8 s183 = 128 | s182;+  const SWord8 s184 = 127 & s182;+  const SWord8 s185 = s181 ? s183 : s184;+  const SWord8 s186 = s93 ? s177 : s185;+  const SWord8 s187 = s74 ? s165 : s186;+  const SWord8 s188 = s55 ? s140 : s187;+  const SWord8 s189 = sbv_bv_u8_add(s1, s78);+  const SBool  s190 = sbv_bv_extract_u8_0_0_u1(s189);+  const SBool  s191 = false != s190;+  const SWord8 s192 = s191 ? s82 : s83;+  const SBool  s193 = sbv_bv_extract_u8_0_0_u1(s192);+  const SBool  s194 = false != s193;+  const SWord8 s195 = s194 ? s88 : s89;+  const SBool  s196 = sbv_bv_extract_u8_0_0_u1(s195);+  const SBool  s197 = false != s196;+  const SBool  s198 = !s197;+  const SBool  s199 = s189 < s1;+  const SBool  s200 = s189 < s78;+  const SBool  s201 = s199 || s200;+  const SWord8 s202 = sbv_bv_u8_rotr(s189, 1);+  const SWord8 s203 = 128 | s202;+  const SWord8 s204 = 127 & s202;+  const SWord8 s205 = s201 ? s203 : s204;+  const SWord8 s206 = sbv_bv_u8_rotr(s205, 1);+  const SWord8 s207 = 128 | s206;+  const SWord8 s208 = 127 & s206;+  const SWord8 s209 = s54 ? s207 : s208;+  const SWord8 s210 = sbv_bv_u8_rotr(s209, 1);+  const SWord8 s211 = 128 | s210;+  const SWord8 s212 = 127 & s210;+  const SWord8 s213 = s73 ? s211 : s212;+  const SWord8 s214 = sbv_bv_u8_rotr(s213, 1);+  const SWord8 s215 = 128 | s214;+  const SWord8 s216 = 127 & s214;+  const SWord8 s217 = s197 ? s215 : s216;+  const SWord8 s218 = sbv_bv_u8_add(s1, s213);+  const SBool  s219 = s218 < s1;+  const SBool  s220 = s218 < s213;+  const SBool  s221 = s219 || s220;+  const SWord8 s222 = sbv_bv_u8_rotr(s218, 1);+  const SWord8 s223 = 128 | s222;+  const SWord8 s224 = 127 & s222;+  const SWord8 s225 = s221 ? s223 : s224;+  const SWord8 s226 = s198 ? s217 : s225;+  const SWord8 s227 = sbv_bv_u8_add(s1, s209);+  const SBool  s228 = s227 < s1;+  const SBool  s229 = s227 < s209;+  const SBool  s230 = s228 || s229;+  const SWord8 s231 = sbv_bv_u8_rotr(s227, 1);+  const SWord8 s232 = 128 | s231;+  const SWord8 s233 = 127 & s231;+  const SWord8 s234 = s230 ? s232 : s233;+  const SWord8 s235 = sbv_bv_u8_rotr(s234, 1);+  const SWord8 s236 = 128 | s235;+  const SWord8 s237 = 127 & s235;+  const SWord8 s238 = s197 ? s236 : s237;+  const SWord8 s239 = sbv_bv_u8_add(s1, s234);+  const SBool  s240 = s239 < s1;+  const SBool  s241 = s239 < s234;+  const SBool  s242 = s240 || s241;+  const SWord8 s243 = sbv_bv_u8_rotr(s239, 1);+  const SWord8 s244 = 128 | s243;+  const SWord8 s245 = 127 & s243;+  const SWord8 s246 = s242 ? s244 : s245;+  const SWord8 s247 = s198 ? s238 : s246;+  const SWord8 s248 = s74 ? s226 : s247;+  const SWord8 s249 = sbv_bv_u8_add(s1, s205);+  const SBool  s250 = s249 < s1;+  const SBool  s251 = s249 < s205;+  const SBool  s252 = s250 || s251;+  const SWord8 s253 = sbv_bv_u8_rotr(s249, 1);+  const SWord8 s254 = 128 | s253;+  const SWord8 s255 = 127 & s253;+  const SWord8 s256 = s252 ? s254 : s255;+  const SWord8 s257 = sbv_bv_u8_rotr(s256, 1);+  const SWord8 s258 = 128 | s257;+  const SWord8 s259 = 127 & s257;+  const SWord8 s260 = s73 ? s258 : s259;+  const SWord8 s261 = sbv_bv_u8_rotr(s260, 1);+  const SWord8 s262 = 128 | s261;+  const SWord8 s263 = 127 & s261;+  const SWord8 s264 = s197 ? s262 : s263;+  const SWord8 s265 = sbv_bv_u8_add(s1, s260);+  const SBool  s266 = s265 < s1;+  const SBool  s267 = s265 < s260;+  const SBool  s268 = s266 || s267;+  const SWord8 s269 = sbv_bv_u8_rotr(s265, 1);+  const SWord8 s270 = 128 | s269;+  const SWord8 s271 = 127 & s269;+  const SWord8 s272 = s268 ? s270 : s271;+  const SWord8 s273 = s198 ? s264 : s272;+  const SWord8 s274 = sbv_bv_u8_add(s1, s256);+  const SBool  s275 = s274 < s1;+  const SBool  s276 = s274 < s256;+  const SBool  s277 = s275 || s276;+  const SWord8 s278 = sbv_bv_u8_rotr(s274, 1);+  const SWord8 s279 = 128 | s278;+  const SWord8 s280 = 127 & s278;+  const SWord8 s281 = s277 ? s279 : s280;+  const SWord8 s282 = sbv_bv_u8_rotr(s281, 1);+  const SWord8 s283 = 128 | s282;+  const SWord8 s284 = 127 & s282;+  const SWord8 s285 = s197 ? s283 : s284;+  const SWord8 s286 = sbv_bv_u8_add(s1, s281);+  const SBool  s287 = s286 < s1;+  const SBool  s288 = s286 < s281;+  const SBool  s289 = s287 || s288;+  const SWord8 s290 = sbv_bv_u8_rotr(s286, 1);+  const SWord8 s291 = 128 | s290;+  const SWord8 s292 = 127 & s290;+  const SWord8 s293 = s289 ? s291 : s292;+  const SWord8 s294 = s198 ? s285 : s293;+  const SWord8 s295 = s74 ? s273 : s294;+  const SWord8 s296 = s55 ? s248 : s295;+  const SWord8 s297 = s36 ? s188 : s296;+  const SWord8 s298 = sbv_bv_u8_add(s1, s59);+  const SBool  s299 = sbv_bv_extract_u8_0_0_u1(s298);+  const SBool  s300 = false != s299;+  const SWord8 s301 = s300 ? s63 : s64;+  const SBool  s302 = sbv_bv_extract_u8_0_0_u1(s301);+  const SBool  s303 = false != s302;+  const SWord8 s304 = s303 ? s69 : s70;+  const SBool  s305 = sbv_bv_extract_u8_0_0_u1(s304);+  const SBool  s306 = false != s305;+  const SBool  s307 = !s306;+  const SBool  s308 = s298 < s1;+  const SBool  s309 = s298 < s59;+  const SBool  s310 = s308 || s309;+  const SWord8 s311 = sbv_bv_u8_rotr(s298, 1);+  const SWord8 s312 = 128 | s311;+  const SWord8 s313 = 127 & s311;+  const SWord8 s314 = s310 ? s312 : s313;+  const SBool  s315 = sbv_bv_extract_u8_0_0_u1(s314);+  const SBool  s316 = false != s315;+  const SWord8 s317 = sbv_bv_u8_rotr(s301, 1);+  const SWord8 s318 = 128 | s317;+  const SWord8 s319 = 127 & s317;+  const SWord8 s320 = s316 ? s318 : s319;+  const SBool  s321 = sbv_bv_extract_u8_0_0_u1(s320);+  const SBool  s322 = false != s321;+  const SWord8 s323 = sbv_bv_u8_rotr(s304, 1);+  const SWord8 s324 = 128 | s323;+  const SWord8 s325 = 127 & s323;+  const SWord8 s326 = s322 ? s324 : s325;+  const SBool  s327 = sbv_bv_extract_u8_0_0_u1(s326);+  const SBool  s328 = false != s327;+  const SBool  s329 = !s328;+  const SWord8 s330 = sbv_bv_u8_rotr(s314, 1);+  const SWord8 s331 = 128 | s330;+  const SWord8 s332 = 127 & s330;+  const SWord8 s333 = s35 ? s331 : s332;+  const SWord8 s334 = sbv_bv_u8_rotr(s333, 1);+  const SWord8 s335 = 128 | s334;+  const SWord8 s336 = 127 & s334;+  const SWord8 s337 = s54 ? s335 : s336;+  const SWord8 s338 = sbv_bv_u8_rotr(s337, 1);+  const SWord8 s339 = 128 | s338;+  const SWord8 s340 = 127 & s338;+  const SWord8 s341 = s306 ? s339 : s340;+  const SWord8 s342 = sbv_bv_u8_rotr(s341, 1);+  const SWord8 s343 = 128 | s342;+  const SWord8 s344 = 127 & s342;+  const SWord8 s345 = s328 ? s343 : s344;+  const SWord8 s346 = sbv_bv_u8_add(s1, s341);+  const SBool  s347 = s346 < s1;+  const SBool  s348 = s346 < s341;+  const SBool  s349 = s347 || s348;+  const SWord8 s350 = sbv_bv_u8_rotr(s346, 1);+  const SWord8 s351 = 128 | s350;+  const SWord8 s352 = 127 & s350;+  const SWord8 s353 = s349 ? s351 : s352;+  const SWord8 s354 = s329 ? s345 : s353;+  const SWord8 s355 = sbv_bv_u8_add(s1, s337);+  const SBool  s356 = s355 < s1;+  const SBool  s357 = s355 < s337;+  const SBool  s358 = s356 || s357;+  const SWord8 s359 = sbv_bv_u8_rotr(s355, 1);+  const SWord8 s360 = 128 | s359;+  const SWord8 s361 = 127 & s359;+  const SWord8 s362 = s358 ? s360 : s361;+  const SWord8 s363 = sbv_bv_u8_rotr(s362, 1);+  const SWord8 s364 = 128 | s363;+  const SWord8 s365 = 127 & s363;+  const SWord8 s366 = s328 ? s364 : s365;+  const SWord8 s367 = sbv_bv_u8_add(s1, s362);+  const SBool  s368 = s367 < s1;+  const SBool  s369 = s367 < s362;+  const SBool  s370 = s368 || s369;+  const SWord8 s371 = sbv_bv_u8_rotr(s367, 1);+  const SWord8 s372 = 128 | s371;+  const SWord8 s373 = 127 & s371;+  const SWord8 s374 = s370 ? s372 : s373;+  const SWord8 s375 = s329 ? s366 : s374;+  const SWord8 s376 = s307 ? s354 : s375;+  const SWord8 s377 = sbv_bv_u8_add(s1, s333);+  const SBool  s378 = s377 < s1;+  const SBool  s379 = s377 < s333;+  const SBool  s380 = s378 || s379;+  const SWord8 s381 = sbv_bv_u8_rotr(s377, 1);+  const SWord8 s382 = 128 | s381;+  const SWord8 s383 = 127 & s381;+  const SWord8 s384 = s380 ? s382 : s383;+  const SWord8 s385 = sbv_bv_u8_rotr(s384, 1);+  const SWord8 s386 = 128 | s385;+  const SWord8 s387 = 127 & s385;+  const SWord8 s388 = s306 ? s386 : s387;+  const SWord8 s389 = sbv_bv_u8_rotr(s388, 1);+  const SWord8 s390 = 128 | s389;+  const SWord8 s391 = 127 & s389;+  const SWord8 s392 = s328 ? s390 : s391;+  const SWord8 s393 = sbv_bv_u8_add(s1, s388);+  const SBool  s394 = s393 < s1;+  const SBool  s395 = s393 < s388;+  const SBool  s396 = s394 || s395;+  const SWord8 s397 = sbv_bv_u8_rotr(s393, 1);+  const SWord8 s398 = 128 | s397;+  const SWord8 s399 = 127 & s397;+  const SWord8 s400 = s396 ? s398 : s399;+  const SWord8 s401 = s329 ? s392 : s400;+  const SWord8 s402 = sbv_bv_u8_add(s1, s384);+  const SBool  s403 = s402 < s1;+  const SBool  s404 = s402 < s384;+  const SBool  s405 = s403 || s404;+  const SWord8 s406 = sbv_bv_u8_rotr(s402, 1);+  const SWord8 s407 = 128 | s406;+  const SWord8 s408 = 127 & s406;+  const SWord8 s409 = s405 ? s407 : s408;+  const SWord8 s410 = sbv_bv_u8_rotr(s409, 1);+  const SWord8 s411 = 128 | s410;+  const SWord8 s412 = 127 & s410;+  const SWord8 s413 = s328 ? s411 : s412;+  const SWord8 s414 = sbv_bv_u8_add(s1, s409);+  const SBool  s415 = s414 < s1;+  const SBool  s416 = s414 < s409;+  const SBool  s417 = s415 || s416;+  const SWord8 s418 = sbv_bv_u8_rotr(s414, 1);+  const SWord8 s419 = 128 | s418;+  const SWord8 s420 = 127 & s418;+  const SWord8 s421 = s417 ? s419 : s420;+  const SWord8 s422 = s329 ? s413 : s421;+  const SWord8 s423 = s307 ? s401 : s422;+  const SWord8 s424 = s55 ? s376 : s423;+  const SWord8 s425 = sbv_bv_u8_add(s1, s314);+  const SBool  s426 = sbv_bv_extract_u8_0_0_u1(s425);+  const SBool  s427 = false != s426;+  const SWord8 s428 = s427 ? s318 : s319;+  const SBool  s429 = sbv_bv_extract_u8_0_0_u1(s428);+  const SBool  s430 = false != s429;+  const SWord8 s431 = s430 ? s324 : s325;+  const SBool  s432 = sbv_bv_extract_u8_0_0_u1(s431);+  const SBool  s433 = false != s432;+  const SBool  s434 = !s433;+  const SBool  s435 = s425 < s1;+  const SBool  s436 = s425 < s314;+  const SBool  s437 = s435 || s436;+  const SWord8 s438 = sbv_bv_u8_rotr(s425, 1);+  const SWord8 s439 = 128 | s438;+  const SWord8 s440 = 127 & s438;+  const SWord8 s441 = s437 ? s439 : s440;+  const SWord8 s442 = sbv_bv_u8_rotr(s441, 1);+  const SWord8 s443 = 128 | s442;+  const SWord8 s444 = 127 & s442;+  const SWord8 s445 = s54 ? s443 : s444;+  const SWord8 s446 = sbv_bv_u8_rotr(s445, 1);+  const SWord8 s447 = 128 | s446;+  const SWord8 s448 = 127 & s446;+  const SWord8 s449 = s306 ? s447 : s448;+  const SWord8 s450 = sbv_bv_u8_rotr(s449, 1);+  const SWord8 s451 = 128 | s450;+  const SWord8 s452 = 127 & s450;+  const SWord8 s453 = s433 ? s451 : s452;+  const SWord8 s454 = sbv_bv_u8_add(s1, s449);+  const SBool  s455 = s454 < s1;+  const SBool  s456 = s454 < s449;+  const SBool  s457 = s455 || s456;+  const SWord8 s458 = sbv_bv_u8_rotr(s454, 1);+  const SWord8 s459 = 128 | s458;+  const SWord8 s460 = 127 & s458;+  const SWord8 s461 = s457 ? s459 : s460;+  const SWord8 s462 = s434 ? s453 : s461;+  const SWord8 s463 = sbv_bv_u8_add(s1, s445);+  const SBool  s464 = s463 < s1;+  const SBool  s465 = s463 < s445;+  const SBool  s466 = s464 || s465;+  const SWord8 s467 = sbv_bv_u8_rotr(s463, 1);+  const SWord8 s468 = 128 | s467;+  const SWord8 s469 = 127 & s467;+  const SWord8 s470 = s466 ? s468 : s469;+  const SWord8 s471 = sbv_bv_u8_rotr(s470, 1);+  const SWord8 s472 = 128 | s471;+  const SWord8 s473 = 127 & s471;+  const SWord8 s474 = s433 ? s472 : s473;+  const SWord8 s475 = sbv_bv_u8_add(s1, s470);+  const SBool  s476 = s475 < s1;+  const SBool  s477 = s475 < s470;+  const SBool  s478 = s476 || s477;+  const SWord8 s479 = sbv_bv_u8_rotr(s475, 1);+  const SWord8 s480 = 128 | s479;+  const SWord8 s481 = 127 & s479;+  const SWord8 s482 = s478 ? s480 : s481;+  const SWord8 s483 = s434 ? s474 : s482;+  const SWord8 s484 = s307 ? s462 : s483;+  const SWord8 s485 = sbv_bv_u8_add(s1, s441);+  const SBool  s486 = s485 < s1;+  const SBool  s487 = s485 < s441;+  const SBool  s488 = s486 || s487;+  const SWord8 s489 = sbv_bv_u8_rotr(s485, 1);+  const SWord8 s490 = 128 | s489;+  const SWord8 s491 = 127 & s489;+  const SWord8 s492 = s488 ? s490 : s491;+  const SWord8 s493 = sbv_bv_u8_rotr(s492, 1);+  const SWord8 s494 = 128 | s493;+  const SWord8 s495 = 127 & s493;+  const SWord8 s496 = s306 ? s494 : s495;+  const SWord8 s497 = sbv_bv_u8_rotr(s496, 1);+  const SWord8 s498 = 128 | s497;+  const SWord8 s499 = 127 & s497;+  const SWord8 s500 = s433 ? s498 : s499;+  const SWord8 s501 = sbv_bv_u8_add(s1, s496);+  const SBool  s502 = s501 < s1;+  const SBool  s503 = s501 < s496;+  const SBool  s504 = s502 || s503;+  const SWord8 s505 = sbv_bv_u8_rotr(s501, 1);+  const SWord8 s506 = 128 | s505;+  const SWord8 s507 = 127 & s505;+  const SWord8 s508 = s504 ? s506 : s507;+  const SWord8 s509 = s434 ? s500 : s508;+  const SWord8 s510 = sbv_bv_u8_add(s1, s492);+  const SBool  s511 = s510 < s1;+  const SBool  s512 = s510 < s492;+  const SBool  s513 = s511 || s512;+  const SWord8 s514 = sbv_bv_u8_rotr(s510, 1);+  const SWord8 s515 = 128 | s514;+  const SWord8 s516 = 127 & s514;+  const SWord8 s517 = s513 ? s515 : s516;+  const SWord8 s518 = sbv_bv_u8_rotr(s517, 1);+  const SWord8 s519 = 128 | s518;+  const SWord8 s520 = 127 & s518;+  const SWord8 s521 = s433 ? s519 : s520;+  const SWord8 s522 = sbv_bv_u8_add(s1, s517);+  const SBool  s523 = s522 < s1;+  const SBool  s524 = s522 < s517;+  const SBool  s525 = s523 || s524;+  const SWord8 s526 = sbv_bv_u8_rotr(s522, 1);+  const SWord8 s527 = 128 | s526;+  const SWord8 s528 = 127 & s526;+  const SWord8 s529 = s525 ? s527 : s528;+  const SWord8 s530 = s434 ? s521 : s529;+  const SWord8 s531 = s307 ? s509 : s530;+  const SWord8 s532 = s55 ? s484 : s531;+  const SWord8 s533 = s36 ? s424 : s532;+  const SWord8 s534 = s21 ? s297 : s533;+  const SWord8 s535 = sbv_bv_u8_add(s1, s40);+  const SBool  s536 = sbv_bv_extract_u8_0_0_u1(s535);+  const SBool  s537 = false != s536;+  const SWord8 s538 = s537 ? s44 : s45;+  const SBool  s539 = sbv_bv_extract_u8_0_0_u1(s538);+  const SBool  s540 = false != s539;+  const SWord8 s541 = s540 ? s50 : s51;+  const SBool  s542 = sbv_bv_extract_u8_0_0_u1(s541);+  const SBool  s543 = false != s542;+  const SBool  s544 = !s543;+  const SBool  s545 = s535 < s1;+  const SBool  s546 = s535 < s40;+  const SBool  s547 = s545 || s546;+  const SWord8 s548 = sbv_bv_u8_rotr(s535, 1);+  const SWord8 s549 = 128 | s548;+  const SWord8 s550 = 127 & s548;+  const SWord8 s551 = s547 ? s549 : s550;+  const SBool  s552 = sbv_bv_extract_u8_0_0_u1(s551);+  const SBool  s553 = false != s552;+  const SWord8 s554 = sbv_bv_u8_rotr(s538, 1);+  const SWord8 s555 = 128 | s554;+  const SWord8 s556 = 127 & s554;+  const SWord8 s557 = s553 ? s555 : s556;+  const SBool  s558 = sbv_bv_extract_u8_0_0_u1(s557);+  const SBool  s559 = false != s558;+  const SWord8 s560 = sbv_bv_u8_rotr(s541, 1);+  const SWord8 s561 = 128 | s560;+  const SWord8 s562 = 127 & s560;+  const SWord8 s563 = s559 ? s561 : s562;+  const SBool  s564 = sbv_bv_extract_u8_0_0_u1(s563);+  const SBool  s565 = false != s564;+  const SBool  s566 = !s565;+  const SWord8 s567 = sbv_bv_u8_rotr(s551, 1);+  const SWord8 s568 = 128 | s567;+  const SWord8 s569 = 127 & s567;+  const SWord8 s570 = s20 ? s568 : s569;+  const SBool  s571 = sbv_bv_extract_u8_0_0_u1(s570);+  const SBool  s572 = false != s571;+  const SWord8 s573 = sbv_bv_u8_rotr(s557, 1);+  const SWord8 s574 = 128 | s573;+  const SWord8 s575 = 127 & s573;+  const SWord8 s576 = s572 ? s574 : s575;+  const SBool  s577 = sbv_bv_extract_u8_0_0_u1(s576);+  const SBool  s578 = false != s577;+  const SWord8 s579 = sbv_bv_u8_rotr(s563, 1);+  const SWord8 s580 = 128 | s579;+  const SWord8 s581 = 127 & s579;+  const SWord8 s582 = s578 ? s580 : s581;+  const SBool  s583 = sbv_bv_extract_u8_0_0_u1(s582);+  const SBool  s584 = false != s583;+  const SBool  s585 = !s584;+  const SWord8 s586 = sbv_bv_u8_rotr(s570, 1);+  const SWord8 s587 = 128 | s586;+  const SWord8 s588 = 127 & s586;+  const SWord8 s589 = s35 ? s587 : s588;+  const SWord8 s590 = sbv_bv_u8_rotr(s589, 1);+  const SWord8 s591 = 128 | s590;+  const SWord8 s592 = 127 & s590;+  const SWord8 s593 = s543 ? s591 : s592;+  const SWord8 s594 = sbv_bv_u8_rotr(s593, 1);+  const SWord8 s595 = 128 | s594;+  const SWord8 s596 = 127 & s594;+  const SWord8 s597 = s565 ? s595 : s596;+  const SWord8 s598 = sbv_bv_u8_rotr(s597, 1);+  const SWord8 s599 = 128 | s598;+  const SWord8 s600 = 127 & s598;+  const SWord8 s601 = s584 ? s599 : s600;+  const SWord8 s602 = sbv_bv_u8_add(s1, s597);+  const SBool  s603 = s602 < s1;+  const SBool  s604 = s602 < s597;+  const SBool  s605 = s603 || s604;+  const SWord8 s606 = sbv_bv_u8_rotr(s602, 1);+  const SWord8 s607 = 128 | s606;+  const SWord8 s608 = 127 & s606;+  const SWord8 s609 = s605 ? s607 : s608;+  const SWord8 s610 = s585 ? s601 : s609;+  const SWord8 s611 = sbv_bv_u8_add(s1, s593);+  const SBool  s612 = s611 < s1;+  const SBool  s613 = s611 < s593;+  const SBool  s614 = s612 || s613;+  const SWord8 s615 = sbv_bv_u8_rotr(s611, 1);+  const SWord8 s616 = 128 | s615;+  const SWord8 s617 = 127 & s615;+  const SWord8 s618 = s614 ? s616 : s617;+  const SWord8 s619 = sbv_bv_u8_rotr(s618, 1);+  const SWord8 s620 = 128 | s619;+  const SWord8 s621 = 127 & s619;+  const SWord8 s622 = s584 ? s620 : s621;+  const SWord8 s623 = sbv_bv_u8_add(s1, s618);+  const SBool  s624 = s623 < s1;+  const SBool  s625 = s623 < s618;+  const SBool  s626 = s624 || s625;+  const SWord8 s627 = sbv_bv_u8_rotr(s623, 1);+  const SWord8 s628 = 128 | s627;+  const SWord8 s629 = 127 & s627;+  const SWord8 s630 = s626 ? s628 : s629;+  const SWord8 s631 = s585 ? s622 : s630;+  const SWord8 s632 = s566 ? s610 : s631;+  const SWord8 s633 = sbv_bv_u8_add(s1, s589);+  const SBool  s634 = s633 < s1;+  const SBool  s635 = s633 < s589;+  const SBool  s636 = s634 || s635;+  const SWord8 s637 = sbv_bv_u8_rotr(s633, 1);+  const SWord8 s638 = 128 | s637;+  const SWord8 s639 = 127 & s637;+  const SWord8 s640 = s636 ? s638 : s639;+  const SWord8 s641 = sbv_bv_u8_rotr(s640, 1);+  const SWord8 s642 = 128 | s641;+  const SWord8 s643 = 127 & s641;+  const SWord8 s644 = s565 ? s642 : s643;+  const SWord8 s645 = sbv_bv_u8_rotr(s644, 1);+  const SWord8 s646 = 128 | s645;+  const SWord8 s647 = 127 & s645;+  const SWord8 s648 = s584 ? s646 : s647;+  const SWord8 s649 = sbv_bv_u8_add(s1, s644);+  const SBool  s650 = s649 < s1;+  const SBool  s651 = s649 < s644;+  const SBool  s652 = s650 || s651;+  const SWord8 s653 = sbv_bv_u8_rotr(s649, 1);+  const SWord8 s654 = 128 | s653;+  const SWord8 s655 = 127 & s653;+  const SWord8 s656 = s652 ? s654 : s655;+  const SWord8 s657 = s585 ? s648 : s656;+  const SWord8 s658 = sbv_bv_u8_add(s1, s640);+  const SBool  s659 = s658 < s1;+  const SBool  s660 = s658 < s640;+  const SBool  s661 = s659 || s660;+  const SWord8 s662 = sbv_bv_u8_rotr(s658, 1);+  const SWord8 s663 = 128 | s662;+  const SWord8 s664 = 127 & s662;+  const SWord8 s665 = s661 ? s663 : s664;+  const SWord8 s666 = sbv_bv_u8_rotr(s665, 1);+  const SWord8 s667 = 128 | s666;+  const SWord8 s668 = 127 & s666;+  const SWord8 s669 = s584 ? s667 : s668;+  const SWord8 s670 = sbv_bv_u8_add(s1, s665);+  const SBool  s671 = s670 < s1;+  const SBool  s672 = s670 < s665;+  const SBool  s673 = s671 || s672;+  const SWord8 s674 = sbv_bv_u8_rotr(s670, 1);+  const SWord8 s675 = 128 | s674;+  const SWord8 s676 = 127 & s674;+  const SWord8 s677 = s673 ? s675 : s676;+  const SWord8 s678 = s585 ? s669 : s677;+  const SWord8 s679 = s566 ? s657 : s678;+  const SWord8 s680 = s544 ? s632 : s679;+  const SWord8 s681 = sbv_bv_u8_add(s1, s570);+  const SBool  s682 = sbv_bv_extract_u8_0_0_u1(s681);+  const SBool  s683 = false != s682;+  const SWord8 s684 = s683 ? s574 : s575;+  const SBool  s685 = sbv_bv_extract_u8_0_0_u1(s684);+  const SBool  s686 = false != s685;+  const SWord8 s687 = s686 ? s580 : s581;+  const SBool  s688 = sbv_bv_extract_u8_0_0_u1(s687);+  const SBool  s689 = false != s688;+  const SBool  s690 = !s689;+  const SBool  s691 = s681 < s1;+  const SBool  s692 = s681 < s570;+  const SBool  s693 = s691 || s692;+  const SWord8 s694 = sbv_bv_u8_rotr(s681, 1);+  const SWord8 s695 = 128 | s694;+  const SWord8 s696 = 127 & s694;+  const SWord8 s697 = s693 ? s695 : s696;+  const SWord8 s698 = sbv_bv_u8_rotr(s697, 1);+  const SWord8 s699 = 128 | s698;+  const SWord8 s700 = 127 & s698;+  const SWord8 s701 = s543 ? s699 : s700;+  const SWord8 s702 = sbv_bv_u8_rotr(s701, 1);+  const SWord8 s703 = 128 | s702;+  const SWord8 s704 = 127 & s702;+  const SWord8 s705 = s565 ? s703 : s704;+  const SWord8 s706 = sbv_bv_u8_rotr(s705, 1);+  const SWord8 s707 = 128 | s706;+  const SWord8 s708 = 127 & s706;+  const SWord8 s709 = s689 ? s707 : s708;+  const SWord8 s710 = sbv_bv_u8_add(s1, s705);+  const SBool  s711 = s710 < s1;+  const SBool  s712 = s710 < s705;+  const SBool  s713 = s711 || s712;+  const SWord8 s714 = sbv_bv_u8_rotr(s710, 1);+  const SWord8 s715 = 128 | s714;+  const SWord8 s716 = 127 & s714;+  const SWord8 s717 = s713 ? s715 : s716;+  const SWord8 s718 = s690 ? s709 : s717;+  const SWord8 s719 = sbv_bv_u8_add(s1, s701);+  const SBool  s720 = s719 < s1;+  const SBool  s721 = s719 < s701;+  const SBool  s722 = s720 || s721;+  const SWord8 s723 = sbv_bv_u8_rotr(s719, 1);+  const SWord8 s724 = 128 | s723;+  const SWord8 s725 = 127 & s723;+  const SWord8 s726 = s722 ? s724 : s725;+  const SWord8 s727 = sbv_bv_u8_rotr(s726, 1);+  const SWord8 s728 = 128 | s727;+  const SWord8 s729 = 127 & s727;+  const SWord8 s730 = s689 ? s728 : s729;+  const SWord8 s731 = sbv_bv_u8_add(s1, s726);+  const SBool  s732 = s731 < s1;+  const SBool  s733 = s731 < s726;+  const SBool  s734 = s732 || s733;+  const SWord8 s735 = sbv_bv_u8_rotr(s731, 1);+  const SWord8 s736 = 128 | s735;+  const SWord8 s737 = 127 & s735;+  const SWord8 s738 = s734 ? s736 : s737;+  const SWord8 s739 = s690 ? s730 : s738;+  const SWord8 s740 = s566 ? s718 : s739;+  const SWord8 s741 = sbv_bv_u8_add(s1, s697);+  const SBool  s742 = s741 < s1;+  const SBool  s743 = s741 < s697;+  const SBool  s744 = s742 || s743;+  const SWord8 s745 = sbv_bv_u8_rotr(s741, 1);+  const SWord8 s746 = 128 | s745;+  const SWord8 s747 = 127 & s745;+  const SWord8 s748 = s744 ? s746 : s747;+  const SWord8 s749 = sbv_bv_u8_rotr(s748, 1);+  const SWord8 s750 = 128 | s749;+  const SWord8 s751 = 127 & s749;+  const SWord8 s752 = s565 ? s750 : s751;+  const SWord8 s753 = sbv_bv_u8_rotr(s752, 1);+  const SWord8 s754 = 128 | s753;+  const SWord8 s755 = 127 & s753;+  const SWord8 s756 = s689 ? s754 : s755;+  const SWord8 s757 = sbv_bv_u8_add(s1, s752);+  const SBool  s758 = s757 < s1;+  const SBool  s759 = s757 < s752;+  const SBool  s760 = s758 || s759;+  const SWord8 s761 = sbv_bv_u8_rotr(s757, 1);+  const SWord8 s762 = 128 | s761;+  const SWord8 s763 = 127 & s761;+  const SWord8 s764 = s760 ? s762 : s763;+  const SWord8 s765 = s690 ? s756 : s764;+  const SWord8 s766 = sbv_bv_u8_add(s1, s748);+  const SBool  s767 = s766 < s1;+  const SBool  s768 = s766 < s748;+  const SBool  s769 = s767 || s768;+  const SWord8 s770 = sbv_bv_u8_rotr(s766, 1);+  const SWord8 s771 = 128 | s770;+  const SWord8 s772 = 127 & s770;+  const SWord8 s773 = s769 ? s771 : s772;+  const SWord8 s774 = sbv_bv_u8_rotr(s773, 1);+  const SWord8 s775 = 128 | s774;+  const SWord8 s776 = 127 & s774;+  const SWord8 s777 = s689 ? s775 : s776;+  const SWord8 s778 = sbv_bv_u8_add(s1, s773);+  const SBool  s779 = s778 < s1;+  const SBool  s780 = s778 < s773;+  const SBool  s781 = s779 || s780;+  const SWord8 s782 = sbv_bv_u8_rotr(s778, 1);+  const SWord8 s783 = 128 | s782;+  const SWord8 s784 = 127 & s782;+  const SWord8 s785 = s781 ? s783 : s784;+  const SWord8 s786 = s690 ? s777 : s785;+  const SWord8 s787 = s566 ? s765 : s786;+  const SWord8 s788 = s544 ? s740 : s787;+  const SWord8 s789 = s36 ? s680 : s788;+  const SWord8 s790 = sbv_bv_u8_add(s1, s551);+  const SBool  s791 = sbv_bv_extract_u8_0_0_u1(s790);+  const SBool  s792 = false != s791;+  const SWord8 s793 = s792 ? s555 : s556;+  const SBool  s794 = sbv_bv_extract_u8_0_0_u1(s793);+  const SBool  s795 = false != s794;+  const SWord8 s796 = s795 ? s561 : s562;+  const SBool  s797 = sbv_bv_extract_u8_0_0_u1(s796);+  const SBool  s798 = false != s797;+  const SBool  s799 = !s798;+  const SBool  s800 = s790 < s1;+  const SBool  s801 = s790 < s551;+  const SBool  s802 = s800 || s801;+  const SWord8 s803 = sbv_bv_u8_rotr(s790, 1);+  const SWord8 s804 = 128 | s803;+  const SWord8 s805 = 127 & s803;+  const SWord8 s806 = s802 ? s804 : s805;+  const SBool  s807 = sbv_bv_extract_u8_0_0_u1(s806);+  const SBool  s808 = false != s807;+  const SWord8 s809 = sbv_bv_u8_rotr(s793, 1);+  const SWord8 s810 = 128 | s809;+  const SWord8 s811 = 127 & s809;+  const SWord8 s812 = s808 ? s810 : s811;+  const SBool  s813 = sbv_bv_extract_u8_0_0_u1(s812);+  const SBool  s814 = false != s813;+  const SWord8 s815 = sbv_bv_u8_rotr(s796, 1);+  const SWord8 s816 = 128 | s815;+  const SWord8 s817 = 127 & s815;+  const SWord8 s818 = s814 ? s816 : s817;+  const SBool  s819 = sbv_bv_extract_u8_0_0_u1(s818);+  const SBool  s820 = false != s819;+  const SBool  s821 = !s820;+  const SWord8 s822 = sbv_bv_u8_rotr(s806, 1);+  const SWord8 s823 = 128 | s822;+  const SWord8 s824 = 127 & s822;+  const SWord8 s825 = s35 ? s823 : s824;+  const SWord8 s826 = sbv_bv_u8_rotr(s825, 1);+  const SWord8 s827 = 128 | s826;+  const SWord8 s828 = 127 & s826;+  const SWord8 s829 = s543 ? s827 : s828;+  const SWord8 s830 = sbv_bv_u8_rotr(s829, 1);+  const SWord8 s831 = 128 | s830;+  const SWord8 s832 = 127 & s830;+  const SWord8 s833 = s798 ? s831 : s832;+  const SWord8 s834 = sbv_bv_u8_rotr(s833, 1);+  const SWord8 s835 = 128 | s834;+  const SWord8 s836 = 127 & s834;+  const SWord8 s837 = s820 ? s835 : s836;+  const SWord8 s838 = sbv_bv_u8_add(s1, s833);+  const SBool  s839 = s838 < s1;+  const SBool  s840 = s838 < s833;+  const SBool  s841 = s839 || s840;+  const SWord8 s842 = sbv_bv_u8_rotr(s838, 1);+  const SWord8 s843 = 128 | s842;+  const SWord8 s844 = 127 & s842;+  const SWord8 s845 = s841 ? s843 : s844;+  const SWord8 s846 = s821 ? s837 : s845;+  const SWord8 s847 = sbv_bv_u8_add(s1, s829);+  const SBool  s848 = s847 < s1;+  const SBool  s849 = s847 < s829;+  const SBool  s850 = s848 || s849;+  const SWord8 s851 = sbv_bv_u8_rotr(s847, 1);+  const SWord8 s852 = 128 | s851;+  const SWord8 s853 = 127 & s851;+  const SWord8 s854 = s850 ? s852 : s853;+  const SWord8 s855 = sbv_bv_u8_rotr(s854, 1);+  const SWord8 s856 = 128 | s855;+  const SWord8 s857 = 127 & s855;+  const SWord8 s858 = s820 ? s856 : s857;+  const SWord8 s859 = sbv_bv_u8_add(s1, s854);+  const SBool  s860 = s859 < s1;+  const SBool  s861 = s859 < s854;+  const SBool  s862 = s860 || s861;+  const SWord8 s863 = sbv_bv_u8_rotr(s859, 1);+  const SWord8 s864 = 128 | s863;+  const SWord8 s865 = 127 & s863;+  const SWord8 s866 = s862 ? s864 : s865;+  const SWord8 s867 = s821 ? s858 : s866;+  const SWord8 s868 = s799 ? s846 : s867;+  const SWord8 s869 = sbv_bv_u8_add(s1, s825);+  const SBool  s870 = s869 < s1;+  const SBool  s871 = s869 < s825;+  const SBool  s872 = s870 || s871;+  const SWord8 s873 = sbv_bv_u8_rotr(s869, 1);+  const SWord8 s874 = 128 | s873;+  const SWord8 s875 = 127 & s873;+  const SWord8 s876 = s872 ? s874 : s875;+  const SWord8 s877 = sbv_bv_u8_rotr(s876, 1);+  const SWord8 s878 = 128 | s877;+  const SWord8 s879 = 127 & s877;+  const SWord8 s880 = s798 ? s878 : s879;+  const SWord8 s881 = sbv_bv_u8_rotr(s880, 1);+  const SWord8 s882 = 128 | s881;+  const SWord8 s883 = 127 & s881;+  const SWord8 s884 = s820 ? s882 : s883;+  const SWord8 s885 = sbv_bv_u8_add(s1, s880);+  const SBool  s886 = s885 < s1;+  const SBool  s887 = s885 < s880;+  const SBool  s888 = s886 || s887;+  const SWord8 s889 = sbv_bv_u8_rotr(s885, 1);+  const SWord8 s890 = 128 | s889;+  const SWord8 s891 = 127 & s889;+  const SWord8 s892 = s888 ? s890 : s891;+  const SWord8 s893 = s821 ? s884 : s892;+  const SWord8 s894 = sbv_bv_u8_add(s1, s876);+  const SBool  s895 = s894 < s1;+  const SBool  s896 = s894 < s876;+  const SBool  s897 = s895 || s896;+  const SWord8 s898 = sbv_bv_u8_rotr(s894, 1);+  const SWord8 s899 = 128 | s898;+  const SWord8 s900 = 127 & s898;+  const SWord8 s901 = s897 ? s899 : s900;+  const SWord8 s902 = sbv_bv_u8_rotr(s901, 1);+  const SWord8 s903 = 128 | s902;+  const SWord8 s904 = 127 & s902;+  const SWord8 s905 = s820 ? s903 : s904;+  const SWord8 s906 = sbv_bv_u8_add(s1, s901);+  const SBool  s907 = s906 < s1;+  const SBool  s908 = s906 < s901;+  const SBool  s909 = s907 || s908;+  const SWord8 s910 = sbv_bv_u8_rotr(s906, 1);+  const SWord8 s911 = 128 | s910;+  const SWord8 s912 = 127 & s910;+  const SWord8 s913 = s909 ? s911 : s912;+  const SWord8 s914 = s821 ? s905 : s913;+  const SWord8 s915 = s799 ? s893 : s914;+  const SWord8 s916 = s544 ? s868 : s915;+  const SWord8 s917 = sbv_bv_u8_add(s1, s806);+  const SBool  s918 = sbv_bv_extract_u8_0_0_u1(s917);+  const SBool  s919 = false != s918;+  const SWord8 s920 = s919 ? s810 : s811;+  const SBool  s921 = sbv_bv_extract_u8_0_0_u1(s920);+  const SBool  s922 = false != s921;+  const SWord8 s923 = s922 ? s816 : s817;+  const SBool  s924 = sbv_bv_extract_u8_0_0_u1(s923);+  const SBool  s925 = false != s924;+  const SBool  s926 = !s925;+  const SBool  s927 = s917 < s1;+  const SBool  s928 = s917 < s806;+  const SBool  s929 = s927 || s928;+  const SWord8 s930 = sbv_bv_u8_rotr(s917, 1);+  const SWord8 s931 = 128 | s930;+  const SWord8 s932 = 127 & s930;+  const SWord8 s933 = s929 ? s931 : s932;+  const SWord8 s934 = sbv_bv_u8_rotr(s933, 1);+  const SWord8 s935 = 128 | s934;+  const SWord8 s936 = 127 & s934;+  const SWord8 s937 = s543 ? s935 : s936;+  const SWord8 s938 = sbv_bv_u8_rotr(s937, 1);+  const SWord8 s939 = 128 | s938;+  const SWord8 s940 = 127 & s938;+  const SWord8 s941 = s798 ? s939 : s940;+  const SWord8 s942 = sbv_bv_u8_rotr(s941, 1);+  const SWord8 s943 = 128 | s942;+  const SWord8 s944 = 127 & s942;+  const SWord8 s945 = s925 ? s943 : s944;+  const SWord8 s946 = sbv_bv_u8_add(s1, s941);+  const SBool  s947 = s946 < s1;+  const SBool  s948 = s946 < s941;+  const SBool  s949 = s947 || s948;+  const SWord8 s950 = sbv_bv_u8_rotr(s946, 1);+  const SWord8 s951 = 128 | s950;+  const SWord8 s952 = 127 & s950;+  const SWord8 s953 = s949 ? s951 : s952;+  const SWord8 s954 = s926 ? s945 : s953;+  const SWord8 s955 = sbv_bv_u8_add(s1, s937);+  const SBool  s956 = s955 < s1;+  const SBool  s957 = s955 < s937;+  const SBool  s958 = s956 || s957;+  const SWord8 s959 = sbv_bv_u8_rotr(s955, 1);+  const SWord8 s960 = 128 | s959;+  const SWord8 s961 = 127 & s959;+  const SWord8 s962 = s958 ? s960 : s961;+  const SWord8 s963 = sbv_bv_u8_rotr(s962, 1);+  const SWord8 s964 = 128 | s963;+  const SWord8 s965 = 127 & s963;+  const SWord8 s966 = s925 ? s964 : s965;+  const SWord8 s967 = sbv_bv_u8_add(s1, s962);+  const SBool  s968 = s967 < s1;+  const SBool  s969 = s967 < s962;+  const SBool  s970 = s968 || s969;+  const SWord8 s971 = sbv_bv_u8_rotr(s967, 1);+  const SWord8 s972 = 128 | s971;+  const SWord8 s973 = 127 & s971;+  const SWord8 s974 = s970 ? s972 : s973;+  const SWord8 s975 = s926 ? s966 : s974;+  const SWord8 s976 = s799 ? s954 : s975;+  const SWord8 s977 = sbv_bv_u8_add(s1, s933);+  const SBool  s978 = s977 < s1;+  const SBool  s979 = s977 < s933;+  const SBool  s980 = s978 || s979;+  const SWord8 s981 = sbv_bv_u8_rotr(s977, 1);+  const SWord8 s982 = 128 | s981;+  const SWord8 s983 = 127 & s981;+  const SWord8 s984 = s980 ? s982 : s983;+  const SWord8 s985 = sbv_bv_u8_rotr(s984, 1);+  const SWord8 s986 = 128 | s985;+  const SWord8 s987 = 127 & s985;+  const SWord8 s988 = s798 ? s986 : s987;+  const SWord8 s989 = sbv_bv_u8_rotr(s988, 1);+  const SWord8 s990 = 128 | s989;+  const SWord8 s991 = 127 & s989;+  const SWord8 s992 = s925 ? s990 : s991;+  const SWord8 s993 = sbv_bv_u8_add(s1, s988);+  const SBool  s994 = s993 < s1;+  const SBool  s995 = s993 < s988;+  const SBool  s996 = s994 || s995;+  const SWord8 s997 = sbv_bv_u8_rotr(s993, 1);+  const SWord8 s998 = 128 | s997;+  const SWord8 s999 = 127 & s997;+  const SWord8 s1000 = s996 ? s998 : s999;+  const SWord8 s1001 = s926 ? s992 : s1000;+  const SWord8 s1002 = sbv_bv_u8_add(s1, s984);+  const SBool  s1003 = s1002 < s1;+  const SBool  s1004 = s1002 < s984;+  const SBool  s1005 = s1003 || s1004;+  const SWord8 s1006 = sbv_bv_u8_rotr(s1002, 1);+  const SWord8 s1007 = 128 | s1006;+  const SWord8 s1008 = 127 & s1006;+  const SWord8 s1009 = s1005 ? s1007 : s1008;+  const SWord8 s1010 = sbv_bv_u8_rotr(s1009, 1);+  const SWord8 s1011 = 128 | s1010;+  const SWord8 s1012 = 127 & s1010;+  const SWord8 s1013 = s925 ? s1011 : s1012;+  const SWord8 s1014 = sbv_bv_u8_add(s1, s1009);+  const SBool  s1015 = s1014 < s1;+  const SBool  s1016 = s1014 < s1009;+  const SBool  s1017 = s1015 || s1016;+  const SWord8 s1018 = sbv_bv_u8_rotr(s1014, 1);+  const SWord8 s1019 = 128 | s1018;+  const SWord8 s1020 = 127 & s1018;+  const SWord8 s1021 = s1017 ? s1019 : s1020;+  const SWord8 s1022 = s926 ? s1013 : s1021;+  const SWord8 s1023 = s799 ? s1001 : s1022;+  const SWord8 s1024 = s544 ? s976 : s1023;+  const SWord8 s1025 = s36 ? s916 : s1024;+  const SWord8 s1026 = s21 ? s789 : s1025;+  const SWord8 s1027 = s16 ? s534 : s1026;+  const SWord8 s1028 = sbv_bv_u8_add(s1, s24);+  const SBool  s1029 = sbv_bv_extract_u8_0_0_u1(s1028);+  const SBool  s1030 = false != s1029;+  const SWord8 s1031 = s1030 ? 128 : 0;+  const SBool  s1032 = sbv_bv_extract_u8_0_0_u1(s1031);+  const SBool  s1033 = false != s1032;+  const SWord8 s1034 = s1033 ? s31 : s32;+  const SBool  s1035 = sbv_bv_extract_u8_0_0_u1(s1034);+  const SBool  s1036 = false != s1035;+  const SBool  s1037 = !s1036;+  const SBool  s1038 = s1028 < s1;+  const SBool  s1039 = s1028 < s24;+  const SBool  s1040 = s1038 || s1039;+  const SWord8 s1041 = sbv_bv_u8_rotr(s1028, 1);+  const SWord8 s1042 = 128 | s1041;+  const SWord8 s1043 = 127 & s1041;+  const SWord8 s1044 = s1040 ? s1042 : s1043;+  const SBool  s1045 = sbv_bv_extract_u8_0_0_u1(s1044);+  const SBool  s1046 = false != s1045;+  const SWord8 s1047 = sbv_bv_u8_rotr(s1031, 1);+  const SWord8 s1048 = 128 | s1047;+  const SWord8 s1049 = 127 & s1047;+  const SWord8 s1050 = s1046 ? s1048 : s1049;+  const SBool  s1051 = sbv_bv_extract_u8_0_0_u1(s1050);+  const SBool  s1052 = false != s1051;+  const SWord8 s1053 = sbv_bv_u8_rotr(s1034, 1);+  const SWord8 s1054 = 128 | s1053;+  const SWord8 s1055 = 127 & s1053;+  const SWord8 s1056 = s1052 ? s1054 : s1055;+  const SBool  s1057 = sbv_bv_extract_u8_0_0_u1(s1056);+  const SBool  s1058 = false != s1057;+  const SBool  s1059 = !s1058;+  const SWord8 s1060 = sbv_bv_u8_rotr(s1044, 1);+  const SWord8 s1061 = 128 | s1060;+  const SWord8 s1062 = 127 & s1060;+  const SWord8 s1063 = s15 ? s1061 : s1062;+  const SBool  s1064 = sbv_bv_extract_u8_0_0_u1(s1063);+  const SBool  s1065 = false != s1064;+  const SWord8 s1066 = sbv_bv_u8_rotr(s1050, 1);+  const SWord8 s1067 = 128 | s1066;+  const SWord8 s1068 = 127 & s1066;+  const SWord8 s1069 = s1065 ? s1067 : s1068;+  const SBool  s1070 = sbv_bv_extract_u8_0_0_u1(s1069);+  const SBool  s1071 = false != s1070;+  const SWord8 s1072 = sbv_bv_u8_rotr(s1056, 1);+  const SWord8 s1073 = 128 | s1072;+  const SWord8 s1074 = 127 & s1072;+  const SWord8 s1075 = s1071 ? s1073 : s1074;+  const SBool  s1076 = sbv_bv_extract_u8_0_0_u1(s1075);+  const SBool  s1077 = false != s1076;+  const SBool  s1078 = !s1077;+  const SWord8 s1079 = sbv_bv_u8_rotr(s1063, 1);+  const SWord8 s1080 = 128 | s1079;+  const SWord8 s1081 = 127 & s1079;+  const SWord8 s1082 = s20 ? s1080 : s1081;+  const SBool  s1083 = sbv_bv_extract_u8_0_0_u1(s1082);+  const SBool  s1084 = false != s1083;+  const SWord8 s1085 = sbv_bv_u8_rotr(s1069, 1);+  const SWord8 s1086 = 128 | s1085;+  const SWord8 s1087 = 127 & s1085;+  const SWord8 s1088 = s1084 ? s1086 : s1087;+  const SBool  s1089 = sbv_bv_extract_u8_0_0_u1(s1088);+  const SBool  s1090 = false != s1089;+  const SWord8 s1091 = sbv_bv_u8_rotr(s1075, 1);+  const SWord8 s1092 = 128 | s1091;+  const SWord8 s1093 = 127 & s1091;+  const SWord8 s1094 = s1090 ? s1092 : s1093;+  const SBool  s1095 = sbv_bv_extract_u8_0_0_u1(s1094);+  const SBool  s1096 = false != s1095;+  const SBool  s1097 = !s1096;+  const SWord8 s1098 = sbv_bv_u8_rotr(s1082, 1);+  const SWord8 s1099 = 128 | s1098;+  const SWord8 s1100 = 127 & s1098;+  const SWord8 s1101 = s1036 ? s1099 : s1100;+  const SWord8 s1102 = sbv_bv_u8_rotr(s1101, 1);+  const SWord8 s1103 = 128 | s1102;+  const SWord8 s1104 = 127 & s1102;+  const SWord8 s1105 = s1058 ? s1103 : s1104;+  const SWord8 s1106 = sbv_bv_u8_rotr(s1105, 1);+  const SWord8 s1107 = 128 | s1106;+  const SWord8 s1108 = 127 & s1106;+  const SWord8 s1109 = s1077 ? s1107 : s1108;+  const SWord8 s1110 = sbv_bv_u8_rotr(s1109, 1);+  const SWord8 s1111 = 128 | s1110;+  const SWord8 s1112 = 127 & s1110;+  const SWord8 s1113 = s1096 ? s1111 : s1112;+  const SWord8 s1114 = sbv_bv_u8_add(s1, s1109);+  const SBool  s1115 = s1114 < s1;+  const SBool  s1116 = s1114 < s1109;+  const SBool  s1117 = s1115 || s1116;+  const SWord8 s1118 = sbv_bv_u8_rotr(s1114, 1);+  const SWord8 s1119 = 128 | s1118;+  const SWord8 s1120 = 127 & s1118;+  const SWord8 s1121 = s1117 ? s1119 : s1120;+  const SWord8 s1122 = s1097 ? s1113 : s1121;+  const SWord8 s1123 = sbv_bv_u8_add(s1, s1105);+  const SBool  s1124 = s1123 < s1;+  const SBool  s1125 = s1123 < s1105;+  const SBool  s1126 = s1124 || s1125;+  const SWord8 s1127 = sbv_bv_u8_rotr(s1123, 1);+  const SWord8 s1128 = 128 | s1127;+  const SWord8 s1129 = 127 & s1127;+  const SWord8 s1130 = s1126 ? s1128 : s1129;+  const SWord8 s1131 = sbv_bv_u8_rotr(s1130, 1);+  const SWord8 s1132 = 128 | s1131;+  const SWord8 s1133 = 127 & s1131;+  const SWord8 s1134 = s1096 ? s1132 : s1133;+  const SWord8 s1135 = sbv_bv_u8_add(s1, s1130);+  const SBool  s1136 = s1135 < s1;+  const SBool  s1137 = s1135 < s1130;+  const SBool  s1138 = s1136 || s1137;+  const SWord8 s1139 = sbv_bv_u8_rotr(s1135, 1);+  const SWord8 s1140 = 128 | s1139;+  const SWord8 s1141 = 127 & s1139;+  const SWord8 s1142 = s1138 ? s1140 : s1141;+  const SWord8 s1143 = s1097 ? s1134 : s1142;+  const SWord8 s1144 = s1078 ? s1122 : s1143;+  const SWord8 s1145 = sbv_bv_u8_add(s1, s1101);+  const SBool  s1146 = s1145 < s1;+  const SBool  s1147 = s1145 < s1101;+  const SBool  s1148 = s1146 || s1147;+  const SWord8 s1149 = sbv_bv_u8_rotr(s1145, 1);+  const SWord8 s1150 = 128 | s1149;+  const SWord8 s1151 = 127 & s1149;+  const SWord8 s1152 = s1148 ? s1150 : s1151;+  const SWord8 s1153 = sbv_bv_u8_rotr(s1152, 1);+  const SWord8 s1154 = 128 | s1153;+  const SWord8 s1155 = 127 & s1153;+  const SWord8 s1156 = s1077 ? s1154 : s1155;+  const SWord8 s1157 = sbv_bv_u8_rotr(s1156, 1);+  const SWord8 s1158 = 128 | s1157;+  const SWord8 s1159 = 127 & s1157;+  const SWord8 s1160 = s1096 ? s1158 : s1159;+  const SWord8 s1161 = sbv_bv_u8_add(s1, s1156);+  const SBool  s1162 = s1161 < s1;+  const SBool  s1163 = s1161 < s1156;+  const SBool  s1164 = s1162 || s1163;+  const SWord8 s1165 = sbv_bv_u8_rotr(s1161, 1);+  const SWord8 s1166 = 128 | s1165;+  const SWord8 s1167 = 127 & s1165;+  const SWord8 s1168 = s1164 ? s1166 : s1167;+  const SWord8 s1169 = s1097 ? s1160 : s1168;+  const SWord8 s1170 = sbv_bv_u8_add(s1, s1152);+  const SBool  s1171 = s1170 < s1;+  const SBool  s1172 = s1170 < s1152;+  const SBool  s1173 = s1171 || s1172;+  const SWord8 s1174 = sbv_bv_u8_rotr(s1170, 1);+  const SWord8 s1175 = 128 | s1174;+  const SWord8 s1176 = 127 & s1174;+  const SWord8 s1177 = s1173 ? s1175 : s1176;+  const SWord8 s1178 = sbv_bv_u8_rotr(s1177, 1);+  const SWord8 s1179 = 128 | s1178;+  const SWord8 s1180 = 127 & s1178;+  const SWord8 s1181 = s1096 ? s1179 : s1180;+  const SWord8 s1182 = sbv_bv_u8_add(s1, s1177);+  const SBool  s1183 = s1182 < s1;+  const SBool  s1184 = s1182 < s1177;+  const SBool  s1185 = s1183 || s1184;+  const SWord8 s1186 = sbv_bv_u8_rotr(s1182, 1);+  const SWord8 s1187 = 128 | s1186;+  const SWord8 s1188 = 127 & s1186;+  const SWord8 s1189 = s1185 ? s1187 : s1188;+  const SWord8 s1190 = s1097 ? s1181 : s1189;+  const SWord8 s1191 = s1078 ? s1169 : s1190;+  const SWord8 s1192 = s1059 ? s1144 : s1191;+  const SWord8 s1193 = sbv_bv_u8_add(s1, s1082);+  const SBool  s1194 = sbv_bv_extract_u8_0_0_u1(s1193);+  const SBool  s1195 = false != s1194;+  const SWord8 s1196 = s1195 ? s1086 : s1087;+  const SBool  s1197 = sbv_bv_extract_u8_0_0_u1(s1196);+  const SBool  s1198 = false != s1197;+  const SWord8 s1199 = s1198 ? s1092 : s1093;+  const SBool  s1200 = sbv_bv_extract_u8_0_0_u1(s1199);+  const SBool  s1201 = false != s1200;+  const SBool  s1202 = !s1201;+  const SBool  s1203 = s1193 < s1;+  const SBool  s1204 = s1193 < s1082;+  const SBool  s1205 = s1203 || s1204;+  const SWord8 s1206 = sbv_bv_u8_rotr(s1193, 1);+  const SWord8 s1207 = 128 | s1206;+  const SWord8 s1208 = 127 & s1206;+  const SWord8 s1209 = s1205 ? s1207 : s1208;+  const SWord8 s1210 = sbv_bv_u8_rotr(s1209, 1);+  const SWord8 s1211 = 128 | s1210;+  const SWord8 s1212 = 127 & s1210;+  const SWord8 s1213 = s1058 ? s1211 : s1212;+  const SWord8 s1214 = sbv_bv_u8_rotr(s1213, 1);+  const SWord8 s1215 = 128 | s1214;+  const SWord8 s1216 = 127 & s1214;+  const SWord8 s1217 = s1077 ? s1215 : s1216;+  const SWord8 s1218 = sbv_bv_u8_rotr(s1217, 1);+  const SWord8 s1219 = 128 | s1218;+  const SWord8 s1220 = 127 & s1218;+  const SWord8 s1221 = s1201 ? s1219 : s1220;+  const SWord8 s1222 = sbv_bv_u8_add(s1, s1217);+  const SBool  s1223 = s1222 < s1;+  const SBool  s1224 = s1222 < s1217;+  const SBool  s1225 = s1223 || s1224;+  const SWord8 s1226 = sbv_bv_u8_rotr(s1222, 1);+  const SWord8 s1227 = 128 | s1226;+  const SWord8 s1228 = 127 & s1226;+  const SWord8 s1229 = s1225 ? s1227 : s1228;+  const SWord8 s1230 = s1202 ? s1221 : s1229;+  const SWord8 s1231 = sbv_bv_u8_add(s1, s1213);+  const SBool  s1232 = s1231 < s1;+  const SBool  s1233 = s1231 < s1213;+  const SBool  s1234 = s1232 || s1233;+  const SWord8 s1235 = sbv_bv_u8_rotr(s1231, 1);+  const SWord8 s1236 = 128 | s1235;+  const SWord8 s1237 = 127 & s1235;+  const SWord8 s1238 = s1234 ? s1236 : s1237;+  const SWord8 s1239 = sbv_bv_u8_rotr(s1238, 1);+  const SWord8 s1240 = 128 | s1239;+  const SWord8 s1241 = 127 & s1239;+  const SWord8 s1242 = s1201 ? s1240 : s1241;+  const SWord8 s1243 = sbv_bv_u8_add(s1, s1238);+  const SBool  s1244 = s1243 < s1;+  const SBool  s1245 = s1243 < s1238;+  const SBool  s1246 = s1244 || s1245;+  const SWord8 s1247 = sbv_bv_u8_rotr(s1243, 1);+  const SWord8 s1248 = 128 | s1247;+  const SWord8 s1249 = 127 & s1247;+  const SWord8 s1250 = s1246 ? s1248 : s1249;+  const SWord8 s1251 = s1202 ? s1242 : s1250;+  const SWord8 s1252 = s1078 ? s1230 : s1251;+  const SWord8 s1253 = sbv_bv_u8_add(s1, s1209);+  const SBool  s1254 = s1253 < s1;+  const SBool  s1255 = s1253 < s1209;+  const SBool  s1256 = s1254 || s1255;+  const SWord8 s1257 = sbv_bv_u8_rotr(s1253, 1);+  const SWord8 s1258 = 128 | s1257;+  const SWord8 s1259 = 127 & s1257;+  const SWord8 s1260 = s1256 ? s1258 : s1259;+  const SWord8 s1261 = sbv_bv_u8_rotr(s1260, 1);+  const SWord8 s1262 = 128 | s1261;+  const SWord8 s1263 = 127 & s1261;+  const SWord8 s1264 = s1077 ? s1262 : s1263;+  const SWord8 s1265 = sbv_bv_u8_rotr(s1264, 1);+  const SWord8 s1266 = 128 | s1265;+  const SWord8 s1267 = 127 & s1265;+  const SWord8 s1268 = s1201 ? s1266 : s1267;+  const SWord8 s1269 = sbv_bv_u8_add(s1, s1264);+  const SBool  s1270 = s1269 < s1;+  const SBool  s1271 = s1269 < s1264;+  const SBool  s1272 = s1270 || s1271;+  const SWord8 s1273 = sbv_bv_u8_rotr(s1269, 1);+  const SWord8 s1274 = 128 | s1273;+  const SWord8 s1275 = 127 & s1273;+  const SWord8 s1276 = s1272 ? s1274 : s1275;+  const SWord8 s1277 = s1202 ? s1268 : s1276;+  const SWord8 s1278 = sbv_bv_u8_add(s1, s1260);+  const SBool  s1279 = s1278 < s1;+  const SBool  s1280 = s1278 < s1260;+  const SBool  s1281 = s1279 || s1280;+  const SWord8 s1282 = sbv_bv_u8_rotr(s1278, 1);+  const SWord8 s1283 = 128 | s1282;+  const SWord8 s1284 = 127 & s1282;+  const SWord8 s1285 = s1281 ? s1283 : s1284;+  const SWord8 s1286 = sbv_bv_u8_rotr(s1285, 1);+  const SWord8 s1287 = 128 | s1286;+  const SWord8 s1288 = 127 & s1286;+  const SWord8 s1289 = s1201 ? s1287 : s1288;+  const SWord8 s1290 = sbv_bv_u8_add(s1, s1285);+  const SBool  s1291 = s1290 < s1;+  const SBool  s1292 = s1290 < s1285;+  const SBool  s1293 = s1291 || s1292;+  const SWord8 s1294 = sbv_bv_u8_rotr(s1290, 1);+  const SWord8 s1295 = 128 | s1294;+  const SWord8 s1296 = 127 & s1294;+  const SWord8 s1297 = s1293 ? s1295 : s1296;+  const SWord8 s1298 = s1202 ? s1289 : s1297;+  const SWord8 s1299 = s1078 ? s1277 : s1298;+  const SWord8 s1300 = s1059 ? s1252 : s1299;+  const SWord8 s1301 = s1037 ? s1192 : s1300;+  const SWord8 s1302 = sbv_bv_u8_add(s1, s1063);+  const SBool  s1303 = sbv_bv_extract_u8_0_0_u1(s1302);+  const SBool  s1304 = false != s1303;+  const SWord8 s1305 = s1304 ? s1067 : s1068;+  const SBool  s1306 = sbv_bv_extract_u8_0_0_u1(s1305);+  const SBool  s1307 = false != s1306;+  const SWord8 s1308 = s1307 ? s1073 : s1074;+  const SBool  s1309 = sbv_bv_extract_u8_0_0_u1(s1308);+  const SBool  s1310 = false != s1309;+  const SBool  s1311 = !s1310;+  const SBool  s1312 = s1302 < s1;+  const SBool  s1313 = s1302 < s1063;+  const SBool  s1314 = s1312 || s1313;+  const SWord8 s1315 = sbv_bv_u8_rotr(s1302, 1);+  const SWord8 s1316 = 128 | s1315;+  const SWord8 s1317 = 127 & s1315;+  const SWord8 s1318 = s1314 ? s1316 : s1317;+  const SBool  s1319 = sbv_bv_extract_u8_0_0_u1(s1318);+  const SBool  s1320 = false != s1319;+  const SWord8 s1321 = sbv_bv_u8_rotr(s1305, 1);+  const SWord8 s1322 = 128 | s1321;+  const SWord8 s1323 = 127 & s1321;+  const SWord8 s1324 = s1320 ? s1322 : s1323;+  const SBool  s1325 = sbv_bv_extract_u8_0_0_u1(s1324);+  const SBool  s1326 = false != s1325;+  const SWord8 s1327 = sbv_bv_u8_rotr(s1308, 1);+  const SWord8 s1328 = 128 | s1327;+  const SWord8 s1329 = 127 & s1327;+  const SWord8 s1330 = s1326 ? s1328 : s1329;+  const SBool  s1331 = sbv_bv_extract_u8_0_0_u1(s1330);+  const SBool  s1332 = false != s1331;+  const SBool  s1333 = !s1332;+  const SWord8 s1334 = sbv_bv_u8_rotr(s1318, 1);+  const SWord8 s1335 = 128 | s1334;+  const SWord8 s1336 = 127 & s1334;+  const SWord8 s1337 = s1036 ? s1335 : s1336;+  const SWord8 s1338 = sbv_bv_u8_rotr(s1337, 1);+  const SWord8 s1339 = 128 | s1338;+  const SWord8 s1340 = 127 & s1338;+  const SWord8 s1341 = s1058 ? s1339 : s1340;+  const SWord8 s1342 = sbv_bv_u8_rotr(s1341, 1);+  const SWord8 s1343 = 128 | s1342;+  const SWord8 s1344 = 127 & s1342;+  const SWord8 s1345 = s1310 ? s1343 : s1344;+  const SWord8 s1346 = sbv_bv_u8_rotr(s1345, 1);+  const SWord8 s1347 = 128 | s1346;+  const SWord8 s1348 = 127 & s1346;+  const SWord8 s1349 = s1332 ? s1347 : s1348;+  const SWord8 s1350 = sbv_bv_u8_add(s1, s1345);+  const SBool  s1351 = s1350 < s1;+  const SBool  s1352 = s1350 < s1345;+  const SBool  s1353 = s1351 || s1352;+  const SWord8 s1354 = sbv_bv_u8_rotr(s1350, 1);+  const SWord8 s1355 = 128 | s1354;+  const SWord8 s1356 = 127 & s1354;+  const SWord8 s1357 = s1353 ? s1355 : s1356;+  const SWord8 s1358 = s1333 ? s1349 : s1357;+  const SWord8 s1359 = sbv_bv_u8_add(s1, s1341);+  const SBool  s1360 = s1359 < s1;+  const SBool  s1361 = s1359 < s1341;+  const SBool  s1362 = s1360 || s1361;+  const SWord8 s1363 = sbv_bv_u8_rotr(s1359, 1);+  const SWord8 s1364 = 128 | s1363;+  const SWord8 s1365 = 127 & s1363;+  const SWord8 s1366 = s1362 ? s1364 : s1365;+  const SWord8 s1367 = sbv_bv_u8_rotr(s1366, 1);+  const SWord8 s1368 = 128 | s1367;+  const SWord8 s1369 = 127 & s1367;+  const SWord8 s1370 = s1332 ? s1368 : s1369;+  const SWord8 s1371 = sbv_bv_u8_add(s1, s1366);+  const SBool  s1372 = s1371 < s1;+  const SBool  s1373 = s1371 < s1366;+  const SBool  s1374 = s1372 || s1373;+  const SWord8 s1375 = sbv_bv_u8_rotr(s1371, 1);+  const SWord8 s1376 = 128 | s1375;+  const SWord8 s1377 = 127 & s1375;+  const SWord8 s1378 = s1374 ? s1376 : s1377;+  const SWord8 s1379 = s1333 ? s1370 : s1378;+  const SWord8 s1380 = s1311 ? s1358 : s1379;+  const SWord8 s1381 = sbv_bv_u8_add(s1, s1337);+  const SBool  s1382 = s1381 < s1;+  const SBool  s1383 = s1381 < s1337;+  const SBool  s1384 = s1382 || s1383;+  const SWord8 s1385 = sbv_bv_u8_rotr(s1381, 1);+  const SWord8 s1386 = 128 | s1385;+  const SWord8 s1387 = 127 & s1385;+  const SWord8 s1388 = s1384 ? s1386 : s1387;+  const SWord8 s1389 = sbv_bv_u8_rotr(s1388, 1);+  const SWord8 s1390 = 128 | s1389;+  const SWord8 s1391 = 127 & s1389;+  const SWord8 s1392 = s1310 ? s1390 : s1391;+  const SWord8 s1393 = sbv_bv_u8_rotr(s1392, 1);+  const SWord8 s1394 = 128 | s1393;+  const SWord8 s1395 = 127 & s1393;+  const SWord8 s1396 = s1332 ? s1394 : s1395;+  const SWord8 s1397 = sbv_bv_u8_add(s1, s1392);+  const SBool  s1398 = s1397 < s1;+  const SBool  s1399 = s1397 < s1392;+  const SBool  s1400 = s1398 || s1399;+  const SWord8 s1401 = sbv_bv_u8_rotr(s1397, 1);+  const SWord8 s1402 = 128 | s1401;+  const SWord8 s1403 = 127 & s1401;+  const SWord8 s1404 = s1400 ? s1402 : s1403;+  const SWord8 s1405 = s1333 ? s1396 : s1404;+  const SWord8 s1406 = sbv_bv_u8_add(s1, s1388);+  const SBool  s1407 = s1406 < s1;+  const SBool  s1408 = s1406 < s1388;+  const SBool  s1409 = s1407 || s1408;+  const SWord8 s1410 = sbv_bv_u8_rotr(s1406, 1);+  const SWord8 s1411 = 128 | s1410;+  const SWord8 s1412 = 127 & s1410;+  const SWord8 s1413 = s1409 ? s1411 : s1412;+  const SWord8 s1414 = sbv_bv_u8_rotr(s1413, 1);+  const SWord8 s1415 = 128 | s1414;+  const SWord8 s1416 = 127 & s1414;+  const SWord8 s1417 = s1332 ? s1415 : s1416;+  const SWord8 s1418 = sbv_bv_u8_add(s1, s1413);+  const SBool  s1419 = s1418 < s1;+  const SBool  s1420 = s1418 < s1413;+  const SBool  s1421 = s1419 || s1420;+  const SWord8 s1422 = sbv_bv_u8_rotr(s1418, 1);+  const SWord8 s1423 = 128 | s1422;+  const SWord8 s1424 = 127 & s1422;+  const SWord8 s1425 = s1421 ? s1423 : s1424;+  const SWord8 s1426 = s1333 ? s1417 : s1425;+  const SWord8 s1427 = s1311 ? s1405 : s1426;+  const SWord8 s1428 = s1059 ? s1380 : s1427;+  const SWord8 s1429 = sbv_bv_u8_add(s1, s1318);+  const SBool  s1430 = sbv_bv_extract_u8_0_0_u1(s1429);+  const SBool  s1431 = false != s1430;+  const SWord8 s1432 = s1431 ? s1322 : s1323;+  const SBool  s1433 = sbv_bv_extract_u8_0_0_u1(s1432);+  const SBool  s1434 = false != s1433;+  const SWord8 s1435 = s1434 ? s1328 : s1329;+  const SBool  s1436 = sbv_bv_extract_u8_0_0_u1(s1435);+  const SBool  s1437 = false != s1436;+  const SBool  s1438 = !s1437;+  const SBool  s1439 = s1429 < s1;+  const SBool  s1440 = s1429 < s1318;+  const SBool  s1441 = s1439 || s1440;+  const SWord8 s1442 = sbv_bv_u8_rotr(s1429, 1);+  const SWord8 s1443 = 128 | s1442;+  const SWord8 s1444 = 127 & s1442;+  const SWord8 s1445 = s1441 ? s1443 : s1444;+  const SWord8 s1446 = sbv_bv_u8_rotr(s1445, 1);+  const SWord8 s1447 = 128 | s1446;+  const SWord8 s1448 = 127 & s1446;+  const SWord8 s1449 = s1058 ? s1447 : s1448;+  const SWord8 s1450 = sbv_bv_u8_rotr(s1449, 1);+  const SWord8 s1451 = 128 | s1450;+  const SWord8 s1452 = 127 & s1450;+  const SWord8 s1453 = s1310 ? s1451 : s1452;+  const SWord8 s1454 = sbv_bv_u8_rotr(s1453, 1);+  const SWord8 s1455 = 128 | s1454;+  const SWord8 s1456 = 127 & s1454;+  const SWord8 s1457 = s1437 ? s1455 : s1456;+  const SWord8 s1458 = sbv_bv_u8_add(s1, s1453);+  const SBool  s1459 = s1458 < s1;+  const SBool  s1460 = s1458 < s1453;+  const SBool  s1461 = s1459 || s1460;+  const SWord8 s1462 = sbv_bv_u8_rotr(s1458, 1);+  const SWord8 s1463 = 128 | s1462;+  const SWord8 s1464 = 127 & s1462;+  const SWord8 s1465 = s1461 ? s1463 : s1464;+  const SWord8 s1466 = s1438 ? s1457 : s1465;+  const SWord8 s1467 = sbv_bv_u8_add(s1, s1449);+  const SBool  s1468 = s1467 < s1;+  const SBool  s1469 = s1467 < s1449;+  const SBool  s1470 = s1468 || s1469;+  const SWord8 s1471 = sbv_bv_u8_rotr(s1467, 1);+  const SWord8 s1472 = 128 | s1471;+  const SWord8 s1473 = 127 & s1471;+  const SWord8 s1474 = s1470 ? s1472 : s1473;+  const SWord8 s1475 = sbv_bv_u8_rotr(s1474, 1);+  const SWord8 s1476 = 128 | s1475;+  const SWord8 s1477 = 127 & s1475;+  const SWord8 s1478 = s1437 ? s1476 : s1477;+  const SWord8 s1479 = sbv_bv_u8_add(s1, s1474);+  const SBool  s1480 = s1479 < s1;+  const SBool  s1481 = s1479 < s1474;+  const SBool  s1482 = s1480 || s1481;+  const SWord8 s1483 = sbv_bv_u8_rotr(s1479, 1);+  const SWord8 s1484 = 128 | s1483;+  const SWord8 s1485 = 127 & s1483;+  const SWord8 s1486 = s1482 ? s1484 : s1485;+  const SWord8 s1487 = s1438 ? s1478 : s1486;+  const SWord8 s1488 = s1311 ? s1466 : s1487;+  const SWord8 s1489 = sbv_bv_u8_add(s1, s1445);+  const SBool  s1490 = s1489 < s1;+  const SBool  s1491 = s1489 < s1445;+  const SBool  s1492 = s1490 || s1491;+  const SWord8 s1493 = sbv_bv_u8_rotr(s1489, 1);+  const SWord8 s1494 = 128 | s1493;+  const SWord8 s1495 = 127 & s1493;+  const SWord8 s1496 = s1492 ? s1494 : s1495;+  const SWord8 s1497 = sbv_bv_u8_rotr(s1496, 1);+  const SWord8 s1498 = 128 | s1497;+  const SWord8 s1499 = 127 & s1497;+  const SWord8 s1500 = s1310 ? s1498 : s1499;+  const SWord8 s1501 = sbv_bv_u8_rotr(s1500, 1);+  const SWord8 s1502 = 128 | s1501;+  const SWord8 s1503 = 127 & s1501;+  const SWord8 s1504 = s1437 ? s1502 : s1503;+  const SWord8 s1505 = sbv_bv_u8_add(s1, s1500);+  const SBool  s1506 = s1505 < s1;+  const SBool  s1507 = s1505 < s1500;+  const SBool  s1508 = s1506 || s1507;+  const SWord8 s1509 = sbv_bv_u8_rotr(s1505, 1);+  const SWord8 s1510 = 128 | s1509;+  const SWord8 s1511 = 127 & s1509;+  const SWord8 s1512 = s1508 ? s1510 : s1511;+  const SWord8 s1513 = s1438 ? s1504 : s1512;+  const SWord8 s1514 = sbv_bv_u8_add(s1, s1496);+  const SBool  s1515 = s1514 < s1;+  const SBool  s1516 = s1514 < s1496;+  const SBool  s1517 = s1515 || s1516;+  const SWord8 s1518 = sbv_bv_u8_rotr(s1514, 1);+  const SWord8 s1519 = 128 | s1518;+  const SWord8 s1520 = 127 & s1518;+  const SWord8 s1521 = s1517 ? s1519 : s1520;+  const SWord8 s1522 = sbv_bv_u8_rotr(s1521, 1);+  const SWord8 s1523 = 128 | s1522;+  const SWord8 s1524 = 127 & s1522;+  const SWord8 s1525 = s1437 ? s1523 : s1524;+  const SWord8 s1526 = sbv_bv_u8_add(s1, s1521);+  const SBool  s1527 = s1526 < s1;+  const SBool  s1528 = s1526 < s1521;+  const SBool  s1529 = s1527 || s1528;+  const SWord8 s1530 = sbv_bv_u8_rotr(s1526, 1);+  const SWord8 s1531 = 128 | s1530;+  const SWord8 s1532 = 127 & s1530;+  const SWord8 s1533 = s1529 ? s1531 : s1532;+  const SWord8 s1534 = s1438 ? s1525 : s1533;+  const SWord8 s1535 = s1311 ? s1513 : s1534;+  const SWord8 s1536 = s1059 ? s1488 : s1535;+  const SWord8 s1537 = s1037 ? s1428 : s1536;+  const SWord8 s1538 = s21 ? s1301 : s1537;+  const SWord8 s1539 = sbv_bv_u8_add(s1, s1044);+  const SBool  s1540 = sbv_bv_extract_u8_0_0_u1(s1539);+  const SBool  s1541 = false != s1540;+  const SWord8 s1542 = s1541 ? s1048 : s1049;+  const SBool  s1543 = sbv_bv_extract_u8_0_0_u1(s1542);+  const SBool  s1544 = false != s1543;+  const SWord8 s1545 = s1544 ? s1054 : s1055;+  const SBool  s1546 = sbv_bv_extract_u8_0_0_u1(s1545);+  const SBool  s1547 = false != s1546;+  const SBool  s1548 = !s1547;+  const SBool  s1549 = s1539 < s1;+  const SBool  s1550 = s1539 < s1044;+  const SBool  s1551 = s1549 || s1550;+  const SWord8 s1552 = sbv_bv_u8_rotr(s1539, 1);+  const SWord8 s1553 = 128 | s1552;+  const SWord8 s1554 = 127 & s1552;+  const SWord8 s1555 = s1551 ? s1553 : s1554;+  const SBool  s1556 = sbv_bv_extract_u8_0_0_u1(s1555);+  const SBool  s1557 = false != s1556;+  const SWord8 s1558 = sbv_bv_u8_rotr(s1542, 1);+  const SWord8 s1559 = 128 | s1558;+  const SWord8 s1560 = 127 & s1558;+  const SWord8 s1561 = s1557 ? s1559 : s1560;+  const SBool  s1562 = sbv_bv_extract_u8_0_0_u1(s1561);+  const SBool  s1563 = false != s1562;+  const SWord8 s1564 = sbv_bv_u8_rotr(s1545, 1);+  const SWord8 s1565 = 128 | s1564;+  const SWord8 s1566 = 127 & s1564;+  const SWord8 s1567 = s1563 ? s1565 : s1566;+  const SBool  s1568 = sbv_bv_extract_u8_0_0_u1(s1567);+  const SBool  s1569 = false != s1568;+  const SBool  s1570 = !s1569;+  const SWord8 s1571 = sbv_bv_u8_rotr(s1555, 1);+  const SWord8 s1572 = 128 | s1571;+  const SWord8 s1573 = 127 & s1571;+  const SWord8 s1574 = s20 ? s1572 : s1573;+  const SBool  s1575 = sbv_bv_extract_u8_0_0_u1(s1574);+  const SBool  s1576 = false != s1575;+  const SWord8 s1577 = sbv_bv_u8_rotr(s1561, 1);+  const SWord8 s1578 = 128 | s1577;+  const SWord8 s1579 = 127 & s1577;+  const SWord8 s1580 = s1576 ? s1578 : s1579;+  const SBool  s1581 = sbv_bv_extract_u8_0_0_u1(s1580);+  const SBool  s1582 = false != s1581;+  const SWord8 s1583 = sbv_bv_u8_rotr(s1567, 1);+  const SWord8 s1584 = 128 | s1583;+  const SWord8 s1585 = 127 & s1583;+  const SWord8 s1586 = s1582 ? s1584 : s1585;+  const SBool  s1587 = sbv_bv_extract_u8_0_0_u1(s1586);+  const SBool  s1588 = false != s1587;+  const SBool  s1589 = !s1588;+  const SWord8 s1590 = sbv_bv_u8_rotr(s1574, 1);+  const SWord8 s1591 = 128 | s1590;+  const SWord8 s1592 = 127 & s1590;+  const SWord8 s1593 = s1036 ? s1591 : s1592;+  const SWord8 s1594 = sbv_bv_u8_rotr(s1593, 1);+  const SWord8 s1595 = 128 | s1594;+  const SWord8 s1596 = 127 & s1594;+  const SWord8 s1597 = s1547 ? s1595 : s1596;+  const SWord8 s1598 = sbv_bv_u8_rotr(s1597, 1);+  const SWord8 s1599 = 128 | s1598;+  const SWord8 s1600 = 127 & s1598;+  const SWord8 s1601 = s1569 ? s1599 : s1600;+  const SWord8 s1602 = sbv_bv_u8_rotr(s1601, 1);+  const SWord8 s1603 = 128 | s1602;+  const SWord8 s1604 = 127 & s1602;+  const SWord8 s1605 = s1588 ? s1603 : s1604;+  const SWord8 s1606 = sbv_bv_u8_add(s1, s1601);+  const SBool  s1607 = s1606 < s1;+  const SBool  s1608 = s1606 < s1601;+  const SBool  s1609 = s1607 || s1608;+  const SWord8 s1610 = sbv_bv_u8_rotr(s1606, 1);+  const SWord8 s1611 = 128 | s1610;+  const SWord8 s1612 = 127 & s1610;+  const SWord8 s1613 = s1609 ? s1611 : s1612;+  const SWord8 s1614 = s1589 ? s1605 : s1613;+  const SWord8 s1615 = sbv_bv_u8_add(s1, s1597);+  const SBool  s1616 = s1615 < s1;+  const SBool  s1617 = s1615 < s1597;+  const SBool  s1618 = s1616 || s1617;+  const SWord8 s1619 = sbv_bv_u8_rotr(s1615, 1);+  const SWord8 s1620 = 128 | s1619;+  const SWord8 s1621 = 127 & s1619;+  const SWord8 s1622 = s1618 ? s1620 : s1621;+  const SWord8 s1623 = sbv_bv_u8_rotr(s1622, 1);+  const SWord8 s1624 = 128 | s1623;+  const SWord8 s1625 = 127 & s1623;+  const SWord8 s1626 = s1588 ? s1624 : s1625;+  const SWord8 s1627 = sbv_bv_u8_add(s1, s1622);+  const SBool  s1628 = s1627 < s1;+  const SBool  s1629 = s1627 < s1622;+  const SBool  s1630 = s1628 || s1629;+  const SWord8 s1631 = sbv_bv_u8_rotr(s1627, 1);+  const SWord8 s1632 = 128 | s1631;+  const SWord8 s1633 = 127 & s1631;+  const SWord8 s1634 = s1630 ? s1632 : s1633;+  const SWord8 s1635 = s1589 ? s1626 : s1634;+  const SWord8 s1636 = s1570 ? s1614 : s1635;+  const SWord8 s1637 = sbv_bv_u8_add(s1, s1593);+  const SBool  s1638 = s1637 < s1;+  const SBool  s1639 = s1637 < s1593;+  const SBool  s1640 = s1638 || s1639;+  const SWord8 s1641 = sbv_bv_u8_rotr(s1637, 1);+  const SWord8 s1642 = 128 | s1641;+  const SWord8 s1643 = 127 & s1641;+  const SWord8 s1644 = s1640 ? s1642 : s1643;+  const SWord8 s1645 = sbv_bv_u8_rotr(s1644, 1);+  const SWord8 s1646 = 128 | s1645;+  const SWord8 s1647 = 127 & s1645;+  const SWord8 s1648 = s1569 ? s1646 : s1647;+  const SWord8 s1649 = sbv_bv_u8_rotr(s1648, 1);+  const SWord8 s1650 = 128 | s1649;+  const SWord8 s1651 = 127 & s1649;+  const SWord8 s1652 = s1588 ? s1650 : s1651;+  const SWord8 s1653 = sbv_bv_u8_add(s1, s1648);+  const SBool  s1654 = s1653 < s1;+  const SBool  s1655 = s1653 < s1648;+  const SBool  s1656 = s1654 || s1655;+  const SWord8 s1657 = sbv_bv_u8_rotr(s1653, 1);+  const SWord8 s1658 = 128 | s1657;+  const SWord8 s1659 = 127 & s1657;+  const SWord8 s1660 = s1656 ? s1658 : s1659;+  const SWord8 s1661 = s1589 ? s1652 : s1660;+  const SWord8 s1662 = sbv_bv_u8_add(s1, s1644);+  const SBool  s1663 = s1662 < s1;+  const SBool  s1664 = s1662 < s1644;+  const SBool  s1665 = s1663 || s1664;+  const SWord8 s1666 = sbv_bv_u8_rotr(s1662, 1);+  const SWord8 s1667 = 128 | s1666;+  const SWord8 s1668 = 127 & s1666;+  const SWord8 s1669 = s1665 ? s1667 : s1668;+  const SWord8 s1670 = sbv_bv_u8_rotr(s1669, 1);+  const SWord8 s1671 = 128 | s1670;+  const SWord8 s1672 = 127 & s1670;+  const SWord8 s1673 = s1588 ? s1671 : s1672;+  const SWord8 s1674 = sbv_bv_u8_add(s1, s1669);+  const SBool  s1675 = s1674 < s1;+  const SBool  s1676 = s1674 < s1669;+  const SBool  s1677 = s1675 || s1676;+  const SWord8 s1678 = sbv_bv_u8_rotr(s1674, 1);+  const SWord8 s1679 = 128 | s1678;+  const SWord8 s1680 = 127 & s1678;+  const SWord8 s1681 = s1677 ? s1679 : s1680;+  const SWord8 s1682 = s1589 ? s1673 : s1681;+  const SWord8 s1683 = s1570 ? s1661 : s1682;+  const SWord8 s1684 = s1548 ? s1636 : s1683;+  const SWord8 s1685 = sbv_bv_u8_add(s1, s1574);+  const SBool  s1686 = sbv_bv_extract_u8_0_0_u1(s1685);+  const SBool  s1687 = false != s1686;+  const SWord8 s1688 = s1687 ? s1578 : s1579;+  const SBool  s1689 = sbv_bv_extract_u8_0_0_u1(s1688);+  const SBool  s1690 = false != s1689;+  const SWord8 s1691 = s1690 ? s1584 : s1585;+  const SBool  s1692 = sbv_bv_extract_u8_0_0_u1(s1691);+  const SBool  s1693 = false != s1692;+  const SBool  s1694 = !s1693;+  const SBool  s1695 = s1685 < s1;+  const SBool  s1696 = s1685 < s1574;+  const SBool  s1697 = s1695 || s1696;+  const SWord8 s1698 = sbv_bv_u8_rotr(s1685, 1);+  const SWord8 s1699 = 128 | s1698;+  const SWord8 s1700 = 127 & s1698;+  const SWord8 s1701 = s1697 ? s1699 : s1700;+  const SWord8 s1702 = sbv_bv_u8_rotr(s1701, 1);+  const SWord8 s1703 = 128 | s1702;+  const SWord8 s1704 = 127 & s1702;+  const SWord8 s1705 = s1547 ? s1703 : s1704;+  const SWord8 s1706 = sbv_bv_u8_rotr(s1705, 1);+  const SWord8 s1707 = 128 | s1706;+  const SWord8 s1708 = 127 & s1706;+  const SWord8 s1709 = s1569 ? s1707 : s1708;+  const SWord8 s1710 = sbv_bv_u8_rotr(s1709, 1);+  const SWord8 s1711 = 128 | s1710;+  const SWord8 s1712 = 127 & s1710;+  const SWord8 s1713 = s1693 ? s1711 : s1712;+  const SWord8 s1714 = sbv_bv_u8_add(s1, s1709);+  const SBool  s1715 = s1714 < s1;+  const SBool  s1716 = s1714 < s1709;+  const SBool  s1717 = s1715 || s1716;+  const SWord8 s1718 = sbv_bv_u8_rotr(s1714, 1);+  const SWord8 s1719 = 128 | s1718;+  const SWord8 s1720 = 127 & s1718;+  const SWord8 s1721 = s1717 ? s1719 : s1720;+  const SWord8 s1722 = s1694 ? s1713 : s1721;+  const SWord8 s1723 = sbv_bv_u8_add(s1, s1705);+  const SBool  s1724 = s1723 < s1;+  const SBool  s1725 = s1723 < s1705;+  const SBool  s1726 = s1724 || s1725;+  const SWord8 s1727 = sbv_bv_u8_rotr(s1723, 1);+  const SWord8 s1728 = 128 | s1727;+  const SWord8 s1729 = 127 & s1727;+  const SWord8 s1730 = s1726 ? s1728 : s1729;+  const SWord8 s1731 = sbv_bv_u8_rotr(s1730, 1);+  const SWord8 s1732 = 128 | s1731;+  const SWord8 s1733 = 127 & s1731;+  const SWord8 s1734 = s1693 ? s1732 : s1733;+  const SWord8 s1735 = sbv_bv_u8_add(s1, s1730);+  const SBool  s1736 = s1735 < s1;+  const SBool  s1737 = s1735 < s1730;+  const SBool  s1738 = s1736 || s1737;+  const SWord8 s1739 = sbv_bv_u8_rotr(s1735, 1);+  const SWord8 s1740 = 128 | s1739;+  const SWord8 s1741 = 127 & s1739;+  const SWord8 s1742 = s1738 ? s1740 : s1741;+  const SWord8 s1743 = s1694 ? s1734 : s1742;+  const SWord8 s1744 = s1570 ? s1722 : s1743;+  const SWord8 s1745 = sbv_bv_u8_add(s1, s1701);+  const SBool  s1746 = s1745 < s1;+  const SBool  s1747 = s1745 < s1701;+  const SBool  s1748 = s1746 || s1747;+  const SWord8 s1749 = sbv_bv_u8_rotr(s1745, 1);+  const SWord8 s1750 = 128 | s1749;+  const SWord8 s1751 = 127 & s1749;+  const SWord8 s1752 = s1748 ? s1750 : s1751;+  const SWord8 s1753 = sbv_bv_u8_rotr(s1752, 1);+  const SWord8 s1754 = 128 | s1753;+  const SWord8 s1755 = 127 & s1753;+  const SWord8 s1756 = s1569 ? s1754 : s1755;+  const SWord8 s1757 = sbv_bv_u8_rotr(s1756, 1);+  const SWord8 s1758 = 128 | s1757;+  const SWord8 s1759 = 127 & s1757;+  const SWord8 s1760 = s1693 ? s1758 : s1759;+  const SWord8 s1761 = sbv_bv_u8_add(s1, s1756);+  const SBool  s1762 = s1761 < s1;+  const SBool  s1763 = s1761 < s1756;+  const SBool  s1764 = s1762 || s1763;+  const SWord8 s1765 = sbv_bv_u8_rotr(s1761, 1);+  const SWord8 s1766 = 128 | s1765;+  const SWord8 s1767 = 127 & s1765;+  const SWord8 s1768 = s1764 ? s1766 : s1767;+  const SWord8 s1769 = s1694 ? s1760 : s1768;+  const SWord8 s1770 = sbv_bv_u8_add(s1, s1752);+  const SBool  s1771 = s1770 < s1;+  const SBool  s1772 = s1770 < s1752;+  const SBool  s1773 = s1771 || s1772;+  const SWord8 s1774 = sbv_bv_u8_rotr(s1770, 1);+  const SWord8 s1775 = 128 | s1774;+  const SWord8 s1776 = 127 & s1774;+  const SWord8 s1777 = s1773 ? s1775 : s1776;+  const SWord8 s1778 = sbv_bv_u8_rotr(s1777, 1);+  const SWord8 s1779 = 128 | s1778;+  const SWord8 s1780 = 127 & s1778;+  const SWord8 s1781 = s1693 ? s1779 : s1780;+  const SWord8 s1782 = sbv_bv_u8_add(s1, s1777);+  const SBool  s1783 = s1782 < s1;+  const SBool  s1784 = s1782 < s1777;+  const SBool  s1785 = s1783 || s1784;+  const SWord8 s1786 = sbv_bv_u8_rotr(s1782, 1);+  const SWord8 s1787 = 128 | s1786;+  const SWord8 s1788 = 127 & s1786;+  const SWord8 s1789 = s1785 ? s1787 : s1788;+  const SWord8 s1790 = s1694 ? s1781 : s1789;+  const SWord8 s1791 = s1570 ? s1769 : s1790;+  const SWord8 s1792 = s1548 ? s1744 : s1791;+  const SWord8 s1793 = s1037 ? s1684 : s1792;+  const SWord8 s1794 = sbv_bv_u8_add(s1, s1555);+  const SBool  s1795 = sbv_bv_extract_u8_0_0_u1(s1794);+  const SBool  s1796 = false != s1795;+  const SWord8 s1797 = s1796 ? s1559 : s1560;+  const SBool  s1798 = sbv_bv_extract_u8_0_0_u1(s1797);+  const SBool  s1799 = false != s1798;+  const SWord8 s1800 = s1799 ? s1565 : s1566;+  const SBool  s1801 = sbv_bv_extract_u8_0_0_u1(s1800);+  const SBool  s1802 = false != s1801;+  const SBool  s1803 = !s1802;+  const SBool  s1804 = s1794 < s1;+  const SBool  s1805 = s1794 < s1555;+  const SBool  s1806 = s1804 || s1805;+  const SWord8 s1807 = sbv_bv_u8_rotr(s1794, 1);+  const SWord8 s1808 = 128 | s1807;+  const SWord8 s1809 = 127 & s1807;+  const SWord8 s1810 = s1806 ? s1808 : s1809;+  const SBool  s1811 = sbv_bv_extract_u8_0_0_u1(s1810);+  const SBool  s1812 = false != s1811;+  const SWord8 s1813 = sbv_bv_u8_rotr(s1797, 1);+  const SWord8 s1814 = 128 | s1813;+  const SWord8 s1815 = 127 & s1813;+  const SWord8 s1816 = s1812 ? s1814 : s1815;+  const SBool  s1817 = sbv_bv_extract_u8_0_0_u1(s1816);+  const SBool  s1818 = false != s1817;+  const SWord8 s1819 = sbv_bv_u8_rotr(s1800, 1);+  const SWord8 s1820 = 128 | s1819;+  const SWord8 s1821 = 127 & s1819;+  const SWord8 s1822 = s1818 ? s1820 : s1821;+  const SBool  s1823 = sbv_bv_extract_u8_0_0_u1(s1822);+  const SBool  s1824 = false != s1823;+  const SBool  s1825 = !s1824;+  const SWord8 s1826 = sbv_bv_u8_rotr(s1810, 1);+  const SWord8 s1827 = 128 | s1826;+  const SWord8 s1828 = 127 & s1826;+  const SWord8 s1829 = s1036 ? s1827 : s1828;+  const SWord8 s1830 = sbv_bv_u8_rotr(s1829, 1);+  const SWord8 s1831 = 128 | s1830;+  const SWord8 s1832 = 127 & s1830;+  const SWord8 s1833 = s1547 ? s1831 : s1832;+  const SWord8 s1834 = sbv_bv_u8_rotr(s1833, 1);+  const SWord8 s1835 = 128 | s1834;+  const SWord8 s1836 = 127 & s1834;+  const SWord8 s1837 = s1802 ? s1835 : s1836;+  const SWord8 s1838 = sbv_bv_u8_rotr(s1837, 1);+  const SWord8 s1839 = 128 | s1838;+  const SWord8 s1840 = 127 & s1838;+  const SWord8 s1841 = s1824 ? s1839 : s1840;+  const SWord8 s1842 = sbv_bv_u8_add(s1, s1837);+  const SBool  s1843 = s1842 < s1;+  const SBool  s1844 = s1842 < s1837;+  const SBool  s1845 = s1843 || s1844;+  const SWord8 s1846 = sbv_bv_u8_rotr(s1842, 1);+  const SWord8 s1847 = 128 | s1846;+  const SWord8 s1848 = 127 & s1846;+  const SWord8 s1849 = s1845 ? s1847 : s1848;+  const SWord8 s1850 = s1825 ? s1841 : s1849;+  const SWord8 s1851 = sbv_bv_u8_add(s1, s1833);+  const SBool  s1852 = s1851 < s1;+  const SBool  s1853 = s1851 < s1833;+  const SBool  s1854 = s1852 || s1853;+  const SWord8 s1855 = sbv_bv_u8_rotr(s1851, 1);+  const SWord8 s1856 = 128 | s1855;+  const SWord8 s1857 = 127 & s1855;+  const SWord8 s1858 = s1854 ? s1856 : s1857;+  const SWord8 s1859 = sbv_bv_u8_rotr(s1858, 1);+  const SWord8 s1860 = 128 | s1859;+  const SWord8 s1861 = 127 & s1859;+  const SWord8 s1862 = s1824 ? s1860 : s1861;+  const SWord8 s1863 = sbv_bv_u8_add(s1, s1858);+  const SBool  s1864 = s1863 < s1;+  const SBool  s1865 = s1863 < s1858;+  const SBool  s1866 = s1864 || s1865;+  const SWord8 s1867 = sbv_bv_u8_rotr(s1863, 1);+  const SWord8 s1868 = 128 | s1867;+  const SWord8 s1869 = 127 & s1867;+  const SWord8 s1870 = s1866 ? s1868 : s1869;+  const SWord8 s1871 = s1825 ? s1862 : s1870;+  const SWord8 s1872 = s1803 ? s1850 : s1871;+  const SWord8 s1873 = sbv_bv_u8_add(s1, s1829);+  const SBool  s1874 = s1873 < s1;+  const SBool  s1875 = s1873 < s1829;+  const SBool  s1876 = s1874 || s1875;+  const SWord8 s1877 = sbv_bv_u8_rotr(s1873, 1);+  const SWord8 s1878 = 128 | s1877;+  const SWord8 s1879 = 127 & s1877;+  const SWord8 s1880 = s1876 ? s1878 : s1879;+  const SWord8 s1881 = sbv_bv_u8_rotr(s1880, 1);+  const SWord8 s1882 = 128 | s1881;+  const SWord8 s1883 = 127 & s1881;+  const SWord8 s1884 = s1802 ? s1882 : s1883;+  const SWord8 s1885 = sbv_bv_u8_rotr(s1884, 1);+  const SWord8 s1886 = 128 | s1885;+  const SWord8 s1887 = 127 & s1885;+  const SWord8 s1888 = s1824 ? s1886 : s1887;+  const SWord8 s1889 = sbv_bv_u8_add(s1, s1884);+  const SBool  s1890 = s1889 < s1;+  const SBool  s1891 = s1889 < s1884;+  const SBool  s1892 = s1890 || s1891;+  const SWord8 s1893 = sbv_bv_u8_rotr(s1889, 1);+  const SWord8 s1894 = 128 | s1893;+  const SWord8 s1895 = 127 & s1893;+  const SWord8 s1896 = s1892 ? s1894 : s1895;+  const SWord8 s1897 = s1825 ? s1888 : s1896;+  const SWord8 s1898 = sbv_bv_u8_add(s1, s1880);+  const SBool  s1899 = s1898 < s1;+  const SBool  s1900 = s1898 < s1880;+  const SBool  s1901 = s1899 || s1900;+  const SWord8 s1902 = sbv_bv_u8_rotr(s1898, 1);+  const SWord8 s1903 = 128 | s1902;+  const SWord8 s1904 = 127 & s1902;+  const SWord8 s1905 = s1901 ? s1903 : s1904;+  const SWord8 s1906 = sbv_bv_u8_rotr(s1905, 1);+  const SWord8 s1907 = 128 | s1906;+  const SWord8 s1908 = 127 & s1906;+  const SWord8 s1909 = s1824 ? s1907 : s1908;+  const SWord8 s1910 = sbv_bv_u8_add(s1, s1905);+  const SBool  s1911 = s1910 < s1;+  const SBool  s1912 = s1910 < s1905;+  const SBool  s1913 = s1911 || s1912;+  const SWord8 s1914 = sbv_bv_u8_rotr(s1910, 1);+  const SWord8 s1915 = 128 | s1914;+  const SWord8 s1916 = 127 & s1914;+  const SWord8 s1917 = s1913 ? s1915 : s1916;+  const SWord8 s1918 = s1825 ? s1909 : s1917;+  const SWord8 s1919 = s1803 ? s1897 : s1918;+  const SWord8 s1920 = s1548 ? s1872 : s1919;+  const SWord8 s1921 = sbv_bv_u8_add(s1, s1810);+  const SBool  s1922 = sbv_bv_extract_u8_0_0_u1(s1921);+  const SBool  s1923 = false != s1922;+  const SWord8 s1924 = s1923 ? s1814 : s1815;+  const SBool  s1925 = sbv_bv_extract_u8_0_0_u1(s1924);+  const SBool  s1926 = false != s1925;+  const SWord8 s1927 = s1926 ? s1820 : s1821;+  const SBool  s1928 = sbv_bv_extract_u8_0_0_u1(s1927);+  const SBool  s1929 = false != s1928;+  const SBool  s1930 = !s1929;+  const SBool  s1931 = s1921 < s1;+  const SBool  s1932 = s1921 < s1810;+  const SBool  s1933 = s1931 || s1932;+  const SWord8 s1934 = sbv_bv_u8_rotr(s1921, 1);+  const SWord8 s1935 = 128 | s1934;+  const SWord8 s1936 = 127 & s1934;+  const SWord8 s1937 = s1933 ? s1935 : s1936;+  const SWord8 s1938 = sbv_bv_u8_rotr(s1937, 1);+  const SWord8 s1939 = 128 | s1938;+  const SWord8 s1940 = 127 & s1938;+  const SWord8 s1941 = s1547 ? s1939 : s1940;+  const SWord8 s1942 = sbv_bv_u8_rotr(s1941, 1);+  const SWord8 s1943 = 128 | s1942;+  const SWord8 s1944 = 127 & s1942;+  const SWord8 s1945 = s1802 ? s1943 : s1944;+  const SWord8 s1946 = sbv_bv_u8_rotr(s1945, 1);+  const SWord8 s1947 = 128 | s1946;+  const SWord8 s1948 = 127 & s1946;+  const SWord8 s1949 = s1929 ? s1947 : s1948;+  const SWord8 s1950 = sbv_bv_u8_add(s1, s1945);+  const SBool  s1951 = s1950 < s1;+  const SBool  s1952 = s1950 < s1945;+  const SBool  s1953 = s1951 || s1952;+  const SWord8 s1954 = sbv_bv_u8_rotr(s1950, 1);+  const SWord8 s1955 = 128 | s1954;+  const SWord8 s1956 = 127 & s1954;+  const SWord8 s1957 = s1953 ? s1955 : s1956;+  const SWord8 s1958 = s1930 ? s1949 : s1957;+  const SWord8 s1959 = sbv_bv_u8_add(s1, s1941);+  const SBool  s1960 = s1959 < s1;+  const SBool  s1961 = s1959 < s1941;+  const SBool  s1962 = s1960 || s1961;+  const SWord8 s1963 = sbv_bv_u8_rotr(s1959, 1);+  const SWord8 s1964 = 128 | s1963;+  const SWord8 s1965 = 127 & s1963;+  const SWord8 s1966 = s1962 ? s1964 : s1965;+  const SWord8 s1967 = sbv_bv_u8_rotr(s1966, 1);+  const SWord8 s1968 = 128 | s1967;+  const SWord8 s1969 = 127 & s1967;+  const SWord8 s1970 = s1929 ? s1968 : s1969;+  const SWord8 s1971 = sbv_bv_u8_add(s1, s1966);+  const SBool  s1972 = s1971 < s1;+  const SBool  s1973 = s1971 < s1966;+  const SBool  s1974 = s1972 || s1973;+  const SWord8 s1975 = sbv_bv_u8_rotr(s1971, 1);+  const SWord8 s1976 = 128 | s1975;+  const SWord8 s1977 = 127 & s1975;+  const SWord8 s1978 = s1974 ? s1976 : s1977;+  const SWord8 s1979 = s1930 ? s1970 : s1978;+  const SWord8 s1980 = s1803 ? s1958 : s1979;+  const SWord8 s1981 = sbv_bv_u8_add(s1, s1937);+  const SBool  s1982 = s1981 < s1;+  const SBool  s1983 = s1981 < s1937;+  const SBool  s1984 = s1982 || s1983;+  const SWord8 s1985 = sbv_bv_u8_rotr(s1981, 1);+  const SWord8 s1986 = 128 | s1985;+  const SWord8 s1987 = 127 & s1985;+  const SWord8 s1988 = s1984 ? s1986 : s1987;+  const SWord8 s1989 = sbv_bv_u8_rotr(s1988, 1);+  const SWord8 s1990 = 128 | s1989;+  const SWord8 s1991 = 127 & s1989;+  const SWord8 s1992 = s1802 ? s1990 : s1991;+  const SWord8 s1993 = sbv_bv_u8_rotr(s1992, 1);+  const SWord8 s1994 = 128 | s1993;+  const SWord8 s1995 = 127 & s1993;+  const SWord8 s1996 = s1929 ? s1994 : s1995;+  const SWord8 s1997 = sbv_bv_u8_add(s1, s1992);+  const SBool  s1998 = s1997 < s1;+  const SBool  s1999 = s1997 < s1992;+  const SBool  s2000 = s1998 || s1999;+  const SWord8 s2001 = sbv_bv_u8_rotr(s1997, 1);+  const SWord8 s2002 = 128 | s2001;+  const SWord8 s2003 = 127 & s2001;+  const SWord8 s2004 = s2000 ? s2002 : s2003;+  const SWord8 s2005 = s1930 ? s1996 : s2004;+  const SWord8 s2006 = sbv_bv_u8_add(s1, s1988);+  const SBool  s2007 = s2006 < s1;+  const SBool  s2008 = s2006 < s1988;+  const SBool  s2009 = s2007 || s2008;+  const SWord8 s2010 = sbv_bv_u8_rotr(s2006, 1);+  const SWord8 s2011 = 128 | s2010;+  const SWord8 s2012 = 127 & s2010;+  const SWord8 s2013 = s2009 ? s2011 : s2012;+  const SWord8 s2014 = sbv_bv_u8_rotr(s2013, 1);+  const SWord8 s2015 = 128 | s2014;+  const SWord8 s2016 = 127 & s2014;+  const SWord8 s2017 = s1929 ? s2015 : s2016;+  const SWord8 s2018 = sbv_bv_u8_add(s1, s2013);+  const SBool  s2019 = s2018 < s1;+  const SBool  s2020 = s2018 < s2013;+  const SBool  s2021 = s2019 || s2020;+  const SWord8 s2022 = sbv_bv_u8_rotr(s2018, 1);+  const SWord8 s2023 = 128 | s2022;+  const SWord8 s2024 = 127 & s2022;+  const SWord8 s2025 = s2021 ? s2023 : s2024;+  const SWord8 s2026 = s1930 ? s2017 : s2025;+  const SWord8 s2027 = s1803 ? s2005 : s2026;+  const SWord8 s2028 = s1548 ? s1980 : s2027;+  const SWord8 s2029 = s1037 ? s1920 : s2028;+  const SWord8 s2030 = s21 ? s1793 : s2029;+  const SWord8 s2031 = s16 ? s1538 : s2030;+  const SWord8 s2032 = s11 ? s1027 : s2031;+  const SBool  s2033 = sbv_bv_extract_u8_0_0_u1(s1);+  const SBool  s2034 = false != s2033;+  const SWord8 s2035 = s2034 ? 128 : 0;+  const SBool  s2036 = sbv_bv_extract_u8_0_0_u1(s2035);+  const SBool  s2037 = false != s2036;+  const SWord8 s2038 = s17 | 128;+  const SWord8 s2039 = s2037 ? s2038 : s18;+  const SBool  s2040 = sbv_bv_extract_u8_0_0_u1(s2039);+  const SBool  s2041 = false != s2040;+  const SBool  s2042 = !s2041;+  const SWord8 s2043 = sbv_bv_u8_rotr(s1, 1);+  const SWord8 s2044 = 127 & s2043;+  const SBool  s2045 = sbv_bv_extract_u8_0_0_u1(s2044);+  const SBool  s2046 = false != s2045;+  const SWord8 s2047 = sbv_bv_u8_rotr(s2035, 1);+  const SWord8 s2048 = 128 | s2047;+  const SWord8 s2049 = 127 & s2047;+  const SWord8 s2050 = s2046 ? s2048 : s2049;+  const SBool  s2051 = sbv_bv_extract_u8_0_0_u1(s2050);+  const SBool  s2052 = false != s2051;+  const SWord8 s2053 = sbv_bv_u8_rotr(s2039, 1);+  const SWord8 s2054 = 128 | s2053;+  const SWord8 s2055 = 127 & s2053;+  const SWord8 s2056 = s2052 ? s2054 : s2055;+  const SBool  s2057 = sbv_bv_extract_u8_0_0_u1(s2056);+  const SBool  s2058 = false != s2057;+  const SBool  s2059 = !s2058;+  const SWord8 s2060 = sbv_bv_u8_rotr(s2044, 1);+  const SWord8 s2061 = 128 | s2060;+  const SWord8 s2062 = 127 & s2060;+  const SWord8 s2063 = s10 ? s2061 : s2062;+  const SBool  s2064 = sbv_bv_extract_u8_0_0_u1(s2063);+  const SBool  s2065 = false != s2064;+  const SWord8 s2066 = sbv_bv_u8_rotr(s2050, 1);+  const SWord8 s2067 = 128 | s2066;+  const SWord8 s2068 = 127 & s2066;+  const SWord8 s2069 = s2065 ? s2067 : s2068;+  const SBool  s2070 = sbv_bv_extract_u8_0_0_u1(s2069);+  const SBool  s2071 = false != s2070;+  const SWord8 s2072 = sbv_bv_u8_rotr(s2056, 1);+  const SWord8 s2073 = 128 | s2072;+  const SWord8 s2074 = 127 & s2072;+  const SWord8 s2075 = s2071 ? s2073 : s2074;+  const SBool  s2076 = sbv_bv_extract_u8_0_0_u1(s2075);+  const SBool  s2077 = false != s2076;+  const SBool  s2078 = !s2077;+  const SWord8 s2079 = sbv_bv_u8_rotr(s2063, 1);+  const SWord8 s2080 = 128 | s2079;+  const SWord8 s2081 = 127 & s2079;+  const SWord8 s2082 = s15 ? s2080 : s2081;+  const SBool  s2083 = sbv_bv_extract_u8_0_0_u1(s2082);+  const SBool  s2084 = false != s2083;+  const SWord8 s2085 = sbv_bv_u8_rotr(s2069, 1);+  const SWord8 s2086 = 128 | s2085;+  const SWord8 s2087 = 127 & s2085;+  const SWord8 s2088 = s2084 ? s2086 : s2087;+  const SBool  s2089 = sbv_bv_extract_u8_0_0_u1(s2088);+  const SBool  s2090 = false != s2089;+  const SWord8 s2091 = sbv_bv_u8_rotr(s2075, 1);+  const SWord8 s2092 = 128 | s2091;+  const SWord8 s2093 = 127 & s2091;+  const SWord8 s2094 = s2090 ? s2092 : s2093;+  const SBool  s2095 = sbv_bv_extract_u8_0_0_u1(s2094);+  const SBool  s2096 = false != s2095;+  const SBool  s2097 = !s2096;+  const SWord8 s2098 = sbv_bv_u8_rotr(s2082, 1);+  const SWord8 s2099 = 128 | s2098;+  const SWord8 s2100 = 127 & s2098;+  const SWord8 s2101 = s2041 ? s2099 : s2100;+  const SBool  s2102 = sbv_bv_extract_u8_0_0_u1(s2101);+  const SBool  s2103 = false != s2102;+  const SWord8 s2104 = sbv_bv_u8_rotr(s2088, 1);+  const SWord8 s2105 = 128 | s2104;+  const SWord8 s2106 = 127 & s2104;+  const SWord8 s2107 = s2103 ? s2105 : s2106;+  const SBool  s2108 = sbv_bv_extract_u8_0_0_u1(s2107);+  const SBool  s2109 = false != s2108;+  const SWord8 s2110 = sbv_bv_u8_rotr(s2094, 1);+  const SWord8 s2111 = 128 | s2110;+  const SWord8 s2112 = 127 & s2110;+  const SWord8 s2113 = s2109 ? s2111 : s2112;+  const SBool  s2114 = sbv_bv_extract_u8_0_0_u1(s2113);+  const SBool  s2115 = false != s2114;+  const SBool  s2116 = !s2115;+  const SWord8 s2117 = sbv_bv_u8_rotr(s2101, 1);+  const SWord8 s2118 = 128 | s2117;+  const SWord8 s2119 = 127 & s2117;+  const SWord8 s2120 = s2058 ? s2118 : s2119;+  const SWord8 s2121 = sbv_bv_u8_rotr(s2120, 1);+  const SWord8 s2122 = 128 | s2121;+  const SWord8 s2123 = 127 & s2121;+  const SWord8 s2124 = s2077 ? s2122 : s2123;+  const SWord8 s2125 = sbv_bv_u8_rotr(s2124, 1);+  const SWord8 s2126 = 128 | s2125;+  const SWord8 s2127 = 127 & s2125;+  const SWord8 s2128 = s2096 ? s2126 : s2127;+  const SWord8 s2129 = sbv_bv_u8_rotr(s2128, 1);+  const SWord8 s2130 = 128 | s2129;+  const SWord8 s2131 = 127 & s2129;+  const SWord8 s2132 = s2115 ? s2130 : s2131;+  const SWord8 s2133 = sbv_bv_u8_add(s1, s2128);+  const SBool  s2134 = s2133 < s1;+  const SBool  s2135 = s2133 < s2128;+  const SBool  s2136 = s2134 || s2135;+  const SWord8 s2137 = sbv_bv_u8_rotr(s2133, 1);+  const SWord8 s2138 = 128 | s2137;+  const SWord8 s2139 = 127 & s2137;+  const SWord8 s2140 = s2136 ? s2138 : s2139;+  const SWord8 s2141 = s2116 ? s2132 : s2140;+  const SWord8 s2142 = sbv_bv_u8_add(s1, s2124);+  const SBool  s2143 = s2142 < s1;+  const SBool  s2144 = s2142 < s2124;+  const SBool  s2145 = s2143 || s2144;+  const SWord8 s2146 = sbv_bv_u8_rotr(s2142, 1);+  const SWord8 s2147 = 128 | s2146;+  const SWord8 s2148 = 127 & s2146;+  const SWord8 s2149 = s2145 ? s2147 : s2148;+  const SWord8 s2150 = sbv_bv_u8_rotr(s2149, 1);+  const SWord8 s2151 = 128 | s2150;+  const SWord8 s2152 = 127 & s2150;+  const SWord8 s2153 = s2115 ? s2151 : s2152;+  const SWord8 s2154 = sbv_bv_u8_add(s1, s2149);+  const SBool  s2155 = s2154 < s1;+  const SBool  s2156 = s2154 < s2149;+  const SBool  s2157 = s2155 || s2156;+  const SWord8 s2158 = sbv_bv_u8_rotr(s2154, 1);+  const SWord8 s2159 = 128 | s2158;+  const SWord8 s2160 = 127 & s2158;+  const SWord8 s2161 = s2157 ? s2159 : s2160;+  const SWord8 s2162 = s2116 ? s2153 : s2161;+  const SWord8 s2163 = s2097 ? s2141 : s2162;+  const SWord8 s2164 = sbv_bv_u8_add(s1, s2120);+  const SBool  s2165 = s2164 < s1;+  const SBool  s2166 = s2164 < s2120;+  const SBool  s2167 = s2165 || s2166;+  const SWord8 s2168 = sbv_bv_u8_rotr(s2164, 1);+  const SWord8 s2169 = 128 | s2168;+  const SWord8 s2170 = 127 & s2168;+  const SWord8 s2171 = s2167 ? s2169 : s2170;+  const SWord8 s2172 = sbv_bv_u8_rotr(s2171, 1);+  const SWord8 s2173 = 128 | s2172;+  const SWord8 s2174 = 127 & s2172;+  const SWord8 s2175 = s2096 ? s2173 : s2174;+  const SWord8 s2176 = sbv_bv_u8_rotr(s2175, 1);+  const SWord8 s2177 = 128 | s2176;+  const SWord8 s2178 = 127 & s2176;+  const SWord8 s2179 = s2115 ? s2177 : s2178;+  const SWord8 s2180 = sbv_bv_u8_add(s1, s2175);+  const SBool  s2181 = s2180 < s1;+  const SBool  s2182 = s2180 < s2175;+  const SBool  s2183 = s2181 || s2182;+  const SWord8 s2184 = sbv_bv_u8_rotr(s2180, 1);+  const SWord8 s2185 = 128 | s2184;+  const SWord8 s2186 = 127 & s2184;+  const SWord8 s2187 = s2183 ? s2185 : s2186;+  const SWord8 s2188 = s2116 ? s2179 : s2187;+  const SWord8 s2189 = sbv_bv_u8_add(s1, s2171);+  const SBool  s2190 = s2189 < s1;+  const SBool  s2191 = s2189 < s2171;+  const SBool  s2192 = s2190 || s2191;+  const SWord8 s2193 = sbv_bv_u8_rotr(s2189, 1);+  const SWord8 s2194 = 128 | s2193;+  const SWord8 s2195 = 127 & s2193;+  const SWord8 s2196 = s2192 ? s2194 : s2195;+  const SWord8 s2197 = sbv_bv_u8_rotr(s2196, 1);+  const SWord8 s2198 = 128 | s2197;+  const SWord8 s2199 = 127 & s2197;+  const SWord8 s2200 = s2115 ? s2198 : s2199;+  const SWord8 s2201 = sbv_bv_u8_add(s1, s2196);+  const SBool  s2202 = s2201 < s1;+  const SBool  s2203 = s2201 < s2196;+  const SBool  s2204 = s2202 || s2203;+  const SWord8 s2205 = sbv_bv_u8_rotr(s2201, 1);+  const SWord8 s2206 = 128 | s2205;+  const SWord8 s2207 = 127 & s2205;+  const SWord8 s2208 = s2204 ? s2206 : s2207;+  const SWord8 s2209 = s2116 ? s2200 : s2208;+  const SWord8 s2210 = s2097 ? s2188 : s2209;+  const SWord8 s2211 = s2078 ? s2163 : s2210;+  const SWord8 s2212 = sbv_bv_u8_add(s1, s2101);+  const SBool  s2213 = sbv_bv_extract_u8_0_0_u1(s2212);+  const SBool  s2214 = false != s2213;+  const SWord8 s2215 = s2214 ? s2105 : s2106;+  const SBool  s2216 = sbv_bv_extract_u8_0_0_u1(s2215);+  const SBool  s2217 = false != s2216;+  const SWord8 s2218 = s2217 ? s2111 : s2112;+  const SBool  s2219 = sbv_bv_extract_u8_0_0_u1(s2218);+  const SBool  s2220 = false != s2219;+  const SBool  s2221 = !s2220;+  const SBool  s2222 = s2212 < s1;+  const SBool  s2223 = s2212 < s2101;+  const SBool  s2224 = s2222 || s2223;+  const SWord8 s2225 = sbv_bv_u8_rotr(s2212, 1);+  const SWord8 s2226 = 128 | s2225;+  const SWord8 s2227 = 127 & s2225;+  const SWord8 s2228 = s2224 ? s2226 : s2227;+  const SWord8 s2229 = sbv_bv_u8_rotr(s2228, 1);+  const SWord8 s2230 = 128 | s2229;+  const SWord8 s2231 = 127 & s2229;+  const SWord8 s2232 = s2077 ? s2230 : s2231;+  const SWord8 s2233 = sbv_bv_u8_rotr(s2232, 1);+  const SWord8 s2234 = 128 | s2233;+  const SWord8 s2235 = 127 & s2233;+  const SWord8 s2236 = s2096 ? s2234 : s2235;+  const SWord8 s2237 = sbv_bv_u8_rotr(s2236, 1);+  const SWord8 s2238 = 128 | s2237;+  const SWord8 s2239 = 127 & s2237;+  const SWord8 s2240 = s2220 ? s2238 : s2239;+  const SWord8 s2241 = sbv_bv_u8_add(s1, s2236);+  const SBool  s2242 = s2241 < s1;+  const SBool  s2243 = s2241 < s2236;+  const SBool  s2244 = s2242 || s2243;+  const SWord8 s2245 = sbv_bv_u8_rotr(s2241, 1);+  const SWord8 s2246 = 128 | s2245;+  const SWord8 s2247 = 127 & s2245;+  const SWord8 s2248 = s2244 ? s2246 : s2247;+  const SWord8 s2249 = s2221 ? s2240 : s2248;+  const SWord8 s2250 = sbv_bv_u8_add(s1, s2232);+  const SBool  s2251 = s2250 < s1;+  const SBool  s2252 = s2250 < s2232;+  const SBool  s2253 = s2251 || s2252;+  const SWord8 s2254 = sbv_bv_u8_rotr(s2250, 1);+  const SWord8 s2255 = 128 | s2254;+  const SWord8 s2256 = 127 & s2254;+  const SWord8 s2257 = s2253 ? s2255 : s2256;+  const SWord8 s2258 = sbv_bv_u8_rotr(s2257, 1);+  const SWord8 s2259 = 128 | s2258;+  const SWord8 s2260 = 127 & s2258;+  const SWord8 s2261 = s2220 ? s2259 : s2260;+  const SWord8 s2262 = sbv_bv_u8_add(s1, s2257);+  const SBool  s2263 = s2262 < s1;+  const SBool  s2264 = s2262 < s2257;+  const SBool  s2265 = s2263 || s2264;+  const SWord8 s2266 = sbv_bv_u8_rotr(s2262, 1);+  const SWord8 s2267 = 128 | s2266;+  const SWord8 s2268 = 127 & s2266;+  const SWord8 s2269 = s2265 ? s2267 : s2268;+  const SWord8 s2270 = s2221 ? s2261 : s2269;+  const SWord8 s2271 = s2097 ? s2249 : s2270;+  const SWord8 s2272 = sbv_bv_u8_add(s1, s2228);+  const SBool  s2273 = s2272 < s1;+  const SBool  s2274 = s2272 < s2228;+  const SBool  s2275 = s2273 || s2274;+  const SWord8 s2276 = sbv_bv_u8_rotr(s2272, 1);+  const SWord8 s2277 = 128 | s2276;+  const SWord8 s2278 = 127 & s2276;+  const SWord8 s2279 = s2275 ? s2277 : s2278;+  const SWord8 s2280 = sbv_bv_u8_rotr(s2279, 1);+  const SWord8 s2281 = 128 | s2280;+  const SWord8 s2282 = 127 & s2280;+  const SWord8 s2283 = s2096 ? s2281 : s2282;+  const SWord8 s2284 = sbv_bv_u8_rotr(s2283, 1);+  const SWord8 s2285 = 128 | s2284;+  const SWord8 s2286 = 127 & s2284;+  const SWord8 s2287 = s2220 ? s2285 : s2286;+  const SWord8 s2288 = sbv_bv_u8_add(s1, s2283);+  const SBool  s2289 = s2288 < s1;+  const SBool  s2290 = s2288 < s2283;+  const SBool  s2291 = s2289 || s2290;+  const SWord8 s2292 = sbv_bv_u8_rotr(s2288, 1);+  const SWord8 s2293 = 128 | s2292;+  const SWord8 s2294 = 127 & s2292;+  const SWord8 s2295 = s2291 ? s2293 : s2294;+  const SWord8 s2296 = s2221 ? s2287 : s2295;+  const SWord8 s2297 = sbv_bv_u8_add(s1, s2279);+  const SBool  s2298 = s2297 < s1;+  const SBool  s2299 = s2297 < s2279;+  const SBool  s2300 = s2298 || s2299;+  const SWord8 s2301 = sbv_bv_u8_rotr(s2297, 1);+  const SWord8 s2302 = 128 | s2301;+  const SWord8 s2303 = 127 & s2301;+  const SWord8 s2304 = s2300 ? s2302 : s2303;+  const SWord8 s2305 = sbv_bv_u8_rotr(s2304, 1);+  const SWord8 s2306 = 128 | s2305;+  const SWord8 s2307 = 127 & s2305;+  const SWord8 s2308 = s2220 ? s2306 : s2307;+  const SWord8 s2309 = sbv_bv_u8_add(s1, s2304);+  const SBool  s2310 = s2309 < s1;+  const SBool  s2311 = s2309 < s2304;+  const SBool  s2312 = s2310 || s2311;+  const SWord8 s2313 = sbv_bv_u8_rotr(s2309, 1);+  const SWord8 s2314 = 128 | s2313;+  const SWord8 s2315 = 127 & s2313;+  const SWord8 s2316 = s2312 ? s2314 : s2315;+  const SWord8 s2317 = s2221 ? s2308 : s2316;+  const SWord8 s2318 = s2097 ? s2296 : s2317;+  const SWord8 s2319 = s2078 ? s2271 : s2318;+  const SWord8 s2320 = s2059 ? s2211 : s2319;+  const SWord8 s2321 = sbv_bv_u8_add(s1, s2082);+  const SBool  s2322 = sbv_bv_extract_u8_0_0_u1(s2321);+  const SBool  s2323 = false != s2322;+  const SWord8 s2324 = s2323 ? s2086 : s2087;+  const SBool  s2325 = sbv_bv_extract_u8_0_0_u1(s2324);+  const SBool  s2326 = false != s2325;+  const SWord8 s2327 = s2326 ? s2092 : s2093;+  const SBool  s2328 = sbv_bv_extract_u8_0_0_u1(s2327);+  const SBool  s2329 = false != s2328;+  const SBool  s2330 = !s2329;+  const SBool  s2331 = s2321 < s1;+  const SBool  s2332 = s2321 < s2082;+  const SBool  s2333 = s2331 || s2332;+  const SWord8 s2334 = sbv_bv_u8_rotr(s2321, 1);+  const SWord8 s2335 = 128 | s2334;+  const SWord8 s2336 = 127 & s2334;+  const SWord8 s2337 = s2333 ? s2335 : s2336;+  const SBool  s2338 = sbv_bv_extract_u8_0_0_u1(s2337);+  const SBool  s2339 = false != s2338;+  const SWord8 s2340 = sbv_bv_u8_rotr(s2324, 1);+  const SWord8 s2341 = 128 | s2340;+  const SWord8 s2342 = 127 & s2340;+  const SWord8 s2343 = s2339 ? s2341 : s2342;+  const SBool  s2344 = sbv_bv_extract_u8_0_0_u1(s2343);+  const SBool  s2345 = false != s2344;+  const SWord8 s2346 = sbv_bv_u8_rotr(s2327, 1);+  const SWord8 s2347 = 128 | s2346;+  const SWord8 s2348 = 127 & s2346;+  const SWord8 s2349 = s2345 ? s2347 : s2348;+  const SBool  s2350 = sbv_bv_extract_u8_0_0_u1(s2349);+  const SBool  s2351 = false != s2350;+  const SBool  s2352 = !s2351;+  const SWord8 s2353 = sbv_bv_u8_rotr(s2337, 1);+  const SWord8 s2354 = 128 | s2353;+  const SWord8 s2355 = 127 & s2353;+  const SWord8 s2356 = s2058 ? s2354 : s2355;+  const SWord8 s2357 = sbv_bv_u8_rotr(s2356, 1);+  const SWord8 s2358 = 128 | s2357;+  const SWord8 s2359 = 127 & s2357;+  const SWord8 s2360 = s2077 ? s2358 : s2359;+  const SWord8 s2361 = sbv_bv_u8_rotr(s2360, 1);+  const SWord8 s2362 = 128 | s2361;+  const SWord8 s2363 = 127 & s2361;+  const SWord8 s2364 = s2329 ? s2362 : s2363;+  const SWord8 s2365 = sbv_bv_u8_rotr(s2364, 1);+  const SWord8 s2366 = 128 | s2365;+  const SWord8 s2367 = 127 & s2365;+  const SWord8 s2368 = s2351 ? s2366 : s2367;+  const SWord8 s2369 = sbv_bv_u8_add(s1, s2364);+  const SBool  s2370 = s2369 < s1;+  const SBool  s2371 = s2369 < s2364;+  const SBool  s2372 = s2370 || s2371;+  const SWord8 s2373 = sbv_bv_u8_rotr(s2369, 1);+  const SWord8 s2374 = 128 | s2373;+  const SWord8 s2375 = 127 & s2373;+  const SWord8 s2376 = s2372 ? s2374 : s2375;+  const SWord8 s2377 = s2352 ? s2368 : s2376;+  const SWord8 s2378 = sbv_bv_u8_add(s1, s2360);+  const SBool  s2379 = s2378 < s1;+  const SBool  s2380 = s2378 < s2360;+  const SBool  s2381 = s2379 || s2380;+  const SWord8 s2382 = sbv_bv_u8_rotr(s2378, 1);+  const SWord8 s2383 = 128 | s2382;+  const SWord8 s2384 = 127 & s2382;+  const SWord8 s2385 = s2381 ? s2383 : s2384;+  const SWord8 s2386 = sbv_bv_u8_rotr(s2385, 1);+  const SWord8 s2387 = 128 | s2386;+  const SWord8 s2388 = 127 & s2386;+  const SWord8 s2389 = s2351 ? s2387 : s2388;+  const SWord8 s2390 = sbv_bv_u8_add(s1, s2385);+  const SBool  s2391 = s2390 < s1;+  const SBool  s2392 = s2390 < s2385;+  const SBool  s2393 = s2391 || s2392;+  const SWord8 s2394 = sbv_bv_u8_rotr(s2390, 1);+  const SWord8 s2395 = 128 | s2394;+  const SWord8 s2396 = 127 & s2394;+  const SWord8 s2397 = s2393 ? s2395 : s2396;+  const SWord8 s2398 = s2352 ? s2389 : s2397;+  const SWord8 s2399 = s2330 ? s2377 : s2398;+  const SWord8 s2400 = sbv_bv_u8_add(s1, s2356);+  const SBool  s2401 = s2400 < s1;+  const SBool  s2402 = s2400 < s2356;+  const SBool  s2403 = s2401 || s2402;+  const SWord8 s2404 = sbv_bv_u8_rotr(s2400, 1);+  const SWord8 s2405 = 128 | s2404;+  const SWord8 s2406 = 127 & s2404;+  const SWord8 s2407 = s2403 ? s2405 : s2406;+  const SWord8 s2408 = sbv_bv_u8_rotr(s2407, 1);+  const SWord8 s2409 = 128 | s2408;+  const SWord8 s2410 = 127 & s2408;+  const SWord8 s2411 = s2329 ? s2409 : s2410;+  const SWord8 s2412 = sbv_bv_u8_rotr(s2411, 1);+  const SWord8 s2413 = 128 | s2412;+  const SWord8 s2414 = 127 & s2412;+  const SWord8 s2415 = s2351 ? s2413 : s2414;+  const SWord8 s2416 = sbv_bv_u8_add(s1, s2411);+  const SBool  s2417 = s2416 < s1;+  const SBool  s2418 = s2416 < s2411;+  const SBool  s2419 = s2417 || s2418;+  const SWord8 s2420 = sbv_bv_u8_rotr(s2416, 1);+  const SWord8 s2421 = 128 | s2420;+  const SWord8 s2422 = 127 & s2420;+  const SWord8 s2423 = s2419 ? s2421 : s2422;+  const SWord8 s2424 = s2352 ? s2415 : s2423;+  const SWord8 s2425 = sbv_bv_u8_add(s1, s2407);+  const SBool  s2426 = s2425 < s1;+  const SBool  s2427 = s2425 < s2407;+  const SBool  s2428 = s2426 || s2427;+  const SWord8 s2429 = sbv_bv_u8_rotr(s2425, 1);+  const SWord8 s2430 = 128 | s2429;+  const SWord8 s2431 = 127 & s2429;+  const SWord8 s2432 = s2428 ? s2430 : s2431;+  const SWord8 s2433 = sbv_bv_u8_rotr(s2432, 1);+  const SWord8 s2434 = 128 | s2433;+  const SWord8 s2435 = 127 & s2433;+  const SWord8 s2436 = s2351 ? s2434 : s2435;+  const SWord8 s2437 = sbv_bv_u8_add(s1, s2432);+  const SBool  s2438 = s2437 < s1;+  const SBool  s2439 = s2437 < s2432;+  const SBool  s2440 = s2438 || s2439;+  const SWord8 s2441 = sbv_bv_u8_rotr(s2437, 1);+  const SWord8 s2442 = 128 | s2441;+  const SWord8 s2443 = 127 & s2441;+  const SWord8 s2444 = s2440 ? s2442 : s2443;+  const SWord8 s2445 = s2352 ? s2436 : s2444;+  const SWord8 s2446 = s2330 ? s2424 : s2445;+  const SWord8 s2447 = s2078 ? s2399 : s2446;+  const SWord8 s2448 = sbv_bv_u8_add(s1, s2337);+  const SBool  s2449 = sbv_bv_extract_u8_0_0_u1(s2448);+  const SBool  s2450 = false != s2449;+  const SWord8 s2451 = s2450 ? s2341 : s2342;+  const SBool  s2452 = sbv_bv_extract_u8_0_0_u1(s2451);+  const SBool  s2453 = false != s2452;+  const SWord8 s2454 = s2453 ? s2347 : s2348;+  const SBool  s2455 = sbv_bv_extract_u8_0_0_u1(s2454);+  const SBool  s2456 = false != s2455;+  const SBool  s2457 = !s2456;+  const SBool  s2458 = s2448 < s1;+  const SBool  s2459 = s2448 < s2337;+  const SBool  s2460 = s2458 || s2459;+  const SWord8 s2461 = sbv_bv_u8_rotr(s2448, 1);+  const SWord8 s2462 = 128 | s2461;+  const SWord8 s2463 = 127 & s2461;+  const SWord8 s2464 = s2460 ? s2462 : s2463;+  const SWord8 s2465 = sbv_bv_u8_rotr(s2464, 1);+  const SWord8 s2466 = 128 | s2465;+  const SWord8 s2467 = 127 & s2465;+  const SWord8 s2468 = s2077 ? s2466 : s2467;+  const SWord8 s2469 = sbv_bv_u8_rotr(s2468, 1);+  const SWord8 s2470 = 128 | s2469;+  const SWord8 s2471 = 127 & s2469;+  const SWord8 s2472 = s2329 ? s2470 : s2471;+  const SWord8 s2473 = sbv_bv_u8_rotr(s2472, 1);+  const SWord8 s2474 = 128 | s2473;+  const SWord8 s2475 = 127 & s2473;+  const SWord8 s2476 = s2456 ? s2474 : s2475;+  const SWord8 s2477 = sbv_bv_u8_add(s1, s2472);+  const SBool  s2478 = s2477 < s1;+  const SBool  s2479 = s2477 < s2472;+  const SBool  s2480 = s2478 || s2479;+  const SWord8 s2481 = sbv_bv_u8_rotr(s2477, 1);+  const SWord8 s2482 = 128 | s2481;+  const SWord8 s2483 = 127 & s2481;+  const SWord8 s2484 = s2480 ? s2482 : s2483;+  const SWord8 s2485 = s2457 ? s2476 : s2484;+  const SWord8 s2486 = sbv_bv_u8_add(s1, s2468);+  const SBool  s2487 = s2486 < s1;+  const SBool  s2488 = s2486 < s2468;+  const SBool  s2489 = s2487 || s2488;+  const SWord8 s2490 = sbv_bv_u8_rotr(s2486, 1);+  const SWord8 s2491 = 128 | s2490;+  const SWord8 s2492 = 127 & s2490;+  const SWord8 s2493 = s2489 ? s2491 : s2492;+  const SWord8 s2494 = sbv_bv_u8_rotr(s2493, 1);+  const SWord8 s2495 = 128 | s2494;+  const SWord8 s2496 = 127 & s2494;+  const SWord8 s2497 = s2456 ? s2495 : s2496;+  const SWord8 s2498 = sbv_bv_u8_add(s1, s2493);+  const SBool  s2499 = s2498 < s1;+  const SBool  s2500 = s2498 < s2493;+  const SBool  s2501 = s2499 || s2500;+  const SWord8 s2502 = sbv_bv_u8_rotr(s2498, 1);+  const SWord8 s2503 = 128 | s2502;+  const SWord8 s2504 = 127 & s2502;+  const SWord8 s2505 = s2501 ? s2503 : s2504;+  const SWord8 s2506 = s2457 ? s2497 : s2505;+  const SWord8 s2507 = s2330 ? s2485 : s2506;+  const SWord8 s2508 = sbv_bv_u8_add(s1, s2464);+  const SBool  s2509 = s2508 < s1;+  const SBool  s2510 = s2508 < s2464;+  const SBool  s2511 = s2509 || s2510;+  const SWord8 s2512 = sbv_bv_u8_rotr(s2508, 1);+  const SWord8 s2513 = 128 | s2512;+  const SWord8 s2514 = 127 & s2512;+  const SWord8 s2515 = s2511 ? s2513 : s2514;+  const SWord8 s2516 = sbv_bv_u8_rotr(s2515, 1);+  const SWord8 s2517 = 128 | s2516;+  const SWord8 s2518 = 127 & s2516;+  const SWord8 s2519 = s2329 ? s2517 : s2518;+  const SWord8 s2520 = sbv_bv_u8_rotr(s2519, 1);+  const SWord8 s2521 = 128 | s2520;+  const SWord8 s2522 = 127 & s2520;+  const SWord8 s2523 = s2456 ? s2521 : s2522;+  const SWord8 s2524 = sbv_bv_u8_add(s1, s2519);+  const SBool  s2525 = s2524 < s1;+  const SBool  s2526 = s2524 < s2519;+  const SBool  s2527 = s2525 || s2526;+  const SWord8 s2528 = sbv_bv_u8_rotr(s2524, 1);+  const SWord8 s2529 = 128 | s2528;+  const SWord8 s2530 = 127 & s2528;+  const SWord8 s2531 = s2527 ? s2529 : s2530;+  const SWord8 s2532 = s2457 ? s2523 : s2531;+  const SWord8 s2533 = sbv_bv_u8_add(s1, s2515);+  const SBool  s2534 = s2533 < s1;+  const SBool  s2535 = s2533 < s2515;+  const SBool  s2536 = s2534 || s2535;+  const SWord8 s2537 = sbv_bv_u8_rotr(s2533, 1);+  const SWord8 s2538 = 128 | s2537;+  const SWord8 s2539 = 127 & s2537;+  const SWord8 s2540 = s2536 ? s2538 : s2539;+  const SWord8 s2541 = sbv_bv_u8_rotr(s2540, 1);+  const SWord8 s2542 = 128 | s2541;+  const SWord8 s2543 = 127 & s2541;+  const SWord8 s2544 = s2456 ? s2542 : s2543;+  const SWord8 s2545 = sbv_bv_u8_add(s1, s2540);+  const SBool  s2546 = s2545 < s1;+  const SBool  s2547 = s2545 < s2540;+  const SBool  s2548 = s2546 || s2547;+  const SWord8 s2549 = sbv_bv_u8_rotr(s2545, 1);+  const SWord8 s2550 = 128 | s2549;+  const SWord8 s2551 = 127 & s2549;+  const SWord8 s2552 = s2548 ? s2550 : s2551;+  const SWord8 s2553 = s2457 ? s2544 : s2552;+  const SWord8 s2554 = s2330 ? s2532 : s2553;+  const SWord8 s2555 = s2078 ? s2507 : s2554;+  const SWord8 s2556 = s2059 ? s2447 : s2555;+  const SWord8 s2557 = s2042 ? s2320 : s2556;+  const SWord8 s2558 = sbv_bv_u8_add(s1, s2063);+  const SBool  s2559 = sbv_bv_extract_u8_0_0_u1(s2558);+  const SBool  s2560 = false != s2559;+  const SWord8 s2561 = s2560 ? s2067 : s2068;+  const SBool  s2562 = sbv_bv_extract_u8_0_0_u1(s2561);+  const SBool  s2563 = false != s2562;+  const SWord8 s2564 = s2563 ? s2073 : s2074;+  const SBool  s2565 = sbv_bv_extract_u8_0_0_u1(s2564);+  const SBool  s2566 = false != s2565;+  const SBool  s2567 = !s2566;+  const SBool  s2568 = s2558 < s1;+  const SBool  s2569 = s2558 < s2063;+  const SBool  s2570 = s2568 || s2569;+  const SWord8 s2571 = sbv_bv_u8_rotr(s2558, 1);+  const SWord8 s2572 = 128 | s2571;+  const SWord8 s2573 = 127 & s2571;+  const SWord8 s2574 = s2570 ? s2572 : s2573;+  const SBool  s2575 = sbv_bv_extract_u8_0_0_u1(s2574);+  const SBool  s2576 = false != s2575;+  const SWord8 s2577 = sbv_bv_u8_rotr(s2561, 1);+  const SWord8 s2578 = 128 | s2577;+  const SWord8 s2579 = 127 & s2577;+  const SWord8 s2580 = s2576 ? s2578 : s2579;+  const SBool  s2581 = sbv_bv_extract_u8_0_0_u1(s2580);+  const SBool  s2582 = false != s2581;+  const SWord8 s2583 = sbv_bv_u8_rotr(s2564, 1);+  const SWord8 s2584 = 128 | s2583;+  const SWord8 s2585 = 127 & s2583;+  const SWord8 s2586 = s2582 ? s2584 : s2585;+  const SBool  s2587 = sbv_bv_extract_u8_0_0_u1(s2586);+  const SBool  s2588 = false != s2587;+  const SBool  s2589 = !s2588;+  const SWord8 s2590 = sbv_bv_u8_rotr(s2574, 1);+  const SWord8 s2591 = 128 | s2590;+  const SWord8 s2592 = 127 & s2590;+  const SWord8 s2593 = s2041 ? s2591 : s2592;+  const SBool  s2594 = sbv_bv_extract_u8_0_0_u1(s2593);+  const SBool  s2595 = false != s2594;+  const SWord8 s2596 = sbv_bv_u8_rotr(s2580, 1);+  const SWord8 s2597 = 128 | s2596;+  const SWord8 s2598 = 127 & s2596;+  const SWord8 s2599 = s2595 ? s2597 : s2598;+  const SBool  s2600 = sbv_bv_extract_u8_0_0_u1(s2599);+  const SBool  s2601 = false != s2600;+  const SWord8 s2602 = sbv_bv_u8_rotr(s2586, 1);+  const SWord8 s2603 = 128 | s2602;+  const SWord8 s2604 = 127 & s2602;+  const SWord8 s2605 = s2601 ? s2603 : s2604;+  const SBool  s2606 = sbv_bv_extract_u8_0_0_u1(s2605);+  const SBool  s2607 = false != s2606;+  const SBool  s2608 = !s2607;+  const SWord8 s2609 = sbv_bv_u8_rotr(s2593, 1);+  const SWord8 s2610 = 128 | s2609;+  const SWord8 s2611 = 127 & s2609;+  const SWord8 s2612 = s2058 ? s2610 : s2611;+  const SWord8 s2613 = sbv_bv_u8_rotr(s2612, 1);+  const SWord8 s2614 = 128 | s2613;+  const SWord8 s2615 = 127 & s2613;+  const SWord8 s2616 = s2566 ? s2614 : s2615;+  const SWord8 s2617 = sbv_bv_u8_rotr(s2616, 1);+  const SWord8 s2618 = 128 | s2617;+  const SWord8 s2619 = 127 & s2617;+  const SWord8 s2620 = s2588 ? s2618 : s2619;+  const SWord8 s2621 = sbv_bv_u8_rotr(s2620, 1);+  const SWord8 s2622 = 128 | s2621;+  const SWord8 s2623 = 127 & s2621;+  const SWord8 s2624 = s2607 ? s2622 : s2623;+  const SWord8 s2625 = sbv_bv_u8_add(s1, s2620);+  const SBool  s2626 = s2625 < s1;+  const SBool  s2627 = s2625 < s2620;+  const SBool  s2628 = s2626 || s2627;+  const SWord8 s2629 = sbv_bv_u8_rotr(s2625, 1);+  const SWord8 s2630 = 128 | s2629;+  const SWord8 s2631 = 127 & s2629;+  const SWord8 s2632 = s2628 ? s2630 : s2631;+  const SWord8 s2633 = s2608 ? s2624 : s2632;+  const SWord8 s2634 = sbv_bv_u8_add(s1, s2616);+  const SBool  s2635 = s2634 < s1;+  const SBool  s2636 = s2634 < s2616;+  const SBool  s2637 = s2635 || s2636;+  const SWord8 s2638 = sbv_bv_u8_rotr(s2634, 1);+  const SWord8 s2639 = 128 | s2638;+  const SWord8 s2640 = 127 & s2638;+  const SWord8 s2641 = s2637 ? s2639 : s2640;+  const SWord8 s2642 = sbv_bv_u8_rotr(s2641, 1);+  const SWord8 s2643 = 128 | s2642;+  const SWord8 s2644 = 127 & s2642;+  const SWord8 s2645 = s2607 ? s2643 : s2644;+  const SWord8 s2646 = sbv_bv_u8_add(s1, s2641);+  const SBool  s2647 = s2646 < s1;+  const SBool  s2648 = s2646 < s2641;+  const SBool  s2649 = s2647 || s2648;+  const SWord8 s2650 = sbv_bv_u8_rotr(s2646, 1);+  const SWord8 s2651 = 128 | s2650;+  const SWord8 s2652 = 127 & s2650;+  const SWord8 s2653 = s2649 ? s2651 : s2652;+  const SWord8 s2654 = s2608 ? s2645 : s2653;+  const SWord8 s2655 = s2589 ? s2633 : s2654;+  const SWord8 s2656 = sbv_bv_u8_add(s1, s2612);+  const SBool  s2657 = s2656 < s1;+  const SBool  s2658 = s2656 < s2612;+  const SBool  s2659 = s2657 || s2658;+  const SWord8 s2660 = sbv_bv_u8_rotr(s2656, 1);+  const SWord8 s2661 = 128 | s2660;+  const SWord8 s2662 = 127 & s2660;+  const SWord8 s2663 = s2659 ? s2661 : s2662;+  const SWord8 s2664 = sbv_bv_u8_rotr(s2663, 1);+  const SWord8 s2665 = 128 | s2664;+  const SWord8 s2666 = 127 & s2664;+  const SWord8 s2667 = s2588 ? s2665 : s2666;+  const SWord8 s2668 = sbv_bv_u8_rotr(s2667, 1);+  const SWord8 s2669 = 128 | s2668;+  const SWord8 s2670 = 127 & s2668;+  const SWord8 s2671 = s2607 ? s2669 : s2670;+  const SWord8 s2672 = sbv_bv_u8_add(s1, s2667);+  const SBool  s2673 = s2672 < s1;+  const SBool  s2674 = s2672 < s2667;+  const SBool  s2675 = s2673 || s2674;+  const SWord8 s2676 = sbv_bv_u8_rotr(s2672, 1);+  const SWord8 s2677 = 128 | s2676;+  const SWord8 s2678 = 127 & s2676;+  const SWord8 s2679 = s2675 ? s2677 : s2678;+  const SWord8 s2680 = s2608 ? s2671 : s2679;+  const SWord8 s2681 = sbv_bv_u8_add(s1, s2663);+  const SBool  s2682 = s2681 < s1;+  const SBool  s2683 = s2681 < s2663;+  const SBool  s2684 = s2682 || s2683;+  const SWord8 s2685 = sbv_bv_u8_rotr(s2681, 1);+  const SWord8 s2686 = 128 | s2685;+  const SWord8 s2687 = 127 & s2685;+  const SWord8 s2688 = s2684 ? s2686 : s2687;+  const SWord8 s2689 = sbv_bv_u8_rotr(s2688, 1);+  const SWord8 s2690 = 128 | s2689;+  const SWord8 s2691 = 127 & s2689;+  const SWord8 s2692 = s2607 ? s2690 : s2691;+  const SWord8 s2693 = sbv_bv_u8_add(s1, s2688);+  const SBool  s2694 = s2693 < s1;+  const SBool  s2695 = s2693 < s2688;+  const SBool  s2696 = s2694 || s2695;+  const SWord8 s2697 = sbv_bv_u8_rotr(s2693, 1);+  const SWord8 s2698 = 128 | s2697;+  const SWord8 s2699 = 127 & s2697;+  const SWord8 s2700 = s2696 ? s2698 : s2699;+  const SWord8 s2701 = s2608 ? s2692 : s2700;+  const SWord8 s2702 = s2589 ? s2680 : s2701;+  const SWord8 s2703 = s2567 ? s2655 : s2702;+  const SWord8 s2704 = sbv_bv_u8_add(s1, s2593);+  const SBool  s2705 = sbv_bv_extract_u8_0_0_u1(s2704);+  const SBool  s2706 = false != s2705;+  const SWord8 s2707 = s2706 ? s2597 : s2598;+  const SBool  s2708 = sbv_bv_extract_u8_0_0_u1(s2707);+  const SBool  s2709 = false != s2708;+  const SWord8 s2710 = s2709 ? s2603 : s2604;+  const SBool  s2711 = sbv_bv_extract_u8_0_0_u1(s2710);+  const SBool  s2712 = false != s2711;+  const SBool  s2713 = !s2712;+  const SBool  s2714 = s2704 < s1;+  const SBool  s2715 = s2704 < s2593;+  const SBool  s2716 = s2714 || s2715;+  const SWord8 s2717 = sbv_bv_u8_rotr(s2704, 1);+  const SWord8 s2718 = 128 | s2717;+  const SWord8 s2719 = 127 & s2717;+  const SWord8 s2720 = s2716 ? s2718 : s2719;+  const SWord8 s2721 = sbv_bv_u8_rotr(s2720, 1);+  const SWord8 s2722 = 128 | s2721;+  const SWord8 s2723 = 127 & s2721;+  const SWord8 s2724 = s2566 ? s2722 : s2723;+  const SWord8 s2725 = sbv_bv_u8_rotr(s2724, 1);+  const SWord8 s2726 = 128 | s2725;+  const SWord8 s2727 = 127 & s2725;+  const SWord8 s2728 = s2588 ? s2726 : s2727;+  const SWord8 s2729 = sbv_bv_u8_rotr(s2728, 1);+  const SWord8 s2730 = 128 | s2729;+  const SWord8 s2731 = 127 & s2729;+  const SWord8 s2732 = s2712 ? s2730 : s2731;+  const SWord8 s2733 = sbv_bv_u8_add(s1, s2728);+  const SBool  s2734 = s2733 < s1;+  const SBool  s2735 = s2733 < s2728;+  const SBool  s2736 = s2734 || s2735;+  const SWord8 s2737 = sbv_bv_u8_rotr(s2733, 1);+  const SWord8 s2738 = 128 | s2737;+  const SWord8 s2739 = 127 & s2737;+  const SWord8 s2740 = s2736 ? s2738 : s2739;+  const SWord8 s2741 = s2713 ? s2732 : s2740;+  const SWord8 s2742 = sbv_bv_u8_add(s1, s2724);+  const SBool  s2743 = s2742 < s1;+  const SBool  s2744 = s2742 < s2724;+  const SBool  s2745 = s2743 || s2744;+  const SWord8 s2746 = sbv_bv_u8_rotr(s2742, 1);+  const SWord8 s2747 = 128 | s2746;+  const SWord8 s2748 = 127 & s2746;+  const SWord8 s2749 = s2745 ? s2747 : s2748;+  const SWord8 s2750 = sbv_bv_u8_rotr(s2749, 1);+  const SWord8 s2751 = 128 | s2750;+  const SWord8 s2752 = 127 & s2750;+  const SWord8 s2753 = s2712 ? s2751 : s2752;+  const SWord8 s2754 = sbv_bv_u8_add(s1, s2749);+  const SBool  s2755 = s2754 < s1;+  const SBool  s2756 = s2754 < s2749;+  const SBool  s2757 = s2755 || s2756;+  const SWord8 s2758 = sbv_bv_u8_rotr(s2754, 1);+  const SWord8 s2759 = 128 | s2758;+  const SWord8 s2760 = 127 & s2758;+  const SWord8 s2761 = s2757 ? s2759 : s2760;+  const SWord8 s2762 = s2713 ? s2753 : s2761;+  const SWord8 s2763 = s2589 ? s2741 : s2762;+  const SWord8 s2764 = sbv_bv_u8_add(s1, s2720);+  const SBool  s2765 = s2764 < s1;+  const SBool  s2766 = s2764 < s2720;+  const SBool  s2767 = s2765 || s2766;+  const SWord8 s2768 = sbv_bv_u8_rotr(s2764, 1);+  const SWord8 s2769 = 128 | s2768;+  const SWord8 s2770 = 127 & s2768;+  const SWord8 s2771 = s2767 ? s2769 : s2770;+  const SWord8 s2772 = sbv_bv_u8_rotr(s2771, 1);+  const SWord8 s2773 = 128 | s2772;+  const SWord8 s2774 = 127 & s2772;+  const SWord8 s2775 = s2588 ? s2773 : s2774;+  const SWord8 s2776 = sbv_bv_u8_rotr(s2775, 1);+  const SWord8 s2777 = 128 | s2776;+  const SWord8 s2778 = 127 & s2776;+  const SWord8 s2779 = s2712 ? s2777 : s2778;+  const SWord8 s2780 = sbv_bv_u8_add(s1, s2775);+  const SBool  s2781 = s2780 < s1;+  const SBool  s2782 = s2780 < s2775;+  const SBool  s2783 = s2781 || s2782;+  const SWord8 s2784 = sbv_bv_u8_rotr(s2780, 1);+  const SWord8 s2785 = 128 | s2784;+  const SWord8 s2786 = 127 & s2784;+  const SWord8 s2787 = s2783 ? s2785 : s2786;+  const SWord8 s2788 = s2713 ? s2779 : s2787;+  const SWord8 s2789 = sbv_bv_u8_add(s1, s2771);+  const SBool  s2790 = s2789 < s1;+  const SBool  s2791 = s2789 < s2771;+  const SBool  s2792 = s2790 || s2791;+  const SWord8 s2793 = sbv_bv_u8_rotr(s2789, 1);+  const SWord8 s2794 = 128 | s2793;+  const SWord8 s2795 = 127 & s2793;+  const SWord8 s2796 = s2792 ? s2794 : s2795;+  const SWord8 s2797 = sbv_bv_u8_rotr(s2796, 1);+  const SWord8 s2798 = 128 | s2797;+  const SWord8 s2799 = 127 & s2797;+  const SWord8 s2800 = s2712 ? s2798 : s2799;+  const SWord8 s2801 = sbv_bv_u8_add(s1, s2796);+  const SBool  s2802 = s2801 < s1;+  const SBool  s2803 = s2801 < s2796;+  const SBool  s2804 = s2802 || s2803;+  const SWord8 s2805 = sbv_bv_u8_rotr(s2801, 1);+  const SWord8 s2806 = 128 | s2805;+  const SWord8 s2807 = 127 & s2805;+  const SWord8 s2808 = s2804 ? s2806 : s2807;+  const SWord8 s2809 = s2713 ? s2800 : s2808;+  const SWord8 s2810 = s2589 ? s2788 : s2809;+  const SWord8 s2811 = s2567 ? s2763 : s2810;+  const SWord8 s2812 = s2059 ? s2703 : s2811;+  const SWord8 s2813 = sbv_bv_u8_add(s1, s2574);+  const SBool  s2814 = sbv_bv_extract_u8_0_0_u1(s2813);+  const SBool  s2815 = false != s2814;+  const SWord8 s2816 = s2815 ? s2578 : s2579;+  const SBool  s2817 = sbv_bv_extract_u8_0_0_u1(s2816);+  const SBool  s2818 = false != s2817;+  const SWord8 s2819 = s2818 ? s2584 : s2585;+  const SBool  s2820 = sbv_bv_extract_u8_0_0_u1(s2819);+  const SBool  s2821 = false != s2820;+  const SBool  s2822 = !s2821;+  const SBool  s2823 = s2813 < s1;+  const SBool  s2824 = s2813 < s2574;+  const SBool  s2825 = s2823 || s2824;+  const SWord8 s2826 = sbv_bv_u8_rotr(s2813, 1);+  const SWord8 s2827 = 128 | s2826;+  const SWord8 s2828 = 127 & s2826;+  const SWord8 s2829 = s2825 ? s2827 : s2828;+  const SBool  s2830 = sbv_bv_extract_u8_0_0_u1(s2829);+  const SBool  s2831 = false != s2830;+  const SWord8 s2832 = sbv_bv_u8_rotr(s2816, 1);+  const SWord8 s2833 = 128 | s2832;+  const SWord8 s2834 = 127 & s2832;+  const SWord8 s2835 = s2831 ? s2833 : s2834;+  const SBool  s2836 = sbv_bv_extract_u8_0_0_u1(s2835);+  const SBool  s2837 = false != s2836;+  const SWord8 s2838 = sbv_bv_u8_rotr(s2819, 1);+  const SWord8 s2839 = 128 | s2838;+  const SWord8 s2840 = 127 & s2838;+  const SWord8 s2841 = s2837 ? s2839 : s2840;+  const SBool  s2842 = sbv_bv_extract_u8_0_0_u1(s2841);+  const SBool  s2843 = false != s2842;+  const SBool  s2844 = !s2843;+  const SWord8 s2845 = sbv_bv_u8_rotr(s2829, 1);+  const SWord8 s2846 = 128 | s2845;+  const SWord8 s2847 = 127 & s2845;+  const SWord8 s2848 = s2058 ? s2846 : s2847;+  const SWord8 s2849 = sbv_bv_u8_rotr(s2848, 1);+  const SWord8 s2850 = 128 | s2849;+  const SWord8 s2851 = 127 & s2849;+  const SWord8 s2852 = s2566 ? s2850 : s2851;+  const SWord8 s2853 = sbv_bv_u8_rotr(s2852, 1);+  const SWord8 s2854 = 128 | s2853;+  const SWord8 s2855 = 127 & s2853;+  const SWord8 s2856 = s2821 ? s2854 : s2855;+  const SWord8 s2857 = sbv_bv_u8_rotr(s2856, 1);+  const SWord8 s2858 = 128 | s2857;+  const SWord8 s2859 = 127 & s2857;+  const SWord8 s2860 = s2843 ? s2858 : s2859;+  const SWord8 s2861 = sbv_bv_u8_add(s1, s2856);+  const SBool  s2862 = s2861 < s1;+  const SBool  s2863 = s2861 < s2856;+  const SBool  s2864 = s2862 || s2863;+  const SWord8 s2865 = sbv_bv_u8_rotr(s2861, 1);+  const SWord8 s2866 = 128 | s2865;+  const SWord8 s2867 = 127 & s2865;+  const SWord8 s2868 = s2864 ? s2866 : s2867;+  const SWord8 s2869 = s2844 ? s2860 : s2868;+  const SWord8 s2870 = sbv_bv_u8_add(s1, s2852);+  const SBool  s2871 = s2870 < s1;+  const SBool  s2872 = s2870 < s2852;+  const SBool  s2873 = s2871 || s2872;+  const SWord8 s2874 = sbv_bv_u8_rotr(s2870, 1);+  const SWord8 s2875 = 128 | s2874;+  const SWord8 s2876 = 127 & s2874;+  const SWord8 s2877 = s2873 ? s2875 : s2876;+  const SWord8 s2878 = sbv_bv_u8_rotr(s2877, 1);+  const SWord8 s2879 = 128 | s2878;+  const SWord8 s2880 = 127 & s2878;+  const SWord8 s2881 = s2843 ? s2879 : s2880;+  const SWord8 s2882 = sbv_bv_u8_add(s1, s2877);+  const SBool  s2883 = s2882 < s1;+  const SBool  s2884 = s2882 < s2877;+  const SBool  s2885 = s2883 || s2884;+  const SWord8 s2886 = sbv_bv_u8_rotr(s2882, 1);+  const SWord8 s2887 = 128 | s2886;+  const SWord8 s2888 = 127 & s2886;+  const SWord8 s2889 = s2885 ? s2887 : s2888;+  const SWord8 s2890 = s2844 ? s2881 : s2889;+  const SWord8 s2891 = s2822 ? s2869 : s2890;+  const SWord8 s2892 = sbv_bv_u8_add(s1, s2848);+  const SBool  s2893 = s2892 < s1;+  const SBool  s2894 = s2892 < s2848;+  const SBool  s2895 = s2893 || s2894;+  const SWord8 s2896 = sbv_bv_u8_rotr(s2892, 1);+  const SWord8 s2897 = 128 | s2896;+  const SWord8 s2898 = 127 & s2896;+  const SWord8 s2899 = s2895 ? s2897 : s2898;+  const SWord8 s2900 = sbv_bv_u8_rotr(s2899, 1);+  const SWord8 s2901 = 128 | s2900;+  const SWord8 s2902 = 127 & s2900;+  const SWord8 s2903 = s2821 ? s2901 : s2902;+  const SWord8 s2904 = sbv_bv_u8_rotr(s2903, 1);+  const SWord8 s2905 = 128 | s2904;+  const SWord8 s2906 = 127 & s2904;+  const SWord8 s2907 = s2843 ? s2905 : s2906;+  const SWord8 s2908 = sbv_bv_u8_add(s1, s2903);+  const SBool  s2909 = s2908 < s1;+  const SBool  s2910 = s2908 < s2903;+  const SBool  s2911 = s2909 || s2910;+  const SWord8 s2912 = sbv_bv_u8_rotr(s2908, 1);+  const SWord8 s2913 = 128 | s2912;+  const SWord8 s2914 = 127 & s2912;+  const SWord8 s2915 = s2911 ? s2913 : s2914;+  const SWord8 s2916 = s2844 ? s2907 : s2915;+  const SWord8 s2917 = sbv_bv_u8_add(s1, s2899);+  const SBool  s2918 = s2917 < s1;+  const SBool  s2919 = s2917 < s2899;+  const SBool  s2920 = s2918 || s2919;+  const SWord8 s2921 = sbv_bv_u8_rotr(s2917, 1);+  const SWord8 s2922 = 128 | s2921;+  const SWord8 s2923 = 127 & s2921;+  const SWord8 s2924 = s2920 ? s2922 : s2923;+  const SWord8 s2925 = sbv_bv_u8_rotr(s2924, 1);+  const SWord8 s2926 = 128 | s2925;+  const SWord8 s2927 = 127 & s2925;+  const SWord8 s2928 = s2843 ? s2926 : s2927;+  const SWord8 s2929 = sbv_bv_u8_add(s1, s2924);+  const SBool  s2930 = s2929 < s1;+  const SBool  s2931 = s2929 < s2924;+  const SBool  s2932 = s2930 || s2931;+  const SWord8 s2933 = sbv_bv_u8_rotr(s2929, 1);+  const SWord8 s2934 = 128 | s2933;+  const SWord8 s2935 = 127 & s2933;+  const SWord8 s2936 = s2932 ? s2934 : s2935;+  const SWord8 s2937 = s2844 ? s2928 : s2936;+  const SWord8 s2938 = s2822 ? s2916 : s2937;+  const SWord8 s2939 = s2567 ? s2891 : s2938;+  const SWord8 s2940 = sbv_bv_u8_add(s1, s2829);+  const SBool  s2941 = sbv_bv_extract_u8_0_0_u1(s2940);+  const SBool  s2942 = false != s2941;+  const SWord8 s2943 = s2942 ? s2833 : s2834;+  const SBool  s2944 = sbv_bv_extract_u8_0_0_u1(s2943);+  const SBool  s2945 = false != s2944;+  const SWord8 s2946 = s2945 ? s2839 : s2840;+  const SBool  s2947 = sbv_bv_extract_u8_0_0_u1(s2946);+  const SBool  s2948 = false != s2947;+  const SBool  s2949 = !s2948;+  const SBool  s2950 = s2940 < s1;+  const SBool  s2951 = s2940 < s2829;+  const SBool  s2952 = s2950 || s2951;+  const SWord8 s2953 = sbv_bv_u8_rotr(s2940, 1);+  const SWord8 s2954 = 128 | s2953;+  const SWord8 s2955 = 127 & s2953;+  const SWord8 s2956 = s2952 ? s2954 : s2955;+  const SWord8 s2957 = sbv_bv_u8_rotr(s2956, 1);+  const SWord8 s2958 = 128 | s2957;+  const SWord8 s2959 = 127 & s2957;+  const SWord8 s2960 = s2566 ? s2958 : s2959;+  const SWord8 s2961 = sbv_bv_u8_rotr(s2960, 1);+  const SWord8 s2962 = 128 | s2961;+  const SWord8 s2963 = 127 & s2961;+  const SWord8 s2964 = s2821 ? s2962 : s2963;+  const SWord8 s2965 = sbv_bv_u8_rotr(s2964, 1);+  const SWord8 s2966 = 128 | s2965;+  const SWord8 s2967 = 127 & s2965;+  const SWord8 s2968 = s2948 ? s2966 : s2967;+  const SWord8 s2969 = sbv_bv_u8_add(s1, s2964);+  const SBool  s2970 = s2969 < s1;+  const SBool  s2971 = s2969 < s2964;+  const SBool  s2972 = s2970 || s2971;+  const SWord8 s2973 = sbv_bv_u8_rotr(s2969, 1);+  const SWord8 s2974 = 128 | s2973;+  const SWord8 s2975 = 127 & s2973;+  const SWord8 s2976 = s2972 ? s2974 : s2975;+  const SWord8 s2977 = s2949 ? s2968 : s2976;+  const SWord8 s2978 = sbv_bv_u8_add(s1, s2960);+  const SBool  s2979 = s2978 < s1;+  const SBool  s2980 = s2978 < s2960;+  const SBool  s2981 = s2979 || s2980;+  const SWord8 s2982 = sbv_bv_u8_rotr(s2978, 1);+  const SWord8 s2983 = 128 | s2982;+  const SWord8 s2984 = 127 & s2982;+  const SWord8 s2985 = s2981 ? s2983 : s2984;+  const SWord8 s2986 = sbv_bv_u8_rotr(s2985, 1);+  const SWord8 s2987 = 128 | s2986;+  const SWord8 s2988 = 127 & s2986;+  const SWord8 s2989 = s2948 ? s2987 : s2988;+  const SWord8 s2990 = sbv_bv_u8_add(s1, s2985);+  const SBool  s2991 = s2990 < s1;+  const SBool  s2992 = s2990 < s2985;+  const SBool  s2993 = s2991 || s2992;+  const SWord8 s2994 = sbv_bv_u8_rotr(s2990, 1);+  const SWord8 s2995 = 128 | s2994;+  const SWord8 s2996 = 127 & s2994;+  const SWord8 s2997 = s2993 ? s2995 : s2996;+  const SWord8 s2998 = s2949 ? s2989 : s2997;+  const SWord8 s2999 = s2822 ? s2977 : s2998;+  const SWord8 s3000 = sbv_bv_u8_add(s1, s2956);+  const SBool  s3001 = s3000 < s1;+  const SBool  s3002 = s3000 < s2956;+  const SBool  s3003 = s3001 || s3002;+  const SWord8 s3004 = sbv_bv_u8_rotr(s3000, 1);+  const SWord8 s3005 = 128 | s3004;+  const SWord8 s3006 = 127 & s3004;+  const SWord8 s3007 = s3003 ? s3005 : s3006;+  const SWord8 s3008 = sbv_bv_u8_rotr(s3007, 1);+  const SWord8 s3009 = 128 | s3008;+  const SWord8 s3010 = 127 & s3008;+  const SWord8 s3011 = s2821 ? s3009 : s3010;+  const SWord8 s3012 = sbv_bv_u8_rotr(s3011, 1);+  const SWord8 s3013 = 128 | s3012;+  const SWord8 s3014 = 127 & s3012;+  const SWord8 s3015 = s2948 ? s3013 : s3014;+  const SWord8 s3016 = sbv_bv_u8_add(s1, s3011);+  const SBool  s3017 = s3016 < s1;+  const SBool  s3018 = s3016 < s3011;+  const SBool  s3019 = s3017 || s3018;+  const SWord8 s3020 = sbv_bv_u8_rotr(s3016, 1);+  const SWord8 s3021 = 128 | s3020;+  const SWord8 s3022 = 127 & s3020;+  const SWord8 s3023 = s3019 ? s3021 : s3022;+  const SWord8 s3024 = s2949 ? s3015 : s3023;+  const SWord8 s3025 = sbv_bv_u8_add(s1, s3007);+  const SBool  s3026 = s3025 < s1;+  const SBool  s3027 = s3025 < s3007;+  const SBool  s3028 = s3026 || s3027;+  const SWord8 s3029 = sbv_bv_u8_rotr(s3025, 1);+  const SWord8 s3030 = 128 | s3029;+  const SWord8 s3031 = 127 & s3029;+  const SWord8 s3032 = s3028 ? s3030 : s3031;+  const SWord8 s3033 = sbv_bv_u8_rotr(s3032, 1);+  const SWord8 s3034 = 128 | s3033;+  const SWord8 s3035 = 127 & s3033;+  const SWord8 s3036 = s2948 ? s3034 : s3035;+  const SWord8 s3037 = sbv_bv_u8_add(s1, s3032);+  const SBool  s3038 = s3037 < s1;+  const SBool  s3039 = s3037 < s3032;+  const SBool  s3040 = s3038 || s3039;+  const SWord8 s3041 = sbv_bv_u8_rotr(s3037, 1);+  const SWord8 s3042 = 128 | s3041;+  const SWord8 s3043 = 127 & s3041;+  const SWord8 s3044 = s3040 ? s3042 : s3043;+  const SWord8 s3045 = s2949 ? s3036 : s3044;+  const SWord8 s3046 = s2822 ? s3024 : s3045;+  const SWord8 s3047 = s2567 ? s2999 : s3046;+  const SWord8 s3048 = s2059 ? s2939 : s3047;+  const SWord8 s3049 = s2042 ? s2812 : s3048;+  const SWord8 s3050 = s16 ? s2557 : s3049;+  const SWord8 s3051 = sbv_bv_u8_add(s1, s2044);+  const SBool  s3052 = sbv_bv_extract_u8_0_0_u1(s3051);+  const SBool  s3053 = false != s3052;+  const SWord8 s3054 = s3053 ? s2048 : s2049;+  const SBool  s3055 = sbv_bv_extract_u8_0_0_u1(s3054);+  const SBool  s3056 = false != s3055;+  const SWord8 s3057 = s3056 ? s2054 : s2055;+  const SBool  s3058 = sbv_bv_extract_u8_0_0_u1(s3057);+  const SBool  s3059 = false != s3058;+  const SBool  s3060 = !s3059;+  const SBool  s3061 = s3051 < s1;+  const SBool  s3062 = s3051 < s2044;+  const SBool  s3063 = s3061 || s3062;+  const SWord8 s3064 = sbv_bv_u8_rotr(s3051, 1);+  const SWord8 s3065 = 128 | s3064;+  const SWord8 s3066 = 127 & s3064;+  const SWord8 s3067 = s3063 ? s3065 : s3066;+  const SBool  s3068 = sbv_bv_extract_u8_0_0_u1(s3067);+  const SBool  s3069 = false != s3068;+  const SWord8 s3070 = sbv_bv_u8_rotr(s3054, 1);+  const SWord8 s3071 = 128 | s3070;+  const SWord8 s3072 = 127 & s3070;+  const SWord8 s3073 = s3069 ? s3071 : s3072;+  const SBool  s3074 = sbv_bv_extract_u8_0_0_u1(s3073);+  const SBool  s3075 = false != s3074;+  const SWord8 s3076 = sbv_bv_u8_rotr(s3057, 1);+  const SWord8 s3077 = 128 | s3076;+  const SWord8 s3078 = 127 & s3076;+  const SWord8 s3079 = s3075 ? s3077 : s3078;+  const SBool  s3080 = sbv_bv_extract_u8_0_0_u1(s3079);+  const SBool  s3081 = false != s3080;+  const SBool  s3082 = !s3081;+  const SWord8 s3083 = sbv_bv_u8_rotr(s3067, 1);+  const SWord8 s3084 = 128 | s3083;+  const SWord8 s3085 = 127 & s3083;+  const SWord8 s3086 = s15 ? s3084 : s3085;+  const SBool  s3087 = sbv_bv_extract_u8_0_0_u1(s3086);+  const SBool  s3088 = false != s3087;+  const SWord8 s3089 = sbv_bv_u8_rotr(s3073, 1);+  const SWord8 s3090 = 128 | s3089;+  const SWord8 s3091 = 127 & s3089;+  const SWord8 s3092 = s3088 ? s3090 : s3091;+  const SBool  s3093 = sbv_bv_extract_u8_0_0_u1(s3092);+  const SBool  s3094 = false != s3093;+  const SWord8 s3095 = sbv_bv_u8_rotr(s3079, 1);+  const SWord8 s3096 = 128 | s3095;+  const SWord8 s3097 = 127 & s3095;+  const SWord8 s3098 = s3094 ? s3096 : s3097;+  const SBool  s3099 = sbv_bv_extract_u8_0_0_u1(s3098);+  const SBool  s3100 = false != s3099;+  const SBool  s3101 = !s3100;+  const SWord8 s3102 = sbv_bv_u8_rotr(s3086, 1);+  const SWord8 s3103 = 128 | s3102;+  const SWord8 s3104 = 127 & s3102;+  const SWord8 s3105 = s2041 ? s3103 : s3104;+  const SBool  s3106 = sbv_bv_extract_u8_0_0_u1(s3105);+  const SBool  s3107 = false != s3106;+  const SWord8 s3108 = sbv_bv_u8_rotr(s3092, 1);+  const SWord8 s3109 = 128 | s3108;+  const SWord8 s3110 = 127 & s3108;+  const SWord8 s3111 = s3107 ? s3109 : s3110;+  const SBool  s3112 = sbv_bv_extract_u8_0_0_u1(s3111);+  const SBool  s3113 = false != s3112;+  const SWord8 s3114 = sbv_bv_u8_rotr(s3098, 1);+  const SWord8 s3115 = 128 | s3114;+  const SWord8 s3116 = 127 & s3114;+  const SWord8 s3117 = s3113 ? s3115 : s3116;+  const SBool  s3118 = sbv_bv_extract_u8_0_0_u1(s3117);+  const SBool  s3119 = false != s3118;+  const SBool  s3120 = !s3119;+  const SWord8 s3121 = sbv_bv_u8_rotr(s3105, 1);+  const SWord8 s3122 = 128 | s3121;+  const SWord8 s3123 = 127 & s3121;+  const SWord8 s3124 = s3059 ? s3122 : s3123;+  const SWord8 s3125 = sbv_bv_u8_rotr(s3124, 1);+  const SWord8 s3126 = 128 | s3125;+  const SWord8 s3127 = 127 & s3125;+  const SWord8 s3128 = s3081 ? s3126 : s3127;+  const SWord8 s3129 = sbv_bv_u8_rotr(s3128, 1);+  const SWord8 s3130 = 128 | s3129;+  const SWord8 s3131 = 127 & s3129;+  const SWord8 s3132 = s3100 ? s3130 : s3131;+  const SWord8 s3133 = sbv_bv_u8_rotr(s3132, 1);+  const SWord8 s3134 = 128 | s3133;+  const SWord8 s3135 = 127 & s3133;+  const SWord8 s3136 = s3119 ? s3134 : s3135;+  const SWord8 s3137 = sbv_bv_u8_add(s1, s3132);+  const SBool  s3138 = s3137 < s1;+  const SBool  s3139 = s3137 < s3132;+  const SBool  s3140 = s3138 || s3139;+  const SWord8 s3141 = sbv_bv_u8_rotr(s3137, 1);+  const SWord8 s3142 = 128 | s3141;+  const SWord8 s3143 = 127 & s3141;+  const SWord8 s3144 = s3140 ? s3142 : s3143;+  const SWord8 s3145 = s3120 ? s3136 : s3144;+  const SWord8 s3146 = sbv_bv_u8_add(s1, s3128);+  const SBool  s3147 = s3146 < s1;+  const SBool  s3148 = s3146 < s3128;+  const SBool  s3149 = s3147 || s3148;+  const SWord8 s3150 = sbv_bv_u8_rotr(s3146, 1);+  const SWord8 s3151 = 128 | s3150;+  const SWord8 s3152 = 127 & s3150;+  const SWord8 s3153 = s3149 ? s3151 : s3152;+  const SWord8 s3154 = sbv_bv_u8_rotr(s3153, 1);+  const SWord8 s3155 = 128 | s3154;+  const SWord8 s3156 = 127 & s3154;+  const SWord8 s3157 = s3119 ? s3155 : s3156;+  const SWord8 s3158 = sbv_bv_u8_add(s1, s3153);+  const SBool  s3159 = s3158 < s1;+  const SBool  s3160 = s3158 < s3153;+  const SBool  s3161 = s3159 || s3160;+  const SWord8 s3162 = sbv_bv_u8_rotr(s3158, 1);+  const SWord8 s3163 = 128 | s3162;+  const SWord8 s3164 = 127 & s3162;+  const SWord8 s3165 = s3161 ? s3163 : s3164;+  const SWord8 s3166 = s3120 ? s3157 : s3165;+  const SWord8 s3167 = s3101 ? s3145 : s3166;+  const SWord8 s3168 = sbv_bv_u8_add(s1, s3124);+  const SBool  s3169 = s3168 < s1;+  const SBool  s3170 = s3168 < s3124;+  const SBool  s3171 = s3169 || s3170;+  const SWord8 s3172 = sbv_bv_u8_rotr(s3168, 1);+  const SWord8 s3173 = 128 | s3172;+  const SWord8 s3174 = 127 & s3172;+  const SWord8 s3175 = s3171 ? s3173 : s3174;+  const SWord8 s3176 = sbv_bv_u8_rotr(s3175, 1);+  const SWord8 s3177 = 128 | s3176;+  const SWord8 s3178 = 127 & s3176;+  const SWord8 s3179 = s3100 ? s3177 : s3178;+  const SWord8 s3180 = sbv_bv_u8_rotr(s3179, 1);+  const SWord8 s3181 = 128 | s3180;+  const SWord8 s3182 = 127 & s3180;+  const SWord8 s3183 = s3119 ? s3181 : s3182;+  const SWord8 s3184 = sbv_bv_u8_add(s1, s3179);+  const SBool  s3185 = s3184 < s1;+  const SBool  s3186 = s3184 < s3179;+  const SBool  s3187 = s3185 || s3186;+  const SWord8 s3188 = sbv_bv_u8_rotr(s3184, 1);+  const SWord8 s3189 = 128 | s3188;+  const SWord8 s3190 = 127 & s3188;+  const SWord8 s3191 = s3187 ? s3189 : s3190;+  const SWord8 s3192 = s3120 ? s3183 : s3191;+  const SWord8 s3193 = sbv_bv_u8_add(s1, s3175);+  const SBool  s3194 = s3193 < s1;+  const SBool  s3195 = s3193 < s3175;+  const SBool  s3196 = s3194 || s3195;+  const SWord8 s3197 = sbv_bv_u8_rotr(s3193, 1);+  const SWord8 s3198 = 128 | s3197;+  const SWord8 s3199 = 127 & s3197;+  const SWord8 s3200 = s3196 ? s3198 : s3199;+  const SWord8 s3201 = sbv_bv_u8_rotr(s3200, 1);+  const SWord8 s3202 = 128 | s3201;+  const SWord8 s3203 = 127 & s3201;+  const SWord8 s3204 = s3119 ? s3202 : s3203;+  const SWord8 s3205 = sbv_bv_u8_add(s1, s3200);+  const SBool  s3206 = s3205 < s1;+  const SBool  s3207 = s3205 < s3200;+  const SBool  s3208 = s3206 || s3207;+  const SWord8 s3209 = sbv_bv_u8_rotr(s3205, 1);+  const SWord8 s3210 = 128 | s3209;+  const SWord8 s3211 = 127 & s3209;+  const SWord8 s3212 = s3208 ? s3210 : s3211;+  const SWord8 s3213 = s3120 ? s3204 : s3212;+  const SWord8 s3214 = s3101 ? s3192 : s3213;+  const SWord8 s3215 = s3082 ? s3167 : s3214;+  const SWord8 s3216 = sbv_bv_u8_add(s1, s3105);+  const SBool  s3217 = sbv_bv_extract_u8_0_0_u1(s3216);+  const SBool  s3218 = false != s3217;+  const SWord8 s3219 = s3218 ? s3109 : s3110;+  const SBool  s3220 = sbv_bv_extract_u8_0_0_u1(s3219);+  const SBool  s3221 = false != s3220;+  const SWord8 s3222 = s3221 ? s3115 : s3116;+  const SBool  s3223 = sbv_bv_extract_u8_0_0_u1(s3222);+  const SBool  s3224 = false != s3223;+  const SBool  s3225 = !s3224;+  const SBool  s3226 = s3216 < s1;+  const SBool  s3227 = s3216 < s3105;+  const SBool  s3228 = s3226 || s3227;+  const SWord8 s3229 = sbv_bv_u8_rotr(s3216, 1);+  const SWord8 s3230 = 128 | s3229;+  const SWord8 s3231 = 127 & s3229;+  const SWord8 s3232 = s3228 ? s3230 : s3231;+  const SWord8 s3233 = sbv_bv_u8_rotr(s3232, 1);+  const SWord8 s3234 = 128 | s3233;+  const SWord8 s3235 = 127 & s3233;+  const SWord8 s3236 = s3081 ? s3234 : s3235;+  const SWord8 s3237 = sbv_bv_u8_rotr(s3236, 1);+  const SWord8 s3238 = 128 | s3237;+  const SWord8 s3239 = 127 & s3237;+  const SWord8 s3240 = s3100 ? s3238 : s3239;+  const SWord8 s3241 = sbv_bv_u8_rotr(s3240, 1);+  const SWord8 s3242 = 128 | s3241;+  const SWord8 s3243 = 127 & s3241;+  const SWord8 s3244 = s3224 ? s3242 : s3243;+  const SWord8 s3245 = sbv_bv_u8_add(s1, s3240);+  const SBool  s3246 = s3245 < s1;+  const SBool  s3247 = s3245 < s3240;+  const SBool  s3248 = s3246 || s3247;+  const SWord8 s3249 = sbv_bv_u8_rotr(s3245, 1);+  const SWord8 s3250 = 128 | s3249;+  const SWord8 s3251 = 127 & s3249;+  const SWord8 s3252 = s3248 ? s3250 : s3251;+  const SWord8 s3253 = s3225 ? s3244 : s3252;+  const SWord8 s3254 = sbv_bv_u8_add(s1, s3236);+  const SBool  s3255 = s3254 < s1;+  const SBool  s3256 = s3254 < s3236;+  const SBool  s3257 = s3255 || s3256;+  const SWord8 s3258 = sbv_bv_u8_rotr(s3254, 1);+  const SWord8 s3259 = 128 | s3258;+  const SWord8 s3260 = 127 & s3258;+  const SWord8 s3261 = s3257 ? s3259 : s3260;+  const SWord8 s3262 = sbv_bv_u8_rotr(s3261, 1);+  const SWord8 s3263 = 128 | s3262;+  const SWord8 s3264 = 127 & s3262;+  const SWord8 s3265 = s3224 ? s3263 : s3264;+  const SWord8 s3266 = sbv_bv_u8_add(s1, s3261);+  const SBool  s3267 = s3266 < s1;+  const SBool  s3268 = s3266 < s3261;+  const SBool  s3269 = s3267 || s3268;+  const SWord8 s3270 = sbv_bv_u8_rotr(s3266, 1);+  const SWord8 s3271 = 128 | s3270;+  const SWord8 s3272 = 127 & s3270;+  const SWord8 s3273 = s3269 ? s3271 : s3272;+  const SWord8 s3274 = s3225 ? s3265 : s3273;+  const SWord8 s3275 = s3101 ? s3253 : s3274;+  const SWord8 s3276 = sbv_bv_u8_add(s1, s3232);+  const SBool  s3277 = s3276 < s1;+  const SBool  s3278 = s3276 < s3232;+  const SBool  s3279 = s3277 || s3278;+  const SWord8 s3280 = sbv_bv_u8_rotr(s3276, 1);+  const SWord8 s3281 = 128 | s3280;+  const SWord8 s3282 = 127 & s3280;+  const SWord8 s3283 = s3279 ? s3281 : s3282;+  const SWord8 s3284 = sbv_bv_u8_rotr(s3283, 1);+  const SWord8 s3285 = 128 | s3284;+  const SWord8 s3286 = 127 & s3284;+  const SWord8 s3287 = s3100 ? s3285 : s3286;+  const SWord8 s3288 = sbv_bv_u8_rotr(s3287, 1);+  const SWord8 s3289 = 128 | s3288;+  const SWord8 s3290 = 127 & s3288;+  const SWord8 s3291 = s3224 ? s3289 : s3290;+  const SWord8 s3292 = sbv_bv_u8_add(s1, s3287);+  const SBool  s3293 = s3292 < s1;+  const SBool  s3294 = s3292 < s3287;+  const SBool  s3295 = s3293 || s3294;+  const SWord8 s3296 = sbv_bv_u8_rotr(s3292, 1);+  const SWord8 s3297 = 128 | s3296;+  const SWord8 s3298 = 127 & s3296;+  const SWord8 s3299 = s3295 ? s3297 : s3298;+  const SWord8 s3300 = s3225 ? s3291 : s3299;+  const SWord8 s3301 = sbv_bv_u8_add(s1, s3283);+  const SBool  s3302 = s3301 < s1;+  const SBool  s3303 = s3301 < s3283;+  const SBool  s3304 = s3302 || s3303;+  const SWord8 s3305 = sbv_bv_u8_rotr(s3301, 1);+  const SWord8 s3306 = 128 | s3305;+  const SWord8 s3307 = 127 & s3305;+  const SWord8 s3308 = s3304 ? s3306 : s3307;+  const SWord8 s3309 = sbv_bv_u8_rotr(s3308, 1);+  const SWord8 s3310 = 128 | s3309;+  const SWord8 s3311 = 127 & s3309;+  const SWord8 s3312 = s3224 ? s3310 : s3311;+  const SWord8 s3313 = sbv_bv_u8_add(s1, s3308);+  const SBool  s3314 = s3313 < s1;+  const SBool  s3315 = s3313 < s3308;+  const SBool  s3316 = s3314 || s3315;+  const SWord8 s3317 = sbv_bv_u8_rotr(s3313, 1);+  const SWord8 s3318 = 128 | s3317;+  const SWord8 s3319 = 127 & s3317;+  const SWord8 s3320 = s3316 ? s3318 : s3319;+  const SWord8 s3321 = s3225 ? s3312 : s3320;+  const SWord8 s3322 = s3101 ? s3300 : s3321;+  const SWord8 s3323 = s3082 ? s3275 : s3322;+  const SWord8 s3324 = s3060 ? s3215 : s3323;+  const SWord8 s3325 = sbv_bv_u8_add(s1, s3086);+  const SBool  s3326 = sbv_bv_extract_u8_0_0_u1(s3325);+  const SBool  s3327 = false != s3326;+  const SWord8 s3328 = s3327 ? s3090 : s3091;+  const SBool  s3329 = sbv_bv_extract_u8_0_0_u1(s3328);+  const SBool  s3330 = false != s3329;+  const SWord8 s3331 = s3330 ? s3096 : s3097;+  const SBool  s3332 = sbv_bv_extract_u8_0_0_u1(s3331);+  const SBool  s3333 = false != s3332;+  const SBool  s3334 = !s3333;+  const SBool  s3335 = s3325 < s1;+  const SBool  s3336 = s3325 < s3086;+  const SBool  s3337 = s3335 || s3336;+  const SWord8 s3338 = sbv_bv_u8_rotr(s3325, 1);+  const SWord8 s3339 = 128 | s3338;+  const SWord8 s3340 = 127 & s3338;+  const SWord8 s3341 = s3337 ? s3339 : s3340;+  const SBool  s3342 = sbv_bv_extract_u8_0_0_u1(s3341);+  const SBool  s3343 = false != s3342;+  const SWord8 s3344 = sbv_bv_u8_rotr(s3328, 1);+  const SWord8 s3345 = 128 | s3344;+  const SWord8 s3346 = 127 & s3344;+  const SWord8 s3347 = s3343 ? s3345 : s3346;+  const SBool  s3348 = sbv_bv_extract_u8_0_0_u1(s3347);+  const SBool  s3349 = false != s3348;+  const SWord8 s3350 = sbv_bv_u8_rotr(s3331, 1);+  const SWord8 s3351 = 128 | s3350;+  const SWord8 s3352 = 127 & s3350;+  const SWord8 s3353 = s3349 ? s3351 : s3352;+  const SBool  s3354 = sbv_bv_extract_u8_0_0_u1(s3353);+  const SBool  s3355 = false != s3354;+  const SBool  s3356 = !s3355;+  const SWord8 s3357 = sbv_bv_u8_rotr(s3341, 1);+  const SWord8 s3358 = 128 | s3357;+  const SWord8 s3359 = 127 & s3357;+  const SWord8 s3360 = s3059 ? s3358 : s3359;+  const SWord8 s3361 = sbv_bv_u8_rotr(s3360, 1);+  const SWord8 s3362 = 128 | s3361;+  const SWord8 s3363 = 127 & s3361;+  const SWord8 s3364 = s3081 ? s3362 : s3363;+  const SWord8 s3365 = sbv_bv_u8_rotr(s3364, 1);+  const SWord8 s3366 = 128 | s3365;+  const SWord8 s3367 = 127 & s3365;+  const SWord8 s3368 = s3333 ? s3366 : s3367;+  const SWord8 s3369 = sbv_bv_u8_rotr(s3368, 1);+  const SWord8 s3370 = 128 | s3369;+  const SWord8 s3371 = 127 & s3369;+  const SWord8 s3372 = s3355 ? s3370 : s3371;+  const SWord8 s3373 = sbv_bv_u8_add(s1, s3368);+  const SBool  s3374 = s3373 < s1;+  const SBool  s3375 = s3373 < s3368;+  const SBool  s3376 = s3374 || s3375;+  const SWord8 s3377 = sbv_bv_u8_rotr(s3373, 1);+  const SWord8 s3378 = 128 | s3377;+  const SWord8 s3379 = 127 & s3377;+  const SWord8 s3380 = s3376 ? s3378 : s3379;+  const SWord8 s3381 = s3356 ? s3372 : s3380;+  const SWord8 s3382 = sbv_bv_u8_add(s1, s3364);+  const SBool  s3383 = s3382 < s1;+  const SBool  s3384 = s3382 < s3364;+  const SBool  s3385 = s3383 || s3384;+  const SWord8 s3386 = sbv_bv_u8_rotr(s3382, 1);+  const SWord8 s3387 = 128 | s3386;+  const SWord8 s3388 = 127 & s3386;+  const SWord8 s3389 = s3385 ? s3387 : s3388;+  const SWord8 s3390 = sbv_bv_u8_rotr(s3389, 1);+  const SWord8 s3391 = 128 | s3390;+  const SWord8 s3392 = 127 & s3390;+  const SWord8 s3393 = s3355 ? s3391 : s3392;+  const SWord8 s3394 = sbv_bv_u8_add(s1, s3389);+  const SBool  s3395 = s3394 < s1;+  const SBool  s3396 = s3394 < s3389;+  const SBool  s3397 = s3395 || s3396;+  const SWord8 s3398 = sbv_bv_u8_rotr(s3394, 1);+  const SWord8 s3399 = 128 | s3398;+  const SWord8 s3400 = 127 & s3398;+  const SWord8 s3401 = s3397 ? s3399 : s3400;+  const SWord8 s3402 = s3356 ? s3393 : s3401;+  const SWord8 s3403 = s3334 ? s3381 : s3402;+  const SWord8 s3404 = sbv_bv_u8_add(s1, s3360);+  const SBool  s3405 = s3404 < s1;+  const SBool  s3406 = s3404 < s3360;+  const SBool  s3407 = s3405 || s3406;+  const SWord8 s3408 = sbv_bv_u8_rotr(s3404, 1);+  const SWord8 s3409 = 128 | s3408;+  const SWord8 s3410 = 127 & s3408;+  const SWord8 s3411 = s3407 ? s3409 : s3410;+  const SWord8 s3412 = sbv_bv_u8_rotr(s3411, 1);+  const SWord8 s3413 = 128 | s3412;+  const SWord8 s3414 = 127 & s3412;+  const SWord8 s3415 = s3333 ? s3413 : s3414;+  const SWord8 s3416 = sbv_bv_u8_rotr(s3415, 1);+  const SWord8 s3417 = 128 | s3416;+  const SWord8 s3418 = 127 & s3416;+  const SWord8 s3419 = s3355 ? s3417 : s3418;+  const SWord8 s3420 = sbv_bv_u8_add(s1, s3415);+  const SBool  s3421 = s3420 < s1;+  const SBool  s3422 = s3420 < s3415;+  const SBool  s3423 = s3421 || s3422;+  const SWord8 s3424 = sbv_bv_u8_rotr(s3420, 1);+  const SWord8 s3425 = 128 | s3424;+  const SWord8 s3426 = 127 & s3424;+  const SWord8 s3427 = s3423 ? s3425 : s3426;+  const SWord8 s3428 = s3356 ? s3419 : s3427;+  const SWord8 s3429 = sbv_bv_u8_add(s1, s3411);+  const SBool  s3430 = s3429 < s1;+  const SBool  s3431 = s3429 < s3411;+  const SBool  s3432 = s3430 || s3431;+  const SWord8 s3433 = sbv_bv_u8_rotr(s3429, 1);+  const SWord8 s3434 = 128 | s3433;+  const SWord8 s3435 = 127 & s3433;+  const SWord8 s3436 = s3432 ? s3434 : s3435;+  const SWord8 s3437 = sbv_bv_u8_rotr(s3436, 1);+  const SWord8 s3438 = 128 | s3437;+  const SWord8 s3439 = 127 & s3437;+  const SWord8 s3440 = s3355 ? s3438 : s3439;+  const SWord8 s3441 = sbv_bv_u8_add(s1, s3436);+  const SBool  s3442 = s3441 < s1;+  const SBool  s3443 = s3441 < s3436;+  const SBool  s3444 = s3442 || s3443;+  const SWord8 s3445 = sbv_bv_u8_rotr(s3441, 1);+  const SWord8 s3446 = 128 | s3445;+  const SWord8 s3447 = 127 & s3445;+  const SWord8 s3448 = s3444 ? s3446 : s3447;+  const SWord8 s3449 = s3356 ? s3440 : s3448;+  const SWord8 s3450 = s3334 ? s3428 : s3449;+  const SWord8 s3451 = s3082 ? s3403 : s3450;+  const SWord8 s3452 = sbv_bv_u8_add(s1, s3341);+  const SBool  s3453 = sbv_bv_extract_u8_0_0_u1(s3452);+  const SBool  s3454 = false != s3453;+  const SWord8 s3455 = s3454 ? s3345 : s3346;+  const SBool  s3456 = sbv_bv_extract_u8_0_0_u1(s3455);+  const SBool  s3457 = false != s3456;+  const SWord8 s3458 = s3457 ? s3351 : s3352;+  const SBool  s3459 = sbv_bv_extract_u8_0_0_u1(s3458);+  const SBool  s3460 = false != s3459;+  const SBool  s3461 = !s3460;+  const SBool  s3462 = s3452 < s1;+  const SBool  s3463 = s3452 < s3341;+  const SBool  s3464 = s3462 || s3463;+  const SWord8 s3465 = sbv_bv_u8_rotr(s3452, 1);+  const SWord8 s3466 = 128 | s3465;+  const SWord8 s3467 = 127 & s3465;+  const SWord8 s3468 = s3464 ? s3466 : s3467;+  const SWord8 s3469 = sbv_bv_u8_rotr(s3468, 1);+  const SWord8 s3470 = 128 | s3469;+  const SWord8 s3471 = 127 & s3469;+  const SWord8 s3472 = s3081 ? s3470 : s3471;+  const SWord8 s3473 = sbv_bv_u8_rotr(s3472, 1);+  const SWord8 s3474 = 128 | s3473;+  const SWord8 s3475 = 127 & s3473;+  const SWord8 s3476 = s3333 ? s3474 : s3475;+  const SWord8 s3477 = sbv_bv_u8_rotr(s3476, 1);+  const SWord8 s3478 = 128 | s3477;+  const SWord8 s3479 = 127 & s3477;+  const SWord8 s3480 = s3460 ? s3478 : s3479;+  const SWord8 s3481 = sbv_bv_u8_add(s1, s3476);+  const SBool  s3482 = s3481 < s1;+  const SBool  s3483 = s3481 < s3476;+  const SBool  s3484 = s3482 || s3483;+  const SWord8 s3485 = sbv_bv_u8_rotr(s3481, 1);+  const SWord8 s3486 = 128 | s3485;+  const SWord8 s3487 = 127 & s3485;+  const SWord8 s3488 = s3484 ? s3486 : s3487;+  const SWord8 s3489 = s3461 ? s3480 : s3488;+  const SWord8 s3490 = sbv_bv_u8_add(s1, s3472);+  const SBool  s3491 = s3490 < s1;+  const SBool  s3492 = s3490 < s3472;+  const SBool  s3493 = s3491 || s3492;+  const SWord8 s3494 = sbv_bv_u8_rotr(s3490, 1);+  const SWord8 s3495 = 128 | s3494;+  const SWord8 s3496 = 127 & s3494;+  const SWord8 s3497 = s3493 ? s3495 : s3496;+  const SWord8 s3498 = sbv_bv_u8_rotr(s3497, 1);+  const SWord8 s3499 = 128 | s3498;+  const SWord8 s3500 = 127 & s3498;+  const SWord8 s3501 = s3460 ? s3499 : s3500;+  const SWord8 s3502 = sbv_bv_u8_add(s1, s3497);+  const SBool  s3503 = s3502 < s1;+  const SBool  s3504 = s3502 < s3497;+  const SBool  s3505 = s3503 || s3504;+  const SWord8 s3506 = sbv_bv_u8_rotr(s3502, 1);+  const SWord8 s3507 = 128 | s3506;+  const SWord8 s3508 = 127 & s3506;+  const SWord8 s3509 = s3505 ? s3507 : s3508;+  const SWord8 s3510 = s3461 ? s3501 : s3509;+  const SWord8 s3511 = s3334 ? s3489 : s3510;+  const SWord8 s3512 = sbv_bv_u8_add(s1, s3468);+  const SBool  s3513 = s3512 < s1;+  const SBool  s3514 = s3512 < s3468;+  const SBool  s3515 = s3513 || s3514;+  const SWord8 s3516 = sbv_bv_u8_rotr(s3512, 1);+  const SWord8 s3517 = 128 | s3516;+  const SWord8 s3518 = 127 & s3516;+  const SWord8 s3519 = s3515 ? s3517 : s3518;+  const SWord8 s3520 = sbv_bv_u8_rotr(s3519, 1);+  const SWord8 s3521 = 128 | s3520;+  const SWord8 s3522 = 127 & s3520;+  const SWord8 s3523 = s3333 ? s3521 : s3522;+  const SWord8 s3524 = sbv_bv_u8_rotr(s3523, 1);+  const SWord8 s3525 = 128 | s3524;+  const SWord8 s3526 = 127 & s3524;+  const SWord8 s3527 = s3460 ? s3525 : s3526;+  const SWord8 s3528 = sbv_bv_u8_add(s1, s3523);+  const SBool  s3529 = s3528 < s1;+  const SBool  s3530 = s3528 < s3523;+  const SBool  s3531 = s3529 || s3530;+  const SWord8 s3532 = sbv_bv_u8_rotr(s3528, 1);+  const SWord8 s3533 = 128 | s3532;+  const SWord8 s3534 = 127 & s3532;+  const SWord8 s3535 = s3531 ? s3533 : s3534;+  const SWord8 s3536 = s3461 ? s3527 : s3535;+  const SWord8 s3537 = sbv_bv_u8_add(s1, s3519);+  const SBool  s3538 = s3537 < s1;+  const SBool  s3539 = s3537 < s3519;+  const SBool  s3540 = s3538 || s3539;+  const SWord8 s3541 = sbv_bv_u8_rotr(s3537, 1);+  const SWord8 s3542 = 128 | s3541;+  const SWord8 s3543 = 127 & s3541;+  const SWord8 s3544 = s3540 ? s3542 : s3543;+  const SWord8 s3545 = sbv_bv_u8_rotr(s3544, 1);+  const SWord8 s3546 = 128 | s3545;+  const SWord8 s3547 = 127 & s3545;+  const SWord8 s3548 = s3460 ? s3546 : s3547;+  const SWord8 s3549 = sbv_bv_u8_add(s1, s3544);+  const SBool  s3550 = s3549 < s1;+  const SBool  s3551 = s3549 < s3544;+  const SBool  s3552 = s3550 || s3551;+  const SWord8 s3553 = sbv_bv_u8_rotr(s3549, 1);+  const SWord8 s3554 = 128 | s3553;+  const SWord8 s3555 = 127 & s3553;+  const SWord8 s3556 = s3552 ? s3554 : s3555;+  const SWord8 s3557 = s3461 ? s3548 : s3556;+  const SWord8 s3558 = s3334 ? s3536 : s3557;+  const SWord8 s3559 = s3082 ? s3511 : s3558;+  const SWord8 s3560 = s3060 ? s3451 : s3559;+  const SWord8 s3561 = s2042 ? s3324 : s3560;+  const SWord8 s3562 = sbv_bv_u8_add(s1, s3067);+  const SBool  s3563 = sbv_bv_extract_u8_0_0_u1(s3562);+  const SBool  s3564 = false != s3563;+  const SWord8 s3565 = s3564 ? s3071 : s3072;+  const SBool  s3566 = sbv_bv_extract_u8_0_0_u1(s3565);+  const SBool  s3567 = false != s3566;+  const SWord8 s3568 = s3567 ? s3077 : s3078;+  const SBool  s3569 = sbv_bv_extract_u8_0_0_u1(s3568);+  const SBool  s3570 = false != s3569;+  const SBool  s3571 = !s3570;+  const SBool  s3572 = s3562 < s1;+  const SBool  s3573 = s3562 < s3067;+  const SBool  s3574 = s3572 || s3573;+  const SWord8 s3575 = sbv_bv_u8_rotr(s3562, 1);+  const SWord8 s3576 = 128 | s3575;+  const SWord8 s3577 = 127 & s3575;+  const SWord8 s3578 = s3574 ? s3576 : s3577;+  const SBool  s3579 = sbv_bv_extract_u8_0_0_u1(s3578);+  const SBool  s3580 = false != s3579;+  const SWord8 s3581 = sbv_bv_u8_rotr(s3565, 1);+  const SWord8 s3582 = 128 | s3581;+  const SWord8 s3583 = 127 & s3581;+  const SWord8 s3584 = s3580 ? s3582 : s3583;+  const SBool  s3585 = sbv_bv_extract_u8_0_0_u1(s3584);+  const SBool  s3586 = false != s3585;+  const SWord8 s3587 = sbv_bv_u8_rotr(s3568, 1);+  const SWord8 s3588 = 128 | s3587;+  const SWord8 s3589 = 127 & s3587;+  const SWord8 s3590 = s3586 ? s3588 : s3589;+  const SBool  s3591 = sbv_bv_extract_u8_0_0_u1(s3590);+  const SBool  s3592 = false != s3591;+  const SBool  s3593 = !s3592;+  const SWord8 s3594 = sbv_bv_u8_rotr(s3578, 1);+  const SWord8 s3595 = 128 | s3594;+  const SWord8 s3596 = 127 & s3594;+  const SWord8 s3597 = s2041 ? s3595 : s3596;+  const SBool  s3598 = sbv_bv_extract_u8_0_0_u1(s3597);+  const SBool  s3599 = false != s3598;+  const SWord8 s3600 = sbv_bv_u8_rotr(s3584, 1);+  const SWord8 s3601 = 128 | s3600;+  const SWord8 s3602 = 127 & s3600;+  const SWord8 s3603 = s3599 ? s3601 : s3602;+  const SBool  s3604 = sbv_bv_extract_u8_0_0_u1(s3603);+  const SBool  s3605 = false != s3604;+  const SWord8 s3606 = sbv_bv_u8_rotr(s3590, 1);+  const SWord8 s3607 = 128 | s3606;+  const SWord8 s3608 = 127 & s3606;+  const SWord8 s3609 = s3605 ? s3607 : s3608;+  const SBool  s3610 = sbv_bv_extract_u8_0_0_u1(s3609);+  const SBool  s3611 = false != s3610;+  const SBool  s3612 = !s3611;+  const SWord8 s3613 = sbv_bv_u8_rotr(s3597, 1);+  const SWord8 s3614 = 128 | s3613;+  const SWord8 s3615 = 127 & s3613;+  const SWord8 s3616 = s3059 ? s3614 : s3615;+  const SWord8 s3617 = sbv_bv_u8_rotr(s3616, 1);+  const SWord8 s3618 = 128 | s3617;+  const SWord8 s3619 = 127 & s3617;+  const SWord8 s3620 = s3570 ? s3618 : s3619;+  const SWord8 s3621 = sbv_bv_u8_rotr(s3620, 1);+  const SWord8 s3622 = 128 | s3621;+  const SWord8 s3623 = 127 & s3621;+  const SWord8 s3624 = s3592 ? s3622 : s3623;+  const SWord8 s3625 = sbv_bv_u8_rotr(s3624, 1);+  const SWord8 s3626 = 128 | s3625;+  const SWord8 s3627 = 127 & s3625;+  const SWord8 s3628 = s3611 ? s3626 : s3627;+  const SWord8 s3629 = sbv_bv_u8_add(s1, s3624);+  const SBool  s3630 = s3629 < s1;+  const SBool  s3631 = s3629 < s3624;+  const SBool  s3632 = s3630 || s3631;+  const SWord8 s3633 = sbv_bv_u8_rotr(s3629, 1);+  const SWord8 s3634 = 128 | s3633;+  const SWord8 s3635 = 127 & s3633;+  const SWord8 s3636 = s3632 ? s3634 : s3635;+  const SWord8 s3637 = s3612 ? s3628 : s3636;+  const SWord8 s3638 = sbv_bv_u8_add(s1, s3620);+  const SBool  s3639 = s3638 < s1;+  const SBool  s3640 = s3638 < s3620;+  const SBool  s3641 = s3639 || s3640;+  const SWord8 s3642 = sbv_bv_u8_rotr(s3638, 1);+  const SWord8 s3643 = 128 | s3642;+  const SWord8 s3644 = 127 & s3642;+  const SWord8 s3645 = s3641 ? s3643 : s3644;+  const SWord8 s3646 = sbv_bv_u8_rotr(s3645, 1);+  const SWord8 s3647 = 128 | s3646;+  const SWord8 s3648 = 127 & s3646;+  const SWord8 s3649 = s3611 ? s3647 : s3648;+  const SWord8 s3650 = sbv_bv_u8_add(s1, s3645);+  const SBool  s3651 = s3650 < s1;+  const SBool  s3652 = s3650 < s3645;+  const SBool  s3653 = s3651 || s3652;+  const SWord8 s3654 = sbv_bv_u8_rotr(s3650, 1);+  const SWord8 s3655 = 128 | s3654;+  const SWord8 s3656 = 127 & s3654;+  const SWord8 s3657 = s3653 ? s3655 : s3656;+  const SWord8 s3658 = s3612 ? s3649 : s3657;+  const SWord8 s3659 = s3593 ? s3637 : s3658;+  const SWord8 s3660 = sbv_bv_u8_add(s1, s3616);+  const SBool  s3661 = s3660 < s1;+  const SBool  s3662 = s3660 < s3616;+  const SBool  s3663 = s3661 || s3662;+  const SWord8 s3664 = sbv_bv_u8_rotr(s3660, 1);+  const SWord8 s3665 = 128 | s3664;+  const SWord8 s3666 = 127 & s3664;+  const SWord8 s3667 = s3663 ? s3665 : s3666;+  const SWord8 s3668 = sbv_bv_u8_rotr(s3667, 1);+  const SWord8 s3669 = 128 | s3668;+  const SWord8 s3670 = 127 & s3668;+  const SWord8 s3671 = s3592 ? s3669 : s3670;+  const SWord8 s3672 = sbv_bv_u8_rotr(s3671, 1);+  const SWord8 s3673 = 128 | s3672;+  const SWord8 s3674 = 127 & s3672;+  const SWord8 s3675 = s3611 ? s3673 : s3674;+  const SWord8 s3676 = sbv_bv_u8_add(s1, s3671);+  const SBool  s3677 = s3676 < s1;+  const SBool  s3678 = s3676 < s3671;+  const SBool  s3679 = s3677 || s3678;+  const SWord8 s3680 = sbv_bv_u8_rotr(s3676, 1);+  const SWord8 s3681 = 128 | s3680;+  const SWord8 s3682 = 127 & s3680;+  const SWord8 s3683 = s3679 ? s3681 : s3682;+  const SWord8 s3684 = s3612 ? s3675 : s3683;+  const SWord8 s3685 = sbv_bv_u8_add(s1, s3667);+  const SBool  s3686 = s3685 < s1;+  const SBool  s3687 = s3685 < s3667;+  const SBool  s3688 = s3686 || s3687;+  const SWord8 s3689 = sbv_bv_u8_rotr(s3685, 1);+  const SWord8 s3690 = 128 | s3689;+  const SWord8 s3691 = 127 & s3689;+  const SWord8 s3692 = s3688 ? s3690 : s3691;+  const SWord8 s3693 = sbv_bv_u8_rotr(s3692, 1);+  const SWord8 s3694 = 128 | s3693;+  const SWord8 s3695 = 127 & s3693;+  const SWord8 s3696 = s3611 ? s3694 : s3695;+  const SWord8 s3697 = sbv_bv_u8_add(s1, s3692);+  const SBool  s3698 = s3697 < s1;+  const SBool  s3699 = s3697 < s3692;+  const SBool  s3700 = s3698 || s3699;+  const SWord8 s3701 = sbv_bv_u8_rotr(s3697, 1);+  const SWord8 s3702 = 128 | s3701;+  const SWord8 s3703 = 127 & s3701;+  const SWord8 s3704 = s3700 ? s3702 : s3703;+  const SWord8 s3705 = s3612 ? s3696 : s3704;+  const SWord8 s3706 = s3593 ? s3684 : s3705;+  const SWord8 s3707 = s3571 ? s3659 : s3706;+  const SWord8 s3708 = sbv_bv_u8_add(s1, s3597);+  const SBool  s3709 = sbv_bv_extract_u8_0_0_u1(s3708);+  const SBool  s3710 = false != s3709;+  const SWord8 s3711 = s3710 ? s3601 : s3602;+  const SBool  s3712 = sbv_bv_extract_u8_0_0_u1(s3711);+  const SBool  s3713 = false != s3712;+  const SWord8 s3714 = s3713 ? s3607 : s3608;+  const SBool  s3715 = sbv_bv_extract_u8_0_0_u1(s3714);+  const SBool  s3716 = false != s3715;+  const SBool  s3717 = !s3716;+  const SBool  s3718 = s3708 < s1;+  const SBool  s3719 = s3708 < s3597;+  const SBool  s3720 = s3718 || s3719;+  const SWord8 s3721 = sbv_bv_u8_rotr(s3708, 1);+  const SWord8 s3722 = 128 | s3721;+  const SWord8 s3723 = 127 & s3721;+  const SWord8 s3724 = s3720 ? s3722 : s3723;+  const SWord8 s3725 = sbv_bv_u8_rotr(s3724, 1);+  const SWord8 s3726 = 128 | s3725;+  const SWord8 s3727 = 127 & s3725;+  const SWord8 s3728 = s3570 ? s3726 : s3727;+  const SWord8 s3729 = sbv_bv_u8_rotr(s3728, 1);+  const SWord8 s3730 = 128 | s3729;+  const SWord8 s3731 = 127 & s3729;+  const SWord8 s3732 = s3592 ? s3730 : s3731;+  const SWord8 s3733 = sbv_bv_u8_rotr(s3732, 1);+  const SWord8 s3734 = 128 | s3733;+  const SWord8 s3735 = 127 & s3733;+  const SWord8 s3736 = s3716 ? s3734 : s3735;+  const SWord8 s3737 = sbv_bv_u8_add(s1, s3732);+  const SBool  s3738 = s3737 < s1;+  const SBool  s3739 = s3737 < s3732;+  const SBool  s3740 = s3738 || s3739;+  const SWord8 s3741 = sbv_bv_u8_rotr(s3737, 1);+  const SWord8 s3742 = 128 | s3741;+  const SWord8 s3743 = 127 & s3741;+  const SWord8 s3744 = s3740 ? s3742 : s3743;+  const SWord8 s3745 = s3717 ? s3736 : s3744;+  const SWord8 s3746 = sbv_bv_u8_add(s1, s3728);+  const SBool  s3747 = s3746 < s1;+  const SBool  s3748 = s3746 < s3728;+  const SBool  s3749 = s3747 || s3748;+  const SWord8 s3750 = sbv_bv_u8_rotr(s3746, 1);+  const SWord8 s3751 = 128 | s3750;+  const SWord8 s3752 = 127 & s3750;+  const SWord8 s3753 = s3749 ? s3751 : s3752;+  const SWord8 s3754 = sbv_bv_u8_rotr(s3753, 1);+  const SWord8 s3755 = 128 | s3754;+  const SWord8 s3756 = 127 & s3754;+  const SWord8 s3757 = s3716 ? s3755 : s3756;+  const SWord8 s3758 = sbv_bv_u8_add(s1, s3753);+  const SBool  s3759 = s3758 < s1;+  const SBool  s3760 = s3758 < s3753;+  const SBool  s3761 = s3759 || s3760;+  const SWord8 s3762 = sbv_bv_u8_rotr(s3758, 1);+  const SWord8 s3763 = 128 | s3762;+  const SWord8 s3764 = 127 & s3762;+  const SWord8 s3765 = s3761 ? s3763 : s3764;+  const SWord8 s3766 = s3717 ? s3757 : s3765;+  const SWord8 s3767 = s3593 ? s3745 : s3766;+  const SWord8 s3768 = sbv_bv_u8_add(s1, s3724);+  const SBool  s3769 = s3768 < s1;+  const SBool  s3770 = s3768 < s3724;+  const SBool  s3771 = s3769 || s3770;+  const SWord8 s3772 = sbv_bv_u8_rotr(s3768, 1);+  const SWord8 s3773 = 128 | s3772;+  const SWord8 s3774 = 127 & s3772;+  const SWord8 s3775 = s3771 ? s3773 : s3774;+  const SWord8 s3776 = sbv_bv_u8_rotr(s3775, 1);+  const SWord8 s3777 = 128 | s3776;+  const SWord8 s3778 = 127 & s3776;+  const SWord8 s3779 = s3592 ? s3777 : s3778;+  const SWord8 s3780 = sbv_bv_u8_rotr(s3779, 1);+  const SWord8 s3781 = 128 | s3780;+  const SWord8 s3782 = 127 & s3780;+  const SWord8 s3783 = s3716 ? s3781 : s3782;+  const SWord8 s3784 = sbv_bv_u8_add(s1, s3779);+  const SBool  s3785 = s3784 < s1;+  const SBool  s3786 = s3784 < s3779;+  const SBool  s3787 = s3785 || s3786;+  const SWord8 s3788 = sbv_bv_u8_rotr(s3784, 1);+  const SWord8 s3789 = 128 | s3788;+  const SWord8 s3790 = 127 & s3788;+  const SWord8 s3791 = s3787 ? s3789 : s3790;+  const SWord8 s3792 = s3717 ? s3783 : s3791;+  const SWord8 s3793 = sbv_bv_u8_add(s1, s3775);+  const SBool  s3794 = s3793 < s1;+  const SBool  s3795 = s3793 < s3775;+  const SBool  s3796 = s3794 || s3795;+  const SWord8 s3797 = sbv_bv_u8_rotr(s3793, 1);+  const SWord8 s3798 = 128 | s3797;+  const SWord8 s3799 = 127 & s3797;+  const SWord8 s3800 = s3796 ? s3798 : s3799;+  const SWord8 s3801 = sbv_bv_u8_rotr(s3800, 1);+  const SWord8 s3802 = 128 | s3801;+  const SWord8 s3803 = 127 & s3801;+  const SWord8 s3804 = s3716 ? s3802 : s3803;+  const SWord8 s3805 = sbv_bv_u8_add(s1, s3800);+  const SBool  s3806 = s3805 < s1;+  const SBool  s3807 = s3805 < s3800;+  const SBool  s3808 = s3806 || s3807;+  const SWord8 s3809 = sbv_bv_u8_rotr(s3805, 1);+  const SWord8 s3810 = 128 | s3809;+  const SWord8 s3811 = 127 & s3809;+  const SWord8 s3812 = s3808 ? s3810 : s3811;+  const SWord8 s3813 = s3717 ? s3804 : s3812;+  const SWord8 s3814 = s3593 ? s3792 : s3813;+  const SWord8 s3815 = s3571 ? s3767 : s3814;+  const SWord8 s3816 = s3060 ? s3707 : s3815;+  const SWord8 s3817 = sbv_bv_u8_add(s1, s3578);+  const SBool  s3818 = sbv_bv_extract_u8_0_0_u1(s3817);+  const SBool  s3819 = false != s3818;+  const SWord8 s3820 = s3819 ? s3582 : s3583;+  const SBool  s3821 = sbv_bv_extract_u8_0_0_u1(s3820);+  const SBool  s3822 = false != s3821;+  const SWord8 s3823 = s3822 ? s3588 : s3589;+  const SBool  s3824 = sbv_bv_extract_u8_0_0_u1(s3823);+  const SBool  s3825 = false != s3824;+  const SBool  s3826 = !s3825;+  const SBool  s3827 = s3817 < s1;+  const SBool  s3828 = s3817 < s3578;+  const SBool  s3829 = s3827 || s3828;+  const SWord8 s3830 = sbv_bv_u8_rotr(s3817, 1);+  const SWord8 s3831 = 128 | s3830;+  const SWord8 s3832 = 127 & s3830;+  const SWord8 s3833 = s3829 ? s3831 : s3832;+  const SBool  s3834 = sbv_bv_extract_u8_0_0_u1(s3833);+  const SBool  s3835 = false != s3834;+  const SWord8 s3836 = sbv_bv_u8_rotr(s3820, 1);+  const SWord8 s3837 = 128 | s3836;+  const SWord8 s3838 = 127 & s3836;+  const SWord8 s3839 = s3835 ? s3837 : s3838;+  const SBool  s3840 = sbv_bv_extract_u8_0_0_u1(s3839);+  const SBool  s3841 = false != s3840;+  const SWord8 s3842 = sbv_bv_u8_rotr(s3823, 1);+  const SWord8 s3843 = 128 | s3842;+  const SWord8 s3844 = 127 & s3842;+  const SWord8 s3845 = s3841 ? s3843 : s3844;+  const SBool  s3846 = sbv_bv_extract_u8_0_0_u1(s3845);+  const SBool  s3847 = false != s3846;+  const SBool  s3848 = !s3847;+  const SWord8 s3849 = sbv_bv_u8_rotr(s3833, 1);+  const SWord8 s3850 = 128 | s3849;+  const SWord8 s3851 = 127 & s3849;+  const SWord8 s3852 = s3059 ? s3850 : s3851;+  const SWord8 s3853 = sbv_bv_u8_rotr(s3852, 1);+  const SWord8 s3854 = 128 | s3853;+  const SWord8 s3855 = 127 & s3853;+  const SWord8 s3856 = s3570 ? s3854 : s3855;+  const SWord8 s3857 = sbv_bv_u8_rotr(s3856, 1);+  const SWord8 s3858 = 128 | s3857;+  const SWord8 s3859 = 127 & s3857;+  const SWord8 s3860 = s3825 ? s3858 : s3859;+  const SWord8 s3861 = sbv_bv_u8_rotr(s3860, 1);+  const SWord8 s3862 = 128 | s3861;+  const SWord8 s3863 = 127 & s3861;+  const SWord8 s3864 = s3847 ? s3862 : s3863;+  const SWord8 s3865 = sbv_bv_u8_add(s1, s3860);+  const SBool  s3866 = s3865 < s1;+  const SBool  s3867 = s3865 < s3860;+  const SBool  s3868 = s3866 || s3867;+  const SWord8 s3869 = sbv_bv_u8_rotr(s3865, 1);+  const SWord8 s3870 = 128 | s3869;+  const SWord8 s3871 = 127 & s3869;+  const SWord8 s3872 = s3868 ? s3870 : s3871;+  const SWord8 s3873 = s3848 ? s3864 : s3872;+  const SWord8 s3874 = sbv_bv_u8_add(s1, s3856);+  const SBool  s3875 = s3874 < s1;+  const SBool  s3876 = s3874 < s3856;+  const SBool  s3877 = s3875 || s3876;+  const SWord8 s3878 = sbv_bv_u8_rotr(s3874, 1);+  const SWord8 s3879 = 128 | s3878;+  const SWord8 s3880 = 127 & s3878;+  const SWord8 s3881 = s3877 ? s3879 : s3880;+  const SWord8 s3882 = sbv_bv_u8_rotr(s3881, 1);+  const SWord8 s3883 = 128 | s3882;+  const SWord8 s3884 = 127 & s3882;+  const SWord8 s3885 = s3847 ? s3883 : s3884;+  const SWord8 s3886 = sbv_bv_u8_add(s1, s3881);+  const SBool  s3887 = s3886 < s1;+  const SBool  s3888 = s3886 < s3881;+  const SBool  s3889 = s3887 || s3888;+  const SWord8 s3890 = sbv_bv_u8_rotr(s3886, 1);+  const SWord8 s3891 = 128 | s3890;+  const SWord8 s3892 = 127 & s3890;+  const SWord8 s3893 = s3889 ? s3891 : s3892;+  const SWord8 s3894 = s3848 ? s3885 : s3893;+  const SWord8 s3895 = s3826 ? s3873 : s3894;+  const SWord8 s3896 = sbv_bv_u8_add(s1, s3852);+  const SBool  s3897 = s3896 < s1;+  const SBool  s3898 = s3896 < s3852;+  const SBool  s3899 = s3897 || s3898;+  const SWord8 s3900 = sbv_bv_u8_rotr(s3896, 1);+  const SWord8 s3901 = 128 | s3900;+  const SWord8 s3902 = 127 & s3900;+  const SWord8 s3903 = s3899 ? s3901 : s3902;+  const SWord8 s3904 = sbv_bv_u8_rotr(s3903, 1);+  const SWord8 s3905 = 128 | s3904;+  const SWord8 s3906 = 127 & s3904;+  const SWord8 s3907 = s3825 ? s3905 : s3906;+  const SWord8 s3908 = sbv_bv_u8_rotr(s3907, 1);+  const SWord8 s3909 = 128 | s3908;+  const SWord8 s3910 = 127 & s3908;+  const SWord8 s3911 = s3847 ? s3909 : s3910;+  const SWord8 s3912 = sbv_bv_u8_add(s1, s3907);+  const SBool  s3913 = s3912 < s1;+  const SBool  s3914 = s3912 < s3907;+  const SBool  s3915 = s3913 || s3914;+  const SWord8 s3916 = sbv_bv_u8_rotr(s3912, 1);+  const SWord8 s3917 = 128 | s3916;+  const SWord8 s3918 = 127 & s3916;+  const SWord8 s3919 = s3915 ? s3917 : s3918;+  const SWord8 s3920 = s3848 ? s3911 : s3919;+  const SWord8 s3921 = sbv_bv_u8_add(s1, s3903);+  const SBool  s3922 = s3921 < s1;+  const SBool  s3923 = s3921 < s3903;+  const SBool  s3924 = s3922 || s3923;+  const SWord8 s3925 = sbv_bv_u8_rotr(s3921, 1);+  const SWord8 s3926 = 128 | s3925;+  const SWord8 s3927 = 127 & s3925;+  const SWord8 s3928 = s3924 ? s3926 : s3927;+  const SWord8 s3929 = sbv_bv_u8_rotr(s3928, 1);+  const SWord8 s3930 = 128 | s3929;+  const SWord8 s3931 = 127 & s3929;+  const SWord8 s3932 = s3847 ? s3930 : s3931;+  const SWord8 s3933 = sbv_bv_u8_add(s1, s3928);+  const SBool  s3934 = s3933 < s1;+  const SBool  s3935 = s3933 < s3928;+  const SBool  s3936 = s3934 || s3935;+  const SWord8 s3937 = sbv_bv_u8_rotr(s3933, 1);+  const SWord8 s3938 = 128 | s3937;+  const SWord8 s3939 = 127 & s3937;+  const SWord8 s3940 = s3936 ? s3938 : s3939;+  const SWord8 s3941 = s3848 ? s3932 : s3940;+  const SWord8 s3942 = s3826 ? s3920 : s3941;+  const SWord8 s3943 = s3571 ? s3895 : s3942;+  const SWord8 s3944 = sbv_bv_u8_add(s1, s3833);+  const SBool  s3945 = sbv_bv_extract_u8_0_0_u1(s3944);+  const SBool  s3946 = false != s3945;+  const SWord8 s3947 = s3946 ? s3837 : s3838;+  const SBool  s3948 = sbv_bv_extract_u8_0_0_u1(s3947);+  const SBool  s3949 = false != s3948;+  const SWord8 s3950 = s3949 ? s3843 : s3844;+  const SBool  s3951 = sbv_bv_extract_u8_0_0_u1(s3950);+  const SBool  s3952 = false != s3951;+  const SBool  s3953 = !s3952;+  const SBool  s3954 = s3944 < s1;+  const SBool  s3955 = s3944 < s3833;+  const SBool  s3956 = s3954 || s3955;+  const SWord8 s3957 = sbv_bv_u8_rotr(s3944, 1);+  const SWord8 s3958 = 128 | s3957;+  const SWord8 s3959 = 127 & s3957;+  const SWord8 s3960 = s3956 ? s3958 : s3959;+  const SWord8 s3961 = sbv_bv_u8_rotr(s3960, 1);+  const SWord8 s3962 = 128 | s3961;+  const SWord8 s3963 = 127 & s3961;+  const SWord8 s3964 = s3570 ? s3962 : s3963;+  const SWord8 s3965 = sbv_bv_u8_rotr(s3964, 1);+  const SWord8 s3966 = 128 | s3965;+  const SWord8 s3967 = 127 & s3965;+  const SWord8 s3968 = s3825 ? s3966 : s3967;+  const SWord8 s3969 = sbv_bv_u8_rotr(s3968, 1);+  const SWord8 s3970 = 128 | s3969;+  const SWord8 s3971 = 127 & s3969;+  const SWord8 s3972 = s3952 ? s3970 : s3971;+  const SWord8 s3973 = sbv_bv_u8_add(s1, s3968);+  const SBool  s3974 = s3973 < s1;+  const SBool  s3975 = s3973 < s3968;+  const SBool  s3976 = s3974 || s3975;+  const SWord8 s3977 = sbv_bv_u8_rotr(s3973, 1);+  const SWord8 s3978 = 128 | s3977;+  const SWord8 s3979 = 127 & s3977;+  const SWord8 s3980 = s3976 ? s3978 : s3979;+  const SWord8 s3981 = s3953 ? s3972 : s3980;+  const SWord8 s3982 = sbv_bv_u8_add(s1, s3964);+  const SBool  s3983 = s3982 < s1;+  const SBool  s3984 = s3982 < s3964;+  const SBool  s3985 = s3983 || s3984;+  const SWord8 s3986 = sbv_bv_u8_rotr(s3982, 1);+  const SWord8 s3987 = 128 | s3986;+  const SWord8 s3988 = 127 & s3986;+  const SWord8 s3989 = s3985 ? s3987 : s3988;+  const SWord8 s3990 = sbv_bv_u8_rotr(s3989, 1);+  const SWord8 s3991 = 128 | s3990;+  const SWord8 s3992 = 127 & s3990;+  const SWord8 s3993 = s3952 ? s3991 : s3992;+  const SWord8 s3994 = sbv_bv_u8_add(s1, s3989);+  const SBool  s3995 = s3994 < s1;+  const SBool  s3996 = s3994 < s3989;+  const SBool  s3997 = s3995 || s3996;+  const SWord8 s3998 = sbv_bv_u8_rotr(s3994, 1);+  const SWord8 s3999 = 128 | s3998;+  const SWord8 s4000 = 127 & s3998;+  const SWord8 s4001 = s3997 ? s3999 : s4000;+  const SWord8 s4002 = s3953 ? s3993 : s4001;+  const SWord8 s4003 = s3826 ? s3981 : s4002;+  const SWord8 s4004 = sbv_bv_u8_add(s1, s3960);+  const SBool  s4005 = s4004 < s1;+  const SBool  s4006 = s4004 < s3960;+  const SBool  s4007 = s4005 || s4006;+  const SWord8 s4008 = sbv_bv_u8_rotr(s4004, 1);+  const SWord8 s4009 = 128 | s4008;+  const SWord8 s4010 = 127 & s4008;+  const SWord8 s4011 = s4007 ? s4009 : s4010;+  const SWord8 s4012 = sbv_bv_u8_rotr(s4011, 1);+  const SWord8 s4013 = 128 | s4012;+  const SWord8 s4014 = 127 & s4012;+  const SWord8 s4015 = s3825 ? s4013 : s4014;+  const SWord8 s4016 = sbv_bv_u8_rotr(s4015, 1);+  const SWord8 s4017 = 128 | s4016;+  const SWord8 s4018 = 127 & s4016;+  const SWord8 s4019 = s3952 ? s4017 : s4018;+  const SWord8 s4020 = sbv_bv_u8_add(s1, s4015);+  const SBool  s4021 = s4020 < s1;+  const SBool  s4022 = s4020 < s4015;+  const SBool  s4023 = s4021 || s4022;+  const SWord8 s4024 = sbv_bv_u8_rotr(s4020, 1);+  const SWord8 s4025 = 128 | s4024;+  const SWord8 s4026 = 127 & s4024;+  const SWord8 s4027 = s4023 ? s4025 : s4026;+  const SWord8 s4028 = s3953 ? s4019 : s4027;+  const SWord8 s4029 = sbv_bv_u8_add(s1, s4011);+  const SBool  s4030 = s4029 < s1;+  const SBool  s4031 = s4029 < s4011;+  const SBool  s4032 = s4030 || s4031;+  const SWord8 s4033 = sbv_bv_u8_rotr(s4029, 1);+  const SWord8 s4034 = 128 | s4033;+  const SWord8 s4035 = 127 & s4033;+  const SWord8 s4036 = s4032 ? s4034 : s4035;+  const SWord8 s4037 = sbv_bv_u8_rotr(s4036, 1);+  const SWord8 s4038 = 128 | s4037;+  const SWord8 s4039 = 127 & s4037;+  const SWord8 s4040 = s3952 ? s4038 : s4039;+  const SWord8 s4041 = sbv_bv_u8_add(s1, s4036);+  const SBool  s4042 = s4041 < s1;+  const SBool  s4043 = s4041 < s4036;+  const SBool  s4044 = s4042 || s4043;+  const SWord8 s4045 = sbv_bv_u8_rotr(s4041, 1);+  const SWord8 s4046 = 128 | s4045;+  const SWord8 s4047 = 127 & s4045;+  const SWord8 s4048 = s4044 ? s4046 : s4047;+  const SWord8 s4049 = s3953 ? s4040 : s4048;+  const SWord8 s4050 = s3826 ? s4028 : s4049;+  const SWord8 s4051 = s3571 ? s4003 : s4050;+  const SWord8 s4052 = s3060 ? s3943 : s4051;+  const SWord8 s4053 = s2042 ? s3816 : s4052;+  const SWord8 s4054 = s16 ? s3561 : s4053;+  const SWord8 s4055 = s11 ? s3050 : s4054;+  const SWord8 s4056 = s5 ? s2032 : s4055;+  const SBool  s4057 = sbv_bv_extract_u8_0_0_u1(s105);+  const SBool  s4058 = false != s4057;+  const SBool  s4059 = sbv_bv_extract_u8_0_0_u1(s101);+  const SBool  s4060 = false != s4059;+  const SBool  s4061 = sbv_bv_extract_u8_0_0_u1(s97);+  const SBool  s4062 = false != s4061;+  const SWord8 s4063 = sbv_bv_u8_rotr(s84, 1);+  const SWord8 s4064 = 128 | s4063;+  const SWord8 s4065 = 127 & s4063;+  const SWord8 s4066 = s4062 ? s4064 : s4065;+  const SWord8 s4067 = sbv_bv_u8_rotr(s4066, 1);+  const SWord8 s4068 = 128 | s4067;+  const SWord8 s4069 = 127 & s4067;+  const SWord8 s4070 = s4060 ? s4068 : s4069;+  const SWord8 s4071 = sbv_bv_u8_rotr(s4070, 1);+  const SWord8 s4072 = 128 | s4071;+  const SWord8 s4073 = 127 & s4071;+  const SWord8 s4074 = s4058 ? s4072 : s4073;+  const SBool  s4075 = sbv_bv_extract_u8_0_0_u1(s110);+  const SBool  s4076 = false != s4075;+  const SWord8 s4077 = s4076 ? s4072 : s4073;+  const SWord8 s4078 = s93 ? s4074 : s4077;+  const SBool  s4079 = sbv_bv_extract_u8_0_0_u1(s126);+  const SBool  s4080 = false != s4079;+  const SBool  s4081 = sbv_bv_extract_u8_0_0_u1(s119);+  const SBool  s4082 = false != s4081;+  const SWord8 s4083 = s4082 ? s4068 : s4069;+  const SWord8 s4084 = sbv_bv_u8_rotr(s4083, 1);+  const SWord8 s4085 = 128 | s4084;+  const SWord8 s4086 = 127 & s4084;+  const SWord8 s4087 = s4080 ? s4085 : s4086;+  const SBool  s4088 = sbv_bv_extract_u8_0_0_u1(s131);+  const SBool  s4089 = false != s4088;+  const SWord8 s4090 = s4089 ? s4085 : s4086;+  const SWord8 s4091 = s93 ? s4087 : s4090;+  const SWord8 s4092 = s74 ? s4078 : s4091;+  const SBool  s4093 = sbv_bv_extract_u8_0_0_u1(s152);+  const SBool  s4094 = false != s4093;+  const SBool  s4095 = sbv_bv_extract_u8_0_0_u1(s148);+  const SBool  s4096 = false != s4095;+  const SBool  s4097 = sbv_bv_extract_u8_0_0_u1(s141);+  const SBool  s4098 = false != s4097;+  const SWord8 s4099 = s4098 ? s4064 : s4065;+  const SWord8 s4100 = sbv_bv_u8_rotr(s4099, 1);+  const SWord8 s4101 = 128 | s4100;+  const SWord8 s4102 = 127 & s4100;+  const SWord8 s4103 = s4096 ? s4101 : s4102;+  const SWord8 s4104 = sbv_bv_u8_rotr(s4103, 1);+  const SWord8 s4105 = 128 | s4104;+  const SWord8 s4106 = 127 & s4104;+  const SWord8 s4107 = s4094 ? s4105 : s4106;+  const SBool  s4108 = sbv_bv_extract_u8_0_0_u1(s157);+  const SBool  s4109 = false != s4108;+  const SWord8 s4110 = s4109 ? s4105 : s4106;+  const SWord8 s4111 = s93 ? s4107 : s4110;+  const SBool  s4112 = sbv_bv_extract_u8_0_0_u1(s173);+  const SBool  s4113 = false != s4112;+  const SBool  s4114 = sbv_bv_extract_u8_0_0_u1(s166);+  const SBool  s4115 = false != s4114;+  const SWord8 s4116 = s4115 ? s4101 : s4102;+  const SWord8 s4117 = sbv_bv_u8_rotr(s4116, 1);+  const SWord8 s4118 = 128 | s4117;+  const SWord8 s4119 = 127 & s4117;+  const SWord8 s4120 = s4113 ? s4118 : s4119;+  const SBool  s4121 = sbv_bv_extract_u8_0_0_u1(s178);+  const SBool  s4122 = false != s4121;+  const SWord8 s4123 = s4122 ? s4118 : s4119;+  const SWord8 s4124 = s93 ? s4120 : s4123;+  const SWord8 s4125 = s74 ? s4111 : s4124;+  const SWord8 s4126 = s55 ? s4092 : s4125;+  const SBool  s4127 = sbv_bv_extract_u8_0_0_u1(s213);+  const SBool  s4128 = false != s4127;+  const SBool  s4129 = sbv_bv_extract_u8_0_0_u1(s209);+  const SBool  s4130 = false != s4129;+  const SBool  s4131 = sbv_bv_extract_u8_0_0_u1(s205);+  const SBool  s4132 = false != s4131;+  const SWord8 s4133 = sbv_bv_u8_rotr(s192, 1);+  const SWord8 s4134 = 128 | s4133;+  const SWord8 s4135 = 127 & s4133;+  const SWord8 s4136 = s4132 ? s4134 : s4135;+  const SWord8 s4137 = sbv_bv_u8_rotr(s4136, 1);+  const SWord8 s4138 = 128 | s4137;+  const SWord8 s4139 = 127 & s4137;+  const SWord8 s4140 = s4130 ? s4138 : s4139;+  const SWord8 s4141 = sbv_bv_u8_rotr(s4140, 1);+  const SWord8 s4142 = 128 | s4141;+  const SWord8 s4143 = 127 & s4141;+  const SWord8 s4144 = s4128 ? s4142 : s4143;+  const SBool  s4145 = sbv_bv_extract_u8_0_0_u1(s218);+  const SBool  s4146 = false != s4145;+  const SWord8 s4147 = s4146 ? s4142 : s4143;+  const SWord8 s4148 = s198 ? s4144 : s4147;+  const SBool  s4149 = sbv_bv_extract_u8_0_0_u1(s234);+  const SBool  s4150 = false != s4149;+  const SBool  s4151 = sbv_bv_extract_u8_0_0_u1(s227);+  const SBool  s4152 = false != s4151;+  const SWord8 s4153 = s4152 ? s4138 : s4139;+  const SWord8 s4154 = sbv_bv_u8_rotr(s4153, 1);+  const SWord8 s4155 = 128 | s4154;+  const SWord8 s4156 = 127 & s4154;+  const SWord8 s4157 = s4150 ? s4155 : s4156;+  const SBool  s4158 = sbv_bv_extract_u8_0_0_u1(s239);+  const SBool  s4159 = false != s4158;+  const SWord8 s4160 = s4159 ? s4155 : s4156;+  const SWord8 s4161 = s198 ? s4157 : s4160;+  const SWord8 s4162 = s74 ? s4148 : s4161;+  const SBool  s4163 = sbv_bv_extract_u8_0_0_u1(s260);+  const SBool  s4164 = false != s4163;+  const SBool  s4165 = sbv_bv_extract_u8_0_0_u1(s256);+  const SBool  s4166 = false != s4165;+  const SBool  s4167 = sbv_bv_extract_u8_0_0_u1(s249);+  const SBool  s4168 = false != s4167;+  const SWord8 s4169 = s4168 ? s4134 : s4135;+  const SWord8 s4170 = sbv_bv_u8_rotr(s4169, 1);+  const SWord8 s4171 = 128 | s4170;+  const SWord8 s4172 = 127 & s4170;+  const SWord8 s4173 = s4166 ? s4171 : s4172;+  const SWord8 s4174 = sbv_bv_u8_rotr(s4173, 1);+  const SWord8 s4175 = 128 | s4174;+  const SWord8 s4176 = 127 & s4174;+  const SWord8 s4177 = s4164 ? s4175 : s4176;+  const SBool  s4178 = sbv_bv_extract_u8_0_0_u1(s265);+  const SBool  s4179 = false != s4178;+  const SWord8 s4180 = s4179 ? s4175 : s4176;+  const SWord8 s4181 = s198 ? s4177 : s4180;+  const SBool  s4182 = sbv_bv_extract_u8_0_0_u1(s281);+  const SBool  s4183 = false != s4182;+  const SBool  s4184 = sbv_bv_extract_u8_0_0_u1(s274);+  const SBool  s4185 = false != s4184;+  const SWord8 s4186 = s4185 ? s4171 : s4172;+  const SWord8 s4187 = sbv_bv_u8_rotr(s4186, 1);+  const SWord8 s4188 = 128 | s4187;+  const SWord8 s4189 = 127 & s4187;+  const SWord8 s4190 = s4183 ? s4188 : s4189;+  const SBool  s4191 = sbv_bv_extract_u8_0_0_u1(s286);+  const SBool  s4192 = false != s4191;+  const SWord8 s4193 = s4192 ? s4188 : s4189;+  const SWord8 s4194 = s198 ? s4190 : s4193;+  const SWord8 s4195 = s74 ? s4181 : s4194;+  const SWord8 s4196 = s55 ? s4162 : s4195;+  const SWord8 s4197 = s36 ? s4126 : s4196;+  const SBool  s4198 = sbv_bv_extract_u8_0_0_u1(s341);+  const SBool  s4199 = false != s4198;+  const SBool  s4200 = sbv_bv_extract_u8_0_0_u1(s337);+  const SBool  s4201 = false != s4200;+  const SBool  s4202 = sbv_bv_extract_u8_0_0_u1(s333);+  const SBool  s4203 = false != s4202;+  const SWord8 s4204 = sbv_bv_u8_rotr(s320, 1);+  const SWord8 s4205 = 128 | s4204;+  const SWord8 s4206 = 127 & s4204;+  const SWord8 s4207 = s4203 ? s4205 : s4206;+  const SWord8 s4208 = sbv_bv_u8_rotr(s4207, 1);+  const SWord8 s4209 = 128 | s4208;+  const SWord8 s4210 = 127 & s4208;+  const SWord8 s4211 = s4201 ? s4209 : s4210;+  const SWord8 s4212 = sbv_bv_u8_rotr(s4211, 1);+  const SWord8 s4213 = 128 | s4212;+  const SWord8 s4214 = 127 & s4212;+  const SWord8 s4215 = s4199 ? s4213 : s4214;+  const SBool  s4216 = sbv_bv_extract_u8_0_0_u1(s346);+  const SBool  s4217 = false != s4216;+  const SWord8 s4218 = s4217 ? s4213 : s4214;+  const SWord8 s4219 = s329 ? s4215 : s4218;+  const SBool  s4220 = sbv_bv_extract_u8_0_0_u1(s362);+  const SBool  s4221 = false != s4220;+  const SBool  s4222 = sbv_bv_extract_u8_0_0_u1(s355);+  const SBool  s4223 = false != s4222;+  const SWord8 s4224 = s4223 ? s4209 : s4210;+  const SWord8 s4225 = sbv_bv_u8_rotr(s4224, 1);+  const SWord8 s4226 = 128 | s4225;+  const SWord8 s4227 = 127 & s4225;+  const SWord8 s4228 = s4221 ? s4226 : s4227;+  const SBool  s4229 = sbv_bv_extract_u8_0_0_u1(s367);+  const SBool  s4230 = false != s4229;+  const SWord8 s4231 = s4230 ? s4226 : s4227;+  const SWord8 s4232 = s329 ? s4228 : s4231;+  const SWord8 s4233 = s307 ? s4219 : s4232;+  const SBool  s4234 = sbv_bv_extract_u8_0_0_u1(s388);+  const SBool  s4235 = false != s4234;+  const SBool  s4236 = sbv_bv_extract_u8_0_0_u1(s384);+  const SBool  s4237 = false != s4236;+  const SBool  s4238 = sbv_bv_extract_u8_0_0_u1(s377);+  const SBool  s4239 = false != s4238;+  const SWord8 s4240 = s4239 ? s4205 : s4206;+  const SWord8 s4241 = sbv_bv_u8_rotr(s4240, 1);+  const SWord8 s4242 = 128 | s4241;+  const SWord8 s4243 = 127 & s4241;+  const SWord8 s4244 = s4237 ? s4242 : s4243;+  const SWord8 s4245 = sbv_bv_u8_rotr(s4244, 1);+  const SWord8 s4246 = 128 | s4245;+  const SWord8 s4247 = 127 & s4245;+  const SWord8 s4248 = s4235 ? s4246 : s4247;+  const SBool  s4249 = sbv_bv_extract_u8_0_0_u1(s393);+  const SBool  s4250 = false != s4249;+  const SWord8 s4251 = s4250 ? s4246 : s4247;+  const SWord8 s4252 = s329 ? s4248 : s4251;+  const SBool  s4253 = sbv_bv_extract_u8_0_0_u1(s409);+  const SBool  s4254 = false != s4253;+  const SBool  s4255 = sbv_bv_extract_u8_0_0_u1(s402);+  const SBool  s4256 = false != s4255;+  const SWord8 s4257 = s4256 ? s4242 : s4243;+  const SWord8 s4258 = sbv_bv_u8_rotr(s4257, 1);+  const SWord8 s4259 = 128 | s4258;+  const SWord8 s4260 = 127 & s4258;+  const SWord8 s4261 = s4254 ? s4259 : s4260;+  const SBool  s4262 = sbv_bv_extract_u8_0_0_u1(s414);+  const SBool  s4263 = false != s4262;+  const SWord8 s4264 = s4263 ? s4259 : s4260;+  const SWord8 s4265 = s329 ? s4261 : s4264;+  const SWord8 s4266 = s307 ? s4252 : s4265;+  const SWord8 s4267 = s55 ? s4233 : s4266;+  const SBool  s4268 = sbv_bv_extract_u8_0_0_u1(s449);+  const SBool  s4269 = false != s4268;+  const SBool  s4270 = sbv_bv_extract_u8_0_0_u1(s445);+  const SBool  s4271 = false != s4270;+  const SBool  s4272 = sbv_bv_extract_u8_0_0_u1(s441);+  const SBool  s4273 = false != s4272;+  const SWord8 s4274 = sbv_bv_u8_rotr(s428, 1);+  const SWord8 s4275 = 128 | s4274;+  const SWord8 s4276 = 127 & s4274;+  const SWord8 s4277 = s4273 ? s4275 : s4276;+  const SWord8 s4278 = sbv_bv_u8_rotr(s4277, 1);+  const SWord8 s4279 = 128 | s4278;+  const SWord8 s4280 = 127 & s4278;+  const SWord8 s4281 = s4271 ? s4279 : s4280;+  const SWord8 s4282 = sbv_bv_u8_rotr(s4281, 1);+  const SWord8 s4283 = 128 | s4282;+  const SWord8 s4284 = 127 & s4282;+  const SWord8 s4285 = s4269 ? s4283 : s4284;+  const SBool  s4286 = sbv_bv_extract_u8_0_0_u1(s454);+  const SBool  s4287 = false != s4286;+  const SWord8 s4288 = s4287 ? s4283 : s4284;+  const SWord8 s4289 = s434 ? s4285 : s4288;+  const SBool  s4290 = sbv_bv_extract_u8_0_0_u1(s470);+  const SBool  s4291 = false != s4290;+  const SBool  s4292 = sbv_bv_extract_u8_0_0_u1(s463);+  const SBool  s4293 = false != s4292;+  const SWord8 s4294 = s4293 ? s4279 : s4280;+  const SWord8 s4295 = sbv_bv_u8_rotr(s4294, 1);+  const SWord8 s4296 = 128 | s4295;+  const SWord8 s4297 = 127 & s4295;+  const SWord8 s4298 = s4291 ? s4296 : s4297;+  const SBool  s4299 = sbv_bv_extract_u8_0_0_u1(s475);+  const SBool  s4300 = false != s4299;+  const SWord8 s4301 = s4300 ? s4296 : s4297;+  const SWord8 s4302 = s434 ? s4298 : s4301;+  const SWord8 s4303 = s307 ? s4289 : s4302;+  const SBool  s4304 = sbv_bv_extract_u8_0_0_u1(s496);+  const SBool  s4305 = false != s4304;+  const SBool  s4306 = sbv_bv_extract_u8_0_0_u1(s492);+  const SBool  s4307 = false != s4306;+  const SBool  s4308 = sbv_bv_extract_u8_0_0_u1(s485);+  const SBool  s4309 = false != s4308;+  const SWord8 s4310 = s4309 ? s4275 : s4276;+  const SWord8 s4311 = sbv_bv_u8_rotr(s4310, 1);+  const SWord8 s4312 = 128 | s4311;+  const SWord8 s4313 = 127 & s4311;+  const SWord8 s4314 = s4307 ? s4312 : s4313;+  const SWord8 s4315 = sbv_bv_u8_rotr(s4314, 1);+  const SWord8 s4316 = 128 | s4315;+  const SWord8 s4317 = 127 & s4315;+  const SWord8 s4318 = s4305 ? s4316 : s4317;+  const SBool  s4319 = sbv_bv_extract_u8_0_0_u1(s501);+  const SBool  s4320 = false != s4319;+  const SWord8 s4321 = s4320 ? s4316 : s4317;+  const SWord8 s4322 = s434 ? s4318 : s4321;+  const SBool  s4323 = sbv_bv_extract_u8_0_0_u1(s517);+  const SBool  s4324 = false != s4323;+  const SBool  s4325 = sbv_bv_extract_u8_0_0_u1(s510);+  const SBool  s4326 = false != s4325;+  const SWord8 s4327 = s4326 ? s4312 : s4313;+  const SWord8 s4328 = sbv_bv_u8_rotr(s4327, 1);+  const SWord8 s4329 = 128 | s4328;+  const SWord8 s4330 = 127 & s4328;+  const SWord8 s4331 = s4324 ? s4329 : s4330;+  const SBool  s4332 = sbv_bv_extract_u8_0_0_u1(s522);+  const SBool  s4333 = false != s4332;+  const SWord8 s4334 = s4333 ? s4329 : s4330;+  const SWord8 s4335 = s434 ? s4331 : s4334;+  const SWord8 s4336 = s307 ? s4322 : s4335;+  const SWord8 s4337 = s55 ? s4303 : s4336;+  const SWord8 s4338 = s36 ? s4267 : s4337;+  const SWord8 s4339 = s21 ? s4197 : s4338;+  const SBool  s4340 = sbv_bv_extract_u8_0_0_u1(s597);+  const SBool  s4341 = false != s4340;+  const SBool  s4342 = sbv_bv_extract_u8_0_0_u1(s593);+  const SBool  s4343 = false != s4342;+  const SBool  s4344 = sbv_bv_extract_u8_0_0_u1(s589);+  const SBool  s4345 = false != s4344;+  const SWord8 s4346 = sbv_bv_u8_rotr(s576, 1);+  const SWord8 s4347 = 128 | s4346;+  const SWord8 s4348 = 127 & s4346;+  const SWord8 s4349 = s4345 ? s4347 : s4348;+  const SWord8 s4350 = sbv_bv_u8_rotr(s4349, 1);+  const SWord8 s4351 = 128 | s4350;+  const SWord8 s4352 = 127 & s4350;+  const SWord8 s4353 = s4343 ? s4351 : s4352;+  const SWord8 s4354 = sbv_bv_u8_rotr(s4353, 1);+  const SWord8 s4355 = 128 | s4354;+  const SWord8 s4356 = 127 & s4354;+  const SWord8 s4357 = s4341 ? s4355 : s4356;+  const SBool  s4358 = sbv_bv_extract_u8_0_0_u1(s602);+  const SBool  s4359 = false != s4358;+  const SWord8 s4360 = s4359 ? s4355 : s4356;+  const SWord8 s4361 = s585 ? s4357 : s4360;+  const SBool  s4362 = sbv_bv_extract_u8_0_0_u1(s618);+  const SBool  s4363 = false != s4362;+  const SBool  s4364 = sbv_bv_extract_u8_0_0_u1(s611);+  const SBool  s4365 = false != s4364;+  const SWord8 s4366 = s4365 ? s4351 : s4352;+  const SWord8 s4367 = sbv_bv_u8_rotr(s4366, 1);+  const SWord8 s4368 = 128 | s4367;+  const SWord8 s4369 = 127 & s4367;+  const SWord8 s4370 = s4363 ? s4368 : s4369;+  const SBool  s4371 = sbv_bv_extract_u8_0_0_u1(s623);+  const SBool  s4372 = false != s4371;+  const SWord8 s4373 = s4372 ? s4368 : s4369;+  const SWord8 s4374 = s585 ? s4370 : s4373;+  const SWord8 s4375 = s566 ? s4361 : s4374;+  const SBool  s4376 = sbv_bv_extract_u8_0_0_u1(s644);+  const SBool  s4377 = false != s4376;+  const SBool  s4378 = sbv_bv_extract_u8_0_0_u1(s640);+  const SBool  s4379 = false != s4378;+  const SBool  s4380 = sbv_bv_extract_u8_0_0_u1(s633);+  const SBool  s4381 = false != s4380;+  const SWord8 s4382 = s4381 ? s4347 : s4348;+  const SWord8 s4383 = sbv_bv_u8_rotr(s4382, 1);+  const SWord8 s4384 = 128 | s4383;+  const SWord8 s4385 = 127 & s4383;+  const SWord8 s4386 = s4379 ? s4384 : s4385;+  const SWord8 s4387 = sbv_bv_u8_rotr(s4386, 1);+  const SWord8 s4388 = 128 | s4387;+  const SWord8 s4389 = 127 & s4387;+  const SWord8 s4390 = s4377 ? s4388 : s4389;+  const SBool  s4391 = sbv_bv_extract_u8_0_0_u1(s649);+  const SBool  s4392 = false != s4391;+  const SWord8 s4393 = s4392 ? s4388 : s4389;+  const SWord8 s4394 = s585 ? s4390 : s4393;+  const SBool  s4395 = sbv_bv_extract_u8_0_0_u1(s665);+  const SBool  s4396 = false != s4395;+  const SBool  s4397 = sbv_bv_extract_u8_0_0_u1(s658);+  const SBool  s4398 = false != s4397;+  const SWord8 s4399 = s4398 ? s4384 : s4385;+  const SWord8 s4400 = sbv_bv_u8_rotr(s4399, 1);+  const SWord8 s4401 = 128 | s4400;+  const SWord8 s4402 = 127 & s4400;+  const SWord8 s4403 = s4396 ? s4401 : s4402;+  const SBool  s4404 = sbv_bv_extract_u8_0_0_u1(s670);+  const SBool  s4405 = false != s4404;+  const SWord8 s4406 = s4405 ? s4401 : s4402;+  const SWord8 s4407 = s585 ? s4403 : s4406;+  const SWord8 s4408 = s566 ? s4394 : s4407;+  const SWord8 s4409 = s544 ? s4375 : s4408;+  const SBool  s4410 = sbv_bv_extract_u8_0_0_u1(s705);+  const SBool  s4411 = false != s4410;+  const SBool  s4412 = sbv_bv_extract_u8_0_0_u1(s701);+  const SBool  s4413 = false != s4412;+  const SBool  s4414 = sbv_bv_extract_u8_0_0_u1(s697);+  const SBool  s4415 = false != s4414;+  const SWord8 s4416 = sbv_bv_u8_rotr(s684, 1);+  const SWord8 s4417 = 128 | s4416;+  const SWord8 s4418 = 127 & s4416;+  const SWord8 s4419 = s4415 ? s4417 : s4418;+  const SWord8 s4420 = sbv_bv_u8_rotr(s4419, 1);+  const SWord8 s4421 = 128 | s4420;+  const SWord8 s4422 = 127 & s4420;+  const SWord8 s4423 = s4413 ? s4421 : s4422;+  const SWord8 s4424 = sbv_bv_u8_rotr(s4423, 1);+  const SWord8 s4425 = 128 | s4424;+  const SWord8 s4426 = 127 & s4424;+  const SWord8 s4427 = s4411 ? s4425 : s4426;+  const SBool  s4428 = sbv_bv_extract_u8_0_0_u1(s710);+  const SBool  s4429 = false != s4428;+  const SWord8 s4430 = s4429 ? s4425 : s4426;+  const SWord8 s4431 = s690 ? s4427 : s4430;+  const SBool  s4432 = sbv_bv_extract_u8_0_0_u1(s726);+  const SBool  s4433 = false != s4432;+  const SBool  s4434 = sbv_bv_extract_u8_0_0_u1(s719);+  const SBool  s4435 = false != s4434;+  const SWord8 s4436 = s4435 ? s4421 : s4422;+  const SWord8 s4437 = sbv_bv_u8_rotr(s4436, 1);+  const SWord8 s4438 = 128 | s4437;+  const SWord8 s4439 = 127 & s4437;+  const SWord8 s4440 = s4433 ? s4438 : s4439;+  const SBool  s4441 = sbv_bv_extract_u8_0_0_u1(s731);+  const SBool  s4442 = false != s4441;+  const SWord8 s4443 = s4442 ? s4438 : s4439;+  const SWord8 s4444 = s690 ? s4440 : s4443;+  const SWord8 s4445 = s566 ? s4431 : s4444;+  const SBool  s4446 = sbv_bv_extract_u8_0_0_u1(s752);+  const SBool  s4447 = false != s4446;+  const SBool  s4448 = sbv_bv_extract_u8_0_0_u1(s748);+  const SBool  s4449 = false != s4448;+  const SBool  s4450 = sbv_bv_extract_u8_0_0_u1(s741);+  const SBool  s4451 = false != s4450;+  const SWord8 s4452 = s4451 ? s4417 : s4418;+  const SWord8 s4453 = sbv_bv_u8_rotr(s4452, 1);+  const SWord8 s4454 = 128 | s4453;+  const SWord8 s4455 = 127 & s4453;+  const SWord8 s4456 = s4449 ? s4454 : s4455;+  const SWord8 s4457 = sbv_bv_u8_rotr(s4456, 1);+  const SWord8 s4458 = 128 | s4457;+  const SWord8 s4459 = 127 & s4457;+  const SWord8 s4460 = s4447 ? s4458 : s4459;+  const SBool  s4461 = sbv_bv_extract_u8_0_0_u1(s757);+  const SBool  s4462 = false != s4461;+  const SWord8 s4463 = s4462 ? s4458 : s4459;+  const SWord8 s4464 = s690 ? s4460 : s4463;+  const SBool  s4465 = sbv_bv_extract_u8_0_0_u1(s773);+  const SBool  s4466 = false != s4465;+  const SBool  s4467 = sbv_bv_extract_u8_0_0_u1(s766);+  const SBool  s4468 = false != s4467;+  const SWord8 s4469 = s4468 ? s4454 : s4455;+  const SWord8 s4470 = sbv_bv_u8_rotr(s4469, 1);+  const SWord8 s4471 = 128 | s4470;+  const SWord8 s4472 = 127 & s4470;+  const SWord8 s4473 = s4466 ? s4471 : s4472;+  const SBool  s4474 = sbv_bv_extract_u8_0_0_u1(s778);+  const SBool  s4475 = false != s4474;+  const SWord8 s4476 = s4475 ? s4471 : s4472;+  const SWord8 s4477 = s690 ? s4473 : s4476;+  const SWord8 s4478 = s566 ? s4464 : s4477;+  const SWord8 s4479 = s544 ? s4445 : s4478;+  const SWord8 s4480 = s36 ? s4409 : s4479;+  const SBool  s4481 = sbv_bv_extract_u8_0_0_u1(s833);+  const SBool  s4482 = false != s4481;+  const SBool  s4483 = sbv_bv_extract_u8_0_0_u1(s829);+  const SBool  s4484 = false != s4483;+  const SBool  s4485 = sbv_bv_extract_u8_0_0_u1(s825);+  const SBool  s4486 = false != s4485;+  const SWord8 s4487 = sbv_bv_u8_rotr(s812, 1);+  const SWord8 s4488 = 128 | s4487;+  const SWord8 s4489 = 127 & s4487;+  const SWord8 s4490 = s4486 ? s4488 : s4489;+  const SWord8 s4491 = sbv_bv_u8_rotr(s4490, 1);+  const SWord8 s4492 = 128 | s4491;+  const SWord8 s4493 = 127 & s4491;+  const SWord8 s4494 = s4484 ? s4492 : s4493;+  const SWord8 s4495 = sbv_bv_u8_rotr(s4494, 1);+  const SWord8 s4496 = 128 | s4495;+  const SWord8 s4497 = 127 & s4495;+  const SWord8 s4498 = s4482 ? s4496 : s4497;+  const SBool  s4499 = sbv_bv_extract_u8_0_0_u1(s838);+  const SBool  s4500 = false != s4499;+  const SWord8 s4501 = s4500 ? s4496 : s4497;+  const SWord8 s4502 = s821 ? s4498 : s4501;+  const SBool  s4503 = sbv_bv_extract_u8_0_0_u1(s854);+  const SBool  s4504 = false != s4503;+  const SBool  s4505 = sbv_bv_extract_u8_0_0_u1(s847);+  const SBool  s4506 = false != s4505;+  const SWord8 s4507 = s4506 ? s4492 : s4493;+  const SWord8 s4508 = sbv_bv_u8_rotr(s4507, 1);+  const SWord8 s4509 = 128 | s4508;+  const SWord8 s4510 = 127 & s4508;+  const SWord8 s4511 = s4504 ? s4509 : s4510;+  const SBool  s4512 = sbv_bv_extract_u8_0_0_u1(s859);+  const SBool  s4513 = false != s4512;+  const SWord8 s4514 = s4513 ? s4509 : s4510;+  const SWord8 s4515 = s821 ? s4511 : s4514;+  const SWord8 s4516 = s799 ? s4502 : s4515;+  const SBool  s4517 = sbv_bv_extract_u8_0_0_u1(s880);+  const SBool  s4518 = false != s4517;+  const SBool  s4519 = sbv_bv_extract_u8_0_0_u1(s876);+  const SBool  s4520 = false != s4519;+  const SBool  s4521 = sbv_bv_extract_u8_0_0_u1(s869);+  const SBool  s4522 = false != s4521;+  const SWord8 s4523 = s4522 ? s4488 : s4489;+  const SWord8 s4524 = sbv_bv_u8_rotr(s4523, 1);+  const SWord8 s4525 = 128 | s4524;+  const SWord8 s4526 = 127 & s4524;+  const SWord8 s4527 = s4520 ? s4525 : s4526;+  const SWord8 s4528 = sbv_bv_u8_rotr(s4527, 1);+  const SWord8 s4529 = 128 | s4528;+  const SWord8 s4530 = 127 & s4528;+  const SWord8 s4531 = s4518 ? s4529 : s4530;+  const SBool  s4532 = sbv_bv_extract_u8_0_0_u1(s885);+  const SBool  s4533 = false != s4532;+  const SWord8 s4534 = s4533 ? s4529 : s4530;+  const SWord8 s4535 = s821 ? s4531 : s4534;+  const SBool  s4536 = sbv_bv_extract_u8_0_0_u1(s901);+  const SBool  s4537 = false != s4536;+  const SBool  s4538 = sbv_bv_extract_u8_0_0_u1(s894);+  const SBool  s4539 = false != s4538;+  const SWord8 s4540 = s4539 ? s4525 : s4526;+  const SWord8 s4541 = sbv_bv_u8_rotr(s4540, 1);+  const SWord8 s4542 = 128 | s4541;+  const SWord8 s4543 = 127 & s4541;+  const SWord8 s4544 = s4537 ? s4542 : s4543;+  const SBool  s4545 = sbv_bv_extract_u8_0_0_u1(s906);+  const SBool  s4546 = false != s4545;+  const SWord8 s4547 = s4546 ? s4542 : s4543;+  const SWord8 s4548 = s821 ? s4544 : s4547;+  const SWord8 s4549 = s799 ? s4535 : s4548;+  const SWord8 s4550 = s544 ? s4516 : s4549;+  const SBool  s4551 = sbv_bv_extract_u8_0_0_u1(s941);+  const SBool  s4552 = false != s4551;+  const SBool  s4553 = sbv_bv_extract_u8_0_0_u1(s937);+  const SBool  s4554 = false != s4553;+  const SBool  s4555 = sbv_bv_extract_u8_0_0_u1(s933);+  const SBool  s4556 = false != s4555;+  const SWord8 s4557 = sbv_bv_u8_rotr(s920, 1);+  const SWord8 s4558 = 128 | s4557;+  const SWord8 s4559 = 127 & s4557;+  const SWord8 s4560 = s4556 ? s4558 : s4559;+  const SWord8 s4561 = sbv_bv_u8_rotr(s4560, 1);+  const SWord8 s4562 = 128 | s4561;+  const SWord8 s4563 = 127 & s4561;+  const SWord8 s4564 = s4554 ? s4562 : s4563;+  const SWord8 s4565 = sbv_bv_u8_rotr(s4564, 1);+  const SWord8 s4566 = 128 | s4565;+  const SWord8 s4567 = 127 & s4565;+  const SWord8 s4568 = s4552 ? s4566 : s4567;+  const SBool  s4569 = sbv_bv_extract_u8_0_0_u1(s946);+  const SBool  s4570 = false != s4569;+  const SWord8 s4571 = s4570 ? s4566 : s4567;+  const SWord8 s4572 = s926 ? s4568 : s4571;+  const SBool  s4573 = sbv_bv_extract_u8_0_0_u1(s962);+  const SBool  s4574 = false != s4573;+  const SBool  s4575 = sbv_bv_extract_u8_0_0_u1(s955);+  const SBool  s4576 = false != s4575;+  const SWord8 s4577 = s4576 ? s4562 : s4563;+  const SWord8 s4578 = sbv_bv_u8_rotr(s4577, 1);+  const SWord8 s4579 = 128 | s4578;+  const SWord8 s4580 = 127 & s4578;+  const SWord8 s4581 = s4574 ? s4579 : s4580;+  const SBool  s4582 = sbv_bv_extract_u8_0_0_u1(s967);+  const SBool  s4583 = false != s4582;+  const SWord8 s4584 = s4583 ? s4579 : s4580;+  const SWord8 s4585 = s926 ? s4581 : s4584;+  const SWord8 s4586 = s799 ? s4572 : s4585;+  const SBool  s4587 = sbv_bv_extract_u8_0_0_u1(s988);+  const SBool  s4588 = false != s4587;+  const SBool  s4589 = sbv_bv_extract_u8_0_0_u1(s984);+  const SBool  s4590 = false != s4589;+  const SBool  s4591 = sbv_bv_extract_u8_0_0_u1(s977);+  const SBool  s4592 = false != s4591;+  const SWord8 s4593 = s4592 ? s4558 : s4559;+  const SWord8 s4594 = sbv_bv_u8_rotr(s4593, 1);+  const SWord8 s4595 = 128 | s4594;+  const SWord8 s4596 = 127 & s4594;+  const SWord8 s4597 = s4590 ? s4595 : s4596;+  const SWord8 s4598 = sbv_bv_u8_rotr(s4597, 1);+  const SWord8 s4599 = 128 | s4598;+  const SWord8 s4600 = 127 & s4598;+  const SWord8 s4601 = s4588 ? s4599 : s4600;+  const SBool  s4602 = sbv_bv_extract_u8_0_0_u1(s993);+  const SBool  s4603 = false != s4602;+  const SWord8 s4604 = s4603 ? s4599 : s4600;+  const SWord8 s4605 = s926 ? s4601 : s4604;+  const SBool  s4606 = sbv_bv_extract_u8_0_0_u1(s1009);+  const SBool  s4607 = false != s4606;+  const SBool  s4608 = sbv_bv_extract_u8_0_0_u1(s1002);+  const SBool  s4609 = false != s4608;+  const SWord8 s4610 = s4609 ? s4595 : s4596;+  const SWord8 s4611 = sbv_bv_u8_rotr(s4610, 1);+  const SWord8 s4612 = 128 | s4611;+  const SWord8 s4613 = 127 & s4611;+  const SWord8 s4614 = s4607 ? s4612 : s4613;+  const SBool  s4615 = sbv_bv_extract_u8_0_0_u1(s1014);+  const SBool  s4616 = false != s4615;+  const SWord8 s4617 = s4616 ? s4612 : s4613;+  const SWord8 s4618 = s926 ? s4614 : s4617;+  const SWord8 s4619 = s799 ? s4605 : s4618;+  const SWord8 s4620 = s544 ? s4586 : s4619;+  const SWord8 s4621 = s36 ? s4550 : s4620;+  const SWord8 s4622 = s21 ? s4480 : s4621;+  const SWord8 s4623 = s16 ? s4339 : s4622;+  const SBool  s4624 = sbv_bv_extract_u8_0_0_u1(s1109);+  const SBool  s4625 = false != s4624;+  const SBool  s4626 = sbv_bv_extract_u8_0_0_u1(s1105);+  const SBool  s4627 = false != s4626;+  const SBool  s4628 = sbv_bv_extract_u8_0_0_u1(s1101);+  const SBool  s4629 = false != s4628;+  const SWord8 s4630 = sbv_bv_u8_rotr(s1088, 1);+  const SWord8 s4631 = 128 | s4630;+  const SWord8 s4632 = 127 & s4630;+  const SWord8 s4633 = s4629 ? s4631 : s4632;+  const SWord8 s4634 = sbv_bv_u8_rotr(s4633, 1);+  const SWord8 s4635 = 128 | s4634;+  const SWord8 s4636 = 127 & s4634;+  const SWord8 s4637 = s4627 ? s4635 : s4636;+  const SWord8 s4638 = sbv_bv_u8_rotr(s4637, 1);+  const SWord8 s4639 = 128 | s4638;+  const SWord8 s4640 = 127 & s4638;+  const SWord8 s4641 = s4625 ? s4639 : s4640;+  const SBool  s4642 = sbv_bv_extract_u8_0_0_u1(s1114);+  const SBool  s4643 = false != s4642;+  const SWord8 s4644 = s4643 ? s4639 : s4640;+  const SWord8 s4645 = s1097 ? s4641 : s4644;+  const SBool  s4646 = sbv_bv_extract_u8_0_0_u1(s1130);+  const SBool  s4647 = false != s4646;+  const SBool  s4648 = sbv_bv_extract_u8_0_0_u1(s1123);+  const SBool  s4649 = false != s4648;+  const SWord8 s4650 = s4649 ? s4635 : s4636;+  const SWord8 s4651 = sbv_bv_u8_rotr(s4650, 1);+  const SWord8 s4652 = 128 | s4651;+  const SWord8 s4653 = 127 & s4651;+  const SWord8 s4654 = s4647 ? s4652 : s4653;+  const SBool  s4655 = sbv_bv_extract_u8_0_0_u1(s1135);+  const SBool  s4656 = false != s4655;+  const SWord8 s4657 = s4656 ? s4652 : s4653;+  const SWord8 s4658 = s1097 ? s4654 : s4657;+  const SWord8 s4659 = s1078 ? s4645 : s4658;+  const SBool  s4660 = sbv_bv_extract_u8_0_0_u1(s1156);+  const SBool  s4661 = false != s4660;+  const SBool  s4662 = sbv_bv_extract_u8_0_0_u1(s1152);+  const SBool  s4663 = false != s4662;+  const SBool  s4664 = sbv_bv_extract_u8_0_0_u1(s1145);+  const SBool  s4665 = false != s4664;+  const SWord8 s4666 = s4665 ? s4631 : s4632;+  const SWord8 s4667 = sbv_bv_u8_rotr(s4666, 1);+  const SWord8 s4668 = 128 | s4667;+  const SWord8 s4669 = 127 & s4667;+  const SWord8 s4670 = s4663 ? s4668 : s4669;+  const SWord8 s4671 = sbv_bv_u8_rotr(s4670, 1);+  const SWord8 s4672 = 128 | s4671;+  const SWord8 s4673 = 127 & s4671;+  const SWord8 s4674 = s4661 ? s4672 : s4673;+  const SBool  s4675 = sbv_bv_extract_u8_0_0_u1(s1161);+  const SBool  s4676 = false != s4675;+  const SWord8 s4677 = s4676 ? s4672 : s4673;+  const SWord8 s4678 = s1097 ? s4674 : s4677;+  const SBool  s4679 = sbv_bv_extract_u8_0_0_u1(s1177);+  const SBool  s4680 = false != s4679;+  const SBool  s4681 = sbv_bv_extract_u8_0_0_u1(s1170);+  const SBool  s4682 = false != s4681;+  const SWord8 s4683 = s4682 ? s4668 : s4669;+  const SWord8 s4684 = sbv_bv_u8_rotr(s4683, 1);+  const SWord8 s4685 = 128 | s4684;+  const SWord8 s4686 = 127 & s4684;+  const SWord8 s4687 = s4680 ? s4685 : s4686;+  const SBool  s4688 = sbv_bv_extract_u8_0_0_u1(s1182);+  const SBool  s4689 = false != s4688;+  const SWord8 s4690 = s4689 ? s4685 : s4686;+  const SWord8 s4691 = s1097 ? s4687 : s4690;+  const SWord8 s4692 = s1078 ? s4678 : s4691;+  const SWord8 s4693 = s1059 ? s4659 : s4692;+  const SBool  s4694 = sbv_bv_extract_u8_0_0_u1(s1217);+  const SBool  s4695 = false != s4694;+  const SBool  s4696 = sbv_bv_extract_u8_0_0_u1(s1213);+  const SBool  s4697 = false != s4696;+  const SBool  s4698 = sbv_bv_extract_u8_0_0_u1(s1209);+  const SBool  s4699 = false != s4698;+  const SWord8 s4700 = sbv_bv_u8_rotr(s1196, 1);+  const SWord8 s4701 = 128 | s4700;+  const SWord8 s4702 = 127 & s4700;+  const SWord8 s4703 = s4699 ? s4701 : s4702;+  const SWord8 s4704 = sbv_bv_u8_rotr(s4703, 1);+  const SWord8 s4705 = 128 | s4704;+  const SWord8 s4706 = 127 & s4704;+  const SWord8 s4707 = s4697 ? s4705 : s4706;+  const SWord8 s4708 = sbv_bv_u8_rotr(s4707, 1);+  const SWord8 s4709 = 128 | s4708;+  const SWord8 s4710 = 127 & s4708;+  const SWord8 s4711 = s4695 ? s4709 : s4710;+  const SBool  s4712 = sbv_bv_extract_u8_0_0_u1(s1222);+  const SBool  s4713 = false != s4712;+  const SWord8 s4714 = s4713 ? s4709 : s4710;+  const SWord8 s4715 = s1202 ? s4711 : s4714;+  const SBool  s4716 = sbv_bv_extract_u8_0_0_u1(s1238);+  const SBool  s4717 = false != s4716;+  const SBool  s4718 = sbv_bv_extract_u8_0_0_u1(s1231);+  const SBool  s4719 = false != s4718;+  const SWord8 s4720 = s4719 ? s4705 : s4706;+  const SWord8 s4721 = sbv_bv_u8_rotr(s4720, 1);+  const SWord8 s4722 = 128 | s4721;+  const SWord8 s4723 = 127 & s4721;+  const SWord8 s4724 = s4717 ? s4722 : s4723;+  const SBool  s4725 = sbv_bv_extract_u8_0_0_u1(s1243);+  const SBool  s4726 = false != s4725;+  const SWord8 s4727 = s4726 ? s4722 : s4723;+  const SWord8 s4728 = s1202 ? s4724 : s4727;+  const SWord8 s4729 = s1078 ? s4715 : s4728;+  const SBool  s4730 = sbv_bv_extract_u8_0_0_u1(s1264);+  const SBool  s4731 = false != s4730;+  const SBool  s4732 = sbv_bv_extract_u8_0_0_u1(s1260);+  const SBool  s4733 = false != s4732;+  const SBool  s4734 = sbv_bv_extract_u8_0_0_u1(s1253);+  const SBool  s4735 = false != s4734;+  const SWord8 s4736 = s4735 ? s4701 : s4702;+  const SWord8 s4737 = sbv_bv_u8_rotr(s4736, 1);+  const SWord8 s4738 = 128 | s4737;+  const SWord8 s4739 = 127 & s4737;+  const SWord8 s4740 = s4733 ? s4738 : s4739;+  const SWord8 s4741 = sbv_bv_u8_rotr(s4740, 1);+  const SWord8 s4742 = 128 | s4741;+  const SWord8 s4743 = 127 & s4741;+  const SWord8 s4744 = s4731 ? s4742 : s4743;+  const SBool  s4745 = sbv_bv_extract_u8_0_0_u1(s1269);+  const SBool  s4746 = false != s4745;+  const SWord8 s4747 = s4746 ? s4742 : s4743;+  const SWord8 s4748 = s1202 ? s4744 : s4747;+  const SBool  s4749 = sbv_bv_extract_u8_0_0_u1(s1285);+  const SBool  s4750 = false != s4749;+  const SBool  s4751 = sbv_bv_extract_u8_0_0_u1(s1278);+  const SBool  s4752 = false != s4751;+  const SWord8 s4753 = s4752 ? s4738 : s4739;+  const SWord8 s4754 = sbv_bv_u8_rotr(s4753, 1);+  const SWord8 s4755 = 128 | s4754;+  const SWord8 s4756 = 127 & s4754;+  const SWord8 s4757 = s4750 ? s4755 : s4756;+  const SBool  s4758 = sbv_bv_extract_u8_0_0_u1(s1290);+  const SBool  s4759 = false != s4758;+  const SWord8 s4760 = s4759 ? s4755 : s4756;+  const SWord8 s4761 = s1202 ? s4757 : s4760;+  const SWord8 s4762 = s1078 ? s4748 : s4761;+  const SWord8 s4763 = s1059 ? s4729 : s4762;+  const SWord8 s4764 = s1037 ? s4693 : s4763;+  const SBool  s4765 = sbv_bv_extract_u8_0_0_u1(s1345);+  const SBool  s4766 = false != s4765;+  const SBool  s4767 = sbv_bv_extract_u8_0_0_u1(s1341);+  const SBool  s4768 = false != s4767;+  const SBool  s4769 = sbv_bv_extract_u8_0_0_u1(s1337);+  const SBool  s4770 = false != s4769;+  const SWord8 s4771 = sbv_bv_u8_rotr(s1324, 1);+  const SWord8 s4772 = 128 | s4771;+  const SWord8 s4773 = 127 & s4771;+  const SWord8 s4774 = s4770 ? s4772 : s4773;+  const SWord8 s4775 = sbv_bv_u8_rotr(s4774, 1);+  const SWord8 s4776 = 128 | s4775;+  const SWord8 s4777 = 127 & s4775;+  const SWord8 s4778 = s4768 ? s4776 : s4777;+  const SWord8 s4779 = sbv_bv_u8_rotr(s4778, 1);+  const SWord8 s4780 = 128 | s4779;+  const SWord8 s4781 = 127 & s4779;+  const SWord8 s4782 = s4766 ? s4780 : s4781;+  const SBool  s4783 = sbv_bv_extract_u8_0_0_u1(s1350);+  const SBool  s4784 = false != s4783;+  const SWord8 s4785 = s4784 ? s4780 : s4781;+  const SWord8 s4786 = s1333 ? s4782 : s4785;+  const SBool  s4787 = sbv_bv_extract_u8_0_0_u1(s1366);+  const SBool  s4788 = false != s4787;+  const SBool  s4789 = sbv_bv_extract_u8_0_0_u1(s1359);+  const SBool  s4790 = false != s4789;+  const SWord8 s4791 = s4790 ? s4776 : s4777;+  const SWord8 s4792 = sbv_bv_u8_rotr(s4791, 1);+  const SWord8 s4793 = 128 | s4792;+  const SWord8 s4794 = 127 & s4792;+  const SWord8 s4795 = s4788 ? s4793 : s4794;+  const SBool  s4796 = sbv_bv_extract_u8_0_0_u1(s1371);+  const SBool  s4797 = false != s4796;+  const SWord8 s4798 = s4797 ? s4793 : s4794;+  const SWord8 s4799 = s1333 ? s4795 : s4798;+  const SWord8 s4800 = s1311 ? s4786 : s4799;+  const SBool  s4801 = sbv_bv_extract_u8_0_0_u1(s1392);+  const SBool  s4802 = false != s4801;+  const SBool  s4803 = sbv_bv_extract_u8_0_0_u1(s1388);+  const SBool  s4804 = false != s4803;+  const SBool  s4805 = sbv_bv_extract_u8_0_0_u1(s1381);+  const SBool  s4806 = false != s4805;+  const SWord8 s4807 = s4806 ? s4772 : s4773;+  const SWord8 s4808 = sbv_bv_u8_rotr(s4807, 1);+  const SWord8 s4809 = 128 | s4808;+  const SWord8 s4810 = 127 & s4808;+  const SWord8 s4811 = s4804 ? s4809 : s4810;+  const SWord8 s4812 = sbv_bv_u8_rotr(s4811, 1);+  const SWord8 s4813 = 128 | s4812;+  const SWord8 s4814 = 127 & s4812;+  const SWord8 s4815 = s4802 ? s4813 : s4814;+  const SBool  s4816 = sbv_bv_extract_u8_0_0_u1(s1397);+  const SBool  s4817 = false != s4816;+  const SWord8 s4818 = s4817 ? s4813 : s4814;+  const SWord8 s4819 = s1333 ? s4815 : s4818;+  const SBool  s4820 = sbv_bv_extract_u8_0_0_u1(s1413);+  const SBool  s4821 = false != s4820;+  const SBool  s4822 = sbv_bv_extract_u8_0_0_u1(s1406);+  const SBool  s4823 = false != s4822;+  const SWord8 s4824 = s4823 ? s4809 : s4810;+  const SWord8 s4825 = sbv_bv_u8_rotr(s4824, 1);+  const SWord8 s4826 = 128 | s4825;+  const SWord8 s4827 = 127 & s4825;+  const SWord8 s4828 = s4821 ? s4826 : s4827;+  const SBool  s4829 = sbv_bv_extract_u8_0_0_u1(s1418);+  const SBool  s4830 = false != s4829;+  const SWord8 s4831 = s4830 ? s4826 : s4827;+  const SWord8 s4832 = s1333 ? s4828 : s4831;+  const SWord8 s4833 = s1311 ? s4819 : s4832;+  const SWord8 s4834 = s1059 ? s4800 : s4833;+  const SBool  s4835 = sbv_bv_extract_u8_0_0_u1(s1453);+  const SBool  s4836 = false != s4835;+  const SBool  s4837 = sbv_bv_extract_u8_0_0_u1(s1449);+  const SBool  s4838 = false != s4837;+  const SBool  s4839 = sbv_bv_extract_u8_0_0_u1(s1445);+  const SBool  s4840 = false != s4839;+  const SWord8 s4841 = sbv_bv_u8_rotr(s1432, 1);+  const SWord8 s4842 = 128 | s4841;+  const SWord8 s4843 = 127 & s4841;+  const SWord8 s4844 = s4840 ? s4842 : s4843;+  const SWord8 s4845 = sbv_bv_u8_rotr(s4844, 1);+  const SWord8 s4846 = 128 | s4845;+  const SWord8 s4847 = 127 & s4845;+  const SWord8 s4848 = s4838 ? s4846 : s4847;+  const SWord8 s4849 = sbv_bv_u8_rotr(s4848, 1);+  const SWord8 s4850 = 128 | s4849;+  const SWord8 s4851 = 127 & s4849;+  const SWord8 s4852 = s4836 ? s4850 : s4851;+  const SBool  s4853 = sbv_bv_extract_u8_0_0_u1(s1458);+  const SBool  s4854 = false != s4853;+  const SWord8 s4855 = s4854 ? s4850 : s4851;+  const SWord8 s4856 = s1438 ? s4852 : s4855;+  const SBool  s4857 = sbv_bv_extract_u8_0_0_u1(s1474);+  const SBool  s4858 = false != s4857;+  const SBool  s4859 = sbv_bv_extract_u8_0_0_u1(s1467);+  const SBool  s4860 = false != s4859;+  const SWord8 s4861 = s4860 ? s4846 : s4847;+  const SWord8 s4862 = sbv_bv_u8_rotr(s4861, 1);+  const SWord8 s4863 = 128 | s4862;+  const SWord8 s4864 = 127 & s4862;+  const SWord8 s4865 = s4858 ? s4863 : s4864;+  const SBool  s4866 = sbv_bv_extract_u8_0_0_u1(s1479);+  const SBool  s4867 = false != s4866;+  const SWord8 s4868 = s4867 ? s4863 : s4864;+  const SWord8 s4869 = s1438 ? s4865 : s4868;+  const SWord8 s4870 = s1311 ? s4856 : s4869;+  const SBool  s4871 = sbv_bv_extract_u8_0_0_u1(s1500);+  const SBool  s4872 = false != s4871;+  const SBool  s4873 = sbv_bv_extract_u8_0_0_u1(s1496);+  const SBool  s4874 = false != s4873;+  const SBool  s4875 = sbv_bv_extract_u8_0_0_u1(s1489);+  const SBool  s4876 = false != s4875;+  const SWord8 s4877 = s4876 ? s4842 : s4843;+  const SWord8 s4878 = sbv_bv_u8_rotr(s4877, 1);+  const SWord8 s4879 = 128 | s4878;+  const SWord8 s4880 = 127 & s4878;+  const SWord8 s4881 = s4874 ? s4879 : s4880;+  const SWord8 s4882 = sbv_bv_u8_rotr(s4881, 1);+  const SWord8 s4883 = 128 | s4882;+  const SWord8 s4884 = 127 & s4882;+  const SWord8 s4885 = s4872 ? s4883 : s4884;+  const SBool  s4886 = sbv_bv_extract_u8_0_0_u1(s1505);+  const SBool  s4887 = false != s4886;+  const SWord8 s4888 = s4887 ? s4883 : s4884;+  const SWord8 s4889 = s1438 ? s4885 : s4888;+  const SBool  s4890 = sbv_bv_extract_u8_0_0_u1(s1521);+  const SBool  s4891 = false != s4890;+  const SBool  s4892 = sbv_bv_extract_u8_0_0_u1(s1514);+  const SBool  s4893 = false != s4892;+  const SWord8 s4894 = s4893 ? s4879 : s4880;+  const SWord8 s4895 = sbv_bv_u8_rotr(s4894, 1);+  const SWord8 s4896 = 128 | s4895;+  const SWord8 s4897 = 127 & s4895;+  const SWord8 s4898 = s4891 ? s4896 : s4897;+  const SBool  s4899 = sbv_bv_extract_u8_0_0_u1(s1526);+  const SBool  s4900 = false != s4899;+  const SWord8 s4901 = s4900 ? s4896 : s4897;+  const SWord8 s4902 = s1438 ? s4898 : s4901;+  const SWord8 s4903 = s1311 ? s4889 : s4902;+  const SWord8 s4904 = s1059 ? s4870 : s4903;+  const SWord8 s4905 = s1037 ? s4834 : s4904;+  const SWord8 s4906 = s21 ? s4764 : s4905;+  const SBool  s4907 = sbv_bv_extract_u8_0_0_u1(s1601);+  const SBool  s4908 = false != s4907;+  const SBool  s4909 = sbv_bv_extract_u8_0_0_u1(s1597);+  const SBool  s4910 = false != s4909;+  const SBool  s4911 = sbv_bv_extract_u8_0_0_u1(s1593);+  const SBool  s4912 = false != s4911;+  const SWord8 s4913 = sbv_bv_u8_rotr(s1580, 1);+  const SWord8 s4914 = 128 | s4913;+  const SWord8 s4915 = 127 & s4913;+  const SWord8 s4916 = s4912 ? s4914 : s4915;+  const SWord8 s4917 = sbv_bv_u8_rotr(s4916, 1);+  const SWord8 s4918 = 128 | s4917;+  const SWord8 s4919 = 127 & s4917;+  const SWord8 s4920 = s4910 ? s4918 : s4919;+  const SWord8 s4921 = sbv_bv_u8_rotr(s4920, 1);+  const SWord8 s4922 = 128 | s4921;+  const SWord8 s4923 = 127 & s4921;+  const SWord8 s4924 = s4908 ? s4922 : s4923;+  const SBool  s4925 = sbv_bv_extract_u8_0_0_u1(s1606);+  const SBool  s4926 = false != s4925;+  const SWord8 s4927 = s4926 ? s4922 : s4923;+  const SWord8 s4928 = s1589 ? s4924 : s4927;+  const SBool  s4929 = sbv_bv_extract_u8_0_0_u1(s1622);+  const SBool  s4930 = false != s4929;+  const SBool  s4931 = sbv_bv_extract_u8_0_0_u1(s1615);+  const SBool  s4932 = false != s4931;+  const SWord8 s4933 = s4932 ? s4918 : s4919;+  const SWord8 s4934 = sbv_bv_u8_rotr(s4933, 1);+  const SWord8 s4935 = 128 | s4934;+  const SWord8 s4936 = 127 & s4934;+  const SWord8 s4937 = s4930 ? s4935 : s4936;+  const SBool  s4938 = sbv_bv_extract_u8_0_0_u1(s1627);+  const SBool  s4939 = false != s4938;+  const SWord8 s4940 = s4939 ? s4935 : s4936;+  const SWord8 s4941 = s1589 ? s4937 : s4940;+  const SWord8 s4942 = s1570 ? s4928 : s4941;+  const SBool  s4943 = sbv_bv_extract_u8_0_0_u1(s1648);+  const SBool  s4944 = false != s4943;+  const SBool  s4945 = sbv_bv_extract_u8_0_0_u1(s1644);+  const SBool  s4946 = false != s4945;+  const SBool  s4947 = sbv_bv_extract_u8_0_0_u1(s1637);+  const SBool  s4948 = false != s4947;+  const SWord8 s4949 = s4948 ? s4914 : s4915;+  const SWord8 s4950 = sbv_bv_u8_rotr(s4949, 1);+  const SWord8 s4951 = 128 | s4950;+  const SWord8 s4952 = 127 & s4950;+  const SWord8 s4953 = s4946 ? s4951 : s4952;+  const SWord8 s4954 = sbv_bv_u8_rotr(s4953, 1);+  const SWord8 s4955 = 128 | s4954;+  const SWord8 s4956 = 127 & s4954;+  const SWord8 s4957 = s4944 ? s4955 : s4956;+  const SBool  s4958 = sbv_bv_extract_u8_0_0_u1(s1653);+  const SBool  s4959 = false != s4958;+  const SWord8 s4960 = s4959 ? s4955 : s4956;+  const SWord8 s4961 = s1589 ? s4957 : s4960;+  const SBool  s4962 = sbv_bv_extract_u8_0_0_u1(s1669);+  const SBool  s4963 = false != s4962;+  const SBool  s4964 = sbv_bv_extract_u8_0_0_u1(s1662);+  const SBool  s4965 = false != s4964;+  const SWord8 s4966 = s4965 ? s4951 : s4952;+  const SWord8 s4967 = sbv_bv_u8_rotr(s4966, 1);+  const SWord8 s4968 = 128 | s4967;+  const SWord8 s4969 = 127 & s4967;+  const SWord8 s4970 = s4963 ? s4968 : s4969;+  const SBool  s4971 = sbv_bv_extract_u8_0_0_u1(s1674);+  const SBool  s4972 = false != s4971;+  const SWord8 s4973 = s4972 ? s4968 : s4969;+  const SWord8 s4974 = s1589 ? s4970 : s4973;+  const SWord8 s4975 = s1570 ? s4961 : s4974;+  const SWord8 s4976 = s1548 ? s4942 : s4975;+  const SBool  s4977 = sbv_bv_extract_u8_0_0_u1(s1709);+  const SBool  s4978 = false != s4977;+  const SBool  s4979 = sbv_bv_extract_u8_0_0_u1(s1705);+  const SBool  s4980 = false != s4979;+  const SBool  s4981 = sbv_bv_extract_u8_0_0_u1(s1701);+  const SBool  s4982 = false != s4981;+  const SWord8 s4983 = sbv_bv_u8_rotr(s1688, 1);+  const SWord8 s4984 = 128 | s4983;+  const SWord8 s4985 = 127 & s4983;+  const SWord8 s4986 = s4982 ? s4984 : s4985;+  const SWord8 s4987 = sbv_bv_u8_rotr(s4986, 1);+  const SWord8 s4988 = 128 | s4987;+  const SWord8 s4989 = 127 & s4987;+  const SWord8 s4990 = s4980 ? s4988 : s4989;+  const SWord8 s4991 = sbv_bv_u8_rotr(s4990, 1);+  const SWord8 s4992 = 128 | s4991;+  const SWord8 s4993 = 127 & s4991;+  const SWord8 s4994 = s4978 ? s4992 : s4993;+  const SBool  s4995 = sbv_bv_extract_u8_0_0_u1(s1714);+  const SBool  s4996 = false != s4995;+  const SWord8 s4997 = s4996 ? s4992 : s4993;+  const SWord8 s4998 = s1694 ? s4994 : s4997;+  const SBool  s4999 = sbv_bv_extract_u8_0_0_u1(s1730);+  const SBool  s5000 = false != s4999;+  const SBool  s5001 = sbv_bv_extract_u8_0_0_u1(s1723);+  const SBool  s5002 = false != s5001;+  const SWord8 s5003 = s5002 ? s4988 : s4989;+  const SWord8 s5004 = sbv_bv_u8_rotr(s5003, 1);+  const SWord8 s5005 = 128 | s5004;+  const SWord8 s5006 = 127 & s5004;+  const SWord8 s5007 = s5000 ? s5005 : s5006;+  const SBool  s5008 = sbv_bv_extract_u8_0_0_u1(s1735);+  const SBool  s5009 = false != s5008;+  const SWord8 s5010 = s5009 ? s5005 : s5006;+  const SWord8 s5011 = s1694 ? s5007 : s5010;+  const SWord8 s5012 = s1570 ? s4998 : s5011;+  const SBool  s5013 = sbv_bv_extract_u8_0_0_u1(s1756);+  const SBool  s5014 = false != s5013;+  const SBool  s5015 = sbv_bv_extract_u8_0_0_u1(s1752);+  const SBool  s5016 = false != s5015;+  const SBool  s5017 = sbv_bv_extract_u8_0_0_u1(s1745);+  const SBool  s5018 = false != s5017;+  const SWord8 s5019 = s5018 ? s4984 : s4985;+  const SWord8 s5020 = sbv_bv_u8_rotr(s5019, 1);+  const SWord8 s5021 = 128 | s5020;+  const SWord8 s5022 = 127 & s5020;+  const SWord8 s5023 = s5016 ? s5021 : s5022;+  const SWord8 s5024 = sbv_bv_u8_rotr(s5023, 1);+  const SWord8 s5025 = 128 | s5024;+  const SWord8 s5026 = 127 & s5024;+  const SWord8 s5027 = s5014 ? s5025 : s5026;+  const SBool  s5028 = sbv_bv_extract_u8_0_0_u1(s1761);+  const SBool  s5029 = false != s5028;+  const SWord8 s5030 = s5029 ? s5025 : s5026;+  const SWord8 s5031 = s1694 ? s5027 : s5030;+  const SBool  s5032 = sbv_bv_extract_u8_0_0_u1(s1777);+  const SBool  s5033 = false != s5032;+  const SBool  s5034 = sbv_bv_extract_u8_0_0_u1(s1770);+  const SBool  s5035 = false != s5034;+  const SWord8 s5036 = s5035 ? s5021 : s5022;+  const SWord8 s5037 = sbv_bv_u8_rotr(s5036, 1);+  const SWord8 s5038 = 128 | s5037;+  const SWord8 s5039 = 127 & s5037;+  const SWord8 s5040 = s5033 ? s5038 : s5039;+  const SBool  s5041 = sbv_bv_extract_u8_0_0_u1(s1782);+  const SBool  s5042 = false != s5041;+  const SWord8 s5043 = s5042 ? s5038 : s5039;+  const SWord8 s5044 = s1694 ? s5040 : s5043;+  const SWord8 s5045 = s1570 ? s5031 : s5044;+  const SWord8 s5046 = s1548 ? s5012 : s5045;+  const SWord8 s5047 = s1037 ? s4976 : s5046;+  const SBool  s5048 = sbv_bv_extract_u8_0_0_u1(s1837);+  const SBool  s5049 = false != s5048;+  const SBool  s5050 = sbv_bv_extract_u8_0_0_u1(s1833);+  const SBool  s5051 = false != s5050;+  const SBool  s5052 = sbv_bv_extract_u8_0_0_u1(s1829);+  const SBool  s5053 = false != s5052;+  const SWord8 s5054 = sbv_bv_u8_rotr(s1816, 1);+  const SWord8 s5055 = 128 | s5054;+  const SWord8 s5056 = 127 & s5054;+  const SWord8 s5057 = s5053 ? s5055 : s5056;+  const SWord8 s5058 = sbv_bv_u8_rotr(s5057, 1);+  const SWord8 s5059 = 128 | s5058;+  const SWord8 s5060 = 127 & s5058;+  const SWord8 s5061 = s5051 ? s5059 : s5060;+  const SWord8 s5062 = sbv_bv_u8_rotr(s5061, 1);+  const SWord8 s5063 = 128 | s5062;+  const SWord8 s5064 = 127 & s5062;+  const SWord8 s5065 = s5049 ? s5063 : s5064;+  const SBool  s5066 = sbv_bv_extract_u8_0_0_u1(s1842);+  const SBool  s5067 = false != s5066;+  const SWord8 s5068 = s5067 ? s5063 : s5064;+  const SWord8 s5069 = s1825 ? s5065 : s5068;+  const SBool  s5070 = sbv_bv_extract_u8_0_0_u1(s1858);+  const SBool  s5071 = false != s5070;+  const SBool  s5072 = sbv_bv_extract_u8_0_0_u1(s1851);+  const SBool  s5073 = false != s5072;+  const SWord8 s5074 = s5073 ? s5059 : s5060;+  const SWord8 s5075 = sbv_bv_u8_rotr(s5074, 1);+  const SWord8 s5076 = 128 | s5075;+  const SWord8 s5077 = 127 & s5075;+  const SWord8 s5078 = s5071 ? s5076 : s5077;+  const SBool  s5079 = sbv_bv_extract_u8_0_0_u1(s1863);+  const SBool  s5080 = false != s5079;+  const SWord8 s5081 = s5080 ? s5076 : s5077;+  const SWord8 s5082 = s1825 ? s5078 : s5081;+  const SWord8 s5083 = s1803 ? s5069 : s5082;+  const SBool  s5084 = sbv_bv_extract_u8_0_0_u1(s1884);+  const SBool  s5085 = false != s5084;+  const SBool  s5086 = sbv_bv_extract_u8_0_0_u1(s1880);+  const SBool  s5087 = false != s5086;+  const SBool  s5088 = sbv_bv_extract_u8_0_0_u1(s1873);+  const SBool  s5089 = false != s5088;+  const SWord8 s5090 = s5089 ? s5055 : s5056;+  const SWord8 s5091 = sbv_bv_u8_rotr(s5090, 1);+  const SWord8 s5092 = 128 | s5091;+  const SWord8 s5093 = 127 & s5091;+  const SWord8 s5094 = s5087 ? s5092 : s5093;+  const SWord8 s5095 = sbv_bv_u8_rotr(s5094, 1);+  const SWord8 s5096 = 128 | s5095;+  const SWord8 s5097 = 127 & s5095;+  const SWord8 s5098 = s5085 ? s5096 : s5097;+  const SBool  s5099 = sbv_bv_extract_u8_0_0_u1(s1889);+  const SBool  s5100 = false != s5099;+  const SWord8 s5101 = s5100 ? s5096 : s5097;+  const SWord8 s5102 = s1825 ? s5098 : s5101;+  const SBool  s5103 = sbv_bv_extract_u8_0_0_u1(s1905);+  const SBool  s5104 = false != s5103;+  const SBool  s5105 = sbv_bv_extract_u8_0_0_u1(s1898);+  const SBool  s5106 = false != s5105;+  const SWord8 s5107 = s5106 ? s5092 : s5093;+  const SWord8 s5108 = sbv_bv_u8_rotr(s5107, 1);+  const SWord8 s5109 = 128 | s5108;+  const SWord8 s5110 = 127 & s5108;+  const SWord8 s5111 = s5104 ? s5109 : s5110;+  const SBool  s5112 = sbv_bv_extract_u8_0_0_u1(s1910);+  const SBool  s5113 = false != s5112;+  const SWord8 s5114 = s5113 ? s5109 : s5110;+  const SWord8 s5115 = s1825 ? s5111 : s5114;+  const SWord8 s5116 = s1803 ? s5102 : s5115;+  const SWord8 s5117 = s1548 ? s5083 : s5116;+  const SBool  s5118 = sbv_bv_extract_u8_0_0_u1(s1945);+  const SBool  s5119 = false != s5118;+  const SBool  s5120 = sbv_bv_extract_u8_0_0_u1(s1941);+  const SBool  s5121 = false != s5120;+  const SBool  s5122 = sbv_bv_extract_u8_0_0_u1(s1937);+  const SBool  s5123 = false != s5122;+  const SWord8 s5124 = sbv_bv_u8_rotr(s1924, 1);+  const SWord8 s5125 = 128 | s5124;+  const SWord8 s5126 = 127 & s5124;+  const SWord8 s5127 = s5123 ? s5125 : s5126;+  const SWord8 s5128 = sbv_bv_u8_rotr(s5127, 1);+  const SWord8 s5129 = 128 | s5128;+  const SWord8 s5130 = 127 & s5128;+  const SWord8 s5131 = s5121 ? s5129 : s5130;+  const SWord8 s5132 = sbv_bv_u8_rotr(s5131, 1);+  const SWord8 s5133 = 128 | s5132;+  const SWord8 s5134 = 127 & s5132;+  const SWord8 s5135 = s5119 ? s5133 : s5134;+  const SBool  s5136 = sbv_bv_extract_u8_0_0_u1(s1950);+  const SBool  s5137 = false != s5136;+  const SWord8 s5138 = s5137 ? s5133 : s5134;+  const SWord8 s5139 = s1930 ? s5135 : s5138;+  const SBool  s5140 = sbv_bv_extract_u8_0_0_u1(s1966);+  const SBool  s5141 = false != s5140;+  const SBool  s5142 = sbv_bv_extract_u8_0_0_u1(s1959);+  const SBool  s5143 = false != s5142;+  const SWord8 s5144 = s5143 ? s5129 : s5130;+  const SWord8 s5145 = sbv_bv_u8_rotr(s5144, 1);+  const SWord8 s5146 = 128 | s5145;+  const SWord8 s5147 = 127 & s5145;+  const SWord8 s5148 = s5141 ? s5146 : s5147;+  const SBool  s5149 = sbv_bv_extract_u8_0_0_u1(s1971);+  const SBool  s5150 = false != s5149;+  const SWord8 s5151 = s5150 ? s5146 : s5147;+  const SWord8 s5152 = s1930 ? s5148 : s5151;+  const SWord8 s5153 = s1803 ? s5139 : s5152;+  const SBool  s5154 = sbv_bv_extract_u8_0_0_u1(s1992);+  const SBool  s5155 = false != s5154;+  const SBool  s5156 = sbv_bv_extract_u8_0_0_u1(s1988);+  const SBool  s5157 = false != s5156;+  const SBool  s5158 = sbv_bv_extract_u8_0_0_u1(s1981);+  const SBool  s5159 = false != s5158;+  const SWord8 s5160 = s5159 ? s5125 : s5126;+  const SWord8 s5161 = sbv_bv_u8_rotr(s5160, 1);+  const SWord8 s5162 = 128 | s5161;+  const SWord8 s5163 = 127 & s5161;+  const SWord8 s5164 = s5157 ? s5162 : s5163;+  const SWord8 s5165 = sbv_bv_u8_rotr(s5164, 1);+  const SWord8 s5166 = 128 | s5165;+  const SWord8 s5167 = 127 & s5165;+  const SWord8 s5168 = s5155 ? s5166 : s5167;+  const SBool  s5169 = sbv_bv_extract_u8_0_0_u1(s1997);+  const SBool  s5170 = false != s5169;+  const SWord8 s5171 = s5170 ? s5166 : s5167;+  const SWord8 s5172 = s1930 ? s5168 : s5171;+  const SBool  s5173 = sbv_bv_extract_u8_0_0_u1(s2013);+  const SBool  s5174 = false != s5173;+  const SBool  s5175 = sbv_bv_extract_u8_0_0_u1(s2006);+  const SBool  s5176 = false != s5175;+  const SWord8 s5177 = s5176 ? s5162 : s5163;+  const SWord8 s5178 = sbv_bv_u8_rotr(s5177, 1);+  const SWord8 s5179 = 128 | s5178;+  const SWord8 s5180 = 127 & s5178;+  const SWord8 s5181 = s5174 ? s5179 : s5180;+  const SBool  s5182 = sbv_bv_extract_u8_0_0_u1(s2018);+  const SBool  s5183 = false != s5182;+  const SWord8 s5184 = s5183 ? s5179 : s5180;+  const SWord8 s5185 = s1930 ? s5181 : s5184;+  const SWord8 s5186 = s1803 ? s5172 : s5185;+  const SWord8 s5187 = s1548 ? s5153 : s5186;+  const SWord8 s5188 = s1037 ? s5117 : s5187;+  const SWord8 s5189 = s21 ? s5047 : s5188;+  const SWord8 s5190 = s16 ? s4906 : s5189;+  const SWord8 s5191 = s11 ? s4623 : s5190;+  const SBool  s5192 = sbv_bv_extract_u8_0_0_u1(s2128);+  const SBool  s5193 = false != s5192;+  const SBool  s5194 = sbv_bv_extract_u8_0_0_u1(s2124);+  const SBool  s5195 = false != s5194;+  const SBool  s5196 = sbv_bv_extract_u8_0_0_u1(s2120);+  const SBool  s5197 = false != s5196;+  const SWord8 s5198 = sbv_bv_u8_rotr(s2107, 1);+  const SWord8 s5199 = 128 | s5198;+  const SWord8 s5200 = 127 & s5198;+  const SWord8 s5201 = s5197 ? s5199 : s5200;+  const SWord8 s5202 = sbv_bv_u8_rotr(s5201, 1);+  const SWord8 s5203 = 128 | s5202;+  const SWord8 s5204 = 127 & s5202;+  const SWord8 s5205 = s5195 ? s5203 : s5204;+  const SWord8 s5206 = sbv_bv_u8_rotr(s5205, 1);+  const SWord8 s5207 = 128 | s5206;+  const SWord8 s5208 = 127 & s5206;+  const SWord8 s5209 = s5193 ? s5207 : s5208;+  const SBool  s5210 = sbv_bv_extract_u8_0_0_u1(s2133);+  const SBool  s5211 = false != s5210;+  const SWord8 s5212 = s5211 ? s5207 : s5208;+  const SWord8 s5213 = s2116 ? s5209 : s5212;+  const SBool  s5214 = sbv_bv_extract_u8_0_0_u1(s2149);+  const SBool  s5215 = false != s5214;+  const SBool  s5216 = sbv_bv_extract_u8_0_0_u1(s2142);+  const SBool  s5217 = false != s5216;+  const SWord8 s5218 = s5217 ? s5203 : s5204;+  const SWord8 s5219 = sbv_bv_u8_rotr(s5218, 1);+  const SWord8 s5220 = 128 | s5219;+  const SWord8 s5221 = 127 & s5219;+  const SWord8 s5222 = s5215 ? s5220 : s5221;+  const SBool  s5223 = sbv_bv_extract_u8_0_0_u1(s2154);+  const SBool  s5224 = false != s5223;+  const SWord8 s5225 = s5224 ? s5220 : s5221;+  const SWord8 s5226 = s2116 ? s5222 : s5225;+  const SWord8 s5227 = s2097 ? s5213 : s5226;+  const SBool  s5228 = sbv_bv_extract_u8_0_0_u1(s2175);+  const SBool  s5229 = false != s5228;+  const SBool  s5230 = sbv_bv_extract_u8_0_0_u1(s2171);+  const SBool  s5231 = false != s5230;+  const SBool  s5232 = sbv_bv_extract_u8_0_0_u1(s2164);+  const SBool  s5233 = false != s5232;+  const SWord8 s5234 = s5233 ? s5199 : s5200;+  const SWord8 s5235 = sbv_bv_u8_rotr(s5234, 1);+  const SWord8 s5236 = 128 | s5235;+  const SWord8 s5237 = 127 & s5235;+  const SWord8 s5238 = s5231 ? s5236 : s5237;+  const SWord8 s5239 = sbv_bv_u8_rotr(s5238, 1);+  const SWord8 s5240 = 128 | s5239;+  const SWord8 s5241 = 127 & s5239;+  const SWord8 s5242 = s5229 ? s5240 : s5241;+  const SBool  s5243 = sbv_bv_extract_u8_0_0_u1(s2180);+  const SBool  s5244 = false != s5243;+  const SWord8 s5245 = s5244 ? s5240 : s5241;+  const SWord8 s5246 = s2116 ? s5242 : s5245;+  const SBool  s5247 = sbv_bv_extract_u8_0_0_u1(s2196);+  const SBool  s5248 = false != s5247;+  const SBool  s5249 = sbv_bv_extract_u8_0_0_u1(s2189);+  const SBool  s5250 = false != s5249;+  const SWord8 s5251 = s5250 ? s5236 : s5237;+  const SWord8 s5252 = sbv_bv_u8_rotr(s5251, 1);+  const SWord8 s5253 = 128 | s5252;+  const SWord8 s5254 = 127 & s5252;+  const SWord8 s5255 = s5248 ? s5253 : s5254;+  const SBool  s5256 = sbv_bv_extract_u8_0_0_u1(s2201);+  const SBool  s5257 = false != s5256;+  const SWord8 s5258 = s5257 ? s5253 : s5254;+  const SWord8 s5259 = s2116 ? s5255 : s5258;+  const SWord8 s5260 = s2097 ? s5246 : s5259;+  const SWord8 s5261 = s2078 ? s5227 : s5260;+  const SBool  s5262 = sbv_bv_extract_u8_0_0_u1(s2236);+  const SBool  s5263 = false != s5262;+  const SBool  s5264 = sbv_bv_extract_u8_0_0_u1(s2232);+  const SBool  s5265 = false != s5264;+  const SBool  s5266 = sbv_bv_extract_u8_0_0_u1(s2228);+  const SBool  s5267 = false != s5266;+  const SWord8 s5268 = sbv_bv_u8_rotr(s2215, 1);+  const SWord8 s5269 = 128 | s5268;+  const SWord8 s5270 = 127 & s5268;+  const SWord8 s5271 = s5267 ? s5269 : s5270;+  const SWord8 s5272 = sbv_bv_u8_rotr(s5271, 1);+  const SWord8 s5273 = 128 | s5272;+  const SWord8 s5274 = 127 & s5272;+  const SWord8 s5275 = s5265 ? s5273 : s5274;+  const SWord8 s5276 = sbv_bv_u8_rotr(s5275, 1);+  const SWord8 s5277 = 128 | s5276;+  const SWord8 s5278 = 127 & s5276;+  const SWord8 s5279 = s5263 ? s5277 : s5278;+  const SBool  s5280 = sbv_bv_extract_u8_0_0_u1(s2241);+  const SBool  s5281 = false != s5280;+  const SWord8 s5282 = s5281 ? s5277 : s5278;+  const SWord8 s5283 = s2221 ? s5279 : s5282;+  const SBool  s5284 = sbv_bv_extract_u8_0_0_u1(s2257);+  const SBool  s5285 = false != s5284;+  const SBool  s5286 = sbv_bv_extract_u8_0_0_u1(s2250);+  const SBool  s5287 = false != s5286;+  const SWord8 s5288 = s5287 ? s5273 : s5274;+  const SWord8 s5289 = sbv_bv_u8_rotr(s5288, 1);+  const SWord8 s5290 = 128 | s5289;+  const SWord8 s5291 = 127 & s5289;+  const SWord8 s5292 = s5285 ? s5290 : s5291;+  const SBool  s5293 = sbv_bv_extract_u8_0_0_u1(s2262);+  const SBool  s5294 = false != s5293;+  const SWord8 s5295 = s5294 ? s5290 : s5291;+  const SWord8 s5296 = s2221 ? s5292 : s5295;+  const SWord8 s5297 = s2097 ? s5283 : s5296;+  const SBool  s5298 = sbv_bv_extract_u8_0_0_u1(s2283);+  const SBool  s5299 = false != s5298;+  const SBool  s5300 = sbv_bv_extract_u8_0_0_u1(s2279);+  const SBool  s5301 = false != s5300;+  const SBool  s5302 = sbv_bv_extract_u8_0_0_u1(s2272);+  const SBool  s5303 = false != s5302;+  const SWord8 s5304 = s5303 ? s5269 : s5270;+  const SWord8 s5305 = sbv_bv_u8_rotr(s5304, 1);+  const SWord8 s5306 = 128 | s5305;+  const SWord8 s5307 = 127 & s5305;+  const SWord8 s5308 = s5301 ? s5306 : s5307;+  const SWord8 s5309 = sbv_bv_u8_rotr(s5308, 1);+  const SWord8 s5310 = 128 | s5309;+  const SWord8 s5311 = 127 & s5309;+  const SWord8 s5312 = s5299 ? s5310 : s5311;+  const SBool  s5313 = sbv_bv_extract_u8_0_0_u1(s2288);+  const SBool  s5314 = false != s5313;+  const SWord8 s5315 = s5314 ? s5310 : s5311;+  const SWord8 s5316 = s2221 ? s5312 : s5315;+  const SBool  s5317 = sbv_bv_extract_u8_0_0_u1(s2304);+  const SBool  s5318 = false != s5317;+  const SBool  s5319 = sbv_bv_extract_u8_0_0_u1(s2297);+  const SBool  s5320 = false != s5319;+  const SWord8 s5321 = s5320 ? s5306 : s5307;+  const SWord8 s5322 = sbv_bv_u8_rotr(s5321, 1);+  const SWord8 s5323 = 128 | s5322;+  const SWord8 s5324 = 127 & s5322;+  const SWord8 s5325 = s5318 ? s5323 : s5324;+  const SBool  s5326 = sbv_bv_extract_u8_0_0_u1(s2309);+  const SBool  s5327 = false != s5326;+  const SWord8 s5328 = s5327 ? s5323 : s5324;+  const SWord8 s5329 = s2221 ? s5325 : s5328;+  const SWord8 s5330 = s2097 ? s5316 : s5329;+  const SWord8 s5331 = s2078 ? s5297 : s5330;+  const SWord8 s5332 = s2059 ? s5261 : s5331;+  const SBool  s5333 = sbv_bv_extract_u8_0_0_u1(s2364);+  const SBool  s5334 = false != s5333;+  const SBool  s5335 = sbv_bv_extract_u8_0_0_u1(s2360);+  const SBool  s5336 = false != s5335;+  const SBool  s5337 = sbv_bv_extract_u8_0_0_u1(s2356);+  const SBool  s5338 = false != s5337;+  const SWord8 s5339 = sbv_bv_u8_rotr(s2343, 1);+  const SWord8 s5340 = 128 | s5339;+  const SWord8 s5341 = 127 & s5339;+  const SWord8 s5342 = s5338 ? s5340 : s5341;+  const SWord8 s5343 = sbv_bv_u8_rotr(s5342, 1);+  const SWord8 s5344 = 128 | s5343;+  const SWord8 s5345 = 127 & s5343;+  const SWord8 s5346 = s5336 ? s5344 : s5345;+  const SWord8 s5347 = sbv_bv_u8_rotr(s5346, 1);+  const SWord8 s5348 = 128 | s5347;+  const SWord8 s5349 = 127 & s5347;+  const SWord8 s5350 = s5334 ? s5348 : s5349;+  const SBool  s5351 = sbv_bv_extract_u8_0_0_u1(s2369);+  const SBool  s5352 = false != s5351;+  const SWord8 s5353 = s5352 ? s5348 : s5349;+  const SWord8 s5354 = s2352 ? s5350 : s5353;+  const SBool  s5355 = sbv_bv_extract_u8_0_0_u1(s2385);+  const SBool  s5356 = false != s5355;+  const SBool  s5357 = sbv_bv_extract_u8_0_0_u1(s2378);+  const SBool  s5358 = false != s5357;+  const SWord8 s5359 = s5358 ? s5344 : s5345;+  const SWord8 s5360 = sbv_bv_u8_rotr(s5359, 1);+  const SWord8 s5361 = 128 | s5360;+  const SWord8 s5362 = 127 & s5360;+  const SWord8 s5363 = s5356 ? s5361 : s5362;+  const SBool  s5364 = sbv_bv_extract_u8_0_0_u1(s2390);+  const SBool  s5365 = false != s5364;+  const SWord8 s5366 = s5365 ? s5361 : s5362;+  const SWord8 s5367 = s2352 ? s5363 : s5366;+  const SWord8 s5368 = s2330 ? s5354 : s5367;+  const SBool  s5369 = sbv_bv_extract_u8_0_0_u1(s2411);+  const SBool  s5370 = false != s5369;+  const SBool  s5371 = sbv_bv_extract_u8_0_0_u1(s2407);+  const SBool  s5372 = false != s5371;+  const SBool  s5373 = sbv_bv_extract_u8_0_0_u1(s2400);+  const SBool  s5374 = false != s5373;+  const SWord8 s5375 = s5374 ? s5340 : s5341;+  const SWord8 s5376 = sbv_bv_u8_rotr(s5375, 1);+  const SWord8 s5377 = 128 | s5376;+  const SWord8 s5378 = 127 & s5376;+  const SWord8 s5379 = s5372 ? s5377 : s5378;+  const SWord8 s5380 = sbv_bv_u8_rotr(s5379, 1);+  const SWord8 s5381 = 128 | s5380;+  const SWord8 s5382 = 127 & s5380;+  const SWord8 s5383 = s5370 ? s5381 : s5382;+  const SBool  s5384 = sbv_bv_extract_u8_0_0_u1(s2416);+  const SBool  s5385 = false != s5384;+  const SWord8 s5386 = s5385 ? s5381 : s5382;+  const SWord8 s5387 = s2352 ? s5383 : s5386;+  const SBool  s5388 = sbv_bv_extract_u8_0_0_u1(s2432);+  const SBool  s5389 = false != s5388;+  const SBool  s5390 = sbv_bv_extract_u8_0_0_u1(s2425);+  const SBool  s5391 = false != s5390;+  const SWord8 s5392 = s5391 ? s5377 : s5378;+  const SWord8 s5393 = sbv_bv_u8_rotr(s5392, 1);+  const SWord8 s5394 = 128 | s5393;+  const SWord8 s5395 = 127 & s5393;+  const SWord8 s5396 = s5389 ? s5394 : s5395;+  const SBool  s5397 = sbv_bv_extract_u8_0_0_u1(s2437);+  const SBool  s5398 = false != s5397;+  const SWord8 s5399 = s5398 ? s5394 : s5395;+  const SWord8 s5400 = s2352 ? s5396 : s5399;+  const SWord8 s5401 = s2330 ? s5387 : s5400;+  const SWord8 s5402 = s2078 ? s5368 : s5401;+  const SBool  s5403 = sbv_bv_extract_u8_0_0_u1(s2472);+  const SBool  s5404 = false != s5403;+  const SBool  s5405 = sbv_bv_extract_u8_0_0_u1(s2468);+  const SBool  s5406 = false != s5405;+  const SBool  s5407 = sbv_bv_extract_u8_0_0_u1(s2464);+  const SBool  s5408 = false != s5407;+  const SWord8 s5409 = sbv_bv_u8_rotr(s2451, 1);+  const SWord8 s5410 = 128 | s5409;+  const SWord8 s5411 = 127 & s5409;+  const SWord8 s5412 = s5408 ? s5410 : s5411;+  const SWord8 s5413 = sbv_bv_u8_rotr(s5412, 1);+  const SWord8 s5414 = 128 | s5413;+  const SWord8 s5415 = 127 & s5413;+  const SWord8 s5416 = s5406 ? s5414 : s5415;+  const SWord8 s5417 = sbv_bv_u8_rotr(s5416, 1);+  const SWord8 s5418 = 128 | s5417;+  const SWord8 s5419 = 127 & s5417;+  const SWord8 s5420 = s5404 ? s5418 : s5419;+  const SBool  s5421 = sbv_bv_extract_u8_0_0_u1(s2477);+  const SBool  s5422 = false != s5421;+  const SWord8 s5423 = s5422 ? s5418 : s5419;+  const SWord8 s5424 = s2457 ? s5420 : s5423;+  const SBool  s5425 = sbv_bv_extract_u8_0_0_u1(s2493);+  const SBool  s5426 = false != s5425;+  const SBool  s5427 = sbv_bv_extract_u8_0_0_u1(s2486);+  const SBool  s5428 = false != s5427;+  const SWord8 s5429 = s5428 ? s5414 : s5415;+  const SWord8 s5430 = sbv_bv_u8_rotr(s5429, 1);+  const SWord8 s5431 = 128 | s5430;+  const SWord8 s5432 = 127 & s5430;+  const SWord8 s5433 = s5426 ? s5431 : s5432;+  const SBool  s5434 = sbv_bv_extract_u8_0_0_u1(s2498);+  const SBool  s5435 = false != s5434;+  const SWord8 s5436 = s5435 ? s5431 : s5432;+  const SWord8 s5437 = s2457 ? s5433 : s5436;+  const SWord8 s5438 = s2330 ? s5424 : s5437;+  const SBool  s5439 = sbv_bv_extract_u8_0_0_u1(s2519);+  const SBool  s5440 = false != s5439;+  const SBool  s5441 = sbv_bv_extract_u8_0_0_u1(s2515);+  const SBool  s5442 = false != s5441;+  const SBool  s5443 = sbv_bv_extract_u8_0_0_u1(s2508);+  const SBool  s5444 = false != s5443;+  const SWord8 s5445 = s5444 ? s5410 : s5411;+  const SWord8 s5446 = sbv_bv_u8_rotr(s5445, 1);+  const SWord8 s5447 = 128 | s5446;+  const SWord8 s5448 = 127 & s5446;+  const SWord8 s5449 = s5442 ? s5447 : s5448;+  const SWord8 s5450 = sbv_bv_u8_rotr(s5449, 1);+  const SWord8 s5451 = 128 | s5450;+  const SWord8 s5452 = 127 & s5450;+  const SWord8 s5453 = s5440 ? s5451 : s5452;+  const SBool  s5454 = sbv_bv_extract_u8_0_0_u1(s2524);+  const SBool  s5455 = false != s5454;+  const SWord8 s5456 = s5455 ? s5451 : s5452;+  const SWord8 s5457 = s2457 ? s5453 : s5456;+  const SBool  s5458 = sbv_bv_extract_u8_0_0_u1(s2540);+  const SBool  s5459 = false != s5458;+  const SBool  s5460 = sbv_bv_extract_u8_0_0_u1(s2533);+  const SBool  s5461 = false != s5460;+  const SWord8 s5462 = s5461 ? s5447 : s5448;+  const SWord8 s5463 = sbv_bv_u8_rotr(s5462, 1);+  const SWord8 s5464 = 128 | s5463;+  const SWord8 s5465 = 127 & s5463;+  const SWord8 s5466 = s5459 ? s5464 : s5465;+  const SBool  s5467 = sbv_bv_extract_u8_0_0_u1(s2545);+  const SBool  s5468 = false != s5467;+  const SWord8 s5469 = s5468 ? s5464 : s5465;+  const SWord8 s5470 = s2457 ? s5466 : s5469;+  const SWord8 s5471 = s2330 ? s5457 : s5470;+  const SWord8 s5472 = s2078 ? s5438 : s5471;+  const SWord8 s5473 = s2059 ? s5402 : s5472;+  const SWord8 s5474 = s2042 ? s5332 : s5473;+  const SBool  s5475 = sbv_bv_extract_u8_0_0_u1(s2620);+  const SBool  s5476 = false != s5475;+  const SBool  s5477 = sbv_bv_extract_u8_0_0_u1(s2616);+  const SBool  s5478 = false != s5477;+  const SBool  s5479 = sbv_bv_extract_u8_0_0_u1(s2612);+  const SBool  s5480 = false != s5479;+  const SWord8 s5481 = sbv_bv_u8_rotr(s2599, 1);+  const SWord8 s5482 = 128 | s5481;+  const SWord8 s5483 = 127 & s5481;+  const SWord8 s5484 = s5480 ? s5482 : s5483;+  const SWord8 s5485 = sbv_bv_u8_rotr(s5484, 1);+  const SWord8 s5486 = 128 | s5485;+  const SWord8 s5487 = 127 & s5485;+  const SWord8 s5488 = s5478 ? s5486 : s5487;+  const SWord8 s5489 = sbv_bv_u8_rotr(s5488, 1);+  const SWord8 s5490 = 128 | s5489;+  const SWord8 s5491 = 127 & s5489;+  const SWord8 s5492 = s5476 ? s5490 : s5491;+  const SBool  s5493 = sbv_bv_extract_u8_0_0_u1(s2625);+  const SBool  s5494 = false != s5493;+  const SWord8 s5495 = s5494 ? s5490 : s5491;+  const SWord8 s5496 = s2608 ? s5492 : s5495;+  const SBool  s5497 = sbv_bv_extract_u8_0_0_u1(s2641);+  const SBool  s5498 = false != s5497;+  const SBool  s5499 = sbv_bv_extract_u8_0_0_u1(s2634);+  const SBool  s5500 = false != s5499;+  const SWord8 s5501 = s5500 ? s5486 : s5487;+  const SWord8 s5502 = sbv_bv_u8_rotr(s5501, 1);+  const SWord8 s5503 = 128 | s5502;+  const SWord8 s5504 = 127 & s5502;+  const SWord8 s5505 = s5498 ? s5503 : s5504;+  const SBool  s5506 = sbv_bv_extract_u8_0_0_u1(s2646);+  const SBool  s5507 = false != s5506;+  const SWord8 s5508 = s5507 ? s5503 : s5504;+  const SWord8 s5509 = s2608 ? s5505 : s5508;+  const SWord8 s5510 = s2589 ? s5496 : s5509;+  const SBool  s5511 = sbv_bv_extract_u8_0_0_u1(s2667);+  const SBool  s5512 = false != s5511;+  const SBool  s5513 = sbv_bv_extract_u8_0_0_u1(s2663);+  const SBool  s5514 = false != s5513;+  const SBool  s5515 = sbv_bv_extract_u8_0_0_u1(s2656);+  const SBool  s5516 = false != s5515;+  const SWord8 s5517 = s5516 ? s5482 : s5483;+  const SWord8 s5518 = sbv_bv_u8_rotr(s5517, 1);+  const SWord8 s5519 = 128 | s5518;+  const SWord8 s5520 = 127 & s5518;+  const SWord8 s5521 = s5514 ? s5519 : s5520;+  const SWord8 s5522 = sbv_bv_u8_rotr(s5521, 1);+  const SWord8 s5523 = 128 | s5522;+  const SWord8 s5524 = 127 & s5522;+  const SWord8 s5525 = s5512 ? s5523 : s5524;+  const SBool  s5526 = sbv_bv_extract_u8_0_0_u1(s2672);+  const SBool  s5527 = false != s5526;+  const SWord8 s5528 = s5527 ? s5523 : s5524;+  const SWord8 s5529 = s2608 ? s5525 : s5528;+  const SBool  s5530 = sbv_bv_extract_u8_0_0_u1(s2688);+  const SBool  s5531 = false != s5530;+  const SBool  s5532 = sbv_bv_extract_u8_0_0_u1(s2681);+  const SBool  s5533 = false != s5532;+  const SWord8 s5534 = s5533 ? s5519 : s5520;+  const SWord8 s5535 = sbv_bv_u8_rotr(s5534, 1);+  const SWord8 s5536 = 128 | s5535;+  const SWord8 s5537 = 127 & s5535;+  const SWord8 s5538 = s5531 ? s5536 : s5537;+  const SBool  s5539 = sbv_bv_extract_u8_0_0_u1(s2693);+  const SBool  s5540 = false != s5539;+  const SWord8 s5541 = s5540 ? s5536 : s5537;+  const SWord8 s5542 = s2608 ? s5538 : s5541;+  const SWord8 s5543 = s2589 ? s5529 : s5542;+  const SWord8 s5544 = s2567 ? s5510 : s5543;+  const SBool  s5545 = sbv_bv_extract_u8_0_0_u1(s2728);+  const SBool  s5546 = false != s5545;+  const SBool  s5547 = sbv_bv_extract_u8_0_0_u1(s2724);+  const SBool  s5548 = false != s5547;+  const SBool  s5549 = sbv_bv_extract_u8_0_0_u1(s2720);+  const SBool  s5550 = false != s5549;+  const SWord8 s5551 = sbv_bv_u8_rotr(s2707, 1);+  const SWord8 s5552 = 128 | s5551;+  const SWord8 s5553 = 127 & s5551;+  const SWord8 s5554 = s5550 ? s5552 : s5553;+  const SWord8 s5555 = sbv_bv_u8_rotr(s5554, 1);+  const SWord8 s5556 = 128 | s5555;+  const SWord8 s5557 = 127 & s5555;+  const SWord8 s5558 = s5548 ? s5556 : s5557;+  const SWord8 s5559 = sbv_bv_u8_rotr(s5558, 1);+  const SWord8 s5560 = 128 | s5559;+  const SWord8 s5561 = 127 & s5559;+  const SWord8 s5562 = s5546 ? s5560 : s5561;+  const SBool  s5563 = sbv_bv_extract_u8_0_0_u1(s2733);+  const SBool  s5564 = false != s5563;+  const SWord8 s5565 = s5564 ? s5560 : s5561;+  const SWord8 s5566 = s2713 ? s5562 : s5565;+  const SBool  s5567 = sbv_bv_extract_u8_0_0_u1(s2749);+  const SBool  s5568 = false != s5567;+  const SBool  s5569 = sbv_bv_extract_u8_0_0_u1(s2742);+  const SBool  s5570 = false != s5569;+  const SWord8 s5571 = s5570 ? s5556 : s5557;+  const SWord8 s5572 = sbv_bv_u8_rotr(s5571, 1);+  const SWord8 s5573 = 128 | s5572;+  const SWord8 s5574 = 127 & s5572;+  const SWord8 s5575 = s5568 ? s5573 : s5574;+  const SBool  s5576 = sbv_bv_extract_u8_0_0_u1(s2754);+  const SBool  s5577 = false != s5576;+  const SWord8 s5578 = s5577 ? s5573 : s5574;+  const SWord8 s5579 = s2713 ? s5575 : s5578;+  const SWord8 s5580 = s2589 ? s5566 : s5579;+  const SBool  s5581 = sbv_bv_extract_u8_0_0_u1(s2775);+  const SBool  s5582 = false != s5581;+  const SBool  s5583 = sbv_bv_extract_u8_0_0_u1(s2771);+  const SBool  s5584 = false != s5583;+  const SBool  s5585 = sbv_bv_extract_u8_0_0_u1(s2764);+  const SBool  s5586 = false != s5585;+  const SWord8 s5587 = s5586 ? s5552 : s5553;+  const SWord8 s5588 = sbv_bv_u8_rotr(s5587, 1);+  const SWord8 s5589 = 128 | s5588;+  const SWord8 s5590 = 127 & s5588;+  const SWord8 s5591 = s5584 ? s5589 : s5590;+  const SWord8 s5592 = sbv_bv_u8_rotr(s5591, 1);+  const SWord8 s5593 = 128 | s5592;+  const SWord8 s5594 = 127 & s5592;+  const SWord8 s5595 = s5582 ? s5593 : s5594;+  const SBool  s5596 = sbv_bv_extract_u8_0_0_u1(s2780);+  const SBool  s5597 = false != s5596;+  const SWord8 s5598 = s5597 ? s5593 : s5594;+  const SWord8 s5599 = s2713 ? s5595 : s5598;+  const SBool  s5600 = sbv_bv_extract_u8_0_0_u1(s2796);+  const SBool  s5601 = false != s5600;+  const SBool  s5602 = sbv_bv_extract_u8_0_0_u1(s2789);+  const SBool  s5603 = false != s5602;+  const SWord8 s5604 = s5603 ? s5589 : s5590;+  const SWord8 s5605 = sbv_bv_u8_rotr(s5604, 1);+  const SWord8 s5606 = 128 | s5605;+  const SWord8 s5607 = 127 & s5605;+  const SWord8 s5608 = s5601 ? s5606 : s5607;+  const SBool  s5609 = sbv_bv_extract_u8_0_0_u1(s2801);+  const SBool  s5610 = false != s5609;+  const SWord8 s5611 = s5610 ? s5606 : s5607;+  const SWord8 s5612 = s2713 ? s5608 : s5611;+  const SWord8 s5613 = s2589 ? s5599 : s5612;+  const SWord8 s5614 = s2567 ? s5580 : s5613;+  const SWord8 s5615 = s2059 ? s5544 : s5614;+  const SBool  s5616 = sbv_bv_extract_u8_0_0_u1(s2856);+  const SBool  s5617 = false != s5616;+  const SBool  s5618 = sbv_bv_extract_u8_0_0_u1(s2852);+  const SBool  s5619 = false != s5618;+  const SBool  s5620 = sbv_bv_extract_u8_0_0_u1(s2848);+  const SBool  s5621 = false != s5620;+  const SWord8 s5622 = sbv_bv_u8_rotr(s2835, 1);+  const SWord8 s5623 = 128 | s5622;+  const SWord8 s5624 = 127 & s5622;+  const SWord8 s5625 = s5621 ? s5623 : s5624;+  const SWord8 s5626 = sbv_bv_u8_rotr(s5625, 1);+  const SWord8 s5627 = 128 | s5626;+  const SWord8 s5628 = 127 & s5626;+  const SWord8 s5629 = s5619 ? s5627 : s5628;+  const SWord8 s5630 = sbv_bv_u8_rotr(s5629, 1);+  const SWord8 s5631 = 128 | s5630;+  const SWord8 s5632 = 127 & s5630;+  const SWord8 s5633 = s5617 ? s5631 : s5632;+  const SBool  s5634 = sbv_bv_extract_u8_0_0_u1(s2861);+  const SBool  s5635 = false != s5634;+  const SWord8 s5636 = s5635 ? s5631 : s5632;+  const SWord8 s5637 = s2844 ? s5633 : s5636;+  const SBool  s5638 = sbv_bv_extract_u8_0_0_u1(s2877);+  const SBool  s5639 = false != s5638;+  const SBool  s5640 = sbv_bv_extract_u8_0_0_u1(s2870);+  const SBool  s5641 = false != s5640;+  const SWord8 s5642 = s5641 ? s5627 : s5628;+  const SWord8 s5643 = sbv_bv_u8_rotr(s5642, 1);+  const SWord8 s5644 = 128 | s5643;+  const SWord8 s5645 = 127 & s5643;+  const SWord8 s5646 = s5639 ? s5644 : s5645;+  const SBool  s5647 = sbv_bv_extract_u8_0_0_u1(s2882);+  const SBool  s5648 = false != s5647;+  const SWord8 s5649 = s5648 ? s5644 : s5645;+  const SWord8 s5650 = s2844 ? s5646 : s5649;+  const SWord8 s5651 = s2822 ? s5637 : s5650;+  const SBool  s5652 = sbv_bv_extract_u8_0_0_u1(s2903);+  const SBool  s5653 = false != s5652;+  const SBool  s5654 = sbv_bv_extract_u8_0_0_u1(s2899);+  const SBool  s5655 = false != s5654;+  const SBool  s5656 = sbv_bv_extract_u8_0_0_u1(s2892);+  const SBool  s5657 = false != s5656;+  const SWord8 s5658 = s5657 ? s5623 : s5624;+  const SWord8 s5659 = sbv_bv_u8_rotr(s5658, 1);+  const SWord8 s5660 = 128 | s5659;+  const SWord8 s5661 = 127 & s5659;+  const SWord8 s5662 = s5655 ? s5660 : s5661;+  const SWord8 s5663 = sbv_bv_u8_rotr(s5662, 1);+  const SWord8 s5664 = 128 | s5663;+  const SWord8 s5665 = 127 & s5663;+  const SWord8 s5666 = s5653 ? s5664 : s5665;+  const SBool  s5667 = sbv_bv_extract_u8_0_0_u1(s2908);+  const SBool  s5668 = false != s5667;+  const SWord8 s5669 = s5668 ? s5664 : s5665;+  const SWord8 s5670 = s2844 ? s5666 : s5669;+  const SBool  s5671 = sbv_bv_extract_u8_0_0_u1(s2924);+  const SBool  s5672 = false != s5671;+  const SBool  s5673 = sbv_bv_extract_u8_0_0_u1(s2917);+  const SBool  s5674 = false != s5673;+  const SWord8 s5675 = s5674 ? s5660 : s5661;+  const SWord8 s5676 = sbv_bv_u8_rotr(s5675, 1);+  const SWord8 s5677 = 128 | s5676;+  const SWord8 s5678 = 127 & s5676;+  const SWord8 s5679 = s5672 ? s5677 : s5678;+  const SBool  s5680 = sbv_bv_extract_u8_0_0_u1(s2929);+  const SBool  s5681 = false != s5680;+  const SWord8 s5682 = s5681 ? s5677 : s5678;+  const SWord8 s5683 = s2844 ? s5679 : s5682;+  const SWord8 s5684 = s2822 ? s5670 : s5683;+  const SWord8 s5685 = s2567 ? s5651 : s5684;+  const SBool  s5686 = sbv_bv_extract_u8_0_0_u1(s2964);+  const SBool  s5687 = false != s5686;+  const SBool  s5688 = sbv_bv_extract_u8_0_0_u1(s2960);+  const SBool  s5689 = false != s5688;+  const SBool  s5690 = sbv_bv_extract_u8_0_0_u1(s2956);+  const SBool  s5691 = false != s5690;+  const SWord8 s5692 = sbv_bv_u8_rotr(s2943, 1);+  const SWord8 s5693 = 128 | s5692;+  const SWord8 s5694 = 127 & s5692;+  const SWord8 s5695 = s5691 ? s5693 : s5694;+  const SWord8 s5696 = sbv_bv_u8_rotr(s5695, 1);+  const SWord8 s5697 = 128 | s5696;+  const SWord8 s5698 = 127 & s5696;+  const SWord8 s5699 = s5689 ? s5697 : s5698;+  const SWord8 s5700 = sbv_bv_u8_rotr(s5699, 1);+  const SWord8 s5701 = 128 | s5700;+  const SWord8 s5702 = 127 & s5700;+  const SWord8 s5703 = s5687 ? s5701 : s5702;+  const SBool  s5704 = sbv_bv_extract_u8_0_0_u1(s2969);+  const SBool  s5705 = false != s5704;+  const SWord8 s5706 = s5705 ? s5701 : s5702;+  const SWord8 s5707 = s2949 ? s5703 : s5706;+  const SBool  s5708 = sbv_bv_extract_u8_0_0_u1(s2985);+  const SBool  s5709 = false != s5708;+  const SBool  s5710 = sbv_bv_extract_u8_0_0_u1(s2978);+  const SBool  s5711 = false != s5710;+  const SWord8 s5712 = s5711 ? s5697 : s5698;+  const SWord8 s5713 = sbv_bv_u8_rotr(s5712, 1);+  const SWord8 s5714 = 128 | s5713;+  const SWord8 s5715 = 127 & s5713;+  const SWord8 s5716 = s5709 ? s5714 : s5715;+  const SBool  s5717 = sbv_bv_extract_u8_0_0_u1(s2990);+  const SBool  s5718 = false != s5717;+  const SWord8 s5719 = s5718 ? s5714 : s5715;+  const SWord8 s5720 = s2949 ? s5716 : s5719;+  const SWord8 s5721 = s2822 ? s5707 : s5720;+  const SBool  s5722 = sbv_bv_extract_u8_0_0_u1(s3011);+  const SBool  s5723 = false != s5722;+  const SBool  s5724 = sbv_bv_extract_u8_0_0_u1(s3007);+  const SBool  s5725 = false != s5724;+  const SBool  s5726 = sbv_bv_extract_u8_0_0_u1(s3000);+  const SBool  s5727 = false != s5726;+  const SWord8 s5728 = s5727 ? s5693 : s5694;+  const SWord8 s5729 = sbv_bv_u8_rotr(s5728, 1);+  const SWord8 s5730 = 128 | s5729;+  const SWord8 s5731 = 127 & s5729;+  const SWord8 s5732 = s5725 ? s5730 : s5731;+  const SWord8 s5733 = sbv_bv_u8_rotr(s5732, 1);+  const SWord8 s5734 = 128 | s5733;+  const SWord8 s5735 = 127 & s5733;+  const SWord8 s5736 = s5723 ? s5734 : s5735;+  const SBool  s5737 = sbv_bv_extract_u8_0_0_u1(s3016);+  const SBool  s5738 = false != s5737;+  const SWord8 s5739 = s5738 ? s5734 : s5735;+  const SWord8 s5740 = s2949 ? s5736 : s5739;+  const SBool  s5741 = sbv_bv_extract_u8_0_0_u1(s3032);+  const SBool  s5742 = false != s5741;+  const SBool  s5743 = sbv_bv_extract_u8_0_0_u1(s3025);+  const SBool  s5744 = false != s5743;+  const SWord8 s5745 = s5744 ? s5730 : s5731;+  const SWord8 s5746 = sbv_bv_u8_rotr(s5745, 1);+  const SWord8 s5747 = 128 | s5746;+  const SWord8 s5748 = 127 & s5746;+  const SWord8 s5749 = s5742 ? s5747 : s5748;+  const SBool  s5750 = sbv_bv_extract_u8_0_0_u1(s3037);+  const SBool  s5751 = false != s5750;+  const SWord8 s5752 = s5751 ? s5747 : s5748;+  const SWord8 s5753 = s2949 ? s5749 : s5752;+  const SWord8 s5754 = s2822 ? s5740 : s5753;+  const SWord8 s5755 = s2567 ? s5721 : s5754;+  const SWord8 s5756 = s2059 ? s5685 : s5755;+  const SWord8 s5757 = s2042 ? s5615 : s5756;+  const SWord8 s5758 = s16 ? s5474 : s5757;+  const SBool  s5759 = sbv_bv_extract_u8_0_0_u1(s3132);+  const SBool  s5760 = false != s5759;+  const SBool  s5761 = sbv_bv_extract_u8_0_0_u1(s3128);+  const SBool  s5762 = false != s5761;+  const SBool  s5763 = sbv_bv_extract_u8_0_0_u1(s3124);+  const SBool  s5764 = false != s5763;+  const SWord8 s5765 = sbv_bv_u8_rotr(s3111, 1);+  const SWord8 s5766 = 128 | s5765;+  const SWord8 s5767 = 127 & s5765;+  const SWord8 s5768 = s5764 ? s5766 : s5767;+  const SWord8 s5769 = sbv_bv_u8_rotr(s5768, 1);+  const SWord8 s5770 = 128 | s5769;+  const SWord8 s5771 = 127 & s5769;+  const SWord8 s5772 = s5762 ? s5770 : s5771;+  const SWord8 s5773 = sbv_bv_u8_rotr(s5772, 1);+  const SWord8 s5774 = 128 | s5773;+  const SWord8 s5775 = 127 & s5773;+  const SWord8 s5776 = s5760 ? s5774 : s5775;+  const SBool  s5777 = sbv_bv_extract_u8_0_0_u1(s3137);+  const SBool  s5778 = false != s5777;+  const SWord8 s5779 = s5778 ? s5774 : s5775;+  const SWord8 s5780 = s3120 ? s5776 : s5779;+  const SBool  s5781 = sbv_bv_extract_u8_0_0_u1(s3153);+  const SBool  s5782 = false != s5781;+  const SBool  s5783 = sbv_bv_extract_u8_0_0_u1(s3146);+  const SBool  s5784 = false != s5783;+  const SWord8 s5785 = s5784 ? s5770 : s5771;+  const SWord8 s5786 = sbv_bv_u8_rotr(s5785, 1);+  const SWord8 s5787 = 128 | s5786;+  const SWord8 s5788 = 127 & s5786;+  const SWord8 s5789 = s5782 ? s5787 : s5788;+  const SBool  s5790 = sbv_bv_extract_u8_0_0_u1(s3158);+  const SBool  s5791 = false != s5790;+  const SWord8 s5792 = s5791 ? s5787 : s5788;+  const SWord8 s5793 = s3120 ? s5789 : s5792;+  const SWord8 s5794 = s3101 ? s5780 : s5793;+  const SBool  s5795 = sbv_bv_extract_u8_0_0_u1(s3179);+  const SBool  s5796 = false != s5795;+  const SBool  s5797 = sbv_bv_extract_u8_0_0_u1(s3175);+  const SBool  s5798 = false != s5797;+  const SBool  s5799 = sbv_bv_extract_u8_0_0_u1(s3168);+  const SBool  s5800 = false != s5799;+  const SWord8 s5801 = s5800 ? s5766 : s5767;+  const SWord8 s5802 = sbv_bv_u8_rotr(s5801, 1);+  const SWord8 s5803 = 128 | s5802;+  const SWord8 s5804 = 127 & s5802;+  const SWord8 s5805 = s5798 ? s5803 : s5804;+  const SWord8 s5806 = sbv_bv_u8_rotr(s5805, 1);+  const SWord8 s5807 = 128 | s5806;+  const SWord8 s5808 = 127 & s5806;+  const SWord8 s5809 = s5796 ? s5807 : s5808;+  const SBool  s5810 = sbv_bv_extract_u8_0_0_u1(s3184);+  const SBool  s5811 = false != s5810;+  const SWord8 s5812 = s5811 ? s5807 : s5808;+  const SWord8 s5813 = s3120 ? s5809 : s5812;+  const SBool  s5814 = sbv_bv_extract_u8_0_0_u1(s3200);+  const SBool  s5815 = false != s5814;+  const SBool  s5816 = sbv_bv_extract_u8_0_0_u1(s3193);+  const SBool  s5817 = false != s5816;+  const SWord8 s5818 = s5817 ? s5803 : s5804;+  const SWord8 s5819 = sbv_bv_u8_rotr(s5818, 1);+  const SWord8 s5820 = 128 | s5819;+  const SWord8 s5821 = 127 & s5819;+  const SWord8 s5822 = s5815 ? s5820 : s5821;+  const SBool  s5823 = sbv_bv_extract_u8_0_0_u1(s3205);+  const SBool  s5824 = false != s5823;+  const SWord8 s5825 = s5824 ? s5820 : s5821;+  const SWord8 s5826 = s3120 ? s5822 : s5825;+  const SWord8 s5827 = s3101 ? s5813 : s5826;+  const SWord8 s5828 = s3082 ? s5794 : s5827;+  const SBool  s5829 = sbv_bv_extract_u8_0_0_u1(s3240);+  const SBool  s5830 = false != s5829;+  const SBool  s5831 = sbv_bv_extract_u8_0_0_u1(s3236);+  const SBool  s5832 = false != s5831;+  const SBool  s5833 = sbv_bv_extract_u8_0_0_u1(s3232);+  const SBool  s5834 = false != s5833;+  const SWord8 s5835 = sbv_bv_u8_rotr(s3219, 1);+  const SWord8 s5836 = 128 | s5835;+  const SWord8 s5837 = 127 & s5835;+  const SWord8 s5838 = s5834 ? s5836 : s5837;+  const SWord8 s5839 = sbv_bv_u8_rotr(s5838, 1);+  const SWord8 s5840 = 128 | s5839;+  const SWord8 s5841 = 127 & s5839;+  const SWord8 s5842 = s5832 ? s5840 : s5841;+  const SWord8 s5843 = sbv_bv_u8_rotr(s5842, 1);+  const SWord8 s5844 = 128 | s5843;+  const SWord8 s5845 = 127 & s5843;+  const SWord8 s5846 = s5830 ? s5844 : s5845;+  const SBool  s5847 = sbv_bv_extract_u8_0_0_u1(s3245);+  const SBool  s5848 = false != s5847;+  const SWord8 s5849 = s5848 ? s5844 : s5845;+  const SWord8 s5850 = s3225 ? s5846 : s5849;+  const SBool  s5851 = sbv_bv_extract_u8_0_0_u1(s3261);+  const SBool  s5852 = false != s5851;+  const SBool  s5853 = sbv_bv_extract_u8_0_0_u1(s3254);+  const SBool  s5854 = false != s5853;+  const SWord8 s5855 = s5854 ? s5840 : s5841;+  const SWord8 s5856 = sbv_bv_u8_rotr(s5855, 1);+  const SWord8 s5857 = 128 | s5856;+  const SWord8 s5858 = 127 & s5856;+  const SWord8 s5859 = s5852 ? s5857 : s5858;+  const SBool  s5860 = sbv_bv_extract_u8_0_0_u1(s3266);+  const SBool  s5861 = false != s5860;+  const SWord8 s5862 = s5861 ? s5857 : s5858;+  const SWord8 s5863 = s3225 ? s5859 : s5862;+  const SWord8 s5864 = s3101 ? s5850 : s5863;+  const SBool  s5865 = sbv_bv_extract_u8_0_0_u1(s3287);+  const SBool  s5866 = false != s5865;+  const SBool  s5867 = sbv_bv_extract_u8_0_0_u1(s3283);+  const SBool  s5868 = false != s5867;+  const SBool  s5869 = sbv_bv_extract_u8_0_0_u1(s3276);+  const SBool  s5870 = false != s5869;+  const SWord8 s5871 = s5870 ? s5836 : s5837;+  const SWord8 s5872 = sbv_bv_u8_rotr(s5871, 1);+  const SWord8 s5873 = 128 | s5872;+  const SWord8 s5874 = 127 & s5872;+  const SWord8 s5875 = s5868 ? s5873 : s5874;+  const SWord8 s5876 = sbv_bv_u8_rotr(s5875, 1);+  const SWord8 s5877 = 128 | s5876;+  const SWord8 s5878 = 127 & s5876;+  const SWord8 s5879 = s5866 ? s5877 : s5878;+  const SBool  s5880 = sbv_bv_extract_u8_0_0_u1(s3292);+  const SBool  s5881 = false != s5880;+  const SWord8 s5882 = s5881 ? s5877 : s5878;+  const SWord8 s5883 = s3225 ? s5879 : s5882;+  const SBool  s5884 = sbv_bv_extract_u8_0_0_u1(s3308);+  const SBool  s5885 = false != s5884;+  const SBool  s5886 = sbv_bv_extract_u8_0_0_u1(s3301);+  const SBool  s5887 = false != s5886;+  const SWord8 s5888 = s5887 ? s5873 : s5874;+  const SWord8 s5889 = sbv_bv_u8_rotr(s5888, 1);+  const SWord8 s5890 = 128 | s5889;+  const SWord8 s5891 = 127 & s5889;+  const SWord8 s5892 = s5885 ? s5890 : s5891;+  const SBool  s5893 = sbv_bv_extract_u8_0_0_u1(s3313);+  const SBool  s5894 = false != s5893;+  const SWord8 s5895 = s5894 ? s5890 : s5891;+  const SWord8 s5896 = s3225 ? s5892 : s5895;+  const SWord8 s5897 = s3101 ? s5883 : s5896;+  const SWord8 s5898 = s3082 ? s5864 : s5897;+  const SWord8 s5899 = s3060 ? s5828 : s5898;+  const SBool  s5900 = sbv_bv_extract_u8_0_0_u1(s3368);+  const SBool  s5901 = false != s5900;+  const SBool  s5902 = sbv_bv_extract_u8_0_0_u1(s3364);+  const SBool  s5903 = false != s5902;+  const SBool  s5904 = sbv_bv_extract_u8_0_0_u1(s3360);+  const SBool  s5905 = false != s5904;+  const SWord8 s5906 = sbv_bv_u8_rotr(s3347, 1);+  const SWord8 s5907 = 128 | s5906;+  const SWord8 s5908 = 127 & s5906;+  const SWord8 s5909 = s5905 ? s5907 : s5908;+  const SWord8 s5910 = sbv_bv_u8_rotr(s5909, 1);+  const SWord8 s5911 = 128 | s5910;+  const SWord8 s5912 = 127 & s5910;+  const SWord8 s5913 = s5903 ? s5911 : s5912;+  const SWord8 s5914 = sbv_bv_u8_rotr(s5913, 1);+  const SWord8 s5915 = 128 | s5914;+  const SWord8 s5916 = 127 & s5914;+  const SWord8 s5917 = s5901 ? s5915 : s5916;+  const SBool  s5918 = sbv_bv_extract_u8_0_0_u1(s3373);+  const SBool  s5919 = false != s5918;+  const SWord8 s5920 = s5919 ? s5915 : s5916;+  const SWord8 s5921 = s3356 ? s5917 : s5920;+  const SBool  s5922 = sbv_bv_extract_u8_0_0_u1(s3389);+  const SBool  s5923 = false != s5922;+  const SBool  s5924 = sbv_bv_extract_u8_0_0_u1(s3382);+  const SBool  s5925 = false != s5924;+  const SWord8 s5926 = s5925 ? s5911 : s5912;+  const SWord8 s5927 = sbv_bv_u8_rotr(s5926, 1);+  const SWord8 s5928 = 128 | s5927;+  const SWord8 s5929 = 127 & s5927;+  const SWord8 s5930 = s5923 ? s5928 : s5929;+  const SBool  s5931 = sbv_bv_extract_u8_0_0_u1(s3394);+  const SBool  s5932 = false != s5931;+  const SWord8 s5933 = s5932 ? s5928 : s5929;+  const SWord8 s5934 = s3356 ? s5930 : s5933;+  const SWord8 s5935 = s3334 ? s5921 : s5934;+  const SBool  s5936 = sbv_bv_extract_u8_0_0_u1(s3415);+  const SBool  s5937 = false != s5936;+  const SBool  s5938 = sbv_bv_extract_u8_0_0_u1(s3411);+  const SBool  s5939 = false != s5938;+  const SBool  s5940 = sbv_bv_extract_u8_0_0_u1(s3404);+  const SBool  s5941 = false != s5940;+  const SWord8 s5942 = s5941 ? s5907 : s5908;+  const SWord8 s5943 = sbv_bv_u8_rotr(s5942, 1);+  const SWord8 s5944 = 128 | s5943;+  const SWord8 s5945 = 127 & s5943;+  const SWord8 s5946 = s5939 ? s5944 : s5945;+  const SWord8 s5947 = sbv_bv_u8_rotr(s5946, 1);+  const SWord8 s5948 = 128 | s5947;+  const SWord8 s5949 = 127 & s5947;+  const SWord8 s5950 = s5937 ? s5948 : s5949;+  const SBool  s5951 = sbv_bv_extract_u8_0_0_u1(s3420);+  const SBool  s5952 = false != s5951;+  const SWord8 s5953 = s5952 ? s5948 : s5949;+  const SWord8 s5954 = s3356 ? s5950 : s5953;+  const SBool  s5955 = sbv_bv_extract_u8_0_0_u1(s3436);+  const SBool  s5956 = false != s5955;+  const SBool  s5957 = sbv_bv_extract_u8_0_0_u1(s3429);+  const SBool  s5958 = false != s5957;+  const SWord8 s5959 = s5958 ? s5944 : s5945;+  const SWord8 s5960 = sbv_bv_u8_rotr(s5959, 1);+  const SWord8 s5961 = 128 | s5960;+  const SWord8 s5962 = 127 & s5960;+  const SWord8 s5963 = s5956 ? s5961 : s5962;+  const SBool  s5964 = sbv_bv_extract_u8_0_0_u1(s3441);+  const SBool  s5965 = false != s5964;+  const SWord8 s5966 = s5965 ? s5961 : s5962;+  const SWord8 s5967 = s3356 ? s5963 : s5966;+  const SWord8 s5968 = s3334 ? s5954 : s5967;+  const SWord8 s5969 = s3082 ? s5935 : s5968;+  const SBool  s5970 = sbv_bv_extract_u8_0_0_u1(s3476);+  const SBool  s5971 = false != s5970;+  const SBool  s5972 = sbv_bv_extract_u8_0_0_u1(s3472);+  const SBool  s5973 = false != s5972;+  const SBool  s5974 = sbv_bv_extract_u8_0_0_u1(s3468);+  const SBool  s5975 = false != s5974;+  const SWord8 s5976 = sbv_bv_u8_rotr(s3455, 1);+  const SWord8 s5977 = 128 | s5976;+  const SWord8 s5978 = 127 & s5976;+  const SWord8 s5979 = s5975 ? s5977 : s5978;+  const SWord8 s5980 = sbv_bv_u8_rotr(s5979, 1);+  const SWord8 s5981 = 128 | s5980;+  const SWord8 s5982 = 127 & s5980;+  const SWord8 s5983 = s5973 ? s5981 : s5982;+  const SWord8 s5984 = sbv_bv_u8_rotr(s5983, 1);+  const SWord8 s5985 = 128 | s5984;+  const SWord8 s5986 = 127 & s5984;+  const SWord8 s5987 = s5971 ? s5985 : s5986;+  const SBool  s5988 = sbv_bv_extract_u8_0_0_u1(s3481);+  const SBool  s5989 = false != s5988;+  const SWord8 s5990 = s5989 ? s5985 : s5986;+  const SWord8 s5991 = s3461 ? s5987 : s5990;+  const SBool  s5992 = sbv_bv_extract_u8_0_0_u1(s3497);+  const SBool  s5993 = false != s5992;+  const SBool  s5994 = sbv_bv_extract_u8_0_0_u1(s3490);+  const SBool  s5995 = false != s5994;+  const SWord8 s5996 = s5995 ? s5981 : s5982;+  const SWord8 s5997 = sbv_bv_u8_rotr(s5996, 1);+  const SWord8 s5998 = 128 | s5997;+  const SWord8 s5999 = 127 & s5997;+  const SWord8 s6000 = s5993 ? s5998 : s5999;+  const SBool  s6001 = sbv_bv_extract_u8_0_0_u1(s3502);+  const SBool  s6002 = false != s6001;+  const SWord8 s6003 = s6002 ? s5998 : s5999;+  const SWord8 s6004 = s3461 ? s6000 : s6003;+  const SWord8 s6005 = s3334 ? s5991 : s6004;+  const SBool  s6006 = sbv_bv_extract_u8_0_0_u1(s3523);+  const SBool  s6007 = false != s6006;+  const SBool  s6008 = sbv_bv_extract_u8_0_0_u1(s3519);+  const SBool  s6009 = false != s6008;+  const SBool  s6010 = sbv_bv_extract_u8_0_0_u1(s3512);+  const SBool  s6011 = false != s6010;+  const SWord8 s6012 = s6011 ? s5977 : s5978;+  const SWord8 s6013 = sbv_bv_u8_rotr(s6012, 1);+  const SWord8 s6014 = 128 | s6013;+  const SWord8 s6015 = 127 & s6013;+  const SWord8 s6016 = s6009 ? s6014 : s6015;+  const SWord8 s6017 = sbv_bv_u8_rotr(s6016, 1);+  const SWord8 s6018 = 128 | s6017;+  const SWord8 s6019 = 127 & s6017;+  const SWord8 s6020 = s6007 ? s6018 : s6019;+  const SBool  s6021 = sbv_bv_extract_u8_0_0_u1(s3528);+  const SBool  s6022 = false != s6021;+  const SWord8 s6023 = s6022 ? s6018 : s6019;+  const SWord8 s6024 = s3461 ? s6020 : s6023;+  const SBool  s6025 = sbv_bv_extract_u8_0_0_u1(s3544);+  const SBool  s6026 = false != s6025;+  const SBool  s6027 = sbv_bv_extract_u8_0_0_u1(s3537);+  const SBool  s6028 = false != s6027;+  const SWord8 s6029 = s6028 ? s6014 : s6015;+  const SWord8 s6030 = sbv_bv_u8_rotr(s6029, 1);+  const SWord8 s6031 = 128 | s6030;+  const SWord8 s6032 = 127 & s6030;+  const SWord8 s6033 = s6026 ? s6031 : s6032;+  const SBool  s6034 = sbv_bv_extract_u8_0_0_u1(s3549);+  const SBool  s6035 = false != s6034;+  const SWord8 s6036 = s6035 ? s6031 : s6032;+  const SWord8 s6037 = s3461 ? s6033 : s6036;+  const SWord8 s6038 = s3334 ? s6024 : s6037;+  const SWord8 s6039 = s3082 ? s6005 : s6038;+  const SWord8 s6040 = s3060 ? s5969 : s6039;+  const SWord8 s6041 = s2042 ? s5899 : s6040;+  const SBool  s6042 = sbv_bv_extract_u8_0_0_u1(s3624);+  const SBool  s6043 = false != s6042;+  const SBool  s6044 = sbv_bv_extract_u8_0_0_u1(s3620);+  const SBool  s6045 = false != s6044;+  const SBool  s6046 = sbv_bv_extract_u8_0_0_u1(s3616);+  const SBool  s6047 = false != s6046;+  const SWord8 s6048 = sbv_bv_u8_rotr(s3603, 1);+  const SWord8 s6049 = 128 | s6048;+  const SWord8 s6050 = 127 & s6048;+  const SWord8 s6051 = s6047 ? s6049 : s6050;+  const SWord8 s6052 = sbv_bv_u8_rotr(s6051, 1);+  const SWord8 s6053 = 128 | s6052;+  const SWord8 s6054 = 127 & s6052;+  const SWord8 s6055 = s6045 ? s6053 : s6054;+  const SWord8 s6056 = sbv_bv_u8_rotr(s6055, 1);+  const SWord8 s6057 = 128 | s6056;+  const SWord8 s6058 = 127 & s6056;+  const SWord8 s6059 = s6043 ? s6057 : s6058;+  const SBool  s6060 = sbv_bv_extract_u8_0_0_u1(s3629);+  const SBool  s6061 = false != s6060;+  const SWord8 s6062 = s6061 ? s6057 : s6058;+  const SWord8 s6063 = s3612 ? s6059 : s6062;+  const SBool  s6064 = sbv_bv_extract_u8_0_0_u1(s3645);+  const SBool  s6065 = false != s6064;+  const SBool  s6066 = sbv_bv_extract_u8_0_0_u1(s3638);+  const SBool  s6067 = false != s6066;+  const SWord8 s6068 = s6067 ? s6053 : s6054;+  const SWord8 s6069 = sbv_bv_u8_rotr(s6068, 1);+  const SWord8 s6070 = 128 | s6069;+  const SWord8 s6071 = 127 & s6069;+  const SWord8 s6072 = s6065 ? s6070 : s6071;+  const SBool  s6073 = sbv_bv_extract_u8_0_0_u1(s3650);+  const SBool  s6074 = false != s6073;+  const SWord8 s6075 = s6074 ? s6070 : s6071;+  const SWord8 s6076 = s3612 ? s6072 : s6075;+  const SWord8 s6077 = s3593 ? s6063 : s6076;+  const SBool  s6078 = sbv_bv_extract_u8_0_0_u1(s3671);+  const SBool  s6079 = false != s6078;+  const SBool  s6080 = sbv_bv_extract_u8_0_0_u1(s3667);+  const SBool  s6081 = false != s6080;+  const SBool  s6082 = sbv_bv_extract_u8_0_0_u1(s3660);+  const SBool  s6083 = false != s6082;+  const SWord8 s6084 = s6083 ? s6049 : s6050;+  const SWord8 s6085 = sbv_bv_u8_rotr(s6084, 1);+  const SWord8 s6086 = 128 | s6085;+  const SWord8 s6087 = 127 & s6085;+  const SWord8 s6088 = s6081 ? s6086 : s6087;+  const SWord8 s6089 = sbv_bv_u8_rotr(s6088, 1);+  const SWord8 s6090 = 128 | s6089;+  const SWord8 s6091 = 127 & s6089;+  const SWord8 s6092 = s6079 ? s6090 : s6091;+  const SBool  s6093 = sbv_bv_extract_u8_0_0_u1(s3676);+  const SBool  s6094 = false != s6093;+  const SWord8 s6095 = s6094 ? s6090 : s6091;+  const SWord8 s6096 = s3612 ? s6092 : s6095;+  const SBool  s6097 = sbv_bv_extract_u8_0_0_u1(s3692);+  const SBool  s6098 = false != s6097;+  const SBool  s6099 = sbv_bv_extract_u8_0_0_u1(s3685);+  const SBool  s6100 = false != s6099;+  const SWord8 s6101 = s6100 ? s6086 : s6087;+  const SWord8 s6102 = sbv_bv_u8_rotr(s6101, 1);+  const SWord8 s6103 = 128 | s6102;+  const SWord8 s6104 = 127 & s6102;+  const SWord8 s6105 = s6098 ? s6103 : s6104;+  const SBool  s6106 = sbv_bv_extract_u8_0_0_u1(s3697);+  const SBool  s6107 = false != s6106;+  const SWord8 s6108 = s6107 ? s6103 : s6104;+  const SWord8 s6109 = s3612 ? s6105 : s6108;+  const SWord8 s6110 = s3593 ? s6096 : s6109;+  const SWord8 s6111 = s3571 ? s6077 : s6110;+  const SBool  s6112 = sbv_bv_extract_u8_0_0_u1(s3732);+  const SBool  s6113 = false != s6112;+  const SBool  s6114 = sbv_bv_extract_u8_0_0_u1(s3728);+  const SBool  s6115 = false != s6114;+  const SBool  s6116 = sbv_bv_extract_u8_0_0_u1(s3724);+  const SBool  s6117 = false != s6116;+  const SWord8 s6118 = sbv_bv_u8_rotr(s3711, 1);+  const SWord8 s6119 = 128 | s6118;+  const SWord8 s6120 = 127 & s6118;+  const SWord8 s6121 = s6117 ? s6119 : s6120;+  const SWord8 s6122 = sbv_bv_u8_rotr(s6121, 1);+  const SWord8 s6123 = 128 | s6122;+  const SWord8 s6124 = 127 & s6122;+  const SWord8 s6125 = s6115 ? s6123 : s6124;+  const SWord8 s6126 = sbv_bv_u8_rotr(s6125, 1);+  const SWord8 s6127 = 128 | s6126;+  const SWord8 s6128 = 127 & s6126;+  const SWord8 s6129 = s6113 ? s6127 : s6128;+  const SBool  s6130 = sbv_bv_extract_u8_0_0_u1(s3737);+  const SBool  s6131 = false != s6130;+  const SWord8 s6132 = s6131 ? s6127 : s6128;+  const SWord8 s6133 = s3717 ? s6129 : s6132;+  const SBool  s6134 = sbv_bv_extract_u8_0_0_u1(s3753);+  const SBool  s6135 = false != s6134;+  const SBool  s6136 = sbv_bv_extract_u8_0_0_u1(s3746);+  const SBool  s6137 = false != s6136;+  const SWord8 s6138 = s6137 ? s6123 : s6124;+  const SWord8 s6139 = sbv_bv_u8_rotr(s6138, 1);+  const SWord8 s6140 = 128 | s6139;+  const SWord8 s6141 = 127 & s6139;+  const SWord8 s6142 = s6135 ? s6140 : s6141;+  const SBool  s6143 = sbv_bv_extract_u8_0_0_u1(s3758);+  const SBool  s6144 = false != s6143;+  const SWord8 s6145 = s6144 ? s6140 : s6141;+  const SWord8 s6146 = s3717 ? s6142 : s6145;+  const SWord8 s6147 = s3593 ? s6133 : s6146;+  const SBool  s6148 = sbv_bv_extract_u8_0_0_u1(s3779);+  const SBool  s6149 = false != s6148;+  const SBool  s6150 = sbv_bv_extract_u8_0_0_u1(s3775);+  const SBool  s6151 = false != s6150;+  const SBool  s6152 = sbv_bv_extract_u8_0_0_u1(s3768);+  const SBool  s6153 = false != s6152;+  const SWord8 s6154 = s6153 ? s6119 : s6120;+  const SWord8 s6155 = sbv_bv_u8_rotr(s6154, 1);+  const SWord8 s6156 = 128 | s6155;+  const SWord8 s6157 = 127 & s6155;+  const SWord8 s6158 = s6151 ? s6156 : s6157;+  const SWord8 s6159 = sbv_bv_u8_rotr(s6158, 1);+  const SWord8 s6160 = 128 | s6159;+  const SWord8 s6161 = 127 & s6159;+  const SWord8 s6162 = s6149 ? s6160 : s6161;+  const SBool  s6163 = sbv_bv_extract_u8_0_0_u1(s3784);+  const SBool  s6164 = false != s6163;+  const SWord8 s6165 = s6164 ? s6160 : s6161;+  const SWord8 s6166 = s3717 ? s6162 : s6165;+  const SBool  s6167 = sbv_bv_extract_u8_0_0_u1(s3800);+  const SBool  s6168 = false != s6167;+  const SBool  s6169 = sbv_bv_extract_u8_0_0_u1(s3793);+  const SBool  s6170 = false != s6169;+  const SWord8 s6171 = s6170 ? s6156 : s6157;+  const SWord8 s6172 = sbv_bv_u8_rotr(s6171, 1);+  const SWord8 s6173 = 128 | s6172;+  const SWord8 s6174 = 127 & s6172;+  const SWord8 s6175 = s6168 ? s6173 : s6174;+  const SBool  s6176 = sbv_bv_extract_u8_0_0_u1(s3805);+  const SBool  s6177 = false != s6176;+  const SWord8 s6178 = s6177 ? s6173 : s6174;+  const SWord8 s6179 = s3717 ? s6175 : s6178;+  const SWord8 s6180 = s3593 ? s6166 : s6179;+  const SWord8 s6181 = s3571 ? s6147 : s6180;+  const SWord8 s6182 = s3060 ? s6111 : s6181;+  const SBool  s6183 = sbv_bv_extract_u8_0_0_u1(s3860);+  const SBool  s6184 = false != s6183;+  const SBool  s6185 = sbv_bv_extract_u8_0_0_u1(s3856);+  const SBool  s6186 = false != s6185;+  const SBool  s6187 = sbv_bv_extract_u8_0_0_u1(s3852);+  const SBool  s6188 = false != s6187;+  const SWord8 s6189 = sbv_bv_u8_rotr(s3839, 1);+  const SWord8 s6190 = 128 | s6189;+  const SWord8 s6191 = 127 & s6189;+  const SWord8 s6192 = s6188 ? s6190 : s6191;+  const SWord8 s6193 = sbv_bv_u8_rotr(s6192, 1);+  const SWord8 s6194 = 128 | s6193;+  const SWord8 s6195 = 127 & s6193;+  const SWord8 s6196 = s6186 ? s6194 : s6195;+  const SWord8 s6197 = sbv_bv_u8_rotr(s6196, 1);+  const SWord8 s6198 = 128 | s6197;+  const SWord8 s6199 = 127 & s6197;+  const SWord8 s6200 = s6184 ? s6198 : s6199;+  const SBool  s6201 = sbv_bv_extract_u8_0_0_u1(s3865);+  const SBool  s6202 = false != s6201;+  const SWord8 s6203 = s6202 ? s6198 : s6199;+  const SWord8 s6204 = s3848 ? s6200 : s6203;+  const SBool  s6205 = sbv_bv_extract_u8_0_0_u1(s3881);+  const SBool  s6206 = false != s6205;+  const SBool  s6207 = sbv_bv_extract_u8_0_0_u1(s3874);+  const SBool  s6208 = false != s6207;+  const SWord8 s6209 = s6208 ? s6194 : s6195;+  const SWord8 s6210 = sbv_bv_u8_rotr(s6209, 1);+  const SWord8 s6211 = 128 | s6210;+  const SWord8 s6212 = 127 & s6210;+  const SWord8 s6213 = s6206 ? s6211 : s6212;+  const SBool  s6214 = sbv_bv_extract_u8_0_0_u1(s3886);+  const SBool  s6215 = false != s6214;+  const SWord8 s6216 = s6215 ? s6211 : s6212;+  const SWord8 s6217 = s3848 ? s6213 : s6216;+  const SWord8 s6218 = s3826 ? s6204 : s6217;+  const SBool  s6219 = sbv_bv_extract_u8_0_0_u1(s3907);+  const SBool  s6220 = false != s6219;+  const SBool  s6221 = sbv_bv_extract_u8_0_0_u1(s3903);+  const SBool  s6222 = false != s6221;+  const SBool  s6223 = sbv_bv_extract_u8_0_0_u1(s3896);+  const SBool  s6224 = false != s6223;+  const SWord8 s6225 = s6224 ? s6190 : s6191;+  const SWord8 s6226 = sbv_bv_u8_rotr(s6225, 1);+  const SWord8 s6227 = 128 | s6226;+  const SWord8 s6228 = 127 & s6226;+  const SWord8 s6229 = s6222 ? s6227 : s6228;+  const SWord8 s6230 = sbv_bv_u8_rotr(s6229, 1);+  const SWord8 s6231 = 128 | s6230;+  const SWord8 s6232 = 127 & s6230;+  const SWord8 s6233 = s6220 ? s6231 : s6232;+  const SBool  s6234 = sbv_bv_extract_u8_0_0_u1(s3912);+  const SBool  s6235 = false != s6234;+  const SWord8 s6236 = s6235 ? s6231 : s6232;+  const SWord8 s6237 = s3848 ? s6233 : s6236;+  const SBool  s6238 = sbv_bv_extract_u8_0_0_u1(s3928);+  const SBool  s6239 = false != s6238;+  const SBool  s6240 = sbv_bv_extract_u8_0_0_u1(s3921);+  const SBool  s6241 = false != s6240;+  const SWord8 s6242 = s6241 ? s6227 : s6228;+  const SWord8 s6243 = sbv_bv_u8_rotr(s6242, 1);+  const SWord8 s6244 = 128 | s6243;+  const SWord8 s6245 = 127 & s6243;+  const SWord8 s6246 = s6239 ? s6244 : s6245;+  const SBool  s6247 = sbv_bv_extract_u8_0_0_u1(s3933);+  const SBool  s6248 = false != s6247;+  const SWord8 s6249 = s6248 ? s6244 : s6245;+  const SWord8 s6250 = s3848 ? s6246 : s6249;+  const SWord8 s6251 = s3826 ? s6237 : s6250;+  const SWord8 s6252 = s3571 ? s6218 : s6251;+  const SBool  s6253 = sbv_bv_extract_u8_0_0_u1(s3968);+  const SBool  s6254 = false != s6253;+  const SBool  s6255 = sbv_bv_extract_u8_0_0_u1(s3964);+  const SBool  s6256 = false != s6255;+  const SBool  s6257 = sbv_bv_extract_u8_0_0_u1(s3960);+  const SBool  s6258 = false != s6257;+  const SWord8 s6259 = sbv_bv_u8_rotr(s3947, 1);+  const SWord8 s6260 = 128 | s6259;+  const SWord8 s6261 = 127 & s6259;+  const SWord8 s6262 = s6258 ? s6260 : s6261;+  const SWord8 s6263 = sbv_bv_u8_rotr(s6262, 1);+  const SWord8 s6264 = 128 | s6263;+  const SWord8 s6265 = 127 & s6263;+  const SWord8 s6266 = s6256 ? s6264 : s6265;+  const SWord8 s6267 = sbv_bv_u8_rotr(s6266, 1);+  const SWord8 s6268 = 128 | s6267;+  const SWord8 s6269 = 127 & s6267;+  const SWord8 s6270 = s6254 ? s6268 : s6269;+  const SBool  s6271 = sbv_bv_extract_u8_0_0_u1(s3973);+  const SBool  s6272 = false != s6271;+  const SWord8 s6273 = s6272 ? s6268 : s6269;+  const SWord8 s6274 = s3953 ? s6270 : s6273;+  const SBool  s6275 = sbv_bv_extract_u8_0_0_u1(s3989);+  const SBool  s6276 = false != s6275;+  const SBool  s6277 = sbv_bv_extract_u8_0_0_u1(s3982);+  const SBool  s6278 = false != s6277;+  const SWord8 s6279 = s6278 ? s6264 : s6265;+  const SWord8 s6280 = sbv_bv_u8_rotr(s6279, 1);+  const SWord8 s6281 = 128 | s6280;+  const SWord8 s6282 = 127 & s6280;+  const SWord8 s6283 = s6276 ? s6281 : s6282;+  const SBool  s6284 = sbv_bv_extract_u8_0_0_u1(s3994);+  const SBool  s6285 = false != s6284;+  const SWord8 s6286 = s6285 ? s6281 : s6282;+  const SWord8 s6287 = s3953 ? s6283 : s6286;+  const SWord8 s6288 = s3826 ? s6274 : s6287;+  const SBool  s6289 = sbv_bv_extract_u8_0_0_u1(s4015);+  const SBool  s6290 = false != s6289;+  const SBool  s6291 = sbv_bv_extract_u8_0_0_u1(s4011);+  const SBool  s6292 = false != s6291;+  const SBool  s6293 = sbv_bv_extract_u8_0_0_u1(s4004);+  const SBool  s6294 = false != s6293;+  const SWord8 s6295 = s6294 ? s6260 : s6261;+  const SWord8 s6296 = sbv_bv_u8_rotr(s6295, 1);+  const SWord8 s6297 = 128 | s6296;+  const SWord8 s6298 = 127 & s6296;+  const SWord8 s6299 = s6292 ? s6297 : s6298;+  const SWord8 s6300 = sbv_bv_u8_rotr(s6299, 1);+  const SWord8 s6301 = 128 | s6300;+  const SWord8 s6302 = 127 & s6300;+  const SWord8 s6303 = s6290 ? s6301 : s6302;+  const SBool  s6304 = sbv_bv_extract_u8_0_0_u1(s4020);+  const SBool  s6305 = false != s6304;+  const SWord8 s6306 = s6305 ? s6301 : s6302;+  const SWord8 s6307 = s3953 ? s6303 : s6306;+  const SBool  s6308 = sbv_bv_extract_u8_0_0_u1(s4036);+  const SBool  s6309 = false != s6308;+  const SBool  s6310 = sbv_bv_extract_u8_0_0_u1(s4029);+  const SBool  s6311 = false != s6310;+  const SWord8 s6312 = s6311 ? s6297 : s6298;+  const SWord8 s6313 = sbv_bv_u8_rotr(s6312, 1);+  const SWord8 s6314 = 128 | s6313;+  const SWord8 s6315 = 127 & s6313;+  const SWord8 s6316 = s6309 ? s6314 : s6315;+  const SBool  s6317 = sbv_bv_extract_u8_0_0_u1(s4041);+  const SBool  s6318 = false != s6317;+  const SWord8 s6319 = s6318 ? s6314 : s6315;+  const SWord8 s6320 = s3953 ? s6316 : s6319;+  const SWord8 s6321 = s3826 ? s6307 : s6320;+  const SWord8 s6322 = s3571 ? s6288 : s6321;+  const SWord8 s6323 = s3060 ? s6252 : s6322;+  const SWord8 s6324 = s2042 ? s6182 : s6323;+  const SWord8 s6325 = s16 ? s6041 : s6324;+  const SWord8 s6326 = s11 ? s5758 : s6325;+  const SWord8 s6327 = s5 ? s5191 : s6326;++  *sbv_output_0 = s4056;+  *sbv_output_1 = s6327; } == END: "legatoMult.c" ==================
SBVTestSuite/GoldFiles/merge.gold view
@@ -12,11 +12,11 @@ merge.o: merge.c merge.h 	${CC} ${CCFLAGS} -c $< -o $@ -merge_driver.o: merge_driver.c+merge_driver.o: merge_driver.c merge.h 	${CC} ${CCFLAGS} -c $< -o $@  merge_driver: merge.o merge_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "merge.h" ================ /* Header file for merge. Automatically generated by SBV. Do not edit! */ -#ifndef __merge__HEADER_INCLUDED__-#define __merge__HEADER_INCLUDED__+#ifndef SBV_GENERATED_merge_HEADER_INCLUDED+#define SBV_GENERATED_merge_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ void merge(const SWord8 *xs, SWord8 *ys); -#endif /* __merge__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_merge_HEADER_INCLUDED */ == END: "merge.h" ================== == BEGIN: "merge_driver.c" ================ /* Example driver program for merge. */@@ -73,23 +81,29 @@  int main(void) {-  const SWord8 xs[5] = {+  const SWord8 sbv_driver_input_0[5] = {       10,  6,  4, 82, 71   };    printf("Contents of input array xs:\n");-  int xs_ctr;-  for(xs_ctr = 0; xs_ctr < 5 ; ++xs_ctr)-    printf("  xs[%1d] = %"PRIu8"\n", xs_ctr ,xs[xs_ctr]);+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 5 ; ++sbv_driver_input_0_ctr)+  { printf("  xs[%1d] = ", sbv_driver_input_0_ctr);+    printf("%"PRIu8"", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  } -  SWord8 ys[5];+  SWord8 sbv_driver_output_0[5]; -  merge(xs, ys);+  merge(sbv_driver_input_0, sbv_driver_output_0);    printf("merge(xs, ys) ->\n");-  int ys_ctr;-  for(ys_ctr = 0; ys_ctr < 5 ; ++ys_ctr)-    printf("  ys[%1d] = %"PRIu8"\n", ys_ctr ,ys[ys_ctr]);+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 5 ; ++sbv_driver_output_0_ctr)+  { printf("  ys[%1d] = ", sbv_driver_output_0_ctr);+    printf("%"PRIu8"", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }    return 0; }@@ -99,13 +113,13 @@  #include "merge.h" -void merge(const SWord8 *xs, SWord8 *ys)+void merge(const SWord8 *sbv_input_0, SWord8 *sbv_output_0) {-  const SWord8 s0 = xs[0];-  const SWord8 s1 = xs[1];-  const SWord8 s2 = xs[2];-  const SWord8 s3 = xs[3];-  const SWord8 s4 = xs[4];+  const SWord8 s0 = sbv_input_0[0];+  const SWord8 s1 = sbv_input_0[1];+  const SWord8 s2 = sbv_input_0[2];+  const SWord8 s3 = sbv_input_0[3];+  const SWord8 s4 = sbv_input_0[4];   const SBool  s5 = s0 < s1;   const SWord8 s6 = s5 ? s0 : s1;   const SBool  s7 = s3 < s4;@@ -147,10 +161,10 @@   const SWord8 s43 = s20 ? s40 : s42;   const SWord8 s44 = s11 ? s41 : s43; -  ys[0] = s12;-  ys[1] = s22;-  ys[2] = s31;-  ys[3] = s38;-  ys[4] = s44;+  sbv_output_0[0] = s12;+  sbv_output_0[1] = s22;+  sbv_output_0[2] = s31;+  sbv_output_0[3] = s38;+  sbv_output_0[4] = s44; } == END: "merge.c" ==================
SBVTestSuite/GoldFiles/popCount1.gold view
@@ -12,11 +12,11 @@ popCount.o: popCount.c popCount.h 	${CC} ${CCFLAGS} -c $< -o $@ -popCount_driver.o: popCount_driver.c+popCount_driver.o: popCount_driver.c popCount.h 	${CC} ${CCFLAGS} -c $< -o $@  popCount_driver: popCount.o popCount_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "popCount.h" ================ /* Header file for popCount. Automatically generated by SBV. Do not edit! */ -#ifndef __popCount__HEADER_INCLUDED__-#define __popCount__HEADER_INCLUDED__+#ifndef SBV_GENERATED_popCount_HEADER_INCLUDED+#define SBV_GENERATED_popCount_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord8 popCount(const SWord64 x); -#endif /* __popCount__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_popCount_HEADER_INCLUDED */ == END: "popCount.h" ================== == BEGIN: "popCount_driver.c" ================ /* Example driver program for popCount. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord8 __result = popCount(0x0123456789abcdefULL);+  const SWord8 sbv_result = popCount(0x0123456789abcdefULL); -  printf("popCount(0x0123456789abcdefULL) = %"PRIu8"\n", __result);+  printf("popCount(0x0123456789abcdefULL) = %"PRIu8"\n", sbv_result);    return 0; }@@ -85,9 +93,68 @@  #include "popCount.h" -SWord8 popCount(const SWord64 x)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_shl(SWord64 a, SWord64 amount) {-  const SWord64 s0 = x;+  const uint64_t n = (uint64_t) (SWord64) amount;+  const SWord64 result = n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a << n);+  return result;+}++static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_lshr(SWord64 a, SWord64 amount)+{+  const uint64_t n = (uint64_t) (SWord64) amount;+  return n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a >> n);+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b)+{+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++SWord8 popCount(const SWord64 sbv_input_0)+{+  const SWord64 s0 = sbv_input_0;+  const SWord64 s11 = s0 & 0x00000000000000ffULL;+  const SWord64 s14 = sbv_bv_u64_lshr(s0, 0x0000000000000008ULL);+  const SWord64 s15 = 0x00000000000000ffULL & s14;+  const SWord64 s18 = sbv_bv_u64_lshr(s14, 0x0000000000000008ULL);+  const SWord64 s19 = 0x00000000000000ffULL & s18;+  const SWord64 s22 = sbv_bv_u64_lshr(s18, 0x0000000000000008ULL);+  const SWord64 s23 = 0x00000000000000ffULL & s22;+  const SWord64 s26 = sbv_bv_u64_lshr(s22, 0x0000000000000008ULL);+  const SWord64 s27 = 0x00000000000000ffULL & s26;+  const SWord64 s30 = sbv_bv_u64_lshr(s26, 0x0000000000000008ULL);+  const SWord64 s31 = 0x00000000000000ffULL & s30;+  const SWord64 s34 = sbv_bv_u64_lshr(s30, 0x0000000000000008ULL);+  const SWord64 s35 = 0x00000000000000ffULL & s34;+  const SWord64 s38 = sbv_bv_u64_lshr(s34, 0x0000000000000008ULL);+  const SWord64 s39 = 0x00000000000000ffULL & s38;+        SWord8  s12;+        SWord8  s16;+        SWord8  s17;+        SWord8  s20;+        SWord8  s21;+        SWord8  s24;+        SWord8  s25;+        SWord8  s28;+        SWord8  s29;+        SWord8  s32;+        SWord8  s33;+        SWord8  s36;+        SWord8  s37;+        SWord8  s40;+        SWord8  s41;   static const SWord8 table0[] = {       0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3,       3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,@@ -102,36 +169,21 @@       5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5,       5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8   };-  const SWord64 s11 = s0 & 0x00000000000000ffULL;-  const SWord8  s12 = table0[s11];-  const SWord64 s14 = s0 >> 8;-  const SWord64 s15 = 0x00000000000000ffULL & s14;-  const SWord8  s16 = table0[s15];-  const SWord8  s17 = s12 + s16;-  const SWord64 s18 = s14 >> 8;-  const SWord64 s19 = 0x00000000000000ffULL & s18;-  const SWord8  s20 = table0[s19];-  const SWord8  s21 = s17 + s20;-  const SWord64 s22 = s18 >> 8;-  const SWord64 s23 = 0x00000000000000ffULL & s22;-  const SWord8  s24 = table0[s23];-  const SWord8  s25 = s21 + s24;-  const SWord64 s26 = s22 >> 8;-  const SWord64 s27 = 0x00000000000000ffULL & s26;-  const SWord8  s28 = table0[s27];-  const SWord8  s29 = s25 + s28;-  const SWord64 s30 = s26 >> 8;-  const SWord64 s31 = 0x00000000000000ffULL & s30;-  const SWord8  s32 = table0[s31];-  const SWord8  s33 = s29 + s32;-  const SWord64 s34 = s30 >> 8;-  const SWord64 s35 = 0x00000000000000ffULL & s34;-  const SWord8  s36 = table0[s35];-  const SWord8  s37 = s33 + s36;-  const SWord64 s38 = s34 >> 8;-  const SWord64 s39 = 0x00000000000000ffULL & s38;-  const SWord8  s40 = table0[s39];-  const SWord8  s41 = s37 + s40;+  s12 = table0[s11];+  s16 = table0[s15];+  s17 = sbv_bv_u8_add(s12, s16);+  s20 = table0[s19];+  s21 = sbv_bv_u8_add(s17, s20);+  s24 = table0[s23];+  s25 = sbv_bv_u8_add(s21, s24);+  s28 = table0[s27];+  s29 = sbv_bv_u8_add(s25, s28);+  s32 = table0[s31];+  s33 = sbv_bv_u8_add(s29, s32);+  s36 = table0[s35];+  s37 = sbv_bv_u8_add(s33, s36);+  s40 = table0[s39];+  s41 = sbv_bv_u8_add(s37, s40);    return s41; }
SBVTestSuite/GoldFiles/popCount2.gold view
@@ -12,11 +12,11 @@ popCount.o: popCount.c popCount.h 	${CC} ${CCFLAGS} -c $< -o $@ -popCount_driver.o: popCount_driver.c+popCount_driver.o: popCount_driver.c popCount.h 	${CC} ${CCFLAGS} -c $< -o $@  popCount_driver: popCount.o popCount_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "popCount.h" ================ /* Header file for popCount. Automatically generated by SBV. Do not edit! */ -#ifndef __popCount__HEADER_INCLUDED__-#define __popCount__HEADER_INCLUDED__+#ifndef SBV_GENERATED_popCount_HEADER_INCLUDED+#define SBV_GENERATED_popCount_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord8 popCount(const SWord64 x); -#endif /* __popCount__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_popCount_HEADER_INCLUDED */ == END: "popCount.h" ================== == BEGIN: "popCount_driver.c" ================ /* Example driver program for popCount. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord8 __result = popCount(0x0123456789abcdefULL);+  const SWord8 sbv_result = popCount(0x0123456789abcdefULL); -  printf("popCount(0x0123456789abcdefULL) = %"PRIu8"\n", __result);+  printf("popCount(0x0123456789abcdefULL) = %"PRIu8"\n", sbv_result);    return 0; }@@ -85,9 +93,68 @@  #include "popCount.h" -SWord8 popCount(const SWord64 x)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_shl(SWord64 a, SWord64 amount) {-  const SWord64 s0 = x;+  const uint64_t n = (uint64_t) (SWord64) amount;+  const SWord64 result = n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a << n);+  return result;+}++static inline SBV_CGEN_UNUSED SWord64 sbv_bv_u64_lshr(SWord64 a, SWord64 amount)+{+  const uint64_t n = (uint64_t) (SWord64) amount;+  return n >= 64 ? (SWord64) 0 : (SWord64) ((uint64_t) (SWord64) a >> n);+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b)+{+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++SWord8 popCount(const SWord64 sbv_input_0)+{+  const SWord64 s0 = sbv_input_0;+  const SWord64 s11 = s0 & 0x00000000000000ffULL;+  const SWord64 s14 = sbv_bv_u64_lshr(s0, 0x0000000000000008ULL);+  const SWord64 s15 = 0x00000000000000ffULL & s14;+  const SWord64 s18 = sbv_bv_u64_lshr(s14, 0x0000000000000008ULL);+  const SWord64 s19 = 0x00000000000000ffULL & s18;+  const SWord64 s22 = sbv_bv_u64_lshr(s18, 0x0000000000000008ULL);+  const SWord64 s23 = 0x00000000000000ffULL & s22;+  const SWord64 s26 = sbv_bv_u64_lshr(s22, 0x0000000000000008ULL);+  const SWord64 s27 = 0x00000000000000ffULL & s26;+  const SWord64 s30 = sbv_bv_u64_lshr(s26, 0x0000000000000008ULL);+  const SWord64 s31 = 0x00000000000000ffULL & s30;+  const SWord64 s34 = sbv_bv_u64_lshr(s30, 0x0000000000000008ULL);+  const SWord64 s35 = 0x00000000000000ffULL & s34;+  const SWord64 s38 = sbv_bv_u64_lshr(s34, 0x0000000000000008ULL);+  const SWord64 s39 = 0x00000000000000ffULL & s38;+        SWord8  s12;+        SWord8  s16;+        SWord8  s17;+        SWord8  s20;+        SWord8  s21;+        SWord8  s24;+        SWord8  s25;+        SWord8  s28;+        SWord8  s29;+        SWord8  s32;+        SWord8  s33;+        SWord8  s36;+        SWord8  s37;+        SWord8  s40;+        SWord8  s41;   static const SWord8 table0[] = {       0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3,       3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,@@ -102,36 +169,21 @@       5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5,       5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8   };-  const SWord64 s11 = s0 & 0x00000000000000ffULL;-  const SWord8  s12 = s11 >= 256 ? 0 : table0[s11];-  const SWord64 s14 = s0 >> 8;-  const SWord64 s15 = 0x00000000000000ffULL & s14;-  const SWord8  s16 = s15 >= 256 ? 0 : table0[s15];-  const SWord8  s17 = s12 + s16;-  const SWord64 s18 = s14 >> 8;-  const SWord64 s19 = 0x00000000000000ffULL & s18;-  const SWord8  s20 = s19 >= 256 ? 0 : table0[s19];-  const SWord8  s21 = s17 + s20;-  const SWord64 s22 = s18 >> 8;-  const SWord64 s23 = 0x00000000000000ffULL & s22;-  const SWord8  s24 = s23 >= 256 ? 0 : table0[s23];-  const SWord8  s25 = s21 + s24;-  const SWord64 s26 = s22 >> 8;-  const SWord64 s27 = 0x00000000000000ffULL & s26;-  const SWord8  s28 = s27 >= 256 ? 0 : table0[s27];-  const SWord8  s29 = s25 + s28;-  const SWord64 s30 = s26 >> 8;-  const SWord64 s31 = 0x00000000000000ffULL & s30;-  const SWord8  s32 = s31 >= 256 ? 0 : table0[s31];-  const SWord8  s33 = s29 + s32;-  const SWord64 s34 = s30 >> 8;-  const SWord64 s35 = 0x00000000000000ffULL & s34;-  const SWord8  s36 = s35 >= 256 ? 0 : table0[s35];-  const SWord8  s37 = s33 + s36;-  const SWord64 s38 = s34 >> 8;-  const SWord64 s39 = 0x00000000000000ffULL & s38;-  const SWord8  s40 = s39 >= 256 ? 0 : table0[s39];-  const SWord8  s41 = s37 + s40;+  s12 = s11 >= 256 ? 0 : table0[s11];+  s16 = s15 >= 256 ? 0 : table0[s15];+  s17 = sbv_bv_u8_add(s12, s16);+  s20 = s19 >= 256 ? 0 : table0[s19];+  s21 = sbv_bv_u8_add(s17, s20);+  s24 = s23 >= 256 ? 0 : table0[s23];+  s25 = sbv_bv_u8_add(s21, s24);+  s28 = s27 >= 256 ? 0 : table0[s27];+  s29 = sbv_bv_u8_add(s25, s28);+  s32 = s31 >= 256 ? 0 : table0[s31];+  s33 = sbv_bv_u8_add(s29, s32);+  s36 = s35 >= 256 ? 0 : table0[s35];+  s37 = sbv_bv_u8_add(s33, s36);+  s40 = s39 >= 256 ? 0 : table0[s39];+  s41 = sbv_bv_u8_add(s37, s40);    return s41; }
SBVTestSuite/GoldFiles/queryTables.gold view
@@ -33,14 +33,14 @@ [GOOD] (set-option :pp.max_depth      4294967295) [GOOD] (set-option :pp.min_alias_size 4294967295) [GOOD] (set-option :model.inline_def  true      )+[GOOD] (declare-datatypes ((SBVTuple2 2)) ((par (T1 T2)+                                           ((mkSBVTuple2 (proj_1_SBVTuple2 T1)+                                                         (proj_2_SBVTuple2 T2)))))) [GOOD] ; User defined ADT: Maybe [GOOD] (declare-datatype Maybe (par (a) (            (Nothing)            (Just (getJust_1 a))        )))-[GOOD] (declare-datatypes ((SBVTuple2 2)) ((par (T1 T2)-                                           ((mkSBVTuple2 (proj_1_SBVTuple2 T1)-                                                         (proj_2_SBVTuple2 T2)))))) [GOOD] (define-fun s13 () (_ BitVec 16) #x000a) [GOOD] (define-fun s15 () (_ BitVec 16) (bvneg #x0001)) [GOOD] (define-fun s17 () (_ BitVec 16) #x0007)
SBVTestSuite/GoldFiles/query_uisatex1.gold view
@@ -19,34 +19,32 @@ [GOOD] (define-fun s9 () Int (- 3)) [GOOD] (define-fun s11 () Int 9) [GOOD] (define-fun s14 () Int 1)-[GOOD] (define-fun s21 () Int 5)-[GOOD] (define-fun s23 () Int 7)-[GOOD] (define-fun s25 () Int 6)-[GOOD] (define-fun s29 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00010011001100110011010))-[GOOD] (define-fun s32 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00110011001100110011010))-[GOOD] (define-fun s33 () Int 121)-[GOOD] (define-fun s38 () Int 8)-[GOOD] (define-fun s40 () (_ FloatingPoint  8 24) (_ +oo 8 24))-[GOOD] (define-fun s42 () String (_ char #x63))-[GOOD] (define-fun s43 () String "hey")-[GOOD] (define-fun s45 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b00111000000000000000000))-[GOOD] (define-fun s47 () String "tey")-[GOOD] (define-fun s49 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b01110000000000000000000))-[GOOD] (define-fun s51 () String (_ char #x72))-[GOOD] (define-fun s52 () String "foo")-[GOOD] (define-fun s54 () (_ FloatingPoint  8 24) (fp #b0 #b10000000 #b11000000000000000000000))-[GOOD] (define-fun s56 () (Seq Int) (seq.++ (seq.unit 1) (seq.unit 2) (seq.unit 3)))-[GOOD] (define-fun s57 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000000 #b10000000000000000000000))))-[GOOD] (define-fun s60 () (Seq Int) (seq.++ (seq.unit 9) (seq.unit 5)))-[GOOD] (define-fun s61 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000010 #b00100000000000000000000))))-[GOOD] (define-fun s63 () Int 21)-[GOOD] (define-fun s65 () (Seq Int) (seq.unit 5))-[GOOD] (define-fun s66 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (_ +zero 8 24))))-[GOOD] (define-fun s68 () Int 210)+[GOOD] (define-fun s18 () Int 5)+[GOOD] (define-fun s20 () Int 7)+[GOOD] (define-fun s22 () Int 6)+[GOOD] (define-fun s26 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00010011001100110011010))+[GOOD] (define-fun s29 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00110011001100110011010))+[GOOD] (define-fun s30 () Int 121)+[GOOD] (define-fun s35 () Int 8)+[GOOD] (define-fun s37 () (_ FloatingPoint  8 24) (_ +oo 8 24))+[GOOD] (define-fun s39 () String (_ char #x63))+[GOOD] (define-fun s40 () String "hey")+[GOOD] (define-fun s42 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b00111000000000000000000))+[GOOD] (define-fun s44 () String "tey")+[GOOD] (define-fun s46 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b01110000000000000000000))+[GOOD] (define-fun s48 () String (_ char #x72))+[GOOD] (define-fun s49 () String "foo")+[GOOD] (define-fun s51 () (_ FloatingPoint  8 24) (fp #b0 #b10000000 #b11000000000000000000000))+[GOOD] (define-fun s53 () (Seq Int) (seq.++ (seq.unit 1) (seq.unit 2) (seq.unit 3)))+[GOOD] (define-fun s54 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000000 #b10000000000000000000000))))+[GOOD] (define-fun s57 () (Seq Int) (seq.++ (seq.unit 9) (seq.unit 5)))+[GOOD] (define-fun s58 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000010 #b00100000000000000000000))))+[GOOD] (define-fun s60 () Int 21)+[GOOD] (define-fun s62 () (Seq Int) (seq.unit 5))+[GOOD] (define-fun s63 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (_ +zero 8 24))))+[GOOD] (define-fun s65 () Int 210) [GOOD] ; --- top level inputs --- [GOOD] (declare-fun s0 () Int)-[GOOD] (declare-fun s17 () Bool) ; tracks user variable "__internal_sbv_s17"-[GOOD] (declare-fun s18 () Int) ; tracks user variable "__internal_sbv_s18" [GOOD] ; --- constant tables --- [GOOD] ; --- non-constant tables --- [GOOD] ; --- uninterpreted constants ---@@ -66,59 +64,54 @@ [GOOD] (define-fun s13 () Int (q1 s0)) [GOOD] (define-fun s15 () Int (+ s0 s14)) [GOOD] (define-fun s16 () Bool (= s13 s15))-[GOOD] (define-fun s19 () Int (q2 s17 s18))-[GOOD] (define-fun s20 () Int (q2 true s5))-[GOOD] (define-fun s22 () Bool (= s20 s21))-[GOOD] (define-fun s24 () Int (q2 false s23))-[GOOD] (define-fun s26 () Bool (= s24 s25))-[GOOD] (define-fun s27 () Int (q2 false s3))-[GOOD] (define-fun s28 () Bool (= s5 s27))-[GOOD] (define-fun s30 () (_ FloatingPoint  8 24) (q3 s29 true s3))-[GOOD] (define-fun s31 () Bool (fp.eq s29 s30))-[GOOD] (define-fun s34 () (_ FloatingPoint  8 24) (q3 s32 true s33))-[GOOD] (define-fun s35 () Bool (fp.isZero s34))-[GOOD] (define-fun s36 () Bool (fp.isNegative s34))-[GOOD] (define-fun s37 () Bool (and s35 s36))-[GOOD] (define-fun s39 () (_ FloatingPoint  8 24) (q3 s32 false s38))-[GOOD] (define-fun s41 () Bool (fp.eq s39 s40))-[GOOD] (define-fun s44 () (_ FloatingPoint  8 24) (q4 s42 s43))-[GOOD] (define-fun s46 () Bool (fp.eq s44 s45))-[GOOD] (define-fun s48 () (_ FloatingPoint  8 24) (q4 s42 s47))-[GOOD] (define-fun s50 () Bool (fp.eq s48 s49))-[GOOD] (define-fun s53 () (_ FloatingPoint  8 24) (q4 s51 s52))-[GOOD] (define-fun s55 () Bool (fp.eq s53 s54))-[GOOD] (define-fun s58 () Int (q5 s56 s57))-[GOOD] (define-fun s59 () Bool (= s23 s58))-[GOOD] (define-fun s62 () Int (q5 s60 s61))-[GOOD] (define-fun s64 () Bool (= s62 s63))-[GOOD] (define-fun s67 () Int (q5 s65 s66))-[GOOD] (define-fun s69 () Bool (= s67 s68))+[GOOD] (define-fun s17 () Int (q2 true s5))+[GOOD] (define-fun s19 () Bool (= s17 s18))+[GOOD] (define-fun s21 () Int (q2 false s20))+[GOOD] (define-fun s23 () Bool (= s21 s22))+[GOOD] (define-fun s24 () Int (q2 false s3))+[GOOD] (define-fun s25 () Bool (= s5 s24))+[GOOD] (define-fun s27 () (_ FloatingPoint  8 24) (q3 s26 true s3))+[GOOD] (define-fun s28 () Bool (fp.eq s26 s27))+[GOOD] (define-fun s31 () (_ FloatingPoint  8 24) (q3 s29 true s30))+[GOOD] (define-fun s32 () Bool (fp.isZero s31))+[GOOD] (define-fun s33 () Bool (fp.isNegative s31))+[GOOD] (define-fun s34 () Bool (and s32 s33))+[GOOD] (define-fun s36 () (_ FloatingPoint  8 24) (q3 s29 false s35))+[GOOD] (define-fun s38 () Bool (fp.eq s36 s37))+[GOOD] (define-fun s41 () (_ FloatingPoint  8 24) (q4 s39 s40))+[GOOD] (define-fun s43 () Bool (fp.eq s41 s42))+[GOOD] (define-fun s45 () (_ FloatingPoint  8 24) (q4 s39 s44))+[GOOD] (define-fun s47 () Bool (fp.eq s45 s46))+[GOOD] (define-fun s50 () (_ FloatingPoint  8 24) (q4 s48 s49))+[GOOD] (define-fun s52 () Bool (fp.eq s50 s51))+[GOOD] (define-fun s55 () Int (q5 s53 s54))+[GOOD] (define-fun s56 () Bool (= s20 s55))+[GOOD] (define-fun s59 () Int (q5 s57 s58))+[GOOD] (define-fun s61 () Bool (= s59 s60))+[GOOD] (define-fun s64 () Int (q5 s62 s63))+[GOOD] (define-fun s66 () Bool (= s64 s65)) [GOOD] ; --- delayedEqualities --- [GOOD] ; --- formula --- [GOOD] (assert s4) [GOOD] (assert s8) [GOOD] (assert s12) [GOOD] (assert s16)-[GOOD] (assert s22)-[GOOD] (assert s26)+[GOOD] (assert s19)+[GOOD] (assert s23)+[GOOD] (assert s25) [GOOD] (assert s28)-[GOOD] (assert s31)-[GOOD] (assert s37)-[GOOD] (assert s41)-[GOOD] (assert s46)-[GOOD] (assert s50)-[GOOD] (assert s55)-[GOOD] (assert s59)-[GOOD] (assert s64)-[GOOD] (assert s69)+[GOOD] (assert s34)+[GOOD] (assert s38)+[GOOD] (assert s43)+[GOOD] (assert s47)+[GOOD] (assert s52)+[GOOD] (assert s56)+[GOOD] (assert s61)+[GOOD] (assert s66) [SEND] (check-sat) [RECV] sat [SEND] (get-value (s0)) [RECV] ((s0 0))-[SEND] (get-value (s17))-[RECV] ((s17 false))-[SEND] (get-value (s18))-[RECV] ((s18 0)) [GOOD] (set-option :pp.max_depth      4294967295) [GOOD] (set-option :pp.min_alias_size 4294967295) [GOOD] (set-option :model.inline_def  true      )
SBVTestSuite/GoldFiles/query_uisatex2.gold view
@@ -19,35 +19,33 @@ [GOOD] (define-fun s9 () Int (- 3)) [GOOD] (define-fun s11 () Int 9) [GOOD] (define-fun s14 () Int 1)-[GOOD] (define-fun s21 () Int 5)-[GOOD] (define-fun s23 () Int 7)-[GOOD] (define-fun s25 () Int 6)-[GOOD] (define-fun s29 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00010011001100110011010))-[GOOD] (define-fun s32 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00110011001100110011010))-[GOOD] (define-fun s33 () Int 121)-[GOOD] (define-fun s38 () Int 8)-[GOOD] (define-fun s40 () (_ FloatingPoint  8 24) (_ +oo 8 24))-[GOOD] (define-fun s42 () String (_ char #x63))-[GOOD] (define-fun s43 () String "hey")-[GOOD] (define-fun s45 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b00111000000000000000000))-[GOOD] (define-fun s47 () String "tey")-[GOOD] (define-fun s49 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b01110000000000000000000))-[GOOD] (define-fun s51 () String (_ char #x72))-[GOOD] (define-fun s52 () String "foo")-[GOOD] (define-fun s54 () (_ FloatingPoint  8 24) (fp #b0 #b10000000 #b11000000000000000000000))-[GOOD] (define-fun s56 () (Seq Int) (seq.++ (seq.unit 1) (seq.unit 2) (seq.unit 3)))-[GOOD] (define-fun s57 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000000 #b10000000000000000000000))))-[GOOD] (define-fun s60 () (Seq Int) (seq.++ (seq.unit 9) (seq.unit 5)))-[GOOD] (define-fun s61 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000010 #b00100000000000000000000))))-[GOOD] (define-fun s63 () Int 21)-[GOOD] (define-fun s65 () (Seq Int) (seq.unit 5))-[GOOD] (define-fun s66 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (_ +zero 8 24))))-[GOOD] (define-fun s68 () Int 210)+[GOOD] (define-fun s18 () Int 5)+[GOOD] (define-fun s20 () Int 7)+[GOOD] (define-fun s22 () Int 6)+[GOOD] (define-fun s26 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00010011001100110011010))+[GOOD] (define-fun s29 () (_ FloatingPoint  8 24) (fp #b0 #b10000010 #b00110011001100110011010))+[GOOD] (define-fun s30 () Int 121)+[GOOD] (define-fun s35 () Int 8)+[GOOD] (define-fun s37 () (_ FloatingPoint  8 24) (_ +oo 8 24))+[GOOD] (define-fun s39 () String (_ char #x63))+[GOOD] (define-fun s40 () String "hey")+[GOOD] (define-fun s42 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b00111000000000000000000))+[GOOD] (define-fun s44 () String "tey")+[GOOD] (define-fun s46 () (_ FloatingPoint  8 24) (fp #b0 #b10000101 #b01110000000000000000000))+[GOOD] (define-fun s48 () String (_ char #x72))+[GOOD] (define-fun s49 () String "foo")+[GOOD] (define-fun s51 () (_ FloatingPoint  8 24) (fp #b0 #b10000000 #b11000000000000000000000))+[GOOD] (define-fun s53 () (Seq Int) (seq.++ (seq.unit 1) (seq.unit 2) (seq.unit 3)))+[GOOD] (define-fun s54 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000000 #b10000000000000000000000))))+[GOOD] (define-fun s57 () (Seq Int) (seq.++ (seq.unit 9) (seq.unit 5)))+[GOOD] (define-fun s58 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (fp #b0 #b10000010 #b00100000000000000000000))))+[GOOD] (define-fun s60 () Int 21)+[GOOD] (define-fun s62 () (Seq Int) (seq.unit 5))+[GOOD] (define-fun s63 () (Seq (_ FloatingPoint  8 24)) (seq.++ (seq.unit (fp #b0 #b10000010 #b00000110011001100110011)) (seq.unit (_ +zero 8 24))))+[GOOD] (define-fun s65 () Int 210) [GOOD] ; --- top level inputs --- [GOOD] (declare-fun s0 () Int)-[GOOD] (declare-fun s17 () Bool) ; tracks user variable "__internal_sbv_s17"-[GOOD] (declare-fun s18 () Int) ; tracks user variable "__internal_sbv_s18"-[GOOD] (declare-fun s70 () Int) ; tracks user variable "__internal_sbv_s70"+[GOOD] (declare-fun s67 () Int) ; tracks user variable "__internal_sbv_s67" [GOOD] ; --- constant tables --- [GOOD] ; --- non-constant tables --- [GOOD] ; --- uninterpreted constants ---@@ -68,52 +66,51 @@ [GOOD] (define-fun s13 () Int (q1 s0)) [GOOD] (define-fun s15 () Int (+ s0 s14)) [GOOD] (define-fun s16 () Bool (= s13 s15))-[GOOD] (define-fun s19 () Int (q2 s17 s18))-[GOOD] (define-fun s20 () Int (q2 true s5))-[GOOD] (define-fun s22 () Bool (= s20 s21))-[GOOD] (define-fun s24 () Int (q2 false s23))-[GOOD] (define-fun s26 () Bool (= s24 s25))-[GOOD] (define-fun s27 () Int (q2 false s3))-[GOOD] (define-fun s28 () Bool (= s5 s27))-[GOOD] (define-fun s30 () (_ FloatingPoint  8 24) (q3 s29 true s3))-[GOOD] (define-fun s31 () Bool (fp.eq s29 s30))-[GOOD] (define-fun s34 () (_ FloatingPoint  8 24) (q3 s32 true s33))-[GOOD] (define-fun s35 () Bool (fp.isZero s34))-[GOOD] (define-fun s36 () Bool (fp.isNegative s34))-[GOOD] (define-fun s37 () Bool (and s35 s36))-[GOOD] (define-fun s39 () (_ FloatingPoint  8 24) (q3 s32 false s38))-[GOOD] (define-fun s41 () Bool (fp.eq s39 s40))-[GOOD] (define-fun s44 () (_ FloatingPoint  8 24) (q4 s42 s43))-[GOOD] (define-fun s46 () Bool (fp.eq s44 s45))-[GOOD] (define-fun s48 () (_ FloatingPoint  8 24) (q4 s42 s47))-[GOOD] (define-fun s50 () Bool (fp.eq s48 s49))-[GOOD] (define-fun s53 () (_ FloatingPoint  8 24) (q4 s51 s52))-[GOOD] (define-fun s55 () Bool (fp.eq s53 s54))-[GOOD] (define-fun s58 () Int (q5 s56 s57))-[GOOD] (define-fun s59 () Bool (= s23 s58))-[GOOD] (define-fun s62 () Int (q5 s60 s61))-[GOOD] (define-fun s64 () Bool (= s62 s63))-[GOOD] (define-fun s67 () Int (q5 s65 s66))-[GOOD] (define-fun s69 () Bool (= s67 s68))-[GOOD] (define-fun s71 () Bool (q6 s70))+[GOOD] (define-fun s17 () Int (q2 true s5))+[GOOD] (define-fun s19 () Bool (= s17 s18))+[GOOD] (define-fun s21 () Int (q2 false s20))+[GOOD] (define-fun s23 () Bool (= s21 s22))+[GOOD] (define-fun s24 () Int (q2 false s3))+[GOOD] (define-fun s25 () Bool (= s5 s24))+[GOOD] (define-fun s27 () (_ FloatingPoint  8 24) (q3 s26 true s3))+[GOOD] (define-fun s28 () Bool (fp.eq s26 s27))+[GOOD] (define-fun s31 () (_ FloatingPoint  8 24) (q3 s29 true s30))+[GOOD] (define-fun s32 () Bool (fp.isZero s31))+[GOOD] (define-fun s33 () Bool (fp.isNegative s31))+[GOOD] (define-fun s34 () Bool (and s32 s33))+[GOOD] (define-fun s36 () (_ FloatingPoint  8 24) (q3 s29 false s35))+[GOOD] (define-fun s38 () Bool (fp.eq s36 s37))+[GOOD] (define-fun s41 () (_ FloatingPoint  8 24) (q4 s39 s40))+[GOOD] (define-fun s43 () Bool (fp.eq s41 s42))+[GOOD] (define-fun s45 () (_ FloatingPoint  8 24) (q4 s39 s44))+[GOOD] (define-fun s47 () Bool (fp.eq s45 s46))+[GOOD] (define-fun s50 () (_ FloatingPoint  8 24) (q4 s48 s49))+[GOOD] (define-fun s52 () Bool (fp.eq s50 s51))+[GOOD] (define-fun s55 () Int (q5 s53 s54))+[GOOD] (define-fun s56 () Bool (= s20 s55))+[GOOD] (define-fun s59 () Int (q5 s57 s58))+[GOOD] (define-fun s61 () Bool (= s59 s60))+[GOOD] (define-fun s64 () Int (q5 s62 s63))+[GOOD] (define-fun s66 () Bool (= s64 s65))+[GOOD] (define-fun s68 () Bool (q6 s67)) [GOOD] ; --- delayedEqualities --- [GOOD] ; --- formula --- [GOOD] (assert s4) [GOOD] (assert s8) [GOOD] (assert s12) [GOOD] (assert s16)-[GOOD] (assert s22)-[GOOD] (assert s26)+[GOOD] (assert s19)+[GOOD] (assert s23)+[GOOD] (assert s25) [GOOD] (assert s28)-[GOOD] (assert s31)-[GOOD] (assert s37)-[GOOD] (assert s41)-[GOOD] (assert s46)-[GOOD] (assert s50)-[GOOD] (assert s55)-[GOOD] (assert s59)-[GOOD] (assert s64)-[GOOD] (assert s69)+[GOOD] (assert s34)+[GOOD] (assert s38)+[GOOD] (assert s43)+[GOOD] (assert s47)+[GOOD] (assert s52)+[GOOD] (assert s56)+[GOOD] (assert s61)+[GOOD] (assert s66) [SEND] (check-sat) [RECV] sat [SEND] (get-value (q1))
SBVTestSuite/GoldFiles/selChecked.gold view
@@ -12,11 +12,11 @@ selChecked.o: selChecked.c selChecked.h 	${CC} ${CCFLAGS} -c $< -o $@ -selChecked_driver.o: selChecked_driver.c+selChecked_driver.o: selChecked_driver.c selChecked.h 	${CC} ${CCFLAGS} -c $< -o $@  selChecked_driver: selChecked.o selChecked_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "selChecked.h" ================ /* Header file for selChecked. Automatically generated by SBV. Do not edit! */ -#ifndef __selChecked__HEADER_INCLUDED__-#define __selChecked__HEADER_INCLUDED__+#ifndef SBV_GENERATED_selChecked_HEADER_INCLUDED+#define SBV_GENERATED_selChecked_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord8 selChecked(const SWord8 x); -#endif /* __selChecked__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_selChecked_HEADER_INCLUDED */ == END: "selChecked.h" ================== == BEGIN: "selChecked_driver.c" ================ /* Example driver program for selChecked. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord8 __result = selChecked(65);+  const SWord8 sbv_result = selChecked(65); -  printf("selChecked(65) = %"PRIu8"\n", __result);+  printf("selChecked(65) = %"PRIu8"\n", sbv_result);    return 0; }@@ -85,14 +93,31 @@  #include "selChecked.h" -SWord8 selChecked(const SWord8 x)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b) {-  const SWord8 s0 = x;-  const SWord8 s3 = s0 + 2;+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++SWord8 selChecked(const SWord8 sbv_input_0)+{+  const SWord8 s0 = sbv_input_0;+  const SWord8 s3 = sbv_bv_u8_add(s0, 2);+        SWord8 s5;   const SWord8 table0[] = {        1, s3   };-  const SWord8 s5 = s0 >= 2 ? 3 : table0[s0];+  s5 = s0 >= 2 ? 3 : table0[s0];    return s5; }
SBVTestSuite/GoldFiles/selUnchecked.gold view
@@ -12,11 +12,11 @@ selUnChecked.o: selUnChecked.c selUnChecked.h 	${CC} ${CCFLAGS} -c $< -o $@ -selUnChecked_driver.o: selUnChecked_driver.c+selUnChecked_driver.o: selUnChecked_driver.c selUnChecked.h 	${CC} ${CCFLAGS} -c $< -o $@  selUnChecked_driver: selUnChecked.o selUnChecked_driver.o-	${CC} ${CCFLAGS} $^ -o $@+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}  clean: 	rm -f *.o@@ -27,9 +27,10 @@ == BEGIN: "selUnChecked.h" ================ /* Header file for selUnChecked. Automatically generated by SBV. Do not edit! */ -#ifndef __selUnChecked__HEADER_INCLUDED__-#define __selUnChecked__HEADER_INCLUDED__+#ifndef SBV_GENERATED_selUnChecked_HEADER_INCLUDED+#define SBV_GENERATED_selUnChecked_HEADER_INCLUDED + #include <stdio.h> #include <stdlib.h> #include <inttypes.h>@@ -38,6 +39,13 @@ #include <string.h> #include <math.h> +/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */+ /* The boolean type */ typedef bool SBool; @@ -62,7 +70,7 @@ /* Entry point prototype: */ SWord8 selUnChecked(const SWord8 x); -#endif /* __selUnChecked__HEADER_INCLUDED__ */+#endif /* SBV_GENERATED_selUnChecked_HEADER_INCLUDED */ == END: "selUnChecked.h" ================== == BEGIN: "selUnChecked_driver.c" ================ /* Example driver program for selUnChecked. */@@ -73,9 +81,9 @@  int main(void) {-  const SWord8 __result = selUnChecked(65);+  const SWord8 sbv_result = selUnChecked(65); -  printf("selUnChecked(65) = %"PRIu8"\n", __result);+  printf("selUnChecked(65) = %"PRIu8"\n", sbv_result);    return 0; }@@ -85,14 +93,31 @@  #include "selUnChecked.h" -SWord8 selUnChecked(const SWord8 x)+/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_u8_add(SWord8 a, SWord8 b) {-  const SWord8 s0 = x;-  const SWord8 s3 = s0 + 2;+  const SWord8 bits = (SWord8) ((((uint64_t) (SWord8) a) + ((uint64_t) (SWord8) b)) & UINT64_C(0x00000000000000ff));+  return (SWord8) bits;+}+++SWord8 selUnChecked(const SWord8 sbv_input_0)+{+  const SWord8 s0 = sbv_input_0;+  const SWord8 s3 = sbv_bv_u8_add(s0, 2);+        SWord8 s5;   const SWord8 table0[] = {        1, s3   };-  const SWord8 s5 = table0[s0];+  s5 = table0[s0];    return s5; }
SBVTestSuite/GoldFiles/sha256HashBlock.gold view
@@ -12,2578 +12,2687 @@ sha256HashBlock.o: sha256HashBlock.c sha256HashBlock.h 	${CC} ${CCFLAGS} -c $< -o $@ -sha256HashBlock_driver.o: sha256HashBlock_driver.c-	${CC} ${CCFLAGS} -c $< -o $@--sha256HashBlock_driver: sha256HashBlock.o sha256HashBlock_driver.o-	${CC} ${CCFLAGS} $^ -o $@--clean:-	rm -f *.o--veryclean: clean-	rm -f sha256HashBlock_driver-== END: "Makefile" ==================-== BEGIN: "sha256HashBlock.h" ================-/* Header file for sha256HashBlock. Automatically generated by SBV. Do not edit! */--#ifndef __sha256HashBlock__HEADER_INCLUDED__-#define __sha256HashBlock__HEADER_INCLUDED__--#include <stdio.h>-#include <stdlib.h>-#include <inttypes.h>-#include <stdint.h>-#include <stdbool.h>-#include <string.h>-#include <math.h>--/* The boolean type */-typedef bool SBool;--/* The float type */-typedef float SFloat;--/* The double type */-typedef double SDouble;--/* Unsigned bit-vectors */-typedef uint8_t  SWord8;-typedef uint16_t SWord16;-typedef uint32_t SWord32;-typedef uint64_t SWord64;--/* Signed bit-vectors */-typedef int8_t  SInt8;-typedef int16_t SInt16;-typedef int32_t SInt32;-typedef int64_t SInt64;--/* Entry point prototype: */-void sha256HashBlock(const SWord8 *hIn, const SWord8 *block,-                     SWord8 *hash);--#endif /* __sha256HashBlock__HEADER_INCLUDED__ */-== END: "sha256HashBlock.h" ==================-== BEGIN: "sha256HashBlock_driver.c" ================-/* Example driver program for sha256HashBlock. */-/* Automatically generated by SBV. Edit as you see fit! */--#include <stdio.h>-#include "sha256HashBlock.h"--int main(void)-{-  const SWord8 hIn[32] = {-      0x6a, 0x09, 0xe6, 0x67, 0xbb, 0x67, 0xae, 0x85, 0x3c, 0x6e, 0xf3,-      0x72, 0xa5, 0x4f, 0xf5, 0x3a, 0x51, 0x0e, 0x52, 0x7f, 0x9b, 0x05,-      0x68, 0x8c, 0x1f, 0x83, 0xd9, 0xab, 0x5b, 0xe0, 0xcd, 0x19-  };--  printf("Contents of input array hIn:\n");-  int hIn_ctr;-  for(hIn_ctr = 0; hIn_ctr < 32 ; ++hIn_ctr)-    printf("  hIn[%2d] = 0x%02"PRIx8"\n", hIn_ctr ,hIn[hIn_ctr]);--  const SWord8 block[64] = {-      0x53, 0x42, 0x56, 0x20, 0x67, 0x6f, 0x65, 0x73, 0x20, 0x53, 0x48,-      0x41, 0x32, 0x35, 0x36, 0x21, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88-  };--  printf("Contents of input array block:\n");-  int block_ctr;-  for(block_ctr = 0; block_ctr < 64 ; ++block_ctr)-    printf("  block[%2d] = 0x%02"PRIx8"\n", block_ctr ,block[block_ctr]);--  SWord8 hash[32];--  sha256HashBlock(hIn, block, hash);--  printf("sha256HashBlock(hIn, block, hash) ->\n");-  int hash_ctr;-  for(hash_ctr = 0; hash_ctr < 32 ; ++hash_ctr)-    printf("  hash[%2d] = 0x%02"PRIx8"\n", hash_ctr ,hash[hash_ctr]);--  return 0;-}-== END: "sha256HashBlock_driver.c" ==================-== BEGIN: "sha256HashBlock.c" ================-/* File: "sha256HashBlock.c". Automatically generated by SBV. Do not edit! */--#include "sha256HashBlock.h"--void sha256HashBlock(const SWord8 *hIn, const SWord8 *block,-                     SWord8 *hash)-{-  const SWord8  s0 = hIn[0];-  const SWord8  s1 = hIn[1];-  const SWord8  s2 = hIn[2];-  const SWord8  s3 = hIn[3];-  const SWord8  s4 = hIn[4];-  const SWord8  s5 = hIn[5];-  const SWord8  s6 = hIn[6];-  const SWord8  s7 = hIn[7];-  const SWord8  s8 = hIn[8];-  const SWord8  s9 = hIn[9];-  const SWord8  s10 = hIn[10];-  const SWord8  s11 = hIn[11];-  const SWord8  s12 = hIn[12];-  const SWord8  s13 = hIn[13];-  const SWord8  s14 = hIn[14];-  const SWord8  s15 = hIn[15];-  const SWord8  s16 = hIn[16];-  const SWord8  s17 = hIn[17];-  const SWord8  s18 = hIn[18];-  const SWord8  s19 = hIn[19];-  const SWord8  s20 = hIn[20];-  const SWord8  s21 = hIn[21];-  const SWord8  s22 = hIn[22];-  const SWord8  s23 = hIn[23];-  const SWord8  s24 = hIn[24];-  const SWord8  s25 = hIn[25];-  const SWord8  s26 = hIn[26];-  const SWord8  s27 = hIn[27];-  const SWord8  s28 = hIn[28];-  const SWord8  s29 = hIn[29];-  const SWord8  s30 = hIn[30];-  const SWord8  s31 = hIn[31];-  const SWord8  s32 = block[0];-  const SWord8  s33 = block[1];-  const SWord8  s34 = block[2];-  const SWord8  s35 = block[3];-  const SWord8  s36 = block[4];-  const SWord8  s37 = block[5];-  const SWord8  s38 = block[6];-  const SWord8  s39 = block[7];-  const SWord8  s40 = block[8];-  const SWord8  s41 = block[9];-  const SWord8  s42 = block[10];-  const SWord8  s43 = block[11];-  const SWord8  s44 = block[12];-  const SWord8  s45 = block[13];-  const SWord8  s46 = block[14];-  const SWord8  s47 = block[15];-  const SWord8  s48 = block[16];-  const SWord8  s49 = block[17];-  const SWord8  s50 = block[18];-  const SWord8  s51 = block[19];-  const SWord8  s52 = block[20];-  const SWord8  s53 = block[21];-  const SWord8  s54 = block[22];-  const SWord8  s55 = block[23];-  const SWord8  s56 = block[24];-  const SWord8  s57 = block[25];-  const SWord8  s58 = block[26];-  const SWord8  s59 = block[27];-  const SWord8  s60 = block[28];-  const SWord8  s61 = block[29];-  const SWord8  s62 = block[30];-  const SWord8  s63 = block[31];-  const SWord8  s64 = block[32];-  const SWord8  s65 = block[33];-  const SWord8  s66 = block[34];-  const SWord8  s67 = block[35];-  const SWord8  s68 = block[36];-  const SWord8  s69 = block[37];-  const SWord8  s70 = block[38];-  const SWord8  s71 = block[39];-  const SWord8  s72 = block[40];-  const SWord8  s73 = block[41];-  const SWord8  s74 = block[42];-  const SWord8  s75 = block[43];-  const SWord8  s76 = block[44];-  const SWord8  s77 = block[45];-  const SWord8  s78 = block[46];-  const SWord8  s79 = block[47];-  const SWord8  s80 = block[48];-  const SWord8  s81 = block[49];-  const SWord8  s82 = block[50];-  const SWord8  s83 = block[51];-  const SWord8  s84 = block[52];-  const SWord8  s85 = block[53];-  const SWord8  s86 = block[54];-  const SWord8  s87 = block[55];-  const SWord8  s88 = block[56];-  const SWord8  s89 = block[57];-  const SWord8  s90 = block[58];-  const SWord8  s91 = block[59];-  const SWord8  s92 = block[60];-  const SWord8  s93 = block[61];-  const SWord8  s94 = block[62];-  const SWord8  s95 = block[63];-  const SWord16 s96 = (((SWord16) s0) << 8) | ((SWord16) s1);-  const SWord16 s97 = (((SWord16) s2) << 8) | ((SWord16) s3);-  const SWord32 s98 = (((SWord32) s96) << 16) | ((SWord32) s97);-  const SWord16 s99 = (((SWord16) s16) << 8) | ((SWord16) s17);-  const SWord16 s100 = (((SWord16) s18) << 8) | ((SWord16) s19);-  const SWord32 s101 = (((SWord32) s99) << 16) | ((SWord32) s100);-  const SWord16 s102 = (((SWord16) s4) << 8) | ((SWord16) s5);-  const SWord16 s103 = (((SWord16) s6) << 8) | ((SWord16) s7);-  const SWord32 s104 = (((SWord32) s102) << 16) | ((SWord32) s103);-  const SWord16 s105 = (((SWord16) s20) << 8) | ((SWord16) s21);-  const SWord16 s106 = (((SWord16) s22) << 8) | ((SWord16) s23);-  const SWord32 s107 = (((SWord32) s105) << 16) | ((SWord32) s106);-  const SWord16 s108 = (((SWord16) s8) << 8) | ((SWord16) s9);-  const SWord16 s109 = (((SWord16) s10) << 8) | ((SWord16) s11);-  const SWord32 s110 = (((SWord32) s108) << 16) | ((SWord32) s109);-  const SWord16 s111 = (((SWord16) s24) << 8) | ((SWord16) s25);-  const SWord16 s112 = (((SWord16) s26) << 8) | ((SWord16) s27);-  const SWord32 s113 = (((SWord32) s111) << 16) | ((SWord32) s112);-  const SWord16 s114 = (((SWord16) s12) << 8) | ((SWord16) s13);-  const SWord16 s115 = (((SWord16) s14) << 8) | ((SWord16) s15);-  const SWord32 s116 = (((SWord32) s114) << 16) | ((SWord32) s115);-  const SWord16 s117 = (((SWord16) s28) << 8) | ((SWord16) s29);-  const SWord16 s118 = (((SWord16) s30) << 8) | ((SWord16) s31);-  const SWord32 s119 = (((SWord32) s117) << 16) | ((SWord32) s118);-  const SWord32 s120 = (s101 >> 6) | (s101 << 26);-  const SWord32 s121 = (s101 >> 11) | (s101 << 21);-  const SWord32 s122 = s120 ^ s121;-  const SWord32 s123 = (s101 >> 25) | (s101 << 7);-  const SWord32 s124 = s122 ^ s123;-  const SWord32 s125 = s119 + s124;-  const SWord32 s126 = s101 & s107;-  const SWord32 s127 = ~s101;-  const SWord32 s128 = s113 & s127;-  const SWord32 s129 = s126 ^ s128;-  const SWord32 s130 = s125 + s129;-  const SWord32 s132 = s130 + 0x428a2f98UL;-  const SWord16 s133 = (((SWord16) s32) << 8) | ((SWord16) s33);-  const SWord16 s134 = (((SWord16) s34) << 8) | ((SWord16) s35);-  const SWord32 s135 = (((SWord32) s133) << 16) | ((SWord32) s134);-  const SWord32 s136 = s132 + s135;-  const SWord32 s137 = s116 + s136;-  const SWord32 s138 = (s137 >> 6) | (s137 << 26);-  const SWord32 s139 = (s137 >> 11) | (s137 << 21);-  const SWord32 s140 = s138 ^ s139;-  const SWord32 s141 = (s137 >> 25) | (s137 << 7);-  const SWord32 s142 = s140 ^ s141;-  const SWord32 s143 = s113 + s142;-  const SWord32 s144 = s101 & s137;-  const SWord32 s145 = ~s137;-  const SWord32 s146 = s107 & s145;-  const SWord32 s147 = s144 ^ s146;-  const SWord32 s148 = s143 + s147;-  const SWord32 s150 = s148 + 0x71374491UL;-  const SWord16 s151 = (((SWord16) s36) << 8) | ((SWord16) s37);-  const SWord16 s152 = (((SWord16) s38) << 8) | ((SWord16) s39);-  const SWord32 s153 = (((SWord32) s151) << 16) | ((SWord32) s152);-  const SWord32 s154 = s150 + s153;-  const SWord32 s155 = s110 + s154;-  const SWord32 s156 = (s155 >> 6) | (s155 << 26);-  const SWord32 s157 = (s155 >> 11) | (s155 << 21);-  const SWord32 s158 = s156 ^ s157;-  const SWord32 s159 = (s155 >> 25) | (s155 << 7);-  const SWord32 s160 = s158 ^ s159;-  const SWord32 s161 = s107 + s160;-  const SWord32 s162 = s137 & s155;-  const SWord32 s163 = ~s155;-  const SWord32 s164 = s101 & s163;-  const SWord32 s165 = s162 ^ s164;-  const SWord32 s166 = s161 + s165;-  const SWord32 s168 = s166 + 0xb5c0fbcfUL;-  const SWord16 s169 = (((SWord16) s40) << 8) | ((SWord16) s41);-  const SWord16 s170 = (((SWord16) s42) << 8) | ((SWord16) s43);-  const SWord32 s171 = (((SWord32) s169) << 16) | ((SWord32) s170);-  const SWord32 s172 = s168 + s171;-  const SWord32 s173 = s104 + s172;-  const SWord32 s174 = (s173 >> 6) | (s173 << 26);-  const SWord32 s175 = (s173 >> 11) | (s173 << 21);-  const SWord32 s176 = s174 ^ s175;-  const SWord32 s177 = (s173 >> 25) | (s173 << 7);-  const SWord32 s178 = s176 ^ s177;-  const SWord32 s179 = s101 + s178;-  const SWord32 s180 = s155 & s173;-  const SWord32 s181 = ~s173;-  const SWord32 s182 = s137 & s181;-  const SWord32 s183 = s180 ^ s182;-  const SWord32 s184 = s179 + s183;-  const SWord32 s186 = s184 + 0xe9b5dba5UL;-  const SWord16 s187 = (((SWord16) s44) << 8) | ((SWord16) s45);-  const SWord16 s188 = (((SWord16) s46) << 8) | ((SWord16) s47);-  const SWord32 s189 = (((SWord32) s187) << 16) | ((SWord32) s188);-  const SWord32 s190 = s186 + s189;-  const SWord32 s191 = s98 + s190;-  const SWord32 s192 = (s98 >> 2) | (s98 << 30);-  const SWord32 s193 = (s98 >> 13) | (s98 << 19);-  const SWord32 s194 = s192 ^ s193;-  const SWord32 s195 = (s98 >> 22) | (s98 << 10);-  const SWord32 s196 = s194 ^ s195;-  const SWord32 s197 = s98 & s104;-  const SWord32 s198 = s98 & s110;-  const SWord32 s199 = s197 ^ s198;-  const SWord32 s200 = s104 & s110;-  const SWord32 s201 = s199 ^ s200;-  const SWord32 s202 = s196 + s201;-  const SWord32 s203 = s136 + s202;-  const SWord32 s204 = (s203 >> 2) | (s203 << 30);-  const SWord32 s205 = (s203 >> 13) | (s203 << 19);-  const SWord32 s206 = s204 ^ s205;-  const SWord32 s207 = (s203 >> 22) | (s203 << 10);-  const SWord32 s208 = s206 ^ s207;-  const SWord32 s209 = s98 & s203;-  const SWord32 s210 = s104 & s203;-  const SWord32 s211 = s209 ^ s210;-  const SWord32 s212 = s197 ^ s211;-  const SWord32 s213 = s208 + s212;-  const SWord32 s214 = s154 + s213;-  const SWord32 s215 = (s214 >> 2) | (s214 << 30);-  const SWord32 s216 = (s214 >> 13) | (s214 << 19);-  const SWord32 s217 = s215 ^ s216;-  const SWord32 s218 = (s214 >> 22) | (s214 << 10);-  const SWord32 s219 = s217 ^ s218;-  const SWord32 s220 = s203 & s214;-  const SWord32 s221 = s98 & s214;-  const SWord32 s222 = s220 ^ s221;-  const SWord32 s223 = s209 ^ s222;-  const SWord32 s224 = s219 + s223;-  const SWord32 s225 = s172 + s224;-  const SWord32 s226 = (s191 >> 6) | (s191 << 26);-  const SWord32 s227 = (s191 >> 11) | (s191 << 21);-  const SWord32 s228 = s226 ^ s227;-  const SWord32 s229 = (s191 >> 25) | (s191 << 7);-  const SWord32 s230 = s228 ^ s229;-  const SWord32 s231 = s137 + s230;-  const SWord32 s232 = s173 & s191;-  const SWord32 s233 = ~s191;-  const SWord32 s234 = s155 & s233;-  const SWord32 s235 = s232 ^ s234;-  const SWord32 s236 = s231 + s235;-  const SWord32 s238 = s236 + 0x3956c25bUL;-  const SWord16 s239 = (((SWord16) s48) << 8) | ((SWord16) s49);-  const SWord16 s240 = (((SWord16) s50) << 8) | ((SWord16) s51);-  const SWord32 s241 = (((SWord32) s239) << 16) | ((SWord32) s240);-  const SWord32 s242 = s238 + s241;-  const SWord32 s243 = s203 + s242;-  const SWord32 s244 = (s243 >> 6) | (s243 << 26);-  const SWord32 s245 = (s243 >> 11) | (s243 << 21);-  const SWord32 s246 = s244 ^ s245;-  const SWord32 s247 = (s243 >> 25) | (s243 << 7);-  const SWord32 s248 = s246 ^ s247;-  const SWord32 s249 = s155 + s248;-  const SWord32 s250 = s191 & s243;-  const SWord32 s251 = ~s243;-  const SWord32 s252 = s173 & s251;-  const SWord32 s253 = s250 ^ s252;-  const SWord32 s254 = s249 + s253;-  const SWord32 s256 = s254 + 0x59f111f1UL;-  const SWord16 s257 = (((SWord16) s52) << 8) | ((SWord16) s53);-  const SWord16 s258 = (((SWord16) s54) << 8) | ((SWord16) s55);-  const SWord32 s259 = (((SWord32) s257) << 16) | ((SWord32) s258);-  const SWord32 s260 = s256 + s259;-  const SWord32 s261 = s214 + s260;-  const SWord32 s262 = (s261 >> 6) | (s261 << 26);-  const SWord32 s263 = (s261 >> 11) | (s261 << 21);-  const SWord32 s264 = s262 ^ s263;-  const SWord32 s265 = (s261 >> 25) | (s261 << 7);-  const SWord32 s266 = s264 ^ s265;-  const SWord32 s267 = s173 + s266;-  const SWord32 s268 = s243 & s261;-  const SWord32 s269 = ~s261;-  const SWord32 s270 = s191 & s269;-  const SWord32 s271 = s268 ^ s270;-  const SWord32 s272 = s267 + s271;-  const SWord32 s274 = s272 + 0x923f82a4UL;-  const SWord16 s275 = (((SWord16) s56) << 8) | ((SWord16) s57);-  const SWord16 s276 = (((SWord16) s58) << 8) | ((SWord16) s59);-  const SWord32 s277 = (((SWord32) s275) << 16) | ((SWord32) s276);-  const SWord32 s278 = s274 + s277;-  const SWord32 s279 = s225 + s278;-  const SWord32 s280 = (s279 >> 6) | (s279 << 26);-  const SWord32 s281 = (s279 >> 11) | (s279 << 21);-  const SWord32 s282 = s280 ^ s281;-  const SWord32 s283 = (s279 >> 25) | (s279 << 7);-  const SWord32 s284 = s282 ^ s283;-  const SWord32 s285 = s191 + s284;-  const SWord32 s286 = s261 & s279;-  const SWord32 s287 = ~s279;-  const SWord32 s288 = s243 & s287;-  const SWord32 s289 = s286 ^ s288;-  const SWord32 s290 = s285 + s289;-  const SWord32 s292 = s290 + 0xab1c5ed5UL;-  const SWord16 s293 = (((SWord16) s60) << 8) | ((SWord16) s61);-  const SWord16 s294 = (((SWord16) s62) << 8) | ((SWord16) s63);-  const SWord32 s295 = (((SWord32) s293) << 16) | ((SWord32) s294);-  const SWord32 s296 = s292 + s295;-  const SWord32 s297 = (s225 >> 2) | (s225 << 30);-  const SWord32 s298 = (s225 >> 13) | (s225 << 19);-  const SWord32 s299 = s297 ^ s298;-  const SWord32 s300 = (s225 >> 22) | (s225 << 10);-  const SWord32 s301 = s299 ^ s300;-  const SWord32 s302 = s214 & s225;-  const SWord32 s303 = s203 & s225;-  const SWord32 s304 = s302 ^ s303;-  const SWord32 s305 = s220 ^ s304;-  const SWord32 s306 = s301 + s305;-  const SWord32 s307 = s190 + s306;-  const SWord32 s308 = (s307 >> 2) | (s307 << 30);-  const SWord32 s309 = (s307 >> 13) | (s307 << 19);-  const SWord32 s310 = s308 ^ s309;-  const SWord32 s311 = (s307 >> 22) | (s307 << 10);-  const SWord32 s312 = s310 ^ s311;-  const SWord32 s313 = s225 & s307;-  const SWord32 s314 = s214 & s307;-  const SWord32 s315 = s313 ^ s314;-  const SWord32 s316 = s302 ^ s315;-  const SWord32 s317 = s312 + s316;-  const SWord32 s318 = s242 + s317;-  const SWord32 s319 = (s318 >> 2) | (s318 << 30);-  const SWord32 s320 = (s318 >> 13) | (s318 << 19);-  const SWord32 s321 = s319 ^ s320;-  const SWord32 s322 = (s318 >> 22) | (s318 << 10);-  const SWord32 s323 = s321 ^ s322;-  const SWord32 s324 = s307 & s318;-  const SWord32 s325 = s225 & s318;-  const SWord32 s326 = s324 ^ s325;-  const SWord32 s327 = s313 ^ s326;-  const SWord32 s328 = s323 + s327;-  const SWord32 s329 = s260 + s328;-  const SWord32 s330 = (s329 >> 2) | (s329 << 30);-  const SWord32 s331 = (s329 >> 13) | (s329 << 19);-  const SWord32 s332 = s330 ^ s331;-  const SWord32 s333 = (s329 >> 22) | (s329 << 10);-  const SWord32 s334 = s332 ^ s333;-  const SWord32 s335 = s318 & s329;-  const SWord32 s336 = s307 & s329;-  const SWord32 s337 = s335 ^ s336;-  const SWord32 s338 = s324 ^ s337;-  const SWord32 s339 = s334 + s338;-  const SWord32 s340 = s278 + s339;-  const SWord32 s341 = (s340 >> 2) | (s340 << 30);-  const SWord32 s342 = (s340 >> 13) | (s340 << 19);-  const SWord32 s343 = s341 ^ s342;-  const SWord32 s344 = (s340 >> 22) | (s340 << 10);-  const SWord32 s345 = s343 ^ s344;-  const SWord32 s346 = s329 & s340;-  const SWord32 s347 = s318 & s340;-  const SWord32 s348 = s346 ^ s347;-  const SWord32 s349 = s335 ^ s348;-  const SWord32 s350 = s345 + s349;-  const SWord32 s351 = s296 + s350;-  const SWord32 s352 = s296 + s307;-  const SWord32 s353 = (s352 >> 6) | (s352 << 26);-  const SWord32 s354 = (s352 >> 11) | (s352 << 21);-  const SWord32 s355 = s353 ^ s354;-  const SWord32 s356 = (s352 >> 25) | (s352 << 7);-  const SWord32 s357 = s355 ^ s356;-  const SWord32 s358 = s243 + s357;-  const SWord32 s359 = s279 & s352;-  const SWord32 s360 = ~s352;-  const SWord32 s361 = s261 & s360;-  const SWord32 s362 = s359 ^ s361;-  const SWord32 s363 = s358 + s362;-  const SWord32 s365 = s363 + 0xd807aa98UL;-  const SWord16 s366 = (((SWord16) s64) << 8) | ((SWord16) s65);-  const SWord16 s367 = (((SWord16) s66) << 8) | ((SWord16) s67);-  const SWord32 s368 = (((SWord32) s366) << 16) | ((SWord32) s367);-  const SWord32 s369 = s365 + s368;-  const SWord32 s370 = s318 + s369;-  const SWord32 s371 = (s370 >> 6) | (s370 << 26);-  const SWord32 s372 = (s370 >> 11) | (s370 << 21);-  const SWord32 s373 = s371 ^ s372;-  const SWord32 s374 = (s370 >> 25) | (s370 << 7);-  const SWord32 s375 = s373 ^ s374;-  const SWord32 s376 = s261 + s375;-  const SWord32 s377 = s352 & s370;-  const SWord32 s378 = ~s370;-  const SWord32 s379 = s279 & s378;-  const SWord32 s380 = s377 ^ s379;-  const SWord32 s381 = s376 + s380;-  const SWord32 s383 = s381 + 0x12835b01UL;-  const SWord16 s384 = (((SWord16) s68) << 8) | ((SWord16) s69);-  const SWord16 s385 = (((SWord16) s70) << 8) | ((SWord16) s71);-  const SWord32 s386 = (((SWord32) s384) << 16) | ((SWord32) s385);-  const SWord32 s387 = s383 + s386;-  const SWord32 s388 = s329 + s387;-  const SWord32 s389 = (s388 >> 6) | (s388 << 26);-  const SWord32 s390 = (s388 >> 11) | (s388 << 21);-  const SWord32 s391 = s389 ^ s390;-  const SWord32 s392 = (s388 >> 25) | (s388 << 7);-  const SWord32 s393 = s391 ^ s392;-  const SWord32 s394 = s279 + s393;-  const SWord32 s395 = s370 & s388;-  const SWord32 s396 = ~s388;-  const SWord32 s397 = s352 & s396;-  const SWord32 s398 = s395 ^ s397;-  const SWord32 s399 = s394 + s398;-  const SWord32 s401 = s399 + 0x243185beUL;-  const SWord16 s402 = (((SWord16) s72) << 8) | ((SWord16) s73);-  const SWord16 s403 = (((SWord16) s74) << 8) | ((SWord16) s75);-  const SWord32 s404 = (((SWord32) s402) << 16) | ((SWord32) s403);-  const SWord32 s405 = s401 + s404;-  const SWord32 s406 = s340 + s405;-  const SWord32 s407 = (s406 >> 6) | (s406 << 26);-  const SWord32 s408 = (s406 >> 11) | (s406 << 21);-  const SWord32 s409 = s407 ^ s408;-  const SWord32 s410 = (s406 >> 25) | (s406 << 7);-  const SWord32 s411 = s409 ^ s410;-  const SWord32 s412 = s352 + s411;-  const SWord32 s413 = s388 & s406;-  const SWord32 s414 = ~s406;-  const SWord32 s415 = s370 & s414;-  const SWord32 s416 = s413 ^ s415;-  const SWord32 s417 = s412 + s416;-  const SWord32 s419 = s417 + 0x550c7dc3UL;-  const SWord16 s420 = (((SWord16) s76) << 8) | ((SWord16) s77);-  const SWord16 s421 = (((SWord16) s78) << 8) | ((SWord16) s79);-  const SWord32 s422 = (((SWord32) s420) << 16) | ((SWord32) s421);-  const SWord32 s423 = s419 + s422;-  const SWord32 s424 = s351 + s423;-  const SWord32 s425 = (s351 >> 2) | (s351 << 30);-  const SWord32 s426 = (s351 >> 13) | (s351 << 19);-  const SWord32 s427 = s425 ^ s426;-  const SWord32 s428 = (s351 >> 22) | (s351 << 10);-  const SWord32 s429 = s427 ^ s428;-  const SWord32 s430 = s340 & s351;-  const SWord32 s431 = s329 & s351;-  const SWord32 s432 = s430 ^ s431;-  const SWord32 s433 = s346 ^ s432;-  const SWord32 s434 = s429 + s433;-  const SWord32 s435 = s369 + s434;-  const SWord32 s436 = (s435 >> 2) | (s435 << 30);-  const SWord32 s437 = (s435 >> 13) | (s435 << 19);-  const SWord32 s438 = s436 ^ s437;-  const SWord32 s439 = (s435 >> 22) | (s435 << 10);-  const SWord32 s440 = s438 ^ s439;-  const SWord32 s441 = s351 & s435;-  const SWord32 s442 = s340 & s435;-  const SWord32 s443 = s441 ^ s442;-  const SWord32 s444 = s430 ^ s443;-  const SWord32 s445 = s440 + s444;-  const SWord32 s446 = s387 + s445;-  const SWord32 s447 = (s446 >> 2) | (s446 << 30);-  const SWord32 s448 = (s446 >> 13) | (s446 << 19);-  const SWord32 s449 = s447 ^ s448;-  const SWord32 s450 = (s446 >> 22) | (s446 << 10);-  const SWord32 s451 = s449 ^ s450;-  const SWord32 s452 = s435 & s446;-  const SWord32 s453 = s351 & s446;-  const SWord32 s454 = s452 ^ s453;-  const SWord32 s455 = s441 ^ s454;-  const SWord32 s456 = s451 + s455;-  const SWord32 s457 = s405 + s456;-  const SWord32 s458 = (s424 >> 6) | (s424 << 26);-  const SWord32 s459 = (s424 >> 11) | (s424 << 21);-  const SWord32 s460 = s458 ^ s459;-  const SWord32 s461 = (s424 >> 25) | (s424 << 7);-  const SWord32 s462 = s460 ^ s461;-  const SWord32 s463 = s370 + s462;-  const SWord32 s464 = s406 & s424;-  const SWord32 s465 = ~s424;-  const SWord32 s466 = s388 & s465;-  const SWord32 s467 = s464 ^ s466;-  const SWord32 s468 = s463 + s467;-  const SWord32 s470 = s468 + 0x72be5d74UL;-  const SWord16 s471 = (((SWord16) s80) << 8) | ((SWord16) s81);-  const SWord16 s472 = (((SWord16) s82) << 8) | ((SWord16) s83);-  const SWord32 s473 = (((SWord32) s471) << 16) | ((SWord32) s472);-  const SWord32 s474 = s470 + s473;-  const SWord32 s475 = s435 + s474;-  const SWord32 s476 = (s475 >> 6) | (s475 << 26);-  const SWord32 s477 = (s475 >> 11) | (s475 << 21);-  const SWord32 s478 = s476 ^ s477;-  const SWord32 s479 = (s475 >> 25) | (s475 << 7);-  const SWord32 s480 = s478 ^ s479;-  const SWord32 s481 = s388 + s480;-  const SWord32 s482 = s424 & s475;-  const SWord32 s483 = ~s475;-  const SWord32 s484 = s406 & s483;-  const SWord32 s485 = s482 ^ s484;-  const SWord32 s486 = s481 + s485;-  const SWord32 s488 = s486 + 0x80deb1feUL;-  const SWord16 s489 = (((SWord16) s84) << 8) | ((SWord16) s85);-  const SWord16 s490 = (((SWord16) s86) << 8) | ((SWord16) s87);-  const SWord32 s491 = (((SWord32) s489) << 16) | ((SWord32) s490);-  const SWord32 s492 = s488 + s491;-  const SWord32 s493 = s446 + s492;-  const SWord32 s494 = (s493 >> 6) | (s493 << 26);-  const SWord32 s495 = (s493 >> 11) | (s493 << 21);-  const SWord32 s496 = s494 ^ s495;-  const SWord32 s497 = (s493 >> 25) | (s493 << 7);-  const SWord32 s498 = s496 ^ s497;-  const SWord32 s499 = s406 + s498;-  const SWord32 s500 = s475 & s493;-  const SWord32 s501 = ~s493;-  const SWord32 s502 = s424 & s501;-  const SWord32 s503 = s500 ^ s502;-  const SWord32 s504 = s499 + s503;-  const SWord32 s506 = s504 + 0x9bdc06a7UL;-  const SWord16 s507 = (((SWord16) s88) << 8) | ((SWord16) s89);-  const SWord16 s508 = (((SWord16) s90) << 8) | ((SWord16) s91);-  const SWord32 s509 = (((SWord32) s507) << 16) | ((SWord32) s508);-  const SWord32 s510 = s506 + s509;-  const SWord32 s511 = s457 + s510;-  const SWord32 s512 = (s511 >> 6) | (s511 << 26);-  const SWord32 s513 = (s511 >> 11) | (s511 << 21);-  const SWord32 s514 = s512 ^ s513;-  const SWord32 s515 = (s511 >> 25) | (s511 << 7);-  const SWord32 s516 = s514 ^ s515;-  const SWord32 s517 = s424 + s516;-  const SWord32 s518 = s493 & s511;-  const SWord32 s519 = ~s511;-  const SWord32 s520 = s475 & s519;-  const SWord32 s521 = s518 ^ s520;-  const SWord32 s522 = s517 + s521;-  const SWord32 s524 = s522 + 0xc19bf174UL;-  const SWord16 s525 = (((SWord16) s92) << 8) | ((SWord16) s93);-  const SWord16 s526 = (((SWord16) s94) << 8) | ((SWord16) s95);-  const SWord32 s527 = (((SWord32) s525) << 16) | ((SWord32) s526);-  const SWord32 s528 = s524 + s527;-  const SWord32 s529 = (s457 >> 2) | (s457 << 30);-  const SWord32 s530 = (s457 >> 13) | (s457 << 19);-  const SWord32 s531 = s529 ^ s530;-  const SWord32 s532 = (s457 >> 22) | (s457 << 10);-  const SWord32 s533 = s531 ^ s532;-  const SWord32 s534 = s446 & s457;-  const SWord32 s535 = s435 & s457;-  const SWord32 s536 = s534 ^ s535;-  const SWord32 s537 = s452 ^ s536;-  const SWord32 s538 = s533 + s537;-  const SWord32 s539 = s423 + s538;-  const SWord32 s540 = (s539 >> 2) | (s539 << 30);-  const SWord32 s541 = (s539 >> 13) | (s539 << 19);-  const SWord32 s542 = s540 ^ s541;-  const SWord32 s543 = (s539 >> 22) | (s539 << 10);-  const SWord32 s544 = s542 ^ s543;-  const SWord32 s545 = s457 & s539;-  const SWord32 s546 = s446 & s539;-  const SWord32 s547 = s545 ^ s546;-  const SWord32 s548 = s534 ^ s547;-  const SWord32 s549 = s544 + s548;-  const SWord32 s550 = s474 + s549;-  const SWord32 s551 = (s550 >> 2) | (s550 << 30);-  const SWord32 s552 = (s550 >> 13) | (s550 << 19);-  const SWord32 s553 = s551 ^ s552;-  const SWord32 s554 = (s550 >> 22) | (s550 << 10);-  const SWord32 s555 = s553 ^ s554;-  const SWord32 s556 = s539 & s550;-  const SWord32 s557 = s457 & s550;-  const SWord32 s558 = s556 ^ s557;-  const SWord32 s559 = s545 ^ s558;-  const SWord32 s560 = s555 + s559;-  const SWord32 s561 = s492 + s560;-  const SWord32 s562 = (s561 >> 2) | (s561 << 30);-  const SWord32 s563 = (s561 >> 13) | (s561 << 19);-  const SWord32 s564 = s562 ^ s563;-  const SWord32 s565 = (s561 >> 22) | (s561 << 10);-  const SWord32 s566 = s564 ^ s565;-  const SWord32 s567 = s550 & s561;-  const SWord32 s568 = s539 & s561;-  const SWord32 s569 = s567 ^ s568;-  const SWord32 s570 = s556 ^ s569;-  const SWord32 s571 = s566 + s570;-  const SWord32 s572 = s510 + s571;-  const SWord32 s573 = (s572 >> 2) | (s572 << 30);-  const SWord32 s574 = (s572 >> 13) | (s572 << 19);-  const SWord32 s575 = s573 ^ s574;-  const SWord32 s576 = (s572 >> 22) | (s572 << 10);-  const SWord32 s577 = s575 ^ s576;-  const SWord32 s578 = s561 & s572;-  const SWord32 s579 = s550 & s572;-  const SWord32 s580 = s578 ^ s579;-  const SWord32 s581 = s567 ^ s580;-  const SWord32 s582 = s577 + s581;-  const SWord32 s583 = s528 + s582;-  const SWord32 s584 = s528 + s539;-  const SWord32 s585 = (s584 >> 6) | (s584 << 26);-  const SWord32 s586 = (s584 >> 11) | (s584 << 21);-  const SWord32 s587 = s585 ^ s586;-  const SWord32 s588 = (s584 >> 25) | (s584 << 7);-  const SWord32 s589 = s587 ^ s588;-  const SWord32 s590 = s475 + s589;-  const SWord32 s591 = s511 & s584;-  const SWord32 s592 = ~s584;-  const SWord32 s593 = s493 & s592;-  const SWord32 s594 = s591 ^ s593;-  const SWord32 s595 = s590 + s594;-  const SWord32 s597 = s595 + 0xe49b69c1UL;-  const SWord32 s598 = (s509 >> 17) | (s509 << 15);-  const SWord32 s599 = (s509 >> 19) | (s509 << 13);-  const SWord32 s600 = s598 ^ s599;-  const SWord32 s602 = s509 >> 10;-  const SWord32 s603 = s600 ^ s602;-  const SWord32 s604 = s386 + s603;-  const SWord32 s605 = (s153 >> 7) | (s153 << 25);-  const SWord32 s606 = (s153 >> 18) | (s153 << 14);-  const SWord32 s607 = s605 ^ s606;-  const SWord32 s609 = s153 >> 3;-  const SWord32 s610 = s607 ^ s609;-  const SWord32 s611 = s604 + s610;-  const SWord32 s612 = s135 + s611;-  const SWord32 s613 = s597 + s612;-  const SWord32 s614 = s550 + s613;-  const SWord32 s615 = (s614 >> 6) | (s614 << 26);-  const SWord32 s616 = (s614 >> 11) | (s614 << 21);-  const SWord32 s617 = s615 ^ s616;-  const SWord32 s618 = (s614 >> 25) | (s614 << 7);-  const SWord32 s619 = s617 ^ s618;-  const SWord32 s620 = s493 + s619;-  const SWord32 s621 = s584 & s614;-  const SWord32 s622 = ~s614;-  const SWord32 s623 = s511 & s622;-  const SWord32 s624 = s621 ^ s623;-  const SWord32 s625 = s620 + s624;-  const SWord32 s627 = s625 + 0xefbe4786UL;-  const SWord32 s628 = (s527 >> 17) | (s527 << 15);-  const SWord32 s629 = (s527 >> 19) | (s527 << 13);-  const SWord32 s630 = s628 ^ s629;-  const SWord32 s631 = s527 >> 10;-  const SWord32 s632 = s630 ^ s631;-  const SWord32 s633 = s404 + s632;-  const SWord32 s634 = (s171 >> 7) | (s171 << 25);-  const SWord32 s635 = (s171 >> 18) | (s171 << 14);-  const SWord32 s636 = s634 ^ s635;-  const SWord32 s637 = s171 >> 3;-  const SWord32 s638 = s636 ^ s637;-  const SWord32 s639 = s633 + s638;-  const SWord32 s640 = s153 + s639;-  const SWord32 s641 = s627 + s640;-  const SWord32 s642 = s561 + s641;-  const SWord32 s643 = (s642 >> 6) | (s642 << 26);-  const SWord32 s644 = (s642 >> 11) | (s642 << 21);-  const SWord32 s645 = s643 ^ s644;-  const SWord32 s646 = (s642 >> 25) | (s642 << 7);-  const SWord32 s647 = s645 ^ s646;-  const SWord32 s648 = s511 + s647;-  const SWord32 s649 = s614 & s642;-  const SWord32 s650 = ~s642;-  const SWord32 s651 = s584 & s650;-  const SWord32 s652 = s649 ^ s651;-  const SWord32 s653 = s648 + s652;-  const SWord32 s655 = s653 + 0x0fc19dc6UL;-  const SWord32 s656 = (s612 >> 17) | (s612 << 15);-  const SWord32 s657 = (s612 >> 19) | (s612 << 13);-  const SWord32 s658 = s656 ^ s657;-  const SWord32 s659 = s612 >> 10;-  const SWord32 s660 = s658 ^ s659;-  const SWord32 s661 = s422 + s660;-  const SWord32 s662 = (s189 >> 7) | (s189 << 25);-  const SWord32 s663 = (s189 >> 18) | (s189 << 14);-  const SWord32 s664 = s662 ^ s663;-  const SWord32 s665 = s189 >> 3;-  const SWord32 s666 = s664 ^ s665;-  const SWord32 s667 = s661 + s666;-  const SWord32 s668 = s171 + s667;-  const SWord32 s669 = s655 + s668;-  const SWord32 s670 = s572 + s669;-  const SWord32 s671 = (s670 >> 6) | (s670 << 26);-  const SWord32 s672 = (s670 >> 11) | (s670 << 21);-  const SWord32 s673 = s671 ^ s672;-  const SWord32 s674 = (s670 >> 25) | (s670 << 7);-  const SWord32 s675 = s673 ^ s674;-  const SWord32 s676 = s584 + s675;-  const SWord32 s677 = s642 & s670;-  const SWord32 s678 = ~s670;-  const SWord32 s679 = s614 & s678;-  const SWord32 s680 = s677 ^ s679;-  const SWord32 s681 = s676 + s680;-  const SWord32 s683 = s681 + 0x240ca1ccUL;-  const SWord32 s684 = (s640 >> 17) | (s640 << 15);-  const SWord32 s685 = (s640 >> 19) | (s640 << 13);-  const SWord32 s686 = s684 ^ s685;-  const SWord32 s687 = s640 >> 10;-  const SWord32 s688 = s686 ^ s687;-  const SWord32 s689 = s473 + s688;-  const SWord32 s690 = (s241 >> 7) | (s241 << 25);-  const SWord32 s691 = (s241 >> 18) | (s241 << 14);-  const SWord32 s692 = s690 ^ s691;-  const SWord32 s693 = s241 >> 3;-  const SWord32 s694 = s692 ^ s693;-  const SWord32 s695 = s689 + s694;-  const SWord32 s696 = s189 + s695;-  const SWord32 s697 = s683 + s696;-  const SWord32 s698 = s583 + s697;-  const SWord32 s699 = (s583 >> 2) | (s583 << 30);-  const SWord32 s700 = (s583 >> 13) | (s583 << 19);-  const SWord32 s701 = s699 ^ s700;-  const SWord32 s702 = (s583 >> 22) | (s583 << 10);-  const SWord32 s703 = s701 ^ s702;-  const SWord32 s704 = s572 & s583;-  const SWord32 s705 = s561 & s583;-  const SWord32 s706 = s704 ^ s705;-  const SWord32 s707 = s578 ^ s706;-  const SWord32 s708 = s703 + s707;-  const SWord32 s709 = s613 + s708;-  const SWord32 s710 = (s709 >> 2) | (s709 << 30);-  const SWord32 s711 = (s709 >> 13) | (s709 << 19);-  const SWord32 s712 = s710 ^ s711;-  const SWord32 s713 = (s709 >> 22) | (s709 << 10);-  const SWord32 s714 = s712 ^ s713;-  const SWord32 s715 = s583 & s709;-  const SWord32 s716 = s572 & s709;-  const SWord32 s717 = s715 ^ s716;-  const SWord32 s718 = s704 ^ s717;-  const SWord32 s719 = s714 + s718;-  const SWord32 s720 = s641 + s719;-  const SWord32 s721 = (s720 >> 2) | (s720 << 30);-  const SWord32 s722 = (s720 >> 13) | (s720 << 19);-  const SWord32 s723 = s721 ^ s722;-  const SWord32 s724 = (s720 >> 22) | (s720 << 10);-  const SWord32 s725 = s723 ^ s724;-  const SWord32 s726 = s709 & s720;-  const SWord32 s727 = s583 & s720;-  const SWord32 s728 = s726 ^ s727;-  const SWord32 s729 = s715 ^ s728;-  const SWord32 s730 = s725 + s729;-  const SWord32 s731 = s669 + s730;-  const SWord32 s732 = (s698 >> 6) | (s698 << 26);-  const SWord32 s733 = (s698 >> 11) | (s698 << 21);-  const SWord32 s734 = s732 ^ s733;-  const SWord32 s735 = (s698 >> 25) | (s698 << 7);-  const SWord32 s736 = s734 ^ s735;-  const SWord32 s737 = s614 + s736;-  const SWord32 s738 = s670 & s698;-  const SWord32 s739 = ~s698;-  const SWord32 s740 = s642 & s739;-  const SWord32 s741 = s738 ^ s740;-  const SWord32 s742 = s737 + s741;-  const SWord32 s744 = s742 + 0x2de92c6fUL;-  const SWord32 s745 = (s668 >> 17) | (s668 << 15);-  const SWord32 s746 = (s668 >> 19) | (s668 << 13);-  const SWord32 s747 = s745 ^ s746;-  const SWord32 s748 = s668 >> 10;-  const SWord32 s749 = s747 ^ s748;-  const SWord32 s750 = s491 + s749;-  const SWord32 s751 = (s259 >> 7) | (s259 << 25);-  const SWord32 s752 = (s259 >> 18) | (s259 << 14);-  const SWord32 s753 = s751 ^ s752;-  const SWord32 s754 = s259 >> 3;-  const SWord32 s755 = s753 ^ s754;-  const SWord32 s756 = s750 + s755;-  const SWord32 s757 = s241 + s756;-  const SWord32 s758 = s744 + s757;-  const SWord32 s759 = s709 + s758;-  const SWord32 s760 = (s759 >> 6) | (s759 << 26);-  const SWord32 s761 = (s759 >> 11) | (s759 << 21);-  const SWord32 s762 = s760 ^ s761;-  const SWord32 s763 = (s759 >> 25) | (s759 << 7);-  const SWord32 s764 = s762 ^ s763;-  const SWord32 s765 = s642 + s764;-  const SWord32 s766 = s698 & s759;-  const SWord32 s767 = ~s759;-  const SWord32 s768 = s670 & s767;-  const SWord32 s769 = s766 ^ s768;-  const SWord32 s770 = s765 + s769;-  const SWord32 s772 = s770 + 0x4a7484aaUL;-  const SWord32 s773 = (s696 >> 17) | (s696 << 15);-  const SWord32 s774 = (s696 >> 19) | (s696 << 13);-  const SWord32 s775 = s773 ^ s774;-  const SWord32 s776 = s696 >> 10;-  const SWord32 s777 = s775 ^ s776;-  const SWord32 s778 = s509 + s777;-  const SWord32 s779 = (s277 >> 7) | (s277 << 25);-  const SWord32 s780 = (s277 >> 18) | (s277 << 14);-  const SWord32 s781 = s779 ^ s780;-  const SWord32 s782 = s277 >> 3;-  const SWord32 s783 = s781 ^ s782;-  const SWord32 s784 = s778 + s783;-  const SWord32 s785 = s259 + s784;-  const SWord32 s786 = s772 + s785;-  const SWord32 s787 = s720 + s786;-  const SWord32 s788 = (s787 >> 6) | (s787 << 26);-  const SWord32 s789 = (s787 >> 11) | (s787 << 21);-  const SWord32 s790 = s788 ^ s789;-  const SWord32 s791 = (s787 >> 25) | (s787 << 7);-  const SWord32 s792 = s790 ^ s791;-  const SWord32 s793 = s670 + s792;-  const SWord32 s794 = s759 & s787;-  const SWord32 s795 = ~s787;-  const SWord32 s796 = s698 & s795;-  const SWord32 s797 = s794 ^ s796;-  const SWord32 s798 = s793 + s797;-  const SWord32 s800 = s798 + 0x5cb0a9dcUL;-  const SWord32 s801 = (s757 >> 17) | (s757 << 15);-  const SWord32 s802 = (s757 >> 19) | (s757 << 13);-  const SWord32 s803 = s801 ^ s802;-  const SWord32 s804 = s757 >> 10;-  const SWord32 s805 = s803 ^ s804;-  const SWord32 s806 = s527 + s805;-  const SWord32 s807 = (s295 >> 7) | (s295 << 25);-  const SWord32 s808 = (s295 >> 18) | (s295 << 14);-  const SWord32 s809 = s807 ^ s808;-  const SWord32 s810 = s295 >> 3;-  const SWord32 s811 = s809 ^ s810;-  const SWord32 s812 = s806 + s811;-  const SWord32 s813 = s277 + s812;-  const SWord32 s814 = s800 + s813;-  const SWord32 s815 = s731 + s814;-  const SWord32 s816 = (s815 >> 6) | (s815 << 26);-  const SWord32 s817 = (s815 >> 11) | (s815 << 21);-  const SWord32 s818 = s816 ^ s817;-  const SWord32 s819 = (s815 >> 25) | (s815 << 7);-  const SWord32 s820 = s818 ^ s819;-  const SWord32 s821 = s698 + s820;-  const SWord32 s822 = s787 & s815;-  const SWord32 s823 = ~s815;-  const SWord32 s824 = s759 & s823;-  const SWord32 s825 = s822 ^ s824;-  const SWord32 s826 = s821 + s825;-  const SWord32 s828 = s826 + 0x76f988daUL;-  const SWord32 s829 = (s785 >> 17) | (s785 << 15);-  const SWord32 s830 = (s785 >> 19) | (s785 << 13);-  const SWord32 s831 = s829 ^ s830;-  const SWord32 s832 = s785 >> 10;-  const SWord32 s833 = s831 ^ s832;-  const SWord32 s834 = s612 + s833;-  const SWord32 s835 = (s368 >> 7) | (s368 << 25);-  const SWord32 s836 = (s368 >> 18) | (s368 << 14);-  const SWord32 s837 = s835 ^ s836;-  const SWord32 s838 = s368 >> 3;-  const SWord32 s839 = s837 ^ s838;-  const SWord32 s840 = s834 + s839;-  const SWord32 s841 = s295 + s840;-  const SWord32 s842 = s828 + s841;-  const SWord32 s843 = (s731 >> 2) | (s731 << 30);-  const SWord32 s844 = (s731 >> 13) | (s731 << 19);-  const SWord32 s845 = s843 ^ s844;-  const SWord32 s846 = (s731 >> 22) | (s731 << 10);-  const SWord32 s847 = s845 ^ s846;-  const SWord32 s848 = s720 & s731;-  const SWord32 s849 = s709 & s731;-  const SWord32 s850 = s848 ^ s849;-  const SWord32 s851 = s726 ^ s850;-  const SWord32 s852 = s847 + s851;-  const SWord32 s853 = s697 + s852;-  const SWord32 s854 = (s853 >> 2) | (s853 << 30);-  const SWord32 s855 = (s853 >> 13) | (s853 << 19);-  const SWord32 s856 = s854 ^ s855;-  const SWord32 s857 = (s853 >> 22) | (s853 << 10);-  const SWord32 s858 = s856 ^ s857;-  const SWord32 s859 = s731 & s853;-  const SWord32 s860 = s720 & s853;-  const SWord32 s861 = s859 ^ s860;-  const SWord32 s862 = s848 ^ s861;-  const SWord32 s863 = s858 + s862;-  const SWord32 s864 = s758 + s863;-  const SWord32 s865 = (s864 >> 2) | (s864 << 30);-  const SWord32 s866 = (s864 >> 13) | (s864 << 19);-  const SWord32 s867 = s865 ^ s866;-  const SWord32 s868 = (s864 >> 22) | (s864 << 10);-  const SWord32 s869 = s867 ^ s868;-  const SWord32 s870 = s853 & s864;-  const SWord32 s871 = s731 & s864;-  const SWord32 s872 = s870 ^ s871;-  const SWord32 s873 = s859 ^ s872;-  const SWord32 s874 = s869 + s873;-  const SWord32 s875 = s786 + s874;-  const SWord32 s876 = (s875 >> 2) | (s875 << 30);-  const SWord32 s877 = (s875 >> 13) | (s875 << 19);-  const SWord32 s878 = s876 ^ s877;-  const SWord32 s879 = (s875 >> 22) | (s875 << 10);-  const SWord32 s880 = s878 ^ s879;-  const SWord32 s881 = s864 & s875;-  const SWord32 s882 = s853 & s875;-  const SWord32 s883 = s881 ^ s882;-  const SWord32 s884 = s870 ^ s883;-  const SWord32 s885 = s880 + s884;-  const SWord32 s886 = s814 + s885;-  const SWord32 s887 = (s886 >> 2) | (s886 << 30);-  const SWord32 s888 = (s886 >> 13) | (s886 << 19);-  const SWord32 s889 = s887 ^ s888;-  const SWord32 s890 = (s886 >> 22) | (s886 << 10);-  const SWord32 s891 = s889 ^ s890;-  const SWord32 s892 = s875 & s886;-  const SWord32 s893 = s864 & s886;-  const SWord32 s894 = s892 ^ s893;-  const SWord32 s895 = s881 ^ s894;-  const SWord32 s896 = s891 + s895;-  const SWord32 s897 = s842 + s896;-  const SWord32 s898 = s842 + s853;-  const SWord32 s899 = (s898 >> 6) | (s898 << 26);-  const SWord32 s900 = (s898 >> 11) | (s898 << 21);-  const SWord32 s901 = s899 ^ s900;-  const SWord32 s902 = (s898 >> 25) | (s898 << 7);-  const SWord32 s903 = s901 ^ s902;-  const SWord32 s904 = s759 + s903;-  const SWord32 s905 = s815 & s898;-  const SWord32 s906 = ~s898;-  const SWord32 s907 = s787 & s906;-  const SWord32 s908 = s905 ^ s907;-  const SWord32 s909 = s904 + s908;-  const SWord32 s911 = s909 + 0x983e5152UL;-  const SWord32 s912 = (s813 >> 17) | (s813 << 15);-  const SWord32 s913 = (s813 >> 19) | (s813 << 13);-  const SWord32 s914 = s912 ^ s913;-  const SWord32 s915 = s813 >> 10;-  const SWord32 s916 = s914 ^ s915;-  const SWord32 s917 = s640 + s916;-  const SWord32 s918 = (s386 >> 7) | (s386 << 25);-  const SWord32 s919 = (s386 >> 18) | (s386 << 14);-  const SWord32 s920 = s918 ^ s919;-  const SWord32 s921 = s386 >> 3;-  const SWord32 s922 = s920 ^ s921;-  const SWord32 s923 = s917 + s922;-  const SWord32 s924 = s368 + s923;-  const SWord32 s925 = s911 + s924;-  const SWord32 s926 = s864 + s925;-  const SWord32 s927 = (s926 >> 6) | (s926 << 26);-  const SWord32 s928 = (s926 >> 11) | (s926 << 21);-  const SWord32 s929 = s927 ^ s928;-  const SWord32 s930 = (s926 >> 25) | (s926 << 7);-  const SWord32 s931 = s929 ^ s930;-  const SWord32 s932 = s787 + s931;-  const SWord32 s933 = s898 & s926;-  const SWord32 s934 = ~s926;-  const SWord32 s935 = s815 & s934;-  const SWord32 s936 = s933 ^ s935;-  const SWord32 s937 = s932 + s936;-  const SWord32 s939 = s937 + 0xa831c66dUL;-  const SWord32 s940 = (s841 >> 17) | (s841 << 15);-  const SWord32 s941 = (s841 >> 19) | (s841 << 13);-  const SWord32 s942 = s940 ^ s941;-  const SWord32 s943 = s841 >> 10;-  const SWord32 s944 = s942 ^ s943;-  const SWord32 s945 = s668 + s944;-  const SWord32 s946 = (s404 >> 7) | (s404 << 25);-  const SWord32 s947 = (s404 >> 18) | (s404 << 14);-  const SWord32 s948 = s946 ^ s947;-  const SWord32 s949 = s404 >> 3;-  const SWord32 s950 = s948 ^ s949;-  const SWord32 s951 = s945 + s950;-  const SWord32 s952 = s386 + s951;-  const SWord32 s953 = s939 + s952;-  const SWord32 s954 = s875 + s953;-  const SWord32 s955 = (s954 >> 6) | (s954 << 26);-  const SWord32 s956 = (s954 >> 11) | (s954 << 21);-  const SWord32 s957 = s955 ^ s956;-  const SWord32 s958 = (s954 >> 25) | (s954 << 7);-  const SWord32 s959 = s957 ^ s958;-  const SWord32 s960 = s815 + s959;-  const SWord32 s961 = s926 & s954;-  const SWord32 s962 = ~s954;-  const SWord32 s963 = s898 & s962;-  const SWord32 s964 = s961 ^ s963;-  const SWord32 s965 = s960 + s964;-  const SWord32 s967 = s965 + 0xb00327c8UL;-  const SWord32 s968 = (s924 >> 17) | (s924 << 15);-  const SWord32 s969 = (s924 >> 19) | (s924 << 13);-  const SWord32 s970 = s968 ^ s969;-  const SWord32 s971 = s924 >> 10;-  const SWord32 s972 = s970 ^ s971;-  const SWord32 s973 = s696 + s972;-  const SWord32 s974 = (s422 >> 7) | (s422 << 25);-  const SWord32 s975 = (s422 >> 18) | (s422 << 14);-  const SWord32 s976 = s974 ^ s975;-  const SWord32 s977 = s422 >> 3;-  const SWord32 s978 = s976 ^ s977;-  const SWord32 s979 = s973 + s978;-  const SWord32 s980 = s404 + s979;-  const SWord32 s981 = s967 + s980;-  const SWord32 s982 = s886 + s981;-  const SWord32 s983 = (s982 >> 6) | (s982 << 26);-  const SWord32 s984 = (s982 >> 11) | (s982 << 21);-  const SWord32 s985 = s983 ^ s984;-  const SWord32 s986 = (s982 >> 25) | (s982 << 7);-  const SWord32 s987 = s985 ^ s986;-  const SWord32 s988 = s898 + s987;-  const SWord32 s989 = s954 & s982;-  const SWord32 s990 = ~s982;-  const SWord32 s991 = s926 & s990;-  const SWord32 s992 = s989 ^ s991;-  const SWord32 s993 = s988 + s992;-  const SWord32 s995 = s993 + 0xbf597fc7UL;-  const SWord32 s996 = (s952 >> 17) | (s952 << 15);-  const SWord32 s997 = (s952 >> 19) | (s952 << 13);-  const SWord32 s998 = s996 ^ s997;-  const SWord32 s999 = s952 >> 10;-  const SWord32 s1000 = s998 ^ s999;-  const SWord32 s1001 = s757 + s1000;-  const SWord32 s1002 = (s473 >> 7) | (s473 << 25);-  const SWord32 s1003 = (s473 >> 18) | (s473 << 14);-  const SWord32 s1004 = s1002 ^ s1003;-  const SWord32 s1005 = s473 >> 3;-  const SWord32 s1006 = s1004 ^ s1005;-  const SWord32 s1007 = s1001 + s1006;-  const SWord32 s1008 = s422 + s1007;-  const SWord32 s1009 = s995 + s1008;-  const SWord32 s1010 = s897 + s1009;-  const SWord32 s1011 = (s897 >> 2) | (s897 << 30);-  const SWord32 s1012 = (s897 >> 13) | (s897 << 19);-  const SWord32 s1013 = s1011 ^ s1012;-  const SWord32 s1014 = (s897 >> 22) | (s897 << 10);-  const SWord32 s1015 = s1013 ^ s1014;-  const SWord32 s1016 = s886 & s897;-  const SWord32 s1017 = s875 & s897;-  const SWord32 s1018 = s1016 ^ s1017;-  const SWord32 s1019 = s892 ^ s1018;-  const SWord32 s1020 = s1015 + s1019;-  const SWord32 s1021 = s925 + s1020;-  const SWord32 s1022 = (s1021 >> 2) | (s1021 << 30);-  const SWord32 s1023 = (s1021 >> 13) | (s1021 << 19);-  const SWord32 s1024 = s1022 ^ s1023;-  const SWord32 s1025 = (s1021 >> 22) | (s1021 << 10);-  const SWord32 s1026 = s1024 ^ s1025;-  const SWord32 s1027 = s897 & s1021;-  const SWord32 s1028 = s886 & s1021;-  const SWord32 s1029 = s1027 ^ s1028;-  const SWord32 s1030 = s1016 ^ s1029;-  const SWord32 s1031 = s1026 + s1030;-  const SWord32 s1032 = s953 + s1031;-  const SWord32 s1033 = (s1032 >> 2) | (s1032 << 30);-  const SWord32 s1034 = (s1032 >> 13) | (s1032 << 19);-  const SWord32 s1035 = s1033 ^ s1034;-  const SWord32 s1036 = (s1032 >> 22) | (s1032 << 10);-  const SWord32 s1037 = s1035 ^ s1036;-  const SWord32 s1038 = s1021 & s1032;-  const SWord32 s1039 = s897 & s1032;-  const SWord32 s1040 = s1038 ^ s1039;-  const SWord32 s1041 = s1027 ^ s1040;-  const SWord32 s1042 = s1037 + s1041;-  const SWord32 s1043 = s981 + s1042;-  const SWord32 s1044 = (s1010 >> 6) | (s1010 << 26);-  const SWord32 s1045 = (s1010 >> 11) | (s1010 << 21);-  const SWord32 s1046 = s1044 ^ s1045;-  const SWord32 s1047 = (s1010 >> 25) | (s1010 << 7);-  const SWord32 s1048 = s1046 ^ s1047;-  const SWord32 s1049 = s926 + s1048;-  const SWord32 s1050 = s982 & s1010;-  const SWord32 s1051 = ~s1010;-  const SWord32 s1052 = s954 & s1051;-  const SWord32 s1053 = s1050 ^ s1052;-  const SWord32 s1054 = s1049 + s1053;-  const SWord32 s1056 = s1054 + 0xc6e00bf3UL;-  const SWord32 s1057 = (s980 >> 17) | (s980 << 15);-  const SWord32 s1058 = (s980 >> 19) | (s980 << 13);-  const SWord32 s1059 = s1057 ^ s1058;-  const SWord32 s1060 = s980 >> 10;-  const SWord32 s1061 = s1059 ^ s1060;-  const SWord32 s1062 = s785 + s1061;-  const SWord32 s1063 = (s491 >> 7) | (s491 << 25);-  const SWord32 s1064 = (s491 >> 18) | (s491 << 14);-  const SWord32 s1065 = s1063 ^ s1064;-  const SWord32 s1066 = s491 >> 3;-  const SWord32 s1067 = s1065 ^ s1066;-  const SWord32 s1068 = s1062 + s1067;-  const SWord32 s1069 = s473 + s1068;-  const SWord32 s1070 = s1056 + s1069;-  const SWord32 s1071 = s1021 + s1070;-  const SWord32 s1072 = (s1071 >> 6) | (s1071 << 26);-  const SWord32 s1073 = (s1071 >> 11) | (s1071 << 21);-  const SWord32 s1074 = s1072 ^ s1073;-  const SWord32 s1075 = (s1071 >> 25) | (s1071 << 7);-  const SWord32 s1076 = s1074 ^ s1075;-  const SWord32 s1077 = s954 + s1076;-  const SWord32 s1078 = s1010 & s1071;-  const SWord32 s1079 = ~s1071;-  const SWord32 s1080 = s982 & s1079;-  const SWord32 s1081 = s1078 ^ s1080;-  const SWord32 s1082 = s1077 + s1081;-  const SWord32 s1084 = s1082 + 0xd5a79147UL;-  const SWord32 s1085 = (s1008 >> 17) | (s1008 << 15);-  const SWord32 s1086 = (s1008 >> 19) | (s1008 << 13);-  const SWord32 s1087 = s1085 ^ s1086;-  const SWord32 s1088 = s1008 >> 10;-  const SWord32 s1089 = s1087 ^ s1088;-  const SWord32 s1090 = s813 + s1089;-  const SWord32 s1091 = (s509 >> 7) | (s509 << 25);-  const SWord32 s1092 = (s509 >> 18) | (s509 << 14);-  const SWord32 s1093 = s1091 ^ s1092;-  const SWord32 s1094 = s509 >> 3;-  const SWord32 s1095 = s1093 ^ s1094;-  const SWord32 s1096 = s1090 + s1095;-  const SWord32 s1097 = s491 + s1096;-  const SWord32 s1098 = s1084 + s1097;-  const SWord32 s1099 = s1032 + s1098;-  const SWord32 s1100 = (s1099 >> 6) | (s1099 << 26);-  const SWord32 s1101 = (s1099 >> 11) | (s1099 << 21);-  const SWord32 s1102 = s1100 ^ s1101;-  const SWord32 s1103 = (s1099 >> 25) | (s1099 << 7);-  const SWord32 s1104 = s1102 ^ s1103;-  const SWord32 s1105 = s982 + s1104;-  const SWord32 s1106 = s1071 & s1099;-  const SWord32 s1107 = ~s1099;-  const SWord32 s1108 = s1010 & s1107;-  const SWord32 s1109 = s1106 ^ s1108;-  const SWord32 s1110 = s1105 + s1109;-  const SWord32 s1112 = s1110 + 0x06ca6351UL;-  const SWord32 s1113 = (s1069 >> 17) | (s1069 << 15);-  const SWord32 s1114 = (s1069 >> 19) | (s1069 << 13);-  const SWord32 s1115 = s1113 ^ s1114;-  const SWord32 s1116 = s1069 >> 10;-  const SWord32 s1117 = s1115 ^ s1116;-  const SWord32 s1118 = s841 + s1117;-  const SWord32 s1119 = (s527 >> 7) | (s527 << 25);-  const SWord32 s1120 = (s527 >> 18) | (s527 << 14);-  const SWord32 s1121 = s1119 ^ s1120;-  const SWord32 s1122 = s527 >> 3;-  const SWord32 s1123 = s1121 ^ s1122;-  const SWord32 s1124 = s1118 + s1123;-  const SWord32 s1125 = s509 + s1124;-  const SWord32 s1126 = s1112 + s1125;-  const SWord32 s1127 = s1043 + s1126;-  const SWord32 s1128 = (s1127 >> 6) | (s1127 << 26);-  const SWord32 s1129 = (s1127 >> 11) | (s1127 << 21);-  const SWord32 s1130 = s1128 ^ s1129;-  const SWord32 s1131 = (s1127 >> 25) | (s1127 << 7);-  const SWord32 s1132 = s1130 ^ s1131;-  const SWord32 s1133 = s1010 + s1132;-  const SWord32 s1134 = s1099 & s1127;-  const SWord32 s1135 = ~s1127;-  const SWord32 s1136 = s1071 & s1135;-  const SWord32 s1137 = s1134 ^ s1136;-  const SWord32 s1138 = s1133 + s1137;-  const SWord32 s1140 = s1138 + 0x14292967UL;-  const SWord32 s1141 = (s1097 >> 17) | (s1097 << 15);-  const SWord32 s1142 = (s1097 >> 19) | (s1097 << 13);-  const SWord32 s1143 = s1141 ^ s1142;-  const SWord32 s1144 = s1097 >> 10;-  const SWord32 s1145 = s1143 ^ s1144;-  const SWord32 s1146 = s924 + s1145;-  const SWord32 s1147 = (s612 >> 7) | (s612 << 25);-  const SWord32 s1148 = (s612 >> 18) | (s612 << 14);-  const SWord32 s1149 = s1147 ^ s1148;-  const SWord32 s1150 = s612 >> 3;-  const SWord32 s1151 = s1149 ^ s1150;-  const SWord32 s1152 = s1146 + s1151;-  const SWord32 s1153 = s527 + s1152;-  const SWord32 s1154 = s1140 + s1153;-  const SWord32 s1155 = (s1043 >> 2) | (s1043 << 30);-  const SWord32 s1156 = (s1043 >> 13) | (s1043 << 19);-  const SWord32 s1157 = s1155 ^ s1156;-  const SWord32 s1158 = (s1043 >> 22) | (s1043 << 10);-  const SWord32 s1159 = s1157 ^ s1158;-  const SWord32 s1160 = s1032 & s1043;-  const SWord32 s1161 = s1021 & s1043;-  const SWord32 s1162 = s1160 ^ s1161;-  const SWord32 s1163 = s1038 ^ s1162;-  const SWord32 s1164 = s1159 + s1163;-  const SWord32 s1165 = s1009 + s1164;-  const SWord32 s1166 = (s1165 >> 2) | (s1165 << 30);-  const SWord32 s1167 = (s1165 >> 13) | (s1165 << 19);-  const SWord32 s1168 = s1166 ^ s1167;-  const SWord32 s1169 = (s1165 >> 22) | (s1165 << 10);-  const SWord32 s1170 = s1168 ^ s1169;-  const SWord32 s1171 = s1043 & s1165;-  const SWord32 s1172 = s1032 & s1165;-  const SWord32 s1173 = s1171 ^ s1172;-  const SWord32 s1174 = s1160 ^ s1173;-  const SWord32 s1175 = s1170 + s1174;-  const SWord32 s1176 = s1070 + s1175;-  const SWord32 s1177 = (s1176 >> 2) | (s1176 << 30);-  const SWord32 s1178 = (s1176 >> 13) | (s1176 << 19);-  const SWord32 s1179 = s1177 ^ s1178;-  const SWord32 s1180 = (s1176 >> 22) | (s1176 << 10);-  const SWord32 s1181 = s1179 ^ s1180;-  const SWord32 s1182 = s1165 & s1176;-  const SWord32 s1183 = s1043 & s1176;-  const SWord32 s1184 = s1182 ^ s1183;-  const SWord32 s1185 = s1171 ^ s1184;-  const SWord32 s1186 = s1181 + s1185;-  const SWord32 s1187 = s1098 + s1186;-  const SWord32 s1188 = (s1187 >> 2) | (s1187 << 30);-  const SWord32 s1189 = (s1187 >> 13) | (s1187 << 19);-  const SWord32 s1190 = s1188 ^ s1189;-  const SWord32 s1191 = (s1187 >> 22) | (s1187 << 10);-  const SWord32 s1192 = s1190 ^ s1191;-  const SWord32 s1193 = s1176 & s1187;-  const SWord32 s1194 = s1165 & s1187;-  const SWord32 s1195 = s1193 ^ s1194;-  const SWord32 s1196 = s1182 ^ s1195;-  const SWord32 s1197 = s1192 + s1196;-  const SWord32 s1198 = s1126 + s1197;-  const SWord32 s1199 = (s1198 >> 2) | (s1198 << 30);-  const SWord32 s1200 = (s1198 >> 13) | (s1198 << 19);-  const SWord32 s1201 = s1199 ^ s1200;-  const SWord32 s1202 = (s1198 >> 22) | (s1198 << 10);-  const SWord32 s1203 = s1201 ^ s1202;-  const SWord32 s1204 = s1187 & s1198;-  const SWord32 s1205 = s1176 & s1198;-  const SWord32 s1206 = s1204 ^ s1205;-  const SWord32 s1207 = s1193 ^ s1206;-  const SWord32 s1208 = s1203 + s1207;-  const SWord32 s1209 = s1154 + s1208;-  const SWord32 s1210 = s1154 + s1165;-  const SWord32 s1211 = (s1210 >> 6) | (s1210 << 26);-  const SWord32 s1212 = (s1210 >> 11) | (s1210 << 21);-  const SWord32 s1213 = s1211 ^ s1212;-  const SWord32 s1214 = (s1210 >> 25) | (s1210 << 7);-  const SWord32 s1215 = s1213 ^ s1214;-  const SWord32 s1216 = s1071 + s1215;-  const SWord32 s1217 = s1127 & s1210;-  const SWord32 s1218 = ~s1210;-  const SWord32 s1219 = s1099 & s1218;-  const SWord32 s1220 = s1217 ^ s1219;-  const SWord32 s1221 = s1216 + s1220;-  const SWord32 s1223 = s1221 + 0x27b70a85UL;-  const SWord32 s1224 = (s1125 >> 17) | (s1125 << 15);-  const SWord32 s1225 = (s1125 >> 19) | (s1125 << 13);-  const SWord32 s1226 = s1224 ^ s1225;-  const SWord32 s1227 = s1125 >> 10;-  const SWord32 s1228 = s1226 ^ s1227;-  const SWord32 s1229 = s952 + s1228;-  const SWord32 s1230 = (s640 >> 7) | (s640 << 25);-  const SWord32 s1231 = (s640 >> 18) | (s640 << 14);-  const SWord32 s1232 = s1230 ^ s1231;-  const SWord32 s1233 = s640 >> 3;-  const SWord32 s1234 = s1232 ^ s1233;-  const SWord32 s1235 = s1229 + s1234;-  const SWord32 s1236 = s612 + s1235;-  const SWord32 s1237 = s1223 + s1236;-  const SWord32 s1238 = s1176 + s1237;-  const SWord32 s1239 = (s1238 >> 6) | (s1238 << 26);-  const SWord32 s1240 = (s1238 >> 11) | (s1238 << 21);-  const SWord32 s1241 = s1239 ^ s1240;-  const SWord32 s1242 = (s1238 >> 25) | (s1238 << 7);-  const SWord32 s1243 = s1241 ^ s1242;-  const SWord32 s1244 = s1099 + s1243;-  const SWord32 s1245 = s1210 & s1238;-  const SWord32 s1246 = ~s1238;-  const SWord32 s1247 = s1127 & s1246;-  const SWord32 s1248 = s1245 ^ s1247;-  const SWord32 s1249 = s1244 + s1248;-  const SWord32 s1251 = s1249 + 0x2e1b2138UL;-  const SWord32 s1252 = (s1153 >> 17) | (s1153 << 15);-  const SWord32 s1253 = (s1153 >> 19) | (s1153 << 13);-  const SWord32 s1254 = s1252 ^ s1253;-  const SWord32 s1255 = s1153 >> 10;-  const SWord32 s1256 = s1254 ^ s1255;-  const SWord32 s1257 = s980 + s1256;-  const SWord32 s1258 = (s668 >> 7) | (s668 << 25);-  const SWord32 s1259 = (s668 >> 18) | (s668 << 14);-  const SWord32 s1260 = s1258 ^ s1259;-  const SWord32 s1261 = s668 >> 3;-  const SWord32 s1262 = s1260 ^ s1261;-  const SWord32 s1263 = s1257 + s1262;-  const SWord32 s1264 = s640 + s1263;-  const SWord32 s1265 = s1251 + s1264;-  const SWord32 s1266 = s1187 + s1265;-  const SWord32 s1267 = (s1266 >> 6) | (s1266 << 26);-  const SWord32 s1268 = (s1266 >> 11) | (s1266 << 21);-  const SWord32 s1269 = s1267 ^ s1268;-  const SWord32 s1270 = (s1266 >> 25) | (s1266 << 7);-  const SWord32 s1271 = s1269 ^ s1270;-  const SWord32 s1272 = s1127 + s1271;-  const SWord32 s1273 = s1238 & s1266;-  const SWord32 s1274 = ~s1266;-  const SWord32 s1275 = s1210 & s1274;-  const SWord32 s1276 = s1273 ^ s1275;-  const SWord32 s1277 = s1272 + s1276;-  const SWord32 s1279 = s1277 + 0x4d2c6dfcUL;-  const SWord32 s1280 = (s1236 >> 17) | (s1236 << 15);-  const SWord32 s1281 = (s1236 >> 19) | (s1236 << 13);-  const SWord32 s1282 = s1280 ^ s1281;-  const SWord32 s1283 = s1236 >> 10;-  const SWord32 s1284 = s1282 ^ s1283;-  const SWord32 s1285 = s1008 + s1284;-  const SWord32 s1286 = (s696 >> 7) | (s696 << 25);-  const SWord32 s1287 = (s696 >> 18) | (s696 << 14);-  const SWord32 s1288 = s1286 ^ s1287;-  const SWord32 s1289 = s696 >> 3;-  const SWord32 s1290 = s1288 ^ s1289;-  const SWord32 s1291 = s1285 + s1290;-  const SWord32 s1292 = s668 + s1291;-  const SWord32 s1293 = s1279 + s1292;-  const SWord32 s1294 = s1198 + s1293;-  const SWord32 s1295 = (s1294 >> 6) | (s1294 << 26);-  const SWord32 s1296 = (s1294 >> 11) | (s1294 << 21);-  const SWord32 s1297 = s1295 ^ s1296;-  const SWord32 s1298 = (s1294 >> 25) | (s1294 << 7);-  const SWord32 s1299 = s1297 ^ s1298;-  const SWord32 s1300 = s1210 + s1299;-  const SWord32 s1301 = s1266 & s1294;-  const SWord32 s1302 = ~s1294;-  const SWord32 s1303 = s1238 & s1302;-  const SWord32 s1304 = s1301 ^ s1303;-  const SWord32 s1305 = s1300 + s1304;-  const SWord32 s1307 = s1305 + 0x53380d13UL;-  const SWord32 s1308 = (s1264 >> 17) | (s1264 << 15);-  const SWord32 s1309 = (s1264 >> 19) | (s1264 << 13);-  const SWord32 s1310 = s1308 ^ s1309;-  const SWord32 s1311 = s1264 >> 10;-  const SWord32 s1312 = s1310 ^ s1311;-  const SWord32 s1313 = s1069 + s1312;-  const SWord32 s1314 = (s757 >> 7) | (s757 << 25);-  const SWord32 s1315 = (s757 >> 18) | (s757 << 14);-  const SWord32 s1316 = s1314 ^ s1315;-  const SWord32 s1317 = s757 >> 3;-  const SWord32 s1318 = s1316 ^ s1317;-  const SWord32 s1319 = s1313 + s1318;-  const SWord32 s1320 = s696 + s1319;-  const SWord32 s1321 = s1307 + s1320;-  const SWord32 s1322 = s1209 + s1321;-  const SWord32 s1323 = (s1209 >> 2) | (s1209 << 30);-  const SWord32 s1324 = (s1209 >> 13) | (s1209 << 19);-  const SWord32 s1325 = s1323 ^ s1324;-  const SWord32 s1326 = (s1209 >> 22) | (s1209 << 10);-  const SWord32 s1327 = s1325 ^ s1326;-  const SWord32 s1328 = s1198 & s1209;-  const SWord32 s1329 = s1187 & s1209;-  const SWord32 s1330 = s1328 ^ s1329;-  const SWord32 s1331 = s1204 ^ s1330;-  const SWord32 s1332 = s1327 + s1331;-  const SWord32 s1333 = s1237 + s1332;-  const SWord32 s1334 = (s1333 >> 2) | (s1333 << 30);-  const SWord32 s1335 = (s1333 >> 13) | (s1333 << 19);-  const SWord32 s1336 = s1334 ^ s1335;-  const SWord32 s1337 = (s1333 >> 22) | (s1333 << 10);-  const SWord32 s1338 = s1336 ^ s1337;-  const SWord32 s1339 = s1209 & s1333;-  const SWord32 s1340 = s1198 & s1333;-  const SWord32 s1341 = s1339 ^ s1340;-  const SWord32 s1342 = s1328 ^ s1341;-  const SWord32 s1343 = s1338 + s1342;-  const SWord32 s1344 = s1265 + s1343;-  const SWord32 s1345 = (s1344 >> 2) | (s1344 << 30);-  const SWord32 s1346 = (s1344 >> 13) | (s1344 << 19);-  const SWord32 s1347 = s1345 ^ s1346;-  const SWord32 s1348 = (s1344 >> 22) | (s1344 << 10);-  const SWord32 s1349 = s1347 ^ s1348;-  const SWord32 s1350 = s1333 & s1344;-  const SWord32 s1351 = s1209 & s1344;-  const SWord32 s1352 = s1350 ^ s1351;-  const SWord32 s1353 = s1339 ^ s1352;-  const SWord32 s1354 = s1349 + s1353;-  const SWord32 s1355 = s1293 + s1354;-  const SWord32 s1356 = (s1322 >> 6) | (s1322 << 26);-  const SWord32 s1357 = (s1322 >> 11) | (s1322 << 21);-  const SWord32 s1358 = s1356 ^ s1357;-  const SWord32 s1359 = (s1322 >> 25) | (s1322 << 7);-  const SWord32 s1360 = s1358 ^ s1359;-  const SWord32 s1361 = s1238 + s1360;-  const SWord32 s1362 = s1294 & s1322;-  const SWord32 s1363 = ~s1322;-  const SWord32 s1364 = s1266 & s1363;-  const SWord32 s1365 = s1362 ^ s1364;-  const SWord32 s1366 = s1361 + s1365;-  const SWord32 s1368 = s1366 + 0x650a7354UL;-  const SWord32 s1369 = (s1292 >> 17) | (s1292 << 15);-  const SWord32 s1370 = (s1292 >> 19) | (s1292 << 13);-  const SWord32 s1371 = s1369 ^ s1370;-  const SWord32 s1372 = s1292 >> 10;-  const SWord32 s1373 = s1371 ^ s1372;-  const SWord32 s1374 = s1097 + s1373;-  const SWord32 s1375 = (s785 >> 7) | (s785 << 25);-  const SWord32 s1376 = (s785 >> 18) | (s785 << 14);-  const SWord32 s1377 = s1375 ^ s1376;-  const SWord32 s1378 = s785 >> 3;-  const SWord32 s1379 = s1377 ^ s1378;-  const SWord32 s1380 = s1374 + s1379;-  const SWord32 s1381 = s757 + s1380;-  const SWord32 s1382 = s1368 + s1381;-  const SWord32 s1383 = s1333 + s1382;-  const SWord32 s1384 = (s1383 >> 6) | (s1383 << 26);-  const SWord32 s1385 = (s1383 >> 11) | (s1383 << 21);-  const SWord32 s1386 = s1384 ^ s1385;-  const SWord32 s1387 = (s1383 >> 25) | (s1383 << 7);-  const SWord32 s1388 = s1386 ^ s1387;-  const SWord32 s1389 = s1266 + s1388;-  const SWord32 s1390 = s1322 & s1383;-  const SWord32 s1391 = ~s1383;-  const SWord32 s1392 = s1294 & s1391;-  const SWord32 s1393 = s1390 ^ s1392;-  const SWord32 s1394 = s1389 + s1393;-  const SWord32 s1396 = s1394 + 0x766a0abbUL;-  const SWord32 s1397 = (s1320 >> 17) | (s1320 << 15);-  const SWord32 s1398 = (s1320 >> 19) | (s1320 << 13);-  const SWord32 s1399 = s1397 ^ s1398;-  const SWord32 s1400 = s1320 >> 10;-  const SWord32 s1401 = s1399 ^ s1400;-  const SWord32 s1402 = s1125 + s1401;-  const SWord32 s1403 = (s813 >> 7) | (s813 << 25);-  const SWord32 s1404 = (s813 >> 18) | (s813 << 14);-  const SWord32 s1405 = s1403 ^ s1404;-  const SWord32 s1406 = s813 >> 3;-  const SWord32 s1407 = s1405 ^ s1406;-  const SWord32 s1408 = s1402 + s1407;-  const SWord32 s1409 = s785 + s1408;-  const SWord32 s1410 = s1396 + s1409;-  const SWord32 s1411 = s1344 + s1410;-  const SWord32 s1412 = (s1411 >> 6) | (s1411 << 26);-  const SWord32 s1413 = (s1411 >> 11) | (s1411 << 21);-  const SWord32 s1414 = s1412 ^ s1413;-  const SWord32 s1415 = (s1411 >> 25) | (s1411 << 7);-  const SWord32 s1416 = s1414 ^ s1415;-  const SWord32 s1417 = s1294 + s1416;-  const SWord32 s1418 = s1383 & s1411;-  const SWord32 s1419 = ~s1411;-  const SWord32 s1420 = s1322 & s1419;-  const SWord32 s1421 = s1418 ^ s1420;-  const SWord32 s1422 = s1417 + s1421;-  const SWord32 s1424 = s1422 + 0x81c2c92eUL;-  const SWord32 s1425 = (s1381 >> 17) | (s1381 << 15);-  const SWord32 s1426 = (s1381 >> 19) | (s1381 << 13);-  const SWord32 s1427 = s1425 ^ s1426;-  const SWord32 s1428 = s1381 >> 10;-  const SWord32 s1429 = s1427 ^ s1428;-  const SWord32 s1430 = s1153 + s1429;-  const SWord32 s1431 = (s841 >> 7) | (s841 << 25);-  const SWord32 s1432 = (s841 >> 18) | (s841 << 14);-  const SWord32 s1433 = s1431 ^ s1432;-  const SWord32 s1434 = s841 >> 3;-  const SWord32 s1435 = s1433 ^ s1434;-  const SWord32 s1436 = s1430 + s1435;-  const SWord32 s1437 = s813 + s1436;-  const SWord32 s1438 = s1424 + s1437;-  const SWord32 s1439 = s1355 + s1438;-  const SWord32 s1440 = (s1439 >> 6) | (s1439 << 26);-  const SWord32 s1441 = (s1439 >> 11) | (s1439 << 21);-  const SWord32 s1442 = s1440 ^ s1441;-  const SWord32 s1443 = (s1439 >> 25) | (s1439 << 7);-  const SWord32 s1444 = s1442 ^ s1443;-  const SWord32 s1445 = s1322 + s1444;-  const SWord32 s1446 = s1411 & s1439;-  const SWord32 s1447 = ~s1439;-  const SWord32 s1448 = s1383 & s1447;-  const SWord32 s1449 = s1446 ^ s1448;-  const SWord32 s1450 = s1445 + s1449;-  const SWord32 s1452 = s1450 + 0x92722c85UL;-  const SWord32 s1453 = (s1409 >> 17) | (s1409 << 15);-  const SWord32 s1454 = (s1409 >> 19) | (s1409 << 13);-  const SWord32 s1455 = s1453 ^ s1454;-  const SWord32 s1456 = s1409 >> 10;-  const SWord32 s1457 = s1455 ^ s1456;-  const SWord32 s1458 = s1236 + s1457;-  const SWord32 s1459 = (s924 >> 7) | (s924 << 25);-  const SWord32 s1460 = (s924 >> 18) | (s924 << 14);-  const SWord32 s1461 = s1459 ^ s1460;-  const SWord32 s1462 = s924 >> 3;-  const SWord32 s1463 = s1461 ^ s1462;-  const SWord32 s1464 = s1458 + s1463;-  const SWord32 s1465 = s841 + s1464;-  const SWord32 s1466 = s1452 + s1465;-  const SWord32 s1467 = (s1355 >> 2) | (s1355 << 30);-  const SWord32 s1468 = (s1355 >> 13) | (s1355 << 19);-  const SWord32 s1469 = s1467 ^ s1468;-  const SWord32 s1470 = (s1355 >> 22) | (s1355 << 10);-  const SWord32 s1471 = s1469 ^ s1470;-  const SWord32 s1472 = s1344 & s1355;-  const SWord32 s1473 = s1333 & s1355;-  const SWord32 s1474 = s1472 ^ s1473;-  const SWord32 s1475 = s1350 ^ s1474;-  const SWord32 s1476 = s1471 + s1475;-  const SWord32 s1477 = s1321 + s1476;-  const SWord32 s1478 = (s1477 >> 2) | (s1477 << 30);-  const SWord32 s1479 = (s1477 >> 13) | (s1477 << 19);-  const SWord32 s1480 = s1478 ^ s1479;-  const SWord32 s1481 = (s1477 >> 22) | (s1477 << 10);-  const SWord32 s1482 = s1480 ^ s1481;-  const SWord32 s1483 = s1355 & s1477;-  const SWord32 s1484 = s1344 & s1477;-  const SWord32 s1485 = s1483 ^ s1484;-  const SWord32 s1486 = s1472 ^ s1485;-  const SWord32 s1487 = s1482 + s1486;-  const SWord32 s1488 = s1382 + s1487;-  const SWord32 s1489 = (s1488 >> 2) | (s1488 << 30);-  const SWord32 s1490 = (s1488 >> 13) | (s1488 << 19);-  const SWord32 s1491 = s1489 ^ s1490;-  const SWord32 s1492 = (s1488 >> 22) | (s1488 << 10);-  const SWord32 s1493 = s1491 ^ s1492;-  const SWord32 s1494 = s1477 & s1488;-  const SWord32 s1495 = s1355 & s1488;-  const SWord32 s1496 = s1494 ^ s1495;-  const SWord32 s1497 = s1483 ^ s1496;-  const SWord32 s1498 = s1493 + s1497;-  const SWord32 s1499 = s1410 + s1498;-  const SWord32 s1500 = (s1499 >> 2) | (s1499 << 30);-  const SWord32 s1501 = (s1499 >> 13) | (s1499 << 19);-  const SWord32 s1502 = s1500 ^ s1501;-  const SWord32 s1503 = (s1499 >> 22) | (s1499 << 10);-  const SWord32 s1504 = s1502 ^ s1503;-  const SWord32 s1505 = s1488 & s1499;-  const SWord32 s1506 = s1477 & s1499;-  const SWord32 s1507 = s1505 ^ s1506;-  const SWord32 s1508 = s1494 ^ s1507;-  const SWord32 s1509 = s1504 + s1508;-  const SWord32 s1510 = s1438 + s1509;-  const SWord32 s1511 = (s1510 >> 2) | (s1510 << 30);-  const SWord32 s1512 = (s1510 >> 13) | (s1510 << 19);-  const SWord32 s1513 = s1511 ^ s1512;-  const SWord32 s1514 = (s1510 >> 22) | (s1510 << 10);-  const SWord32 s1515 = s1513 ^ s1514;-  const SWord32 s1516 = s1499 & s1510;-  const SWord32 s1517 = s1488 & s1510;-  const SWord32 s1518 = s1516 ^ s1517;-  const SWord32 s1519 = s1505 ^ s1518;-  const SWord32 s1520 = s1515 + s1519;-  const SWord32 s1521 = s1466 + s1520;-  const SWord32 s1522 = s1466 + s1477;-  const SWord32 s1523 = (s1522 >> 6) | (s1522 << 26);-  const SWord32 s1524 = (s1522 >> 11) | (s1522 << 21);-  const SWord32 s1525 = s1523 ^ s1524;-  const SWord32 s1526 = (s1522 >> 25) | (s1522 << 7);-  const SWord32 s1527 = s1525 ^ s1526;-  const SWord32 s1528 = s1383 + s1527;-  const SWord32 s1529 = s1439 & s1522;-  const SWord32 s1530 = ~s1522;-  const SWord32 s1531 = s1411 & s1530;-  const SWord32 s1532 = s1529 ^ s1531;-  const SWord32 s1533 = s1528 + s1532;-  const SWord32 s1535 = s1533 + 0xa2bfe8a1UL;-  const SWord32 s1536 = (s1437 >> 17) | (s1437 << 15);-  const SWord32 s1537 = (s1437 >> 19) | (s1437 << 13);-  const SWord32 s1538 = s1536 ^ s1537;-  const SWord32 s1539 = s1437 >> 10;-  const SWord32 s1540 = s1538 ^ s1539;-  const SWord32 s1541 = s1264 + s1540;-  const SWord32 s1542 = (s952 >> 7) | (s952 << 25);-  const SWord32 s1543 = (s952 >> 18) | (s952 << 14);-  const SWord32 s1544 = s1542 ^ s1543;-  const SWord32 s1545 = s952 >> 3;-  const SWord32 s1546 = s1544 ^ s1545;-  const SWord32 s1547 = s1541 + s1546;-  const SWord32 s1548 = s924 + s1547;-  const SWord32 s1549 = s1535 + s1548;-  const SWord32 s1550 = s1488 + s1549;-  const SWord32 s1551 = (s1550 >> 6) | (s1550 << 26);-  const SWord32 s1552 = (s1550 >> 11) | (s1550 << 21);-  const SWord32 s1553 = s1551 ^ s1552;-  const SWord32 s1554 = (s1550 >> 25) | (s1550 << 7);-  const SWord32 s1555 = s1553 ^ s1554;-  const SWord32 s1556 = s1411 + s1555;-  const SWord32 s1557 = s1522 & s1550;-  const SWord32 s1558 = ~s1550;-  const SWord32 s1559 = s1439 & s1558;-  const SWord32 s1560 = s1557 ^ s1559;-  const SWord32 s1561 = s1556 + s1560;-  const SWord32 s1563 = s1561 + 0xa81a664bUL;-  const SWord32 s1564 = (s1465 >> 17) | (s1465 << 15);-  const SWord32 s1565 = (s1465 >> 19) | (s1465 << 13);-  const SWord32 s1566 = s1564 ^ s1565;-  const SWord32 s1567 = s1465 >> 10;-  const SWord32 s1568 = s1566 ^ s1567;-  const SWord32 s1569 = s1292 + s1568;-  const SWord32 s1570 = (s980 >> 7) | (s980 << 25);-  const SWord32 s1571 = (s980 >> 18) | (s980 << 14);-  const SWord32 s1572 = s1570 ^ s1571;-  const SWord32 s1573 = s980 >> 3;-  const SWord32 s1574 = s1572 ^ s1573;-  const SWord32 s1575 = s1569 + s1574;-  const SWord32 s1576 = s952 + s1575;-  const SWord32 s1577 = s1563 + s1576;-  const SWord32 s1578 = s1499 + s1577;-  const SWord32 s1579 = (s1578 >> 6) | (s1578 << 26);-  const SWord32 s1580 = (s1578 >> 11) | (s1578 << 21);-  const SWord32 s1581 = s1579 ^ s1580;-  const SWord32 s1582 = (s1578 >> 25) | (s1578 << 7);-  const SWord32 s1583 = s1581 ^ s1582;-  const SWord32 s1584 = s1439 + s1583;-  const SWord32 s1585 = s1550 & s1578;-  const SWord32 s1586 = ~s1578;-  const SWord32 s1587 = s1522 & s1586;-  const SWord32 s1588 = s1585 ^ s1587;-  const SWord32 s1589 = s1584 + s1588;-  const SWord32 s1591 = s1589 + 0xc24b8b70UL;-  const SWord32 s1592 = (s1548 >> 17) | (s1548 << 15);-  const SWord32 s1593 = (s1548 >> 19) | (s1548 << 13);-  const SWord32 s1594 = s1592 ^ s1593;-  const SWord32 s1595 = s1548 >> 10;-  const SWord32 s1596 = s1594 ^ s1595;-  const SWord32 s1597 = s1320 + s1596;-  const SWord32 s1598 = (s1008 >> 7) | (s1008 << 25);-  const SWord32 s1599 = (s1008 >> 18) | (s1008 << 14);-  const SWord32 s1600 = s1598 ^ s1599;-  const SWord32 s1601 = s1008 >> 3;-  const SWord32 s1602 = s1600 ^ s1601;-  const SWord32 s1603 = s1597 + s1602;-  const SWord32 s1604 = s980 + s1603;-  const SWord32 s1605 = s1591 + s1604;-  const SWord32 s1606 = s1510 + s1605;-  const SWord32 s1607 = (s1606 >> 6) | (s1606 << 26);-  const SWord32 s1608 = (s1606 >> 11) | (s1606 << 21);-  const SWord32 s1609 = s1607 ^ s1608;-  const SWord32 s1610 = (s1606 >> 25) | (s1606 << 7);-  const SWord32 s1611 = s1609 ^ s1610;-  const SWord32 s1612 = s1522 + s1611;-  const SWord32 s1613 = s1578 & s1606;-  const SWord32 s1614 = ~s1606;-  const SWord32 s1615 = s1550 & s1614;-  const SWord32 s1616 = s1613 ^ s1615;-  const SWord32 s1617 = s1612 + s1616;-  const SWord32 s1619 = s1617 + 0xc76c51a3UL;-  const SWord32 s1620 = (s1576 >> 17) | (s1576 << 15);-  const SWord32 s1621 = (s1576 >> 19) | (s1576 << 13);-  const SWord32 s1622 = s1620 ^ s1621;-  const SWord32 s1623 = s1576 >> 10;-  const SWord32 s1624 = s1622 ^ s1623;-  const SWord32 s1625 = s1381 + s1624;-  const SWord32 s1626 = (s1069 >> 7) | (s1069 << 25);-  const SWord32 s1627 = (s1069 >> 18) | (s1069 << 14);-  const SWord32 s1628 = s1626 ^ s1627;-  const SWord32 s1629 = s1069 >> 3;-  const SWord32 s1630 = s1628 ^ s1629;-  const SWord32 s1631 = s1625 + s1630;-  const SWord32 s1632 = s1008 + s1631;-  const SWord32 s1633 = s1619 + s1632;-  const SWord32 s1634 = s1521 + s1633;-  const SWord32 s1635 = (s1521 >> 2) | (s1521 << 30);-  const SWord32 s1636 = (s1521 >> 13) | (s1521 << 19);-  const SWord32 s1637 = s1635 ^ s1636;-  const SWord32 s1638 = (s1521 >> 22) | (s1521 << 10);-  const SWord32 s1639 = s1637 ^ s1638;-  const SWord32 s1640 = s1510 & s1521;-  const SWord32 s1641 = s1499 & s1521;-  const SWord32 s1642 = s1640 ^ s1641;-  const SWord32 s1643 = s1516 ^ s1642;-  const SWord32 s1644 = s1639 + s1643;-  const SWord32 s1645 = s1549 + s1644;-  const SWord32 s1646 = (s1645 >> 2) | (s1645 << 30);-  const SWord32 s1647 = (s1645 >> 13) | (s1645 << 19);-  const SWord32 s1648 = s1646 ^ s1647;-  const SWord32 s1649 = (s1645 >> 22) | (s1645 << 10);-  const SWord32 s1650 = s1648 ^ s1649;-  const SWord32 s1651 = s1521 & s1645;-  const SWord32 s1652 = s1510 & s1645;-  const SWord32 s1653 = s1651 ^ s1652;-  const SWord32 s1654 = s1640 ^ s1653;-  const SWord32 s1655 = s1650 + s1654;-  const SWord32 s1656 = s1577 + s1655;-  const SWord32 s1657 = (s1656 >> 2) | (s1656 << 30);-  const SWord32 s1658 = (s1656 >> 13) | (s1656 << 19);-  const SWord32 s1659 = s1657 ^ s1658;-  const SWord32 s1660 = (s1656 >> 22) | (s1656 << 10);-  const SWord32 s1661 = s1659 ^ s1660;-  const SWord32 s1662 = s1645 & s1656;-  const SWord32 s1663 = s1521 & s1656;-  const SWord32 s1664 = s1662 ^ s1663;-  const SWord32 s1665 = s1651 ^ s1664;-  const SWord32 s1666 = s1661 + s1665;-  const SWord32 s1667 = s1605 + s1666;-  const SWord32 s1668 = (s1634 >> 6) | (s1634 << 26);-  const SWord32 s1669 = (s1634 >> 11) | (s1634 << 21);-  const SWord32 s1670 = s1668 ^ s1669;-  const SWord32 s1671 = (s1634 >> 25) | (s1634 << 7);-  const SWord32 s1672 = s1670 ^ s1671;-  const SWord32 s1673 = s1550 + s1672;-  const SWord32 s1674 = s1606 & s1634;-  const SWord32 s1675 = ~s1634;-  const SWord32 s1676 = s1578 & s1675;-  const SWord32 s1677 = s1674 ^ s1676;-  const SWord32 s1678 = s1673 + s1677;-  const SWord32 s1680 = s1678 + 0xd192e819UL;-  const SWord32 s1681 = (s1604 >> 17) | (s1604 << 15);-  const SWord32 s1682 = (s1604 >> 19) | (s1604 << 13);-  const SWord32 s1683 = s1681 ^ s1682;-  const SWord32 s1684 = s1604 >> 10;-  const SWord32 s1685 = s1683 ^ s1684;-  const SWord32 s1686 = s1409 + s1685;-  const SWord32 s1687 = (s1097 >> 7) | (s1097 << 25);-  const SWord32 s1688 = (s1097 >> 18) | (s1097 << 14);-  const SWord32 s1689 = s1687 ^ s1688;-  const SWord32 s1690 = s1097 >> 3;-  const SWord32 s1691 = s1689 ^ s1690;-  const SWord32 s1692 = s1686 + s1691;-  const SWord32 s1693 = s1069 + s1692;-  const SWord32 s1694 = s1680 + s1693;-  const SWord32 s1695 = s1645 + s1694;-  const SWord32 s1696 = (s1695 >> 6) | (s1695 << 26);-  const SWord32 s1697 = (s1695 >> 11) | (s1695 << 21);-  const SWord32 s1698 = s1696 ^ s1697;-  const SWord32 s1699 = (s1695 >> 25) | (s1695 << 7);-  const SWord32 s1700 = s1698 ^ s1699;-  const SWord32 s1701 = s1578 + s1700;-  const SWord32 s1702 = s1634 & s1695;-  const SWord32 s1703 = ~s1695;-  const SWord32 s1704 = s1606 & s1703;-  const SWord32 s1705 = s1702 ^ s1704;-  const SWord32 s1706 = s1701 + s1705;-  const SWord32 s1708 = s1706 + 0xd6990624UL;-  const SWord32 s1709 = (s1632 >> 17) | (s1632 << 15);-  const SWord32 s1710 = (s1632 >> 19) | (s1632 << 13);-  const SWord32 s1711 = s1709 ^ s1710;-  const SWord32 s1712 = s1632 >> 10;-  const SWord32 s1713 = s1711 ^ s1712;-  const SWord32 s1714 = s1437 + s1713;-  const SWord32 s1715 = (s1125 >> 7) | (s1125 << 25);-  const SWord32 s1716 = (s1125 >> 18) | (s1125 << 14);-  const SWord32 s1717 = s1715 ^ s1716;-  const SWord32 s1718 = s1125 >> 3;-  const SWord32 s1719 = s1717 ^ s1718;-  const SWord32 s1720 = s1714 + s1719;-  const SWord32 s1721 = s1097 + s1720;-  const SWord32 s1722 = s1708 + s1721;-  const SWord32 s1723 = s1656 + s1722;-  const SWord32 s1724 = (s1723 >> 6) | (s1723 << 26);-  const SWord32 s1725 = (s1723 >> 11) | (s1723 << 21);-  const SWord32 s1726 = s1724 ^ s1725;-  const SWord32 s1727 = (s1723 >> 25) | (s1723 << 7);-  const SWord32 s1728 = s1726 ^ s1727;-  const SWord32 s1729 = s1606 + s1728;-  const SWord32 s1730 = s1695 & s1723;-  const SWord32 s1731 = ~s1723;-  const SWord32 s1732 = s1634 & s1731;-  const SWord32 s1733 = s1730 ^ s1732;-  const SWord32 s1734 = s1729 + s1733;-  const SWord32 s1736 = s1734 + 0xf40e3585UL;-  const SWord32 s1737 = (s1693 >> 17) | (s1693 << 15);-  const SWord32 s1738 = (s1693 >> 19) | (s1693 << 13);-  const SWord32 s1739 = s1737 ^ s1738;-  const SWord32 s1740 = s1693 >> 10;-  const SWord32 s1741 = s1739 ^ s1740;-  const SWord32 s1742 = s1465 + s1741;-  const SWord32 s1743 = (s1153 >> 7) | (s1153 << 25);-  const SWord32 s1744 = (s1153 >> 18) | (s1153 << 14);-  const SWord32 s1745 = s1743 ^ s1744;-  const SWord32 s1746 = s1153 >> 3;-  const SWord32 s1747 = s1745 ^ s1746;-  const SWord32 s1748 = s1742 + s1747;-  const SWord32 s1749 = s1125 + s1748;-  const SWord32 s1750 = s1736 + s1749;-  const SWord32 s1751 = s1667 + s1750;-  const SWord32 s1752 = (s1751 >> 6) | (s1751 << 26);-  const SWord32 s1753 = (s1751 >> 11) | (s1751 << 21);-  const SWord32 s1754 = s1752 ^ s1753;-  const SWord32 s1755 = (s1751 >> 25) | (s1751 << 7);-  const SWord32 s1756 = s1754 ^ s1755;-  const SWord32 s1757 = s1634 + s1756;-  const SWord32 s1758 = s1723 & s1751;-  const SWord32 s1759 = ~s1751;-  const SWord32 s1760 = s1695 & s1759;-  const SWord32 s1761 = s1758 ^ s1760;-  const SWord32 s1762 = s1757 + s1761;-  const SWord32 s1764 = s1762 + 0x106aa070UL;-  const SWord32 s1765 = (s1721 >> 17) | (s1721 << 15);-  const SWord32 s1766 = (s1721 >> 19) | (s1721 << 13);-  const SWord32 s1767 = s1765 ^ s1766;-  const SWord32 s1768 = s1721 >> 10;-  const SWord32 s1769 = s1767 ^ s1768;-  const SWord32 s1770 = s1548 + s1769;-  const SWord32 s1771 = (s1236 >> 7) | (s1236 << 25);-  const SWord32 s1772 = (s1236 >> 18) | (s1236 << 14);-  const SWord32 s1773 = s1771 ^ s1772;-  const SWord32 s1774 = s1236 >> 3;-  const SWord32 s1775 = s1773 ^ s1774;-  const SWord32 s1776 = s1770 + s1775;-  const SWord32 s1777 = s1153 + s1776;-  const SWord32 s1778 = s1764 + s1777;-  const SWord32 s1779 = (s1667 >> 2) | (s1667 << 30);-  const SWord32 s1780 = (s1667 >> 13) | (s1667 << 19);-  const SWord32 s1781 = s1779 ^ s1780;-  const SWord32 s1782 = (s1667 >> 22) | (s1667 << 10);-  const SWord32 s1783 = s1781 ^ s1782;-  const SWord32 s1784 = s1656 & s1667;-  const SWord32 s1785 = s1645 & s1667;-  const SWord32 s1786 = s1784 ^ s1785;-  const SWord32 s1787 = s1662 ^ s1786;-  const SWord32 s1788 = s1783 + s1787;-  const SWord32 s1789 = s1633 + s1788;-  const SWord32 s1790 = (s1789 >> 2) | (s1789 << 30);-  const SWord32 s1791 = (s1789 >> 13) | (s1789 << 19);-  const SWord32 s1792 = s1790 ^ s1791;-  const SWord32 s1793 = (s1789 >> 22) | (s1789 << 10);-  const SWord32 s1794 = s1792 ^ s1793;-  const SWord32 s1795 = s1667 & s1789;-  const SWord32 s1796 = s1656 & s1789;-  const SWord32 s1797 = s1795 ^ s1796;-  const SWord32 s1798 = s1784 ^ s1797;-  const SWord32 s1799 = s1794 + s1798;-  const SWord32 s1800 = s1694 + s1799;-  const SWord32 s1801 = (s1800 >> 2) | (s1800 << 30);-  const SWord32 s1802 = (s1800 >> 13) | (s1800 << 19);-  const SWord32 s1803 = s1801 ^ s1802;-  const SWord32 s1804 = (s1800 >> 22) | (s1800 << 10);-  const SWord32 s1805 = s1803 ^ s1804;-  const SWord32 s1806 = s1789 & s1800;-  const SWord32 s1807 = s1667 & s1800;-  const SWord32 s1808 = s1806 ^ s1807;-  const SWord32 s1809 = s1795 ^ s1808;-  const SWord32 s1810 = s1805 + s1809;-  const SWord32 s1811 = s1722 + s1810;-  const SWord32 s1812 = (s1811 >> 2) | (s1811 << 30);-  const SWord32 s1813 = (s1811 >> 13) | (s1811 << 19);-  const SWord32 s1814 = s1812 ^ s1813;-  const SWord32 s1815 = (s1811 >> 22) | (s1811 << 10);-  const SWord32 s1816 = s1814 ^ s1815;-  const SWord32 s1817 = s1800 & s1811;-  const SWord32 s1818 = s1789 & s1811;-  const SWord32 s1819 = s1817 ^ s1818;-  const SWord32 s1820 = s1806 ^ s1819;-  const SWord32 s1821 = s1816 + s1820;-  const SWord32 s1822 = s1750 + s1821;-  const SWord32 s1823 = (s1822 >> 2) | (s1822 << 30);-  const SWord32 s1824 = (s1822 >> 13) | (s1822 << 19);-  const SWord32 s1825 = s1823 ^ s1824;-  const SWord32 s1826 = (s1822 >> 22) | (s1822 << 10);-  const SWord32 s1827 = s1825 ^ s1826;-  const SWord32 s1828 = s1811 & s1822;-  const SWord32 s1829 = s1800 & s1822;-  const SWord32 s1830 = s1828 ^ s1829;-  const SWord32 s1831 = s1817 ^ s1830;-  const SWord32 s1832 = s1827 + s1831;-  const SWord32 s1833 = s1778 + s1832;-  const SWord32 s1834 = s1778 + s1789;-  const SWord32 s1835 = (s1834 >> 6) | (s1834 << 26);-  const SWord32 s1836 = (s1834 >> 11) | (s1834 << 21);-  const SWord32 s1837 = s1835 ^ s1836;-  const SWord32 s1838 = (s1834 >> 25) | (s1834 << 7);-  const SWord32 s1839 = s1837 ^ s1838;-  const SWord32 s1840 = s1695 + s1839;-  const SWord32 s1841 = s1751 & s1834;-  const SWord32 s1842 = ~s1834;-  const SWord32 s1843 = s1723 & s1842;-  const SWord32 s1844 = s1841 ^ s1843;-  const SWord32 s1845 = s1840 + s1844;-  const SWord32 s1847 = s1845 + 0x19a4c116UL;-  const SWord32 s1848 = (s1749 >> 17) | (s1749 << 15);-  const SWord32 s1849 = (s1749 >> 19) | (s1749 << 13);-  const SWord32 s1850 = s1848 ^ s1849;-  const SWord32 s1851 = s1749 >> 10;-  const SWord32 s1852 = s1850 ^ s1851;-  const SWord32 s1853 = s1576 + s1852;-  const SWord32 s1854 = (s1264 >> 7) | (s1264 << 25);-  const SWord32 s1855 = (s1264 >> 18) | (s1264 << 14);-  const SWord32 s1856 = s1854 ^ s1855;-  const SWord32 s1857 = s1264 >> 3;-  const SWord32 s1858 = s1856 ^ s1857;-  const SWord32 s1859 = s1853 + s1858;-  const SWord32 s1860 = s1236 + s1859;-  const SWord32 s1861 = s1847 + s1860;-  const SWord32 s1862 = s1800 + s1861;-  const SWord32 s1863 = (s1862 >> 6) | (s1862 << 26);-  const SWord32 s1864 = (s1862 >> 11) | (s1862 << 21);-  const SWord32 s1865 = s1863 ^ s1864;-  const SWord32 s1866 = (s1862 >> 25) | (s1862 << 7);-  const SWord32 s1867 = s1865 ^ s1866;-  const SWord32 s1868 = s1723 + s1867;-  const SWord32 s1869 = s1834 & s1862;-  const SWord32 s1870 = ~s1862;-  const SWord32 s1871 = s1751 & s1870;-  const SWord32 s1872 = s1869 ^ s1871;-  const SWord32 s1873 = s1868 + s1872;-  const SWord32 s1875 = s1873 + 0x1e376c08UL;-  const SWord32 s1876 = (s1777 >> 17) | (s1777 << 15);-  const SWord32 s1877 = (s1777 >> 19) | (s1777 << 13);-  const SWord32 s1878 = s1876 ^ s1877;-  const SWord32 s1879 = s1777 >> 10;-  const SWord32 s1880 = s1878 ^ s1879;-  const SWord32 s1881 = s1604 + s1880;-  const SWord32 s1882 = (s1292 >> 7) | (s1292 << 25);-  const SWord32 s1883 = (s1292 >> 18) | (s1292 << 14);-  const SWord32 s1884 = s1882 ^ s1883;-  const SWord32 s1885 = s1292 >> 3;-  const SWord32 s1886 = s1884 ^ s1885;-  const SWord32 s1887 = s1881 + s1886;-  const SWord32 s1888 = s1264 + s1887;-  const SWord32 s1889 = s1875 + s1888;-  const SWord32 s1890 = s1811 + s1889;-  const SWord32 s1891 = (s1890 >> 6) | (s1890 << 26);-  const SWord32 s1892 = (s1890 >> 11) | (s1890 << 21);-  const SWord32 s1893 = s1891 ^ s1892;-  const SWord32 s1894 = (s1890 >> 25) | (s1890 << 7);-  const SWord32 s1895 = s1893 ^ s1894;-  const SWord32 s1896 = s1751 + s1895;-  const SWord32 s1897 = s1862 & s1890;-  const SWord32 s1898 = ~s1890;-  const SWord32 s1899 = s1834 & s1898;-  const SWord32 s1900 = s1897 ^ s1899;-  const SWord32 s1901 = s1896 + s1900;-  const SWord32 s1903 = s1901 + 0x2748774cUL;-  const SWord32 s1904 = (s1860 >> 17) | (s1860 << 15);-  const SWord32 s1905 = (s1860 >> 19) | (s1860 << 13);-  const SWord32 s1906 = s1904 ^ s1905;-  const SWord32 s1907 = s1860 >> 10;-  const SWord32 s1908 = s1906 ^ s1907;-  const SWord32 s1909 = s1632 + s1908;-  const SWord32 s1910 = (s1320 >> 7) | (s1320 << 25);-  const SWord32 s1911 = (s1320 >> 18) | (s1320 << 14);-  const SWord32 s1912 = s1910 ^ s1911;-  const SWord32 s1913 = s1320 >> 3;-  const SWord32 s1914 = s1912 ^ s1913;-  const SWord32 s1915 = s1909 + s1914;-  const SWord32 s1916 = s1292 + s1915;-  const SWord32 s1917 = s1903 + s1916;-  const SWord32 s1918 = s1822 + s1917;-  const SWord32 s1919 = (s1918 >> 6) | (s1918 << 26);-  const SWord32 s1920 = (s1918 >> 11) | (s1918 << 21);-  const SWord32 s1921 = s1919 ^ s1920;-  const SWord32 s1922 = (s1918 >> 25) | (s1918 << 7);-  const SWord32 s1923 = s1921 ^ s1922;-  const SWord32 s1924 = s1834 + s1923;-  const SWord32 s1925 = s1890 & s1918;-  const SWord32 s1926 = ~s1918;-  const SWord32 s1927 = s1862 & s1926;-  const SWord32 s1928 = s1925 ^ s1927;-  const SWord32 s1929 = s1924 + s1928;-  const SWord32 s1931 = s1929 + 0x34b0bcb5UL;-  const SWord32 s1932 = (s1888 >> 17) | (s1888 << 15);-  const SWord32 s1933 = (s1888 >> 19) | (s1888 << 13);-  const SWord32 s1934 = s1932 ^ s1933;-  const SWord32 s1935 = s1888 >> 10;-  const SWord32 s1936 = s1934 ^ s1935;-  const SWord32 s1937 = s1693 + s1936;-  const SWord32 s1938 = (s1381 >> 7) | (s1381 << 25);-  const SWord32 s1939 = (s1381 >> 18) | (s1381 << 14);-  const SWord32 s1940 = s1938 ^ s1939;-  const SWord32 s1941 = s1381 >> 3;-  const SWord32 s1942 = s1940 ^ s1941;-  const SWord32 s1943 = s1937 + s1942;-  const SWord32 s1944 = s1320 + s1943;-  const SWord32 s1945 = s1931 + s1944;-  const SWord32 s1946 = s1833 + s1945;-  const SWord32 s1947 = (s1833 >> 2) | (s1833 << 30);-  const SWord32 s1948 = (s1833 >> 13) | (s1833 << 19);-  const SWord32 s1949 = s1947 ^ s1948;-  const SWord32 s1950 = (s1833 >> 22) | (s1833 << 10);-  const SWord32 s1951 = s1949 ^ s1950;-  const SWord32 s1952 = s1822 & s1833;-  const SWord32 s1953 = s1811 & s1833;-  const SWord32 s1954 = s1952 ^ s1953;-  const SWord32 s1955 = s1828 ^ s1954;-  const SWord32 s1956 = s1951 + s1955;-  const SWord32 s1957 = s1861 + s1956;-  const SWord32 s1958 = (s1957 >> 2) | (s1957 << 30);-  const SWord32 s1959 = (s1957 >> 13) | (s1957 << 19);-  const SWord32 s1960 = s1958 ^ s1959;-  const SWord32 s1961 = (s1957 >> 22) | (s1957 << 10);-  const SWord32 s1962 = s1960 ^ s1961;-  const SWord32 s1963 = s1833 & s1957;-  const SWord32 s1964 = s1822 & s1957;-  const SWord32 s1965 = s1963 ^ s1964;-  const SWord32 s1966 = s1952 ^ s1965;-  const SWord32 s1967 = s1962 + s1966;-  const SWord32 s1968 = s1889 + s1967;-  const SWord32 s1969 = (s1968 >> 2) | (s1968 << 30);-  const SWord32 s1970 = (s1968 >> 13) | (s1968 << 19);-  const SWord32 s1971 = s1969 ^ s1970;-  const SWord32 s1972 = (s1968 >> 22) | (s1968 << 10);-  const SWord32 s1973 = s1971 ^ s1972;-  const SWord32 s1974 = s1957 & s1968;-  const SWord32 s1975 = s1833 & s1968;-  const SWord32 s1976 = s1974 ^ s1975;-  const SWord32 s1977 = s1963 ^ s1976;-  const SWord32 s1978 = s1973 + s1977;-  const SWord32 s1979 = s1917 + s1978;-  const SWord32 s1980 = (s1946 >> 6) | (s1946 << 26);-  const SWord32 s1981 = (s1946 >> 11) | (s1946 << 21);-  const SWord32 s1982 = s1980 ^ s1981;-  const SWord32 s1983 = (s1946 >> 25) | (s1946 << 7);-  const SWord32 s1984 = s1982 ^ s1983;-  const SWord32 s1985 = s1862 + s1984;-  const SWord32 s1986 = s1918 & s1946;-  const SWord32 s1987 = ~s1946;-  const SWord32 s1988 = s1890 & s1987;-  const SWord32 s1989 = s1986 ^ s1988;-  const SWord32 s1990 = s1985 + s1989;-  const SWord32 s1992 = s1990 + 0x391c0cb3UL;-  const SWord32 s1993 = (s1916 >> 17) | (s1916 << 15);-  const SWord32 s1994 = (s1916 >> 19) | (s1916 << 13);-  const SWord32 s1995 = s1993 ^ s1994;-  const SWord32 s1996 = s1916 >> 10;-  const SWord32 s1997 = s1995 ^ s1996;-  const SWord32 s1998 = s1721 + s1997;-  const SWord32 s1999 = (s1409 >> 7) | (s1409 << 25);-  const SWord32 s2000 = (s1409 >> 18) | (s1409 << 14);-  const SWord32 s2001 = s1999 ^ s2000;-  const SWord32 s2002 = s1409 >> 3;-  const SWord32 s2003 = s2001 ^ s2002;-  const SWord32 s2004 = s1998 + s2003;-  const SWord32 s2005 = s1381 + s2004;-  const SWord32 s2006 = s1992 + s2005;-  const SWord32 s2007 = s1957 + s2006;-  const SWord32 s2008 = (s2007 >> 6) | (s2007 << 26);-  const SWord32 s2009 = (s2007 >> 11) | (s2007 << 21);-  const SWord32 s2010 = s2008 ^ s2009;-  const SWord32 s2011 = (s2007 >> 25) | (s2007 << 7);-  const SWord32 s2012 = s2010 ^ s2011;-  const SWord32 s2013 = s1890 + s2012;-  const SWord32 s2014 = s1946 & s2007;-  const SWord32 s2015 = ~s2007;-  const SWord32 s2016 = s1918 & s2015;-  const SWord32 s2017 = s2014 ^ s2016;-  const SWord32 s2018 = s2013 + s2017;-  const SWord32 s2020 = s2018 + 0x4ed8aa4aUL;-  const SWord32 s2021 = (s1944 >> 17) | (s1944 << 15);-  const SWord32 s2022 = (s1944 >> 19) | (s1944 << 13);-  const SWord32 s2023 = s2021 ^ s2022;-  const SWord32 s2024 = s1944 >> 10;-  const SWord32 s2025 = s2023 ^ s2024;-  const SWord32 s2026 = s1749 + s2025;-  const SWord32 s2027 = (s1437 >> 7) | (s1437 << 25);-  const SWord32 s2028 = (s1437 >> 18) | (s1437 << 14);-  const SWord32 s2029 = s2027 ^ s2028;-  const SWord32 s2030 = s1437 >> 3;-  const SWord32 s2031 = s2029 ^ s2030;-  const SWord32 s2032 = s2026 + s2031;-  const SWord32 s2033 = s1409 + s2032;-  const SWord32 s2034 = s2020 + s2033;-  const SWord32 s2035 = s1968 + s2034;-  const SWord32 s2036 = (s2035 >> 6) | (s2035 << 26);-  const SWord32 s2037 = (s2035 >> 11) | (s2035 << 21);-  const SWord32 s2038 = s2036 ^ s2037;-  const SWord32 s2039 = (s2035 >> 25) | (s2035 << 7);-  const SWord32 s2040 = s2038 ^ s2039;-  const SWord32 s2041 = s1918 + s2040;-  const SWord32 s2042 = s2007 & s2035;-  const SWord32 s2043 = ~s2035;-  const SWord32 s2044 = s1946 & s2043;-  const SWord32 s2045 = s2042 ^ s2044;-  const SWord32 s2046 = s2041 + s2045;-  const SWord32 s2048 = s2046 + 0x5b9cca4fUL;-  const SWord32 s2049 = (s2005 >> 17) | (s2005 << 15);-  const SWord32 s2050 = (s2005 >> 19) | (s2005 << 13);-  const SWord32 s2051 = s2049 ^ s2050;-  const SWord32 s2052 = s2005 >> 10;-  const SWord32 s2053 = s2051 ^ s2052;-  const SWord32 s2054 = s1777 + s2053;-  const SWord32 s2055 = (s1465 >> 7) | (s1465 << 25);-  const SWord32 s2056 = (s1465 >> 18) | (s1465 << 14);-  const SWord32 s2057 = s2055 ^ s2056;-  const SWord32 s2058 = s1465 >> 3;-  const SWord32 s2059 = s2057 ^ s2058;-  const SWord32 s2060 = s2054 + s2059;-  const SWord32 s2061 = s1437 + s2060;-  const SWord32 s2062 = s2048 + s2061;-  const SWord32 s2063 = s1979 + s2062;-  const SWord32 s2064 = (s2063 >> 6) | (s2063 << 26);-  const SWord32 s2065 = (s2063 >> 11) | (s2063 << 21);-  const SWord32 s2066 = s2064 ^ s2065;-  const SWord32 s2067 = (s2063 >> 25) | (s2063 << 7);-  const SWord32 s2068 = s2066 ^ s2067;-  const SWord32 s2069 = s1946 + s2068;-  const SWord32 s2070 = s2035 & s2063;-  const SWord32 s2071 = ~s2063;-  const SWord32 s2072 = s2007 & s2071;-  const SWord32 s2073 = s2070 ^ s2072;-  const SWord32 s2074 = s2069 + s2073;-  const SWord32 s2076 = s2074 + 0x682e6ff3UL;-  const SWord32 s2077 = (s2033 >> 17) | (s2033 << 15);-  const SWord32 s2078 = (s2033 >> 19) | (s2033 << 13);-  const SWord32 s2079 = s2077 ^ s2078;-  const SWord32 s2080 = s2033 >> 10;-  const SWord32 s2081 = s2079 ^ s2080;-  const SWord32 s2082 = s1860 + s2081;-  const SWord32 s2083 = (s1548 >> 7) | (s1548 << 25);-  const SWord32 s2084 = (s1548 >> 18) | (s1548 << 14);-  const SWord32 s2085 = s2083 ^ s2084;-  const SWord32 s2086 = s1548 >> 3;-  const SWord32 s2087 = s2085 ^ s2086;-  const SWord32 s2088 = s2082 + s2087;-  const SWord32 s2089 = s1465 + s2088;-  const SWord32 s2090 = s2076 + s2089;-  const SWord32 s2091 = (s1979 >> 2) | (s1979 << 30);-  const SWord32 s2092 = (s1979 >> 13) | (s1979 << 19);-  const SWord32 s2093 = s2091 ^ s2092;-  const SWord32 s2094 = (s1979 >> 22) | (s1979 << 10);-  const SWord32 s2095 = s2093 ^ s2094;-  const SWord32 s2096 = s1968 & s1979;-  const SWord32 s2097 = s1957 & s1979;-  const SWord32 s2098 = s2096 ^ s2097;-  const SWord32 s2099 = s1974 ^ s2098;-  const SWord32 s2100 = s2095 + s2099;-  const SWord32 s2101 = s1945 + s2100;-  const SWord32 s2102 = (s2101 >> 2) | (s2101 << 30);-  const SWord32 s2103 = (s2101 >> 13) | (s2101 << 19);-  const SWord32 s2104 = s2102 ^ s2103;-  const SWord32 s2105 = (s2101 >> 22) | (s2101 << 10);-  const SWord32 s2106 = s2104 ^ s2105;-  const SWord32 s2107 = s1979 & s2101;-  const SWord32 s2108 = s1968 & s2101;-  const SWord32 s2109 = s2107 ^ s2108;-  const SWord32 s2110 = s2096 ^ s2109;-  const SWord32 s2111 = s2106 + s2110;-  const SWord32 s2112 = s2006 + s2111;-  const SWord32 s2113 = (s2112 >> 2) | (s2112 << 30);-  const SWord32 s2114 = (s2112 >> 13) | (s2112 << 19);-  const SWord32 s2115 = s2113 ^ s2114;-  const SWord32 s2116 = (s2112 >> 22) | (s2112 << 10);-  const SWord32 s2117 = s2115 ^ s2116;-  const SWord32 s2118 = s2101 & s2112;-  const SWord32 s2119 = s1979 & s2112;-  const SWord32 s2120 = s2118 ^ s2119;-  const SWord32 s2121 = s2107 ^ s2120;-  const SWord32 s2122 = s2117 + s2121;-  const SWord32 s2123 = s2034 + s2122;-  const SWord32 s2124 = (s2123 >> 2) | (s2123 << 30);-  const SWord32 s2125 = (s2123 >> 13) | (s2123 << 19);-  const SWord32 s2126 = s2124 ^ s2125;-  const SWord32 s2127 = (s2123 >> 22) | (s2123 << 10);-  const SWord32 s2128 = s2126 ^ s2127;-  const SWord32 s2129 = s2112 & s2123;-  const SWord32 s2130 = s2101 & s2123;-  const SWord32 s2131 = s2129 ^ s2130;-  const SWord32 s2132 = s2118 ^ s2131;-  const SWord32 s2133 = s2128 + s2132;-  const SWord32 s2134 = s2062 + s2133;-  const SWord32 s2135 = (s2134 >> 2) | (s2134 << 30);-  const SWord32 s2136 = (s2134 >> 13) | (s2134 << 19);-  const SWord32 s2137 = s2135 ^ s2136;-  const SWord32 s2138 = (s2134 >> 22) | (s2134 << 10);-  const SWord32 s2139 = s2137 ^ s2138;-  const SWord32 s2140 = s2123 & s2134;-  const SWord32 s2141 = s2112 & s2134;-  const SWord32 s2142 = s2140 ^ s2141;-  const SWord32 s2143 = s2129 ^ s2142;-  const SWord32 s2144 = s2139 + s2143;-  const SWord32 s2145 = s2090 + s2144;-  const SWord32 s2146 = s2090 + s2101;-  const SWord32 s2147 = (s2146 >> 6) | (s2146 << 26);-  const SWord32 s2148 = (s2146 >> 11) | (s2146 << 21);-  const SWord32 s2149 = s2147 ^ s2148;-  const SWord32 s2150 = (s2146 >> 25) | (s2146 << 7);-  const SWord32 s2151 = s2149 ^ s2150;-  const SWord32 s2152 = s2007 + s2151;-  const SWord32 s2153 = s2063 & s2146;-  const SWord32 s2154 = ~s2146;-  const SWord32 s2155 = s2035 & s2154;-  const SWord32 s2156 = s2153 ^ s2155;-  const SWord32 s2157 = s2152 + s2156;-  const SWord32 s2159 = s2157 + 0x748f82eeUL;-  const SWord32 s2160 = (s2061 >> 17) | (s2061 << 15);-  const SWord32 s2161 = (s2061 >> 19) | (s2061 << 13);-  const SWord32 s2162 = s2160 ^ s2161;-  const SWord32 s2163 = s2061 >> 10;-  const SWord32 s2164 = s2162 ^ s2163;-  const SWord32 s2165 = s1888 + s2164;-  const SWord32 s2166 = (s1576 >> 7) | (s1576 << 25);-  const SWord32 s2167 = (s1576 >> 18) | (s1576 << 14);-  const SWord32 s2168 = s2166 ^ s2167;-  const SWord32 s2169 = s1576 >> 3;-  const SWord32 s2170 = s2168 ^ s2169;-  const SWord32 s2171 = s2165 + s2170;-  const SWord32 s2172 = s1548 + s2171;-  const SWord32 s2173 = s2159 + s2172;-  const SWord32 s2174 = s2112 + s2173;-  const SWord32 s2175 = (s2174 >> 6) | (s2174 << 26);-  const SWord32 s2176 = (s2174 >> 11) | (s2174 << 21);-  const SWord32 s2177 = s2175 ^ s2176;-  const SWord32 s2178 = (s2174 >> 25) | (s2174 << 7);-  const SWord32 s2179 = s2177 ^ s2178;-  const SWord32 s2180 = s2035 + s2179;-  const SWord32 s2181 = s2146 & s2174;-  const SWord32 s2182 = ~s2174;-  const SWord32 s2183 = s2063 & s2182;-  const SWord32 s2184 = s2181 ^ s2183;-  const SWord32 s2185 = s2180 + s2184;-  const SWord32 s2187 = s2185 + 0x78a5636fUL;-  const SWord32 s2188 = (s2089 >> 17) | (s2089 << 15);-  const SWord32 s2189 = (s2089 >> 19) | (s2089 << 13);-  const SWord32 s2190 = s2188 ^ s2189;-  const SWord32 s2191 = s2089 >> 10;-  const SWord32 s2192 = s2190 ^ s2191;-  const SWord32 s2193 = s1916 + s2192;-  const SWord32 s2194 = (s1604 >> 7) | (s1604 << 25);-  const SWord32 s2195 = (s1604 >> 18) | (s1604 << 14);-  const SWord32 s2196 = s2194 ^ s2195;-  const SWord32 s2197 = s1604 >> 3;-  const SWord32 s2198 = s2196 ^ s2197;-  const SWord32 s2199 = s2193 + s2198;-  const SWord32 s2200 = s1576 + s2199;-  const SWord32 s2201 = s2187 + s2200;-  const SWord32 s2202 = s2123 + s2201;-  const SWord32 s2203 = (s2202 >> 6) | (s2202 << 26);-  const SWord32 s2204 = (s2202 >> 11) | (s2202 << 21);-  const SWord32 s2205 = s2203 ^ s2204;-  const SWord32 s2206 = (s2202 >> 25) | (s2202 << 7);-  const SWord32 s2207 = s2205 ^ s2206;-  const SWord32 s2208 = s2063 + s2207;-  const SWord32 s2209 = s2174 & s2202;-  const SWord32 s2210 = ~s2202;-  const SWord32 s2211 = s2146 & s2210;-  const SWord32 s2212 = s2209 ^ s2211;-  const SWord32 s2213 = s2208 + s2212;-  const SWord32 s2215 = s2213 + 0x84c87814UL;-  const SWord32 s2216 = (s2172 >> 17) | (s2172 << 15);-  const SWord32 s2217 = (s2172 >> 19) | (s2172 << 13);-  const SWord32 s2218 = s2216 ^ s2217;-  const SWord32 s2219 = s2172 >> 10;-  const SWord32 s2220 = s2218 ^ s2219;-  const SWord32 s2221 = s1944 + s2220;-  const SWord32 s2222 = (s1632 >> 7) | (s1632 << 25);-  const SWord32 s2223 = (s1632 >> 18) | (s1632 << 14);-  const SWord32 s2224 = s2222 ^ s2223;-  const SWord32 s2225 = s1632 >> 3;-  const SWord32 s2226 = s2224 ^ s2225;-  const SWord32 s2227 = s2221 + s2226;-  const SWord32 s2228 = s1604 + s2227;-  const SWord32 s2229 = s2215 + s2228;-  const SWord32 s2230 = s2134 + s2229;-  const SWord32 s2231 = (s2230 >> 6) | (s2230 << 26);-  const SWord32 s2232 = (s2230 >> 11) | (s2230 << 21);-  const SWord32 s2233 = s2231 ^ s2232;-  const SWord32 s2234 = (s2230 >> 25) | (s2230 << 7);-  const SWord32 s2235 = s2233 ^ s2234;-  const SWord32 s2236 = s2146 + s2235;-  const SWord32 s2237 = s2202 & s2230;-  const SWord32 s2238 = ~s2230;-  const SWord32 s2239 = s2174 & s2238;-  const SWord32 s2240 = s2237 ^ s2239;-  const SWord32 s2241 = s2236 + s2240;-  const SWord32 s2243 = s2241 + 0x8cc70208UL;-  const SWord32 s2244 = (s2200 >> 17) | (s2200 << 15);-  const SWord32 s2245 = (s2200 >> 19) | (s2200 << 13);-  const SWord32 s2246 = s2244 ^ s2245;-  const SWord32 s2247 = s2200 >> 10;-  const SWord32 s2248 = s2246 ^ s2247;-  const SWord32 s2249 = s2005 + s2248;-  const SWord32 s2250 = (s1693 >> 7) | (s1693 << 25);-  const SWord32 s2251 = (s1693 >> 18) | (s1693 << 14);-  const SWord32 s2252 = s2250 ^ s2251;-  const SWord32 s2253 = s1693 >> 3;-  const SWord32 s2254 = s2252 ^ s2253;-  const SWord32 s2255 = s2249 + s2254;-  const SWord32 s2256 = s1632 + s2255;-  const SWord32 s2257 = s2243 + s2256;-  const SWord32 s2258 = s2145 + s2257;-  const SWord32 s2259 = (s2145 >> 2) | (s2145 << 30);-  const SWord32 s2260 = (s2145 >> 13) | (s2145 << 19);-  const SWord32 s2261 = s2259 ^ s2260;-  const SWord32 s2262 = (s2145 >> 22) | (s2145 << 10);-  const SWord32 s2263 = s2261 ^ s2262;-  const SWord32 s2264 = s2134 & s2145;-  const SWord32 s2265 = s2123 & s2145;-  const SWord32 s2266 = s2264 ^ s2265;-  const SWord32 s2267 = s2140 ^ s2266;-  const SWord32 s2268 = s2263 + s2267;-  const SWord32 s2269 = s2173 + s2268;-  const SWord32 s2270 = (s2269 >> 2) | (s2269 << 30);-  const SWord32 s2271 = (s2269 >> 13) | (s2269 << 19);-  const SWord32 s2272 = s2270 ^ s2271;-  const SWord32 s2273 = (s2269 >> 22) | (s2269 << 10);-  const SWord32 s2274 = s2272 ^ s2273;-  const SWord32 s2275 = s2145 & s2269;-  const SWord32 s2276 = s2134 & s2269;-  const SWord32 s2277 = s2275 ^ s2276;-  const SWord32 s2278 = s2264 ^ s2277;-  const SWord32 s2279 = s2274 + s2278;-  const SWord32 s2280 = s2201 + s2279;-  const SWord32 s2281 = (s2280 >> 2) | (s2280 << 30);-  const SWord32 s2282 = (s2280 >> 13) | (s2280 << 19);-  const SWord32 s2283 = s2281 ^ s2282;-  const SWord32 s2284 = (s2280 >> 22) | (s2280 << 10);-  const SWord32 s2285 = s2283 ^ s2284;-  const SWord32 s2286 = s2269 & s2280;-  const SWord32 s2287 = s2145 & s2280;-  const SWord32 s2288 = s2286 ^ s2287;-  const SWord32 s2289 = s2275 ^ s2288;-  const SWord32 s2290 = s2285 + s2289;-  const SWord32 s2291 = s2229 + s2290;-  const SWord32 s2292 = (s2258 >> 6) | (s2258 << 26);-  const SWord32 s2293 = (s2258 >> 11) | (s2258 << 21);-  const SWord32 s2294 = s2292 ^ s2293;-  const SWord32 s2295 = (s2258 >> 25) | (s2258 << 7);-  const SWord32 s2296 = s2294 ^ s2295;-  const SWord32 s2297 = s2174 + s2296;-  const SWord32 s2298 = s2230 & s2258;-  const SWord32 s2299 = ~s2258;-  const SWord32 s2300 = s2202 & s2299;-  const SWord32 s2301 = s2298 ^ s2300;-  const SWord32 s2302 = s2297 + s2301;-  const SWord32 s2304 = s2302 + 0x90befffaUL;-  const SWord32 s2305 = (s2228 >> 17) | (s2228 << 15);-  const SWord32 s2306 = (s2228 >> 19) | (s2228 << 13);-  const SWord32 s2307 = s2305 ^ s2306;-  const SWord32 s2308 = s2228 >> 10;-  const SWord32 s2309 = s2307 ^ s2308;-  const SWord32 s2310 = s2033 + s2309;-  const SWord32 s2311 = (s1721 >> 7) | (s1721 << 25);-  const SWord32 s2312 = (s1721 >> 18) | (s1721 << 14);-  const SWord32 s2313 = s2311 ^ s2312;-  const SWord32 s2314 = s1721 >> 3;-  const SWord32 s2315 = s2313 ^ s2314;-  const SWord32 s2316 = s2310 + s2315;-  const SWord32 s2317 = s1693 + s2316;-  const SWord32 s2318 = s2304 + s2317;-  const SWord32 s2319 = s2269 + s2318;-  const SWord32 s2320 = (s2319 >> 6) | (s2319 << 26);-  const SWord32 s2321 = (s2319 >> 11) | (s2319 << 21);-  const SWord32 s2322 = s2320 ^ s2321;-  const SWord32 s2323 = (s2319 >> 25) | (s2319 << 7);-  const SWord32 s2324 = s2322 ^ s2323;-  const SWord32 s2325 = s2202 + s2324;-  const SWord32 s2326 = s2258 & s2319;-  const SWord32 s2327 = ~s2319;-  const SWord32 s2328 = s2230 & s2327;-  const SWord32 s2329 = s2326 ^ s2328;-  const SWord32 s2330 = s2325 + s2329;-  const SWord32 s2332 = s2330 + 0xa4506cebUL;-  const SWord32 s2333 = (s2256 >> 17) | (s2256 << 15);-  const SWord32 s2334 = (s2256 >> 19) | (s2256 << 13);-  const SWord32 s2335 = s2333 ^ s2334;-  const SWord32 s2336 = s2256 >> 10;-  const SWord32 s2337 = s2335 ^ s2336;-  const SWord32 s2338 = s2061 + s2337;-  const SWord32 s2339 = (s1749 >> 7) | (s1749 << 25);-  const SWord32 s2340 = (s1749 >> 18) | (s1749 << 14);-  const SWord32 s2341 = s2339 ^ s2340;-  const SWord32 s2342 = s1749 >> 3;-  const SWord32 s2343 = s2341 ^ s2342;-  const SWord32 s2344 = s2338 + s2343;-  const SWord32 s2345 = s1721 + s2344;-  const SWord32 s2346 = s2332 + s2345;-  const SWord32 s2347 = s2280 + s2346;-  const SWord32 s2348 = (s2347 >> 6) | (s2347 << 26);-  const SWord32 s2349 = (s2347 >> 11) | (s2347 << 21);-  const SWord32 s2350 = s2348 ^ s2349;-  const SWord32 s2351 = (s2347 >> 25) | (s2347 << 7);-  const SWord32 s2352 = s2350 ^ s2351;-  const SWord32 s2353 = s2230 + s2352;-  const SWord32 s2354 = s2319 & s2347;-  const SWord32 s2355 = ~s2347;-  const SWord32 s2356 = s2258 & s2355;-  const SWord32 s2357 = s2354 ^ s2356;-  const SWord32 s2358 = s2353 + s2357;-  const SWord32 s2360 = s2358 + 0xbef9a3f7UL;-  const SWord32 s2361 = (s2317 >> 17) | (s2317 << 15);-  const SWord32 s2362 = (s2317 >> 19) | (s2317 << 13);-  const SWord32 s2363 = s2361 ^ s2362;-  const SWord32 s2364 = s2317 >> 10;-  const SWord32 s2365 = s2363 ^ s2364;-  const SWord32 s2366 = s2089 + s2365;-  const SWord32 s2367 = (s1777 >> 7) | (s1777 << 25);-  const SWord32 s2368 = (s1777 >> 18) | (s1777 << 14);-  const SWord32 s2369 = s2367 ^ s2368;-  const SWord32 s2370 = s1777 >> 3;-  const SWord32 s2371 = s2369 ^ s2370;-  const SWord32 s2372 = s2366 + s2371;-  const SWord32 s2373 = s1749 + s2372;-  const SWord32 s2374 = s2360 + s2373;-  const SWord32 s2375 = s2291 + s2374;-  const SWord32 s2376 = (s2375 >> 6) | (s2375 << 26);-  const SWord32 s2377 = (s2375 >> 11) | (s2375 << 21);-  const SWord32 s2378 = s2376 ^ s2377;-  const SWord32 s2379 = (s2375 >> 25) | (s2375 << 7);-  const SWord32 s2380 = s2378 ^ s2379;-  const SWord32 s2381 = s2258 + s2380;-  const SWord32 s2382 = s2347 & s2375;-  const SWord32 s2383 = ~s2375;-  const SWord32 s2384 = s2319 & s2383;-  const SWord32 s2385 = s2382 ^ s2384;-  const SWord32 s2386 = s2381 + s2385;-  const SWord32 s2388 = s2386 + 0xc67178f2UL;-  const SWord32 s2389 = (s2345 >> 17) | (s2345 << 15);-  const SWord32 s2390 = (s2345 >> 19) | (s2345 << 13);-  const SWord32 s2391 = s2389 ^ s2390;-  const SWord32 s2392 = s2345 >> 10;-  const SWord32 s2393 = s2391 ^ s2392;-  const SWord32 s2394 = s2172 + s2393;-  const SWord32 s2395 = (s1860 >> 7) | (s1860 << 25);-  const SWord32 s2396 = (s1860 >> 18) | (s1860 << 14);-  const SWord32 s2397 = s2395 ^ s2396;-  const SWord32 s2398 = s1860 >> 3;-  const SWord32 s2399 = s2397 ^ s2398;-  const SWord32 s2400 = s2394 + s2399;-  const SWord32 s2401 = s1777 + s2400;-  const SWord32 s2402 = s2388 + s2401;-  const SWord32 s2403 = (s2291 >> 2) | (s2291 << 30);-  const SWord32 s2404 = (s2291 >> 13) | (s2291 << 19);-  const SWord32 s2405 = s2403 ^ s2404;-  const SWord32 s2406 = (s2291 >> 22) | (s2291 << 10);-  const SWord32 s2407 = s2405 ^ s2406;-  const SWord32 s2408 = s2280 & s2291;-  const SWord32 s2409 = s2269 & s2291;-  const SWord32 s2410 = s2408 ^ s2409;-  const SWord32 s2411 = s2286 ^ s2410;-  const SWord32 s2412 = s2407 + s2411;-  const SWord32 s2413 = s2257 + s2412;-  const SWord32 s2414 = (s2413 >> 2) | (s2413 << 30);-  const SWord32 s2415 = (s2413 >> 13) | (s2413 << 19);-  const SWord32 s2416 = s2414 ^ s2415;-  const SWord32 s2417 = (s2413 >> 22) | (s2413 << 10);-  const SWord32 s2418 = s2416 ^ s2417;-  const SWord32 s2419 = s2291 & s2413;-  const SWord32 s2420 = s2280 & s2413;-  const SWord32 s2421 = s2419 ^ s2420;-  const SWord32 s2422 = s2408 ^ s2421;-  const SWord32 s2423 = s2418 + s2422;-  const SWord32 s2424 = s2318 + s2423;-  const SWord32 s2425 = (s2424 >> 2) | (s2424 << 30);-  const SWord32 s2426 = (s2424 >> 13) | (s2424 << 19);-  const SWord32 s2427 = s2425 ^ s2426;-  const SWord32 s2428 = (s2424 >> 22) | (s2424 << 10);-  const SWord32 s2429 = s2427 ^ s2428;-  const SWord32 s2430 = s2413 & s2424;-  const SWord32 s2431 = s2291 & s2424;-  const SWord32 s2432 = s2430 ^ s2431;-  const SWord32 s2433 = s2419 ^ s2432;-  const SWord32 s2434 = s2429 + s2433;-  const SWord32 s2435 = s2346 + s2434;-  const SWord32 s2436 = (s2435 >> 2) | (s2435 << 30);-  const SWord32 s2437 = (s2435 >> 13) | (s2435 << 19);-  const SWord32 s2438 = s2436 ^ s2437;-  const SWord32 s2439 = (s2435 >> 22) | (s2435 << 10);-  const SWord32 s2440 = s2438 ^ s2439;-  const SWord32 s2441 = s2424 & s2435;-  const SWord32 s2442 = s2413 & s2435;-  const SWord32 s2443 = s2441 ^ s2442;-  const SWord32 s2444 = s2430 ^ s2443;-  const SWord32 s2445 = s2440 + s2444;-  const SWord32 s2446 = s2374 + s2445;-  const SWord32 s2447 = (s2446 >> 2) | (s2446 << 30);-  const SWord32 s2448 = (s2446 >> 13) | (s2446 << 19);-  const SWord32 s2449 = s2447 ^ s2448;-  const SWord32 s2450 = (s2446 >> 22) | (s2446 << 10);-  const SWord32 s2451 = s2449 ^ s2450;-  const SWord32 s2452 = s2435 & s2446;-  const SWord32 s2453 = s2424 & s2446;-  const SWord32 s2454 = s2452 ^ s2453;-  const SWord32 s2455 = s2441 ^ s2454;-  const SWord32 s2456 = s2451 + s2455;-  const SWord32 s2457 = s2402 + s2456;-  const SWord32 s2458 = s98 + s2457;-  const SWord8  s2459 = (SWord8) (s2458 >> 24);-  const SWord8  s2460 = (SWord8) (s2458 >> 16);-  const SWord8  s2461 = (SWord8) (s2458 >> 8);-  const SWord8  s2462 = (SWord8) s2458;-  const SWord32 s2463 = s104 + s2446;-  const SWord8  s2464 = (SWord8) (s2463 >> 24);-  const SWord8  s2465 = (SWord8) (s2463 >> 16);-  const SWord8  s2466 = (SWord8) (s2463 >> 8);-  const SWord8  s2467 = (SWord8) s2463;-  const SWord32 s2468 = s110 + s2435;-  const SWord8  s2469 = (SWord8) (s2468 >> 24);-  const SWord8  s2470 = (SWord8) (s2468 >> 16);-  const SWord8  s2471 = (SWord8) (s2468 >> 8);-  const SWord8  s2472 = (SWord8) s2468;-  const SWord32 s2473 = s116 + s2424;-  const SWord8  s2474 = (SWord8) (s2473 >> 24);-  const SWord8  s2475 = (SWord8) (s2473 >> 16);-  const SWord8  s2476 = (SWord8) (s2473 >> 8);-  const SWord8  s2477 = (SWord8) s2473;-  const SWord32 s2478 = s2402 + s2413;-  const SWord32 s2479 = s101 + s2478;-  const SWord8  s2480 = (SWord8) (s2479 >> 24);-  const SWord8  s2481 = (SWord8) (s2479 >> 16);-  const SWord8  s2482 = (SWord8) (s2479 >> 8);-  const SWord8  s2483 = (SWord8) s2479;-  const SWord32 s2484 = s107 + s2375;-  const SWord8  s2485 = (SWord8) (s2484 >> 24);-  const SWord8  s2486 = (SWord8) (s2484 >> 16);-  const SWord8  s2487 = (SWord8) (s2484 >> 8);-  const SWord8  s2488 = (SWord8) s2484;-  const SWord32 s2489 = s113 + s2347;-  const SWord8  s2490 = (SWord8) (s2489 >> 24);-  const SWord8  s2491 = (SWord8) (s2489 >> 16);-  const SWord8  s2492 = (SWord8) (s2489 >> 8);-  const SWord8  s2493 = (SWord8) s2489;-  const SWord32 s2494 = s119 + s2319;-  const SWord8  s2495 = (SWord8) (s2494 >> 24);-  const SWord8  s2496 = (SWord8) (s2494 >> 16);-  const SWord8  s2497 = (SWord8) (s2494 >> 8);-  const SWord8  s2498 = (SWord8) s2494;--  hash[0] = s2459;-  hash[1] = s2460;-  hash[2] = s2461;-  hash[3] = s2462;-  hash[4] = s2464;-  hash[5] = s2465;-  hash[6] = s2466;-  hash[7] = s2467;-  hash[8] = s2469;-  hash[9] = s2470;-  hash[10] = s2471;-  hash[11] = s2472;-  hash[12] = s2474;-  hash[13] = s2475;-  hash[14] = s2476;-  hash[15] = s2477;-  hash[16] = s2480;-  hash[17] = s2481;-  hash[18] = s2482;-  hash[19] = s2483;-  hash[20] = s2485;-  hash[21] = s2486;-  hash[22] = s2487;-  hash[23] = s2488;-  hash[24] = s2490;-  hash[25] = s2491;-  hash[26] = s2492;-  hash[27] = s2493;-  hash[28] = s2495;-  hash[29] = s2496;-  hash[30] = s2497;-  hash[31] = s2498;+sha256HashBlock_driver.o: sha256HashBlock_driver.c sha256HashBlock.h+	${CC} ${CCFLAGS} -c $< -o $@++sha256HashBlock_driver: sha256HashBlock.o sha256HashBlock_driver.o+	${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS}++clean:+	rm -f *.o++veryclean: clean+	rm -f sha256HashBlock_driver+== END: "Makefile" ==================+== BEGIN: "sha256HashBlock.h" ================+/* Header file for sha256HashBlock. Automatically generated by SBV. Do not edit! */++#ifndef SBV_GENERATED_sha256HashBlock_HEADER_INCLUDED+#define SBV_GENERATED_sha256HashBlock_HEADER_INCLUDED+++#include <stdio.h>+#include <stdlib.h>+#include <inttypes.h>+#include <stdint.h>+#include <stdbool.h>+#include <string.h>+#include <math.h>++/* Floating-point calling convention:+ * Enter generated code in FE_TONEAREST (round-to-nearest, ties-to-even).+ * Callbacks must preserve this mode before returning or re-entering.+ * Generated code does not check or change the hardware rounding mode.+ * Custom builds must disable implicit FP contraction, including at LTO link time.+ */++/* The boolean type */+typedef bool SBool;++/* The float type */+typedef float SFloat;++/* The double type */+typedef double SDouble;++/* Unsigned bit-vectors */+typedef uint8_t  SWord8;+typedef uint16_t SWord16;+typedef uint32_t SWord32;+typedef uint64_t SWord64;++/* Signed bit-vectors */+typedef int8_t  SInt8;+typedef int16_t SInt16;+typedef int32_t SInt32;+typedef int64_t SInt64;++/* Entry point prototype: */+void sha256HashBlock(const SWord8 *hIn, const SWord8 *block,+                     SWord8 *hash);++#endif /* SBV_GENERATED_sha256HashBlock_HEADER_INCLUDED */+== END: "sha256HashBlock.h" ==================+== BEGIN: "sha256HashBlock_driver.c" ================+/* Example driver program for sha256HashBlock. */+/* Automatically generated by SBV. Edit as you see fit! */++#include <stdio.h>+#include "sha256HashBlock.h"++int main(void)+{+  const SWord8 sbv_driver_input_0[32] = {+      0x6a, 0x09, 0xe6, 0x67, 0xbb, 0x67, 0xae, 0x85, 0x3c, 0x6e, 0xf3,+      0x72, 0xa5, 0x4f, 0xf5, 0x3a, 0x51, 0x0e, 0x52, 0x7f, 0x9b, 0x05,+      0x68, 0x8c, 0x1f, 0x83, 0xd9, 0xab, 0x5b, 0xe0, 0xcd, 0x19+  };++  printf("Contents of input array hIn:\n");+  int sbv_driver_input_0_ctr;+  for(sbv_driver_input_0_ctr = 0; sbv_driver_input_0_ctr < 32 ; ++sbv_driver_input_0_ctr)+  { printf("  hIn[%2d] = ", sbv_driver_input_0_ctr);+    printf("0x%02"PRIx8"", sbv_driver_input_0[sbv_driver_input_0_ctr]);+    printf("\n");+  }++  const SWord8 sbv_driver_input_1[64] = {+      0x53, 0x42, 0x56, 0x20, 0x67, 0x6f, 0x65, 0x73, 0x20, 0x53, 0x48,+      0x41, 0x32, 0x35, 0x36, 0x21, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88+  };++  printf("Contents of input array block:\n");+  int sbv_driver_input_1_ctr;+  for(sbv_driver_input_1_ctr = 0; sbv_driver_input_1_ctr < 64 ; ++sbv_driver_input_1_ctr)+  { printf("  block[%2d] = ", sbv_driver_input_1_ctr);+    printf("0x%02"PRIx8"", sbv_driver_input_1[sbv_driver_input_1_ctr]);+    printf("\n");+  }++  SWord8 sbv_driver_output_0[32];++  sha256HashBlock(sbv_driver_input_0, sbv_driver_input_1,+                  sbv_driver_output_0);++  printf("sha256HashBlock(hIn, block, hash) ->\n");+  int sbv_driver_output_0_ctr;+  for(sbv_driver_output_0_ctr = 0; sbv_driver_output_0_ctr < 32 ; ++sbv_driver_output_0_ctr)+  { printf("  hash[%2d] = ", sbv_driver_output_0_ctr);+    printf("0x%02"PRIx8"", sbv_driver_output_0[sbv_driver_output_0_ctr]);+    printf("\n");+  }++  return 0;+}+== END: "sha256HashBlock_driver.c" ==================+== BEGIN: "sha256HashBlock.c" ================+/* File: "sha256HashBlock.c". Automatically generated by SBV. Do not edit! */++#include "sha256HashBlock.h"++/* Exact bit-vector runtime. All arithmetic is modulo the declared width. */+#ifndef SBV_CGEN_UNUSED+#if defined(__GNUC__) || defined(__clang__)+#define SBV_CGEN_UNUSED __attribute__((unused))+#else+#define SBV_CGEN_UNUSED+#endif+#endif++static inline SBV_CGEN_UNUSED SWord16 sbv_bv_join_u8_u8_u16(SWord8 high, SWord8 low)+{+  SWord16 r = (SWord16) 0; uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 8; ++i) { r = (SWord16) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 8))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_join_u16_u16_u32(SWord16 high, SWord16 low)+{+  SWord32 r = (SWord32) 0; uint64_t i;+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) low) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  for (i = 0; i < 16; ++i) { r = (SWord32) ((uint64_t) r | ((uint64_t) (((((uint64_t) high) >> (i)) & UINT64_C(1)) != 0) << (i + 16))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotl(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) << amount) | (((uint64_t) (SWord32) a) >> (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_rotr(SWord32 a, uint64_t amount)+{+  amount %= 32;+  if (amount == 0) return a;+  return (SWord32) ((((uint64_t) (SWord32) a) >> amount) | (((uint64_t) (SWord32) a) << (32 - amount)));+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_add(SWord32 a, SWord32 b)+{+  const SWord32 bits = (SWord32) ((((uint64_t) (SWord32) a) + ((uint64_t) (SWord32) b)) & UINT64_C(0x00000000ffffffff));+  return (SWord32) bits;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_shl(SWord32 a, SWord32 amount)+{+  const uint64_t n = (uint64_t) (SWord32) amount;+  const SWord32 result = n >= 32 ? (SWord32) 0 : (SWord32) ((uint64_t) (SWord32) a << n);+  return result;+}++static inline SBV_CGEN_UNUSED SWord32 sbv_bv_u32_lshr(SWord32 a, SWord32 amount)+{+  const uint64_t n = (uint64_t) (SWord32) amount;+  return n >= 32 ? (SWord32) 0 : (SWord32) ((uint64_t) (SWord32) a >> n);+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_31_24_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 24)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_23_16_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 16)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_15_8_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i + 8)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}++static inline SBV_CGEN_UNUSED SWord8 sbv_bv_extract_u32_7_0_u8(SWord32 a)+{+  SWord8 r = (SWord8) 0;+  uint64_t i;+  for (i = 0; i < 8; ++i) { r = (SWord8) ((uint64_t) r | ((uint64_t) (((((uint64_t) a) >> (i)) & UINT64_C(1)) != 0) << (i))); }+  return r;+}+++void sha256HashBlock(const SWord8 *sbv_input_0,+                     const SWord8 *sbv_input_1, SWord8 *sbv_output_0)+{+  const SWord8  s0 = sbv_input_0[0];+  const SWord8  s1 = sbv_input_0[1];+  const SWord8  s2 = sbv_input_0[2];+  const SWord8  s3 = sbv_input_0[3];+  const SWord8  s4 = sbv_input_0[4];+  const SWord8  s5 = sbv_input_0[5];+  const SWord8  s6 = sbv_input_0[6];+  const SWord8  s7 = sbv_input_0[7];+  const SWord8  s8 = sbv_input_0[8];+  const SWord8  s9 = sbv_input_0[9];+  const SWord8  s10 = sbv_input_0[10];+  const SWord8  s11 = sbv_input_0[11];+  const SWord8  s12 = sbv_input_0[12];+  const SWord8  s13 = sbv_input_0[13];+  const SWord8  s14 = sbv_input_0[14];+  const SWord8  s15 = sbv_input_0[15];+  const SWord8  s16 = sbv_input_0[16];+  const SWord8  s17 = sbv_input_0[17];+  const SWord8  s18 = sbv_input_0[18];+  const SWord8  s19 = sbv_input_0[19];+  const SWord8  s20 = sbv_input_0[20];+  const SWord8  s21 = sbv_input_0[21];+  const SWord8  s22 = sbv_input_0[22];+  const SWord8  s23 = sbv_input_0[23];+  const SWord8  s24 = sbv_input_0[24];+  const SWord8  s25 = sbv_input_0[25];+  const SWord8  s26 = sbv_input_0[26];+  const SWord8  s27 = sbv_input_0[27];+  const SWord8  s28 = sbv_input_0[28];+  const SWord8  s29 = sbv_input_0[29];+  const SWord8  s30 = sbv_input_0[30];+  const SWord8  s31 = sbv_input_0[31];+  const SWord8  s32 = sbv_input_1[0];+  const SWord8  s33 = sbv_input_1[1];+  const SWord8  s34 = sbv_input_1[2];+  const SWord8  s35 = sbv_input_1[3];+  const SWord8  s36 = sbv_input_1[4];+  const SWord8  s37 = sbv_input_1[5];+  const SWord8  s38 = sbv_input_1[6];+  const SWord8  s39 = sbv_input_1[7];+  const SWord8  s40 = sbv_input_1[8];+  const SWord8  s41 = sbv_input_1[9];+  const SWord8  s42 = sbv_input_1[10];+  const SWord8  s43 = sbv_input_1[11];+  const SWord8  s44 = sbv_input_1[12];+  const SWord8  s45 = sbv_input_1[13];+  const SWord8  s46 = sbv_input_1[14];+  const SWord8  s47 = sbv_input_1[15];+  const SWord8  s48 = sbv_input_1[16];+  const SWord8  s49 = sbv_input_1[17];+  const SWord8  s50 = sbv_input_1[18];+  const SWord8  s51 = sbv_input_1[19];+  const SWord8  s52 = sbv_input_1[20];+  const SWord8  s53 = sbv_input_1[21];+  const SWord8  s54 = sbv_input_1[22];+  const SWord8  s55 = sbv_input_1[23];+  const SWord8  s56 = sbv_input_1[24];+  const SWord8  s57 = sbv_input_1[25];+  const SWord8  s58 = sbv_input_1[26];+  const SWord8  s59 = sbv_input_1[27];+  const SWord8  s60 = sbv_input_1[28];+  const SWord8  s61 = sbv_input_1[29];+  const SWord8  s62 = sbv_input_1[30];+  const SWord8  s63 = sbv_input_1[31];+  const SWord8  s64 = sbv_input_1[32];+  const SWord8  s65 = sbv_input_1[33];+  const SWord8  s66 = sbv_input_1[34];+  const SWord8  s67 = sbv_input_1[35];+  const SWord8  s68 = sbv_input_1[36];+  const SWord8  s69 = sbv_input_1[37];+  const SWord8  s70 = sbv_input_1[38];+  const SWord8  s71 = sbv_input_1[39];+  const SWord8  s72 = sbv_input_1[40];+  const SWord8  s73 = sbv_input_1[41];+  const SWord8  s74 = sbv_input_1[42];+  const SWord8  s75 = sbv_input_1[43];+  const SWord8  s76 = sbv_input_1[44];+  const SWord8  s77 = sbv_input_1[45];+  const SWord8  s78 = sbv_input_1[46];+  const SWord8  s79 = sbv_input_1[47];+  const SWord8  s80 = sbv_input_1[48];+  const SWord8  s81 = sbv_input_1[49];+  const SWord8  s82 = sbv_input_1[50];+  const SWord8  s83 = sbv_input_1[51];+  const SWord8  s84 = sbv_input_1[52];+  const SWord8  s85 = sbv_input_1[53];+  const SWord8  s86 = sbv_input_1[54];+  const SWord8  s87 = sbv_input_1[55];+  const SWord8  s88 = sbv_input_1[56];+  const SWord8  s89 = sbv_input_1[57];+  const SWord8  s90 = sbv_input_1[58];+  const SWord8  s91 = sbv_input_1[59];+  const SWord8  s92 = sbv_input_1[60];+  const SWord8  s93 = sbv_input_1[61];+  const SWord8  s94 = sbv_input_1[62];+  const SWord8  s95 = sbv_input_1[63];+  const SWord16 s96 = sbv_bv_join_u8_u8_u16(s0, s1);+  const SWord16 s97 = sbv_bv_join_u8_u8_u16(s2, s3);+  const SWord32 s98 = sbv_bv_join_u16_u16_u32(s96, s97);+  const SWord16 s99 = sbv_bv_join_u8_u8_u16(s16, s17);+  const SWord16 s100 = sbv_bv_join_u8_u8_u16(s18, s19);+  const SWord32 s101 = sbv_bv_join_u16_u16_u32(s99, s100);+  const SWord16 s102 = sbv_bv_join_u8_u8_u16(s4, s5);+  const SWord16 s103 = sbv_bv_join_u8_u8_u16(s6, s7);+  const SWord32 s104 = sbv_bv_join_u16_u16_u32(s102, s103);+  const SWord16 s105 = sbv_bv_join_u8_u8_u16(s20, s21);+  const SWord16 s106 = sbv_bv_join_u8_u8_u16(s22, s23);+  const SWord32 s107 = sbv_bv_join_u16_u16_u32(s105, s106);+  const SWord16 s108 = sbv_bv_join_u8_u8_u16(s8, s9);+  const SWord16 s109 = sbv_bv_join_u8_u8_u16(s10, s11);+  const SWord32 s110 = sbv_bv_join_u16_u16_u32(s108, s109);+  const SWord16 s111 = sbv_bv_join_u8_u8_u16(s24, s25);+  const SWord16 s112 = sbv_bv_join_u8_u8_u16(s26, s27);+  const SWord32 s113 = sbv_bv_join_u16_u16_u32(s111, s112);+  const SWord16 s114 = sbv_bv_join_u8_u8_u16(s12, s13);+  const SWord16 s115 = sbv_bv_join_u8_u8_u16(s14, s15);+  const SWord32 s116 = sbv_bv_join_u16_u16_u32(s114, s115);+  const SWord16 s117 = sbv_bv_join_u8_u8_u16(s28, s29);+  const SWord16 s118 = sbv_bv_join_u8_u8_u16(s30, s31);+  const SWord32 s119 = sbv_bv_join_u16_u16_u32(s117, s118);+  const SWord32 s120 = sbv_bv_u32_rotr(s101, 6);+  const SWord32 s121 = sbv_bv_u32_rotr(s101, 11);+  const SWord32 s122 = s120 ^ s121;+  const SWord32 s123 = sbv_bv_u32_rotr(s101, 25);+  const SWord32 s124 = s122 ^ s123;+  const SWord32 s125 = sbv_bv_u32_add(s119, s124);+  const SWord32 s126 = s101 & s107;+  const SWord32 s127 = ~s101;+  const SWord32 s128 = s113 & s127;+  const SWord32 s129 = s126 ^ s128;+  const SWord32 s130 = sbv_bv_u32_add(s125, s129);+  const SWord32 s132 = sbv_bv_u32_add(s130, 0x428a2f98UL);+  const SWord16 s133 = sbv_bv_join_u8_u8_u16(s32, s33);+  const SWord16 s134 = sbv_bv_join_u8_u8_u16(s34, s35);+  const SWord32 s135 = sbv_bv_join_u16_u16_u32(s133, s134);+  const SWord32 s136 = sbv_bv_u32_add(s132, s135);+  const SWord32 s137 = sbv_bv_u32_add(s116, s136);+  const SWord32 s138 = sbv_bv_u32_rotr(s137, 6);+  const SWord32 s139 = sbv_bv_u32_rotr(s137, 11);+  const SWord32 s140 = s138 ^ s139;+  const SWord32 s141 = sbv_bv_u32_rotr(s137, 25);+  const SWord32 s142 = s140 ^ s141;+  const SWord32 s143 = sbv_bv_u32_add(s113, s142);+  const SWord32 s144 = s101 & s137;+  const SWord32 s145 = ~s137;+  const SWord32 s146 = s107 & s145;+  const SWord32 s147 = s144 ^ s146;+  const SWord32 s148 = sbv_bv_u32_add(s143, s147);+  const SWord32 s150 = sbv_bv_u32_add(s148, 0x71374491UL);+  const SWord16 s151 = sbv_bv_join_u8_u8_u16(s36, s37);+  const SWord16 s152 = sbv_bv_join_u8_u8_u16(s38, s39);+  const SWord32 s153 = sbv_bv_join_u16_u16_u32(s151, s152);+  const SWord32 s154 = sbv_bv_u32_add(s150, s153);+  const SWord32 s155 = sbv_bv_u32_add(s110, s154);+  const SWord32 s156 = sbv_bv_u32_rotr(s155, 6);+  const SWord32 s157 = sbv_bv_u32_rotr(s155, 11);+  const SWord32 s158 = s156 ^ s157;+  const SWord32 s159 = sbv_bv_u32_rotr(s155, 25);+  const SWord32 s160 = s158 ^ s159;+  const SWord32 s161 = sbv_bv_u32_add(s107, s160);+  const SWord32 s162 = s137 & s155;+  const SWord32 s163 = ~s155;+  const SWord32 s164 = s101 & s163;+  const SWord32 s165 = s162 ^ s164;+  const SWord32 s166 = sbv_bv_u32_add(s161, s165);+  const SWord32 s168 = sbv_bv_u32_add(s166, 0xb5c0fbcfUL);+  const SWord16 s169 = sbv_bv_join_u8_u8_u16(s40, s41);+  const SWord16 s170 = sbv_bv_join_u8_u8_u16(s42, s43);+  const SWord32 s171 = sbv_bv_join_u16_u16_u32(s169, s170);+  const SWord32 s172 = sbv_bv_u32_add(s168, s171);+  const SWord32 s173 = sbv_bv_u32_add(s104, s172);+  const SWord32 s174 = sbv_bv_u32_rotr(s173, 6);+  const SWord32 s175 = sbv_bv_u32_rotr(s173, 11);+  const SWord32 s176 = s174 ^ s175;+  const SWord32 s177 = sbv_bv_u32_rotr(s173, 25);+  const SWord32 s178 = s176 ^ s177;+  const SWord32 s179 = sbv_bv_u32_add(s101, s178);+  const SWord32 s180 = s155 & s173;+  const SWord32 s181 = ~s173;+  const SWord32 s182 = s137 & s181;+  const SWord32 s183 = s180 ^ s182;+  const SWord32 s184 = sbv_bv_u32_add(s179, s183);+  const SWord32 s186 = sbv_bv_u32_add(s184, 0xe9b5dba5UL);+  const SWord16 s187 = sbv_bv_join_u8_u8_u16(s44, s45);+  const SWord16 s188 = sbv_bv_join_u8_u8_u16(s46, s47);+  const SWord32 s189 = sbv_bv_join_u16_u16_u32(s187, s188);+  const SWord32 s190 = sbv_bv_u32_add(s186, s189);+  const SWord32 s191 = sbv_bv_u32_add(s98, s190);+  const SWord32 s192 = sbv_bv_u32_rotr(s98, 2);+  const SWord32 s193 = sbv_bv_u32_rotr(s98, 13);+  const SWord32 s194 = s192 ^ s193;+  const SWord32 s195 = sbv_bv_u32_rotr(s98, 22);+  const SWord32 s196 = s194 ^ s195;+  const SWord32 s197 = s98 & s104;+  const SWord32 s198 = s98 & s110;+  const SWord32 s199 = s197 ^ s198;+  const SWord32 s200 = s104 & s110;+  const SWord32 s201 = s199 ^ s200;+  const SWord32 s202 = sbv_bv_u32_add(s196, s201);+  const SWord32 s203 = sbv_bv_u32_add(s136, s202);+  const SWord32 s204 = sbv_bv_u32_rotr(s203, 2);+  const SWord32 s205 = sbv_bv_u32_rotr(s203, 13);+  const SWord32 s206 = s204 ^ s205;+  const SWord32 s207 = sbv_bv_u32_rotr(s203, 22);+  const SWord32 s208 = s206 ^ s207;+  const SWord32 s209 = s98 & s203;+  const SWord32 s210 = s104 & s203;+  const SWord32 s211 = s209 ^ s210;+  const SWord32 s212 = s197 ^ s211;+  const SWord32 s213 = sbv_bv_u32_add(s208, s212);+  const SWord32 s214 = sbv_bv_u32_add(s154, s213);+  const SWord32 s215 = sbv_bv_u32_rotr(s214, 2);+  const SWord32 s216 = sbv_bv_u32_rotr(s214, 13);+  const SWord32 s217 = s215 ^ s216;+  const SWord32 s218 = sbv_bv_u32_rotr(s214, 22);+  const SWord32 s219 = s217 ^ s218;+  const SWord32 s220 = s203 & s214;+  const SWord32 s221 = s98 & s214;+  const SWord32 s222 = s220 ^ s221;+  const SWord32 s223 = s209 ^ s222;+  const SWord32 s224 = sbv_bv_u32_add(s219, s223);+  const SWord32 s225 = sbv_bv_u32_add(s172, s224);+  const SWord32 s226 = sbv_bv_u32_rotr(s191, 6);+  const SWord32 s227 = sbv_bv_u32_rotr(s191, 11);+  const SWord32 s228 = s226 ^ s227;+  const SWord32 s229 = sbv_bv_u32_rotr(s191, 25);+  const SWord32 s230 = s228 ^ s229;+  const SWord32 s231 = sbv_bv_u32_add(s137, s230);+  const SWord32 s232 = s173 & s191;+  const SWord32 s233 = ~s191;+  const SWord32 s234 = s155 & s233;+  const SWord32 s235 = s232 ^ s234;+  const SWord32 s236 = sbv_bv_u32_add(s231, s235);+  const SWord32 s238 = sbv_bv_u32_add(s236, 0x3956c25bUL);+  const SWord16 s239 = sbv_bv_join_u8_u8_u16(s48, s49);+  const SWord16 s240 = sbv_bv_join_u8_u8_u16(s50, s51);+  const SWord32 s241 = sbv_bv_join_u16_u16_u32(s239, s240);+  const SWord32 s242 = sbv_bv_u32_add(s238, s241);+  const SWord32 s243 = sbv_bv_u32_add(s203, s242);+  const SWord32 s244 = sbv_bv_u32_rotr(s243, 6);+  const SWord32 s245 = sbv_bv_u32_rotr(s243, 11);+  const SWord32 s246 = s244 ^ s245;+  const SWord32 s247 = sbv_bv_u32_rotr(s243, 25);+  const SWord32 s248 = s246 ^ s247;+  const SWord32 s249 = sbv_bv_u32_add(s155, s248);+  const SWord32 s250 = s191 & s243;+  const SWord32 s251 = ~s243;+  const SWord32 s252 = s173 & s251;+  const SWord32 s253 = s250 ^ s252;+  const SWord32 s254 = sbv_bv_u32_add(s249, s253);+  const SWord32 s256 = sbv_bv_u32_add(s254, 0x59f111f1UL);+  const SWord16 s257 = sbv_bv_join_u8_u8_u16(s52, s53);+  const SWord16 s258 = sbv_bv_join_u8_u8_u16(s54, s55);+  const SWord32 s259 = sbv_bv_join_u16_u16_u32(s257, s258);+  const SWord32 s260 = sbv_bv_u32_add(s256, s259);+  const SWord32 s261 = sbv_bv_u32_add(s214, s260);+  const SWord32 s262 = sbv_bv_u32_rotr(s261, 6);+  const SWord32 s263 = sbv_bv_u32_rotr(s261, 11);+  const SWord32 s264 = s262 ^ s263;+  const SWord32 s265 = sbv_bv_u32_rotr(s261, 25);+  const SWord32 s266 = s264 ^ s265;+  const SWord32 s267 = sbv_bv_u32_add(s173, s266);+  const SWord32 s268 = s243 & s261;+  const SWord32 s269 = ~s261;+  const SWord32 s270 = s191 & s269;+  const SWord32 s271 = s268 ^ s270;+  const SWord32 s272 = sbv_bv_u32_add(s267, s271);+  const SWord32 s274 = sbv_bv_u32_add(s272, 0x923f82a4UL);+  const SWord16 s275 = sbv_bv_join_u8_u8_u16(s56, s57);+  const SWord16 s276 = sbv_bv_join_u8_u8_u16(s58, s59);+  const SWord32 s277 = sbv_bv_join_u16_u16_u32(s275, s276);+  const SWord32 s278 = sbv_bv_u32_add(s274, s277);+  const SWord32 s279 = sbv_bv_u32_add(s225, s278);+  const SWord32 s280 = sbv_bv_u32_rotr(s279, 6);+  const SWord32 s281 = sbv_bv_u32_rotr(s279, 11);+  const SWord32 s282 = s280 ^ s281;+  const SWord32 s283 = sbv_bv_u32_rotr(s279, 25);+  const SWord32 s284 = s282 ^ s283;+  const SWord32 s285 = sbv_bv_u32_add(s191, s284);+  const SWord32 s286 = s261 & s279;+  const SWord32 s287 = ~s279;+  const SWord32 s288 = s243 & s287;+  const SWord32 s289 = s286 ^ s288;+  const SWord32 s290 = sbv_bv_u32_add(s285, s289);+  const SWord32 s292 = sbv_bv_u32_add(s290, 0xab1c5ed5UL);+  const SWord16 s293 = sbv_bv_join_u8_u8_u16(s60, s61);+  const SWord16 s294 = sbv_bv_join_u8_u8_u16(s62, s63);+  const SWord32 s295 = sbv_bv_join_u16_u16_u32(s293, s294);+  const SWord32 s296 = sbv_bv_u32_add(s292, s295);+  const SWord32 s297 = sbv_bv_u32_rotr(s225, 2);+  const SWord32 s298 = sbv_bv_u32_rotr(s225, 13);+  const SWord32 s299 = s297 ^ s298;+  const SWord32 s300 = sbv_bv_u32_rotr(s225, 22);+  const SWord32 s301 = s299 ^ s300;+  const SWord32 s302 = s214 & s225;+  const SWord32 s303 = s203 & s225;+  const SWord32 s304 = s302 ^ s303;+  const SWord32 s305 = s220 ^ s304;+  const SWord32 s306 = sbv_bv_u32_add(s301, s305);+  const SWord32 s307 = sbv_bv_u32_add(s190, s306);+  const SWord32 s308 = sbv_bv_u32_rotr(s307, 2);+  const SWord32 s309 = sbv_bv_u32_rotr(s307, 13);+  const SWord32 s310 = s308 ^ s309;+  const SWord32 s311 = sbv_bv_u32_rotr(s307, 22);+  const SWord32 s312 = s310 ^ s311;+  const SWord32 s313 = s225 & s307;+  const SWord32 s314 = s214 & s307;+  const SWord32 s315 = s313 ^ s314;+  const SWord32 s316 = s302 ^ s315;+  const SWord32 s317 = sbv_bv_u32_add(s312, s316);+  const SWord32 s318 = sbv_bv_u32_add(s242, s317);+  const SWord32 s319 = sbv_bv_u32_rotr(s318, 2);+  const SWord32 s320 = sbv_bv_u32_rotr(s318, 13);+  const SWord32 s321 = s319 ^ s320;+  const SWord32 s322 = sbv_bv_u32_rotr(s318, 22);+  const SWord32 s323 = s321 ^ s322;+  const SWord32 s324 = s307 & s318;+  const SWord32 s325 = s225 & s318;+  const SWord32 s326 = s324 ^ s325;+  const SWord32 s327 = s313 ^ s326;+  const SWord32 s328 = sbv_bv_u32_add(s323, s327);+  const SWord32 s329 = sbv_bv_u32_add(s260, s328);+  const SWord32 s330 = sbv_bv_u32_rotr(s329, 2);+  const SWord32 s331 = sbv_bv_u32_rotr(s329, 13);+  const SWord32 s332 = s330 ^ s331;+  const SWord32 s333 = sbv_bv_u32_rotr(s329, 22);+  const SWord32 s334 = s332 ^ s333;+  const SWord32 s335 = s318 & s329;+  const SWord32 s336 = s307 & s329;+  const SWord32 s337 = s335 ^ s336;+  const SWord32 s338 = s324 ^ s337;+  const SWord32 s339 = sbv_bv_u32_add(s334, s338);+  const SWord32 s340 = sbv_bv_u32_add(s278, s339);+  const SWord32 s341 = sbv_bv_u32_rotr(s340, 2);+  const SWord32 s342 = sbv_bv_u32_rotr(s340, 13);+  const SWord32 s343 = s341 ^ s342;+  const SWord32 s344 = sbv_bv_u32_rotr(s340, 22);+  const SWord32 s345 = s343 ^ s344;+  const SWord32 s346 = s329 & s340;+  const SWord32 s347 = s318 & s340;+  const SWord32 s348 = s346 ^ s347;+  const SWord32 s349 = s335 ^ s348;+  const SWord32 s350 = sbv_bv_u32_add(s345, s349);+  const SWord32 s351 = sbv_bv_u32_add(s296, s350);+  const SWord32 s352 = sbv_bv_u32_add(s296, s307);+  const SWord32 s353 = sbv_bv_u32_rotr(s352, 6);+  const SWord32 s354 = sbv_bv_u32_rotr(s352, 11);+  const SWord32 s355 = s353 ^ s354;+  const SWord32 s356 = sbv_bv_u32_rotr(s352, 25);+  const SWord32 s357 = s355 ^ s356;+  const SWord32 s358 = sbv_bv_u32_add(s243, s357);+  const SWord32 s359 = s279 & s352;+  const SWord32 s360 = ~s352;+  const SWord32 s361 = s261 & s360;+  const SWord32 s362 = s359 ^ s361;+  const SWord32 s363 = sbv_bv_u32_add(s358, s362);+  const SWord32 s365 = sbv_bv_u32_add(s363, 0xd807aa98UL);+  const SWord16 s366 = sbv_bv_join_u8_u8_u16(s64, s65);+  const SWord16 s367 = sbv_bv_join_u8_u8_u16(s66, s67);+  const SWord32 s368 = sbv_bv_join_u16_u16_u32(s366, s367);+  const SWord32 s369 = sbv_bv_u32_add(s365, s368);+  const SWord32 s370 = sbv_bv_u32_add(s318, s369);+  const SWord32 s371 = sbv_bv_u32_rotr(s370, 6);+  const SWord32 s372 = sbv_bv_u32_rotr(s370, 11);+  const SWord32 s373 = s371 ^ s372;+  const SWord32 s374 = sbv_bv_u32_rotr(s370, 25);+  const SWord32 s375 = s373 ^ s374;+  const SWord32 s376 = sbv_bv_u32_add(s261, s375);+  const SWord32 s377 = s352 & s370;+  const SWord32 s378 = ~s370;+  const SWord32 s379 = s279 & s378;+  const SWord32 s380 = s377 ^ s379;+  const SWord32 s381 = sbv_bv_u32_add(s376, s380);+  const SWord32 s383 = sbv_bv_u32_add(s381, 0x12835b01UL);+  const SWord16 s384 = sbv_bv_join_u8_u8_u16(s68, s69);+  const SWord16 s385 = sbv_bv_join_u8_u8_u16(s70, s71);+  const SWord32 s386 = sbv_bv_join_u16_u16_u32(s384, s385);+  const SWord32 s387 = sbv_bv_u32_add(s383, s386);+  const SWord32 s388 = sbv_bv_u32_add(s329, s387);+  const SWord32 s389 = sbv_bv_u32_rotr(s388, 6);+  const SWord32 s390 = sbv_bv_u32_rotr(s388, 11);+  const SWord32 s391 = s389 ^ s390;+  const SWord32 s392 = sbv_bv_u32_rotr(s388, 25);+  const SWord32 s393 = s391 ^ s392;+  const SWord32 s394 = sbv_bv_u32_add(s279, s393);+  const SWord32 s395 = s370 & s388;+  const SWord32 s396 = ~s388;+  const SWord32 s397 = s352 & s396;+  const SWord32 s398 = s395 ^ s397;+  const SWord32 s399 = sbv_bv_u32_add(s394, s398);+  const SWord32 s401 = sbv_bv_u32_add(s399, 0x243185beUL);+  const SWord16 s402 = sbv_bv_join_u8_u8_u16(s72, s73);+  const SWord16 s403 = sbv_bv_join_u8_u8_u16(s74, s75);+  const SWord32 s404 = sbv_bv_join_u16_u16_u32(s402, s403);+  const SWord32 s405 = sbv_bv_u32_add(s401, s404);+  const SWord32 s406 = sbv_bv_u32_add(s340, s405);+  const SWord32 s407 = sbv_bv_u32_rotr(s406, 6);+  const SWord32 s408 = sbv_bv_u32_rotr(s406, 11);+  const SWord32 s409 = s407 ^ s408;+  const SWord32 s410 = sbv_bv_u32_rotr(s406, 25);+  const SWord32 s411 = s409 ^ s410;+  const SWord32 s412 = sbv_bv_u32_add(s352, s411);+  const SWord32 s413 = s388 & s406;+  const SWord32 s414 = ~s406;+  const SWord32 s415 = s370 & s414;+  const SWord32 s416 = s413 ^ s415;+  const SWord32 s417 = sbv_bv_u32_add(s412, s416);+  const SWord32 s419 = sbv_bv_u32_add(s417, 0x550c7dc3UL);+  const SWord16 s420 = sbv_bv_join_u8_u8_u16(s76, s77);+  const SWord16 s421 = sbv_bv_join_u8_u8_u16(s78, s79);+  const SWord32 s422 = sbv_bv_join_u16_u16_u32(s420, s421);+  const SWord32 s423 = sbv_bv_u32_add(s419, s422);+  const SWord32 s424 = sbv_bv_u32_add(s351, s423);+  const SWord32 s425 = sbv_bv_u32_rotr(s351, 2);+  const SWord32 s426 = sbv_bv_u32_rotr(s351, 13);+  const SWord32 s427 = s425 ^ s426;+  const SWord32 s428 = sbv_bv_u32_rotr(s351, 22);+  const SWord32 s429 = s427 ^ s428;+  const SWord32 s430 = s340 & s351;+  const SWord32 s431 = s329 & s351;+  const SWord32 s432 = s430 ^ s431;+  const SWord32 s433 = s346 ^ s432;+  const SWord32 s434 = sbv_bv_u32_add(s429, s433);+  const SWord32 s435 = sbv_bv_u32_add(s369, s434);+  const SWord32 s436 = sbv_bv_u32_rotr(s435, 2);+  const SWord32 s437 = sbv_bv_u32_rotr(s435, 13);+  const SWord32 s438 = s436 ^ s437;+  const SWord32 s439 = sbv_bv_u32_rotr(s435, 22);+  const SWord32 s440 = s438 ^ s439;+  const SWord32 s441 = s351 & s435;+  const SWord32 s442 = s340 & s435;+  const SWord32 s443 = s441 ^ s442;+  const SWord32 s444 = s430 ^ s443;+  const SWord32 s445 = sbv_bv_u32_add(s440, s444);+  const SWord32 s446 = sbv_bv_u32_add(s387, s445);+  const SWord32 s447 = sbv_bv_u32_rotr(s446, 2);+  const SWord32 s448 = sbv_bv_u32_rotr(s446, 13);+  const SWord32 s449 = s447 ^ s448;+  const SWord32 s450 = sbv_bv_u32_rotr(s446, 22);+  const SWord32 s451 = s449 ^ s450;+  const SWord32 s452 = s435 & s446;+  const SWord32 s453 = s351 & s446;+  const SWord32 s454 = s452 ^ s453;+  const SWord32 s455 = s441 ^ s454;+  const SWord32 s456 = sbv_bv_u32_add(s451, s455);+  const SWord32 s457 = sbv_bv_u32_add(s405, s456);+  const SWord32 s458 = sbv_bv_u32_rotr(s424, 6);+  const SWord32 s459 = sbv_bv_u32_rotr(s424, 11);+  const SWord32 s460 = s458 ^ s459;+  const SWord32 s461 = sbv_bv_u32_rotr(s424, 25);+  const SWord32 s462 = s460 ^ s461;+  const SWord32 s463 = sbv_bv_u32_add(s370, s462);+  const SWord32 s464 = s406 & s424;+  const SWord32 s465 = ~s424;+  const SWord32 s466 = s388 & s465;+  const SWord32 s467 = s464 ^ s466;+  const SWord32 s468 = sbv_bv_u32_add(s463, s467);+  const SWord32 s470 = sbv_bv_u32_add(s468, 0x72be5d74UL);+  const SWord16 s471 = sbv_bv_join_u8_u8_u16(s80, s81);+  const SWord16 s472 = sbv_bv_join_u8_u8_u16(s82, s83);+  const SWord32 s473 = sbv_bv_join_u16_u16_u32(s471, s472);+  const SWord32 s474 = sbv_bv_u32_add(s470, s473);+  const SWord32 s475 = sbv_bv_u32_add(s435, s474);+  const SWord32 s476 = sbv_bv_u32_rotr(s475, 6);+  const SWord32 s477 = sbv_bv_u32_rotr(s475, 11);+  const SWord32 s478 = s476 ^ s477;+  const SWord32 s479 = sbv_bv_u32_rotr(s475, 25);+  const SWord32 s480 = s478 ^ s479;+  const SWord32 s481 = sbv_bv_u32_add(s388, s480);+  const SWord32 s482 = s424 & s475;+  const SWord32 s483 = ~s475;+  const SWord32 s484 = s406 & s483;+  const SWord32 s485 = s482 ^ s484;+  const SWord32 s486 = sbv_bv_u32_add(s481, s485);+  const SWord32 s488 = sbv_bv_u32_add(s486, 0x80deb1feUL);+  const SWord16 s489 = sbv_bv_join_u8_u8_u16(s84, s85);+  const SWord16 s490 = sbv_bv_join_u8_u8_u16(s86, s87);+  const SWord32 s491 = sbv_bv_join_u16_u16_u32(s489, s490);+  const SWord32 s492 = sbv_bv_u32_add(s488, s491);+  const SWord32 s493 = sbv_bv_u32_add(s446, s492);+  const SWord32 s494 = sbv_bv_u32_rotr(s493, 6);+  const SWord32 s495 = sbv_bv_u32_rotr(s493, 11);+  const SWord32 s496 = s494 ^ s495;+  const SWord32 s497 = sbv_bv_u32_rotr(s493, 25);+  const SWord32 s498 = s496 ^ s497;+  const SWord32 s499 = sbv_bv_u32_add(s406, s498);+  const SWord32 s500 = s475 & s493;+  const SWord32 s501 = ~s493;+  const SWord32 s502 = s424 & s501;+  const SWord32 s503 = s500 ^ s502;+  const SWord32 s504 = sbv_bv_u32_add(s499, s503);+  const SWord32 s506 = sbv_bv_u32_add(s504, 0x9bdc06a7UL);+  const SWord16 s507 = sbv_bv_join_u8_u8_u16(s88, s89);+  const SWord16 s508 = sbv_bv_join_u8_u8_u16(s90, s91);+  const SWord32 s509 = sbv_bv_join_u16_u16_u32(s507, s508);+  const SWord32 s510 = sbv_bv_u32_add(s506, s509);+  const SWord32 s511 = sbv_bv_u32_add(s457, s510);+  const SWord32 s512 = sbv_bv_u32_rotr(s511, 6);+  const SWord32 s513 = sbv_bv_u32_rotr(s511, 11);+  const SWord32 s514 = s512 ^ s513;+  const SWord32 s515 = sbv_bv_u32_rotr(s511, 25);+  const SWord32 s516 = s514 ^ s515;+  const SWord32 s517 = sbv_bv_u32_add(s424, s516);+  const SWord32 s518 = s493 & s511;+  const SWord32 s519 = ~s511;+  const SWord32 s520 = s475 & s519;+  const SWord32 s521 = s518 ^ s520;+  const SWord32 s522 = sbv_bv_u32_add(s517, s521);+  const SWord32 s524 = sbv_bv_u32_add(s522, 0xc19bf174UL);+  const SWord16 s525 = sbv_bv_join_u8_u8_u16(s92, s93);+  const SWord16 s526 = sbv_bv_join_u8_u8_u16(s94, s95);+  const SWord32 s527 = sbv_bv_join_u16_u16_u32(s525, s526);+  const SWord32 s528 = sbv_bv_u32_add(s524, s527);+  const SWord32 s529 = sbv_bv_u32_rotr(s457, 2);+  const SWord32 s530 = sbv_bv_u32_rotr(s457, 13);+  const SWord32 s531 = s529 ^ s530;+  const SWord32 s532 = sbv_bv_u32_rotr(s457, 22);+  const SWord32 s533 = s531 ^ s532;+  const SWord32 s534 = s446 & s457;+  const SWord32 s535 = s435 & s457;+  const SWord32 s536 = s534 ^ s535;+  const SWord32 s537 = s452 ^ s536;+  const SWord32 s538 = sbv_bv_u32_add(s533, s537);+  const SWord32 s539 = sbv_bv_u32_add(s423, s538);+  const SWord32 s540 = sbv_bv_u32_rotr(s539, 2);+  const SWord32 s541 = sbv_bv_u32_rotr(s539, 13);+  const SWord32 s542 = s540 ^ s541;+  const SWord32 s543 = sbv_bv_u32_rotr(s539, 22);+  const SWord32 s544 = s542 ^ s543;+  const SWord32 s545 = s457 & s539;+  const SWord32 s546 = s446 & s539;+  const SWord32 s547 = s545 ^ s546;+  const SWord32 s548 = s534 ^ s547;+  const SWord32 s549 = sbv_bv_u32_add(s544, s548);+  const SWord32 s550 = sbv_bv_u32_add(s474, s549);+  const SWord32 s551 = sbv_bv_u32_rotr(s550, 2);+  const SWord32 s552 = sbv_bv_u32_rotr(s550, 13);+  const SWord32 s553 = s551 ^ s552;+  const SWord32 s554 = sbv_bv_u32_rotr(s550, 22);+  const SWord32 s555 = s553 ^ s554;+  const SWord32 s556 = s539 & s550;+  const SWord32 s557 = s457 & s550;+  const SWord32 s558 = s556 ^ s557;+  const SWord32 s559 = s545 ^ s558;+  const SWord32 s560 = sbv_bv_u32_add(s555, s559);+  const SWord32 s561 = sbv_bv_u32_add(s492, s560);+  const SWord32 s562 = sbv_bv_u32_rotr(s561, 2);+  const SWord32 s563 = sbv_bv_u32_rotr(s561, 13);+  const SWord32 s564 = s562 ^ s563;+  const SWord32 s565 = sbv_bv_u32_rotr(s561, 22);+  const SWord32 s566 = s564 ^ s565;+  const SWord32 s567 = s550 & s561;+  const SWord32 s568 = s539 & s561;+  const SWord32 s569 = s567 ^ s568;+  const SWord32 s570 = s556 ^ s569;+  const SWord32 s571 = sbv_bv_u32_add(s566, s570);+  const SWord32 s572 = sbv_bv_u32_add(s510, s571);+  const SWord32 s573 = sbv_bv_u32_rotr(s572, 2);+  const SWord32 s574 = sbv_bv_u32_rotr(s572, 13);+  const SWord32 s575 = s573 ^ s574;+  const SWord32 s576 = sbv_bv_u32_rotr(s572, 22);+  const SWord32 s577 = s575 ^ s576;+  const SWord32 s578 = s561 & s572;+  const SWord32 s579 = s550 & s572;+  const SWord32 s580 = s578 ^ s579;+  const SWord32 s581 = s567 ^ s580;+  const SWord32 s582 = sbv_bv_u32_add(s577, s581);+  const SWord32 s583 = sbv_bv_u32_add(s528, s582);+  const SWord32 s584 = sbv_bv_u32_add(s528, s539);+  const SWord32 s585 = sbv_bv_u32_rotr(s584, 6);+  const SWord32 s586 = sbv_bv_u32_rotr(s584, 11);+  const SWord32 s587 = s585 ^ s586;+  const SWord32 s588 = sbv_bv_u32_rotr(s584, 25);+  const SWord32 s589 = s587 ^ s588;+  const SWord32 s590 = sbv_bv_u32_add(s475, s589);+  const SWord32 s591 = s511 & s584;+  const SWord32 s592 = ~s584;+  const SWord32 s593 = s493 & s592;+  const SWord32 s594 = s591 ^ s593;+  const SWord32 s595 = sbv_bv_u32_add(s590, s594);+  const SWord32 s597 = sbv_bv_u32_add(s595, 0xe49b69c1UL);+  const SWord32 s598 = sbv_bv_u32_rotr(s509, 17);+  const SWord32 s599 = sbv_bv_u32_rotr(s509, 19);+  const SWord32 s600 = s598 ^ s599;+  const SWord32 s602 = sbv_bv_u32_lshr(s509, 0x0000000aUL);+  const SWord32 s603 = s600 ^ s602;+  const SWord32 s604 = sbv_bv_u32_add(s386, s603);+  const SWord32 s605 = sbv_bv_u32_rotr(s153, 7);+  const SWord32 s606 = sbv_bv_u32_rotr(s153, 18);+  const SWord32 s607 = s605 ^ s606;+  const SWord32 s609 = sbv_bv_u32_lshr(s153, 0x00000003UL);+  const SWord32 s610 = s607 ^ s609;+  const SWord32 s611 = sbv_bv_u32_add(s604, s610);+  const SWord32 s612 = sbv_bv_u32_add(s135, s611);+  const SWord32 s613 = sbv_bv_u32_add(s597, s612);+  const SWord32 s614 = sbv_bv_u32_add(s550, s613);+  const SWord32 s615 = sbv_bv_u32_rotr(s614, 6);+  const SWord32 s616 = sbv_bv_u32_rotr(s614, 11);+  const SWord32 s617 = s615 ^ s616;+  const SWord32 s618 = sbv_bv_u32_rotr(s614, 25);+  const SWord32 s619 = s617 ^ s618;+  const SWord32 s620 = sbv_bv_u32_add(s493, s619);+  const SWord32 s621 = s584 & s614;+  const SWord32 s622 = ~s614;+  const SWord32 s623 = s511 & s622;+  const SWord32 s624 = s621 ^ s623;+  const SWord32 s625 = sbv_bv_u32_add(s620, s624);+  const SWord32 s627 = sbv_bv_u32_add(s625, 0xefbe4786UL);+  const SWord32 s628 = sbv_bv_u32_rotr(s527, 17);+  const SWord32 s629 = sbv_bv_u32_rotr(s527, 19);+  const SWord32 s630 = s628 ^ s629;+  const SWord32 s631 = sbv_bv_u32_lshr(s527, 0x0000000aUL);+  const SWord32 s632 = s630 ^ s631;+  const SWord32 s633 = sbv_bv_u32_add(s404, s632);+  const SWord32 s634 = sbv_bv_u32_rotr(s171, 7);+  const SWord32 s635 = sbv_bv_u32_rotr(s171, 18);+  const SWord32 s636 = s634 ^ s635;+  const SWord32 s637 = sbv_bv_u32_lshr(s171, 0x00000003UL);+  const SWord32 s638 = s636 ^ s637;+  const SWord32 s639 = sbv_bv_u32_add(s633, s638);+  const SWord32 s640 = sbv_bv_u32_add(s153, s639);+  const SWord32 s641 = sbv_bv_u32_add(s627, s640);+  const SWord32 s642 = sbv_bv_u32_add(s561, s641);+  const SWord32 s643 = sbv_bv_u32_rotr(s642, 6);+  const SWord32 s644 = sbv_bv_u32_rotr(s642, 11);+  const SWord32 s645 = s643 ^ s644;+  const SWord32 s646 = sbv_bv_u32_rotr(s642, 25);+  const SWord32 s647 = s645 ^ s646;+  const SWord32 s648 = sbv_bv_u32_add(s511, s647);+  const SWord32 s649 = s614 & s642;+  const SWord32 s650 = ~s642;+  const SWord32 s651 = s584 & s650;+  const SWord32 s652 = s649 ^ s651;+  const SWord32 s653 = sbv_bv_u32_add(s648, s652);+  const SWord32 s655 = sbv_bv_u32_add(s653, 0x0fc19dc6UL);+  const SWord32 s656 = sbv_bv_u32_rotr(s612, 17);+  const SWord32 s657 = sbv_bv_u32_rotr(s612, 19);+  const SWord32 s658 = s656 ^ s657;+  const SWord32 s659 = sbv_bv_u32_lshr(s612, 0x0000000aUL);+  const SWord32 s660 = s658 ^ s659;+  const SWord32 s661 = sbv_bv_u32_add(s422, s660);+  const SWord32 s662 = sbv_bv_u32_rotr(s189, 7);+  const SWord32 s663 = sbv_bv_u32_rotr(s189, 18);+  const SWord32 s664 = s662 ^ s663;+  const SWord32 s665 = sbv_bv_u32_lshr(s189, 0x00000003UL);+  const SWord32 s666 = s664 ^ s665;+  const SWord32 s667 = sbv_bv_u32_add(s661, s666);+  const SWord32 s668 = sbv_bv_u32_add(s171, s667);+  const SWord32 s669 = sbv_bv_u32_add(s655, s668);+  const SWord32 s670 = sbv_bv_u32_add(s572, s669);+  const SWord32 s671 = sbv_bv_u32_rotr(s670, 6);+  const SWord32 s672 = sbv_bv_u32_rotr(s670, 11);+  const SWord32 s673 = s671 ^ s672;+  const SWord32 s674 = sbv_bv_u32_rotr(s670, 25);+  const SWord32 s675 = s673 ^ s674;+  const SWord32 s676 = sbv_bv_u32_add(s584, s675);+  const SWord32 s677 = s642 & s670;+  const SWord32 s678 = ~s670;+  const SWord32 s679 = s614 & s678;+  const SWord32 s680 = s677 ^ s679;+  const SWord32 s681 = sbv_bv_u32_add(s676, s680);+  const SWord32 s683 = sbv_bv_u32_add(s681, 0x240ca1ccUL);+  const SWord32 s684 = sbv_bv_u32_rotr(s640, 17);+  const SWord32 s685 = sbv_bv_u32_rotr(s640, 19);+  const SWord32 s686 = s684 ^ s685;+  const SWord32 s687 = sbv_bv_u32_lshr(s640, 0x0000000aUL);+  const SWord32 s688 = s686 ^ s687;+  const SWord32 s689 = sbv_bv_u32_add(s473, s688);+  const SWord32 s690 = sbv_bv_u32_rotr(s241, 7);+  const SWord32 s691 = sbv_bv_u32_rotr(s241, 18);+  const SWord32 s692 = s690 ^ s691;+  const SWord32 s693 = sbv_bv_u32_lshr(s241, 0x00000003UL);+  const SWord32 s694 = s692 ^ s693;+  const SWord32 s695 = sbv_bv_u32_add(s689, s694);+  const SWord32 s696 = sbv_bv_u32_add(s189, s695);+  const SWord32 s697 = sbv_bv_u32_add(s683, s696);+  const SWord32 s698 = sbv_bv_u32_add(s583, s697);+  const SWord32 s699 = sbv_bv_u32_rotr(s583, 2);+  const SWord32 s700 = sbv_bv_u32_rotr(s583, 13);+  const SWord32 s701 = s699 ^ s700;+  const SWord32 s702 = sbv_bv_u32_rotr(s583, 22);+  const SWord32 s703 = s701 ^ s702;+  const SWord32 s704 = s572 & s583;+  const SWord32 s705 = s561 & s583;+  const SWord32 s706 = s704 ^ s705;+  const SWord32 s707 = s578 ^ s706;+  const SWord32 s708 = sbv_bv_u32_add(s703, s707);+  const SWord32 s709 = sbv_bv_u32_add(s613, s708);+  const SWord32 s710 = sbv_bv_u32_rotr(s709, 2);+  const SWord32 s711 = sbv_bv_u32_rotr(s709, 13);+  const SWord32 s712 = s710 ^ s711;+  const SWord32 s713 = sbv_bv_u32_rotr(s709, 22);+  const SWord32 s714 = s712 ^ s713;+  const SWord32 s715 = s583 & s709;+  const SWord32 s716 = s572 & s709;+  const SWord32 s717 = s715 ^ s716;+  const SWord32 s718 = s704 ^ s717;+  const SWord32 s719 = sbv_bv_u32_add(s714, s718);+  const SWord32 s720 = sbv_bv_u32_add(s641, s719);+  const SWord32 s721 = sbv_bv_u32_rotr(s720, 2);+  const SWord32 s722 = sbv_bv_u32_rotr(s720, 13);+  const SWord32 s723 = s721 ^ s722;+  const SWord32 s724 = sbv_bv_u32_rotr(s720, 22);+  const SWord32 s725 = s723 ^ s724;+  const SWord32 s726 = s709 & s720;+  const SWord32 s727 = s583 & s720;+  const SWord32 s728 = s726 ^ s727;+  const SWord32 s729 = s715 ^ s728;+  const SWord32 s730 = sbv_bv_u32_add(s725, s729);+  const SWord32 s731 = sbv_bv_u32_add(s669, s730);+  const SWord32 s732 = sbv_bv_u32_rotr(s698, 6);+  const SWord32 s733 = sbv_bv_u32_rotr(s698, 11);+  const SWord32 s734 = s732 ^ s733;+  const SWord32 s735 = sbv_bv_u32_rotr(s698, 25);+  const SWord32 s736 = s734 ^ s735;+  const SWord32 s737 = sbv_bv_u32_add(s614, s736);+  const SWord32 s738 = s670 & s698;+  const SWord32 s739 = ~s698;+  const SWord32 s740 = s642 & s739;+  const SWord32 s741 = s738 ^ s740;+  const SWord32 s742 = sbv_bv_u32_add(s737, s741);+  const SWord32 s744 = sbv_bv_u32_add(s742, 0x2de92c6fUL);+  const SWord32 s745 = sbv_bv_u32_rotr(s668, 17);+  const SWord32 s746 = sbv_bv_u32_rotr(s668, 19);+  const SWord32 s747 = s745 ^ s746;+  const SWord32 s748 = sbv_bv_u32_lshr(s668, 0x0000000aUL);+  const SWord32 s749 = s747 ^ s748;+  const SWord32 s750 = sbv_bv_u32_add(s491, s749);+  const SWord32 s751 = sbv_bv_u32_rotr(s259, 7);+  const SWord32 s752 = sbv_bv_u32_rotr(s259, 18);+  const SWord32 s753 = s751 ^ s752;+  const SWord32 s754 = sbv_bv_u32_lshr(s259, 0x00000003UL);+  const SWord32 s755 = s753 ^ s754;+  const SWord32 s756 = sbv_bv_u32_add(s750, s755);+  const SWord32 s757 = sbv_bv_u32_add(s241, s756);+  const SWord32 s758 = sbv_bv_u32_add(s744, s757);+  const SWord32 s759 = sbv_bv_u32_add(s709, s758);+  const SWord32 s760 = sbv_bv_u32_rotr(s759, 6);+  const SWord32 s761 = sbv_bv_u32_rotr(s759, 11);+  const SWord32 s762 = s760 ^ s761;+  const SWord32 s763 = sbv_bv_u32_rotr(s759, 25);+  const SWord32 s764 = s762 ^ s763;+  const SWord32 s765 = sbv_bv_u32_add(s642, s764);+  const SWord32 s766 = s698 & s759;+  const SWord32 s767 = ~s759;+  const SWord32 s768 = s670 & s767;+  const SWord32 s769 = s766 ^ s768;+  const SWord32 s770 = sbv_bv_u32_add(s765, s769);+  const SWord32 s772 = sbv_bv_u32_add(s770, 0x4a7484aaUL);+  const SWord32 s773 = sbv_bv_u32_rotr(s696, 17);+  const SWord32 s774 = sbv_bv_u32_rotr(s696, 19);+  const SWord32 s775 = s773 ^ s774;+  const SWord32 s776 = sbv_bv_u32_lshr(s696, 0x0000000aUL);+  const SWord32 s777 = s775 ^ s776;+  const SWord32 s778 = sbv_bv_u32_add(s509, s777);+  const SWord32 s779 = sbv_bv_u32_rotr(s277, 7);+  const SWord32 s780 = sbv_bv_u32_rotr(s277, 18);+  const SWord32 s781 = s779 ^ s780;+  const SWord32 s782 = sbv_bv_u32_lshr(s277, 0x00000003UL);+  const SWord32 s783 = s781 ^ s782;+  const SWord32 s784 = sbv_bv_u32_add(s778, s783);+  const SWord32 s785 = sbv_bv_u32_add(s259, s784);+  const SWord32 s786 = sbv_bv_u32_add(s772, s785);+  const SWord32 s787 = sbv_bv_u32_add(s720, s786);+  const SWord32 s788 = sbv_bv_u32_rotr(s787, 6);+  const SWord32 s789 = sbv_bv_u32_rotr(s787, 11);+  const SWord32 s790 = s788 ^ s789;+  const SWord32 s791 = sbv_bv_u32_rotr(s787, 25);+  const SWord32 s792 = s790 ^ s791;+  const SWord32 s793 = sbv_bv_u32_add(s670, s792);+  const SWord32 s794 = s759 & s787;+  const SWord32 s795 = ~s787;+  const SWord32 s796 = s698 & s795;+  const SWord32 s797 = s794 ^ s796;+  const SWord32 s798 = sbv_bv_u32_add(s793, s797);+  const SWord32 s800 = sbv_bv_u32_add(s798, 0x5cb0a9dcUL);+  const SWord32 s801 = sbv_bv_u32_rotr(s757, 17);+  const SWord32 s802 = sbv_bv_u32_rotr(s757, 19);+  const SWord32 s803 = s801 ^ s802;+  const SWord32 s804 = sbv_bv_u32_lshr(s757, 0x0000000aUL);+  const SWord32 s805 = s803 ^ s804;+  const SWord32 s806 = sbv_bv_u32_add(s527, s805);+  const SWord32 s807 = sbv_bv_u32_rotr(s295, 7);+  const SWord32 s808 = sbv_bv_u32_rotr(s295, 18);+  const SWord32 s809 = s807 ^ s808;+  const SWord32 s810 = sbv_bv_u32_lshr(s295, 0x00000003UL);+  const SWord32 s811 = s809 ^ s810;+  const SWord32 s812 = sbv_bv_u32_add(s806, s811);+  const SWord32 s813 = sbv_bv_u32_add(s277, s812);+  const SWord32 s814 = sbv_bv_u32_add(s800, s813);+  const SWord32 s815 = sbv_bv_u32_add(s731, s814);+  const SWord32 s816 = sbv_bv_u32_rotr(s815, 6);+  const SWord32 s817 = sbv_bv_u32_rotr(s815, 11);+  const SWord32 s818 = s816 ^ s817;+  const SWord32 s819 = sbv_bv_u32_rotr(s815, 25);+  const SWord32 s820 = s818 ^ s819;+  const SWord32 s821 = sbv_bv_u32_add(s698, s820);+  const SWord32 s822 = s787 & s815;+  const SWord32 s823 = ~s815;+  const SWord32 s824 = s759 & s823;+  const SWord32 s825 = s822 ^ s824;+  const SWord32 s826 = sbv_bv_u32_add(s821, s825);+  const SWord32 s828 = sbv_bv_u32_add(s826, 0x76f988daUL);+  const SWord32 s829 = sbv_bv_u32_rotr(s785, 17);+  const SWord32 s830 = sbv_bv_u32_rotr(s785, 19);+  const SWord32 s831 = s829 ^ s830;+  const SWord32 s832 = sbv_bv_u32_lshr(s785, 0x0000000aUL);+  const SWord32 s833 = s831 ^ s832;+  const SWord32 s834 = sbv_bv_u32_add(s612, s833);+  const SWord32 s835 = sbv_bv_u32_rotr(s368, 7);+  const SWord32 s836 = sbv_bv_u32_rotr(s368, 18);+  const SWord32 s837 = s835 ^ s836;+  const SWord32 s838 = sbv_bv_u32_lshr(s368, 0x00000003UL);+  const SWord32 s839 = s837 ^ s838;+  const SWord32 s840 = sbv_bv_u32_add(s834, s839);+  const SWord32 s841 = sbv_bv_u32_add(s295, s840);+  const SWord32 s842 = sbv_bv_u32_add(s828, s841);+  const SWord32 s843 = sbv_bv_u32_rotr(s731, 2);+  const SWord32 s844 = sbv_bv_u32_rotr(s731, 13);+  const SWord32 s845 = s843 ^ s844;+  const SWord32 s846 = sbv_bv_u32_rotr(s731, 22);+  const SWord32 s847 = s845 ^ s846;+  const SWord32 s848 = s720 & s731;+  const SWord32 s849 = s709 & s731;+  const SWord32 s850 = s848 ^ s849;+  const SWord32 s851 = s726 ^ s850;+  const SWord32 s852 = sbv_bv_u32_add(s847, s851);+  const SWord32 s853 = sbv_bv_u32_add(s697, s852);+  const SWord32 s854 = sbv_bv_u32_rotr(s853, 2);+  const SWord32 s855 = sbv_bv_u32_rotr(s853, 13);+  const SWord32 s856 = s854 ^ s855;+  const SWord32 s857 = sbv_bv_u32_rotr(s853, 22);+  const SWord32 s858 = s856 ^ s857;+  const SWord32 s859 = s731 & s853;+  const SWord32 s860 = s720 & s853;+  const SWord32 s861 = s859 ^ s860;+  const SWord32 s862 = s848 ^ s861;+  const SWord32 s863 = sbv_bv_u32_add(s858, s862);+  const SWord32 s864 = sbv_bv_u32_add(s758, s863);+  const SWord32 s865 = sbv_bv_u32_rotr(s864, 2);+  const SWord32 s866 = sbv_bv_u32_rotr(s864, 13);+  const SWord32 s867 = s865 ^ s866;+  const SWord32 s868 = sbv_bv_u32_rotr(s864, 22);+  const SWord32 s869 = s867 ^ s868;+  const SWord32 s870 = s853 & s864;+  const SWord32 s871 = s731 & s864;+  const SWord32 s872 = s870 ^ s871;+  const SWord32 s873 = s859 ^ s872;+  const SWord32 s874 = sbv_bv_u32_add(s869, s873);+  const SWord32 s875 = sbv_bv_u32_add(s786, s874);+  const SWord32 s876 = sbv_bv_u32_rotr(s875, 2);+  const SWord32 s877 = sbv_bv_u32_rotr(s875, 13);+  const SWord32 s878 = s876 ^ s877;+  const SWord32 s879 = sbv_bv_u32_rotr(s875, 22);+  const SWord32 s880 = s878 ^ s879;+  const SWord32 s881 = s864 & s875;+  const SWord32 s882 = s853 & s875;+  const SWord32 s883 = s881 ^ s882;+  const SWord32 s884 = s870 ^ s883;+  const SWord32 s885 = sbv_bv_u32_add(s880, s884);+  const SWord32 s886 = sbv_bv_u32_add(s814, s885);+  const SWord32 s887 = sbv_bv_u32_rotr(s886, 2);+  const SWord32 s888 = sbv_bv_u32_rotr(s886, 13);+  const SWord32 s889 = s887 ^ s888;+  const SWord32 s890 = sbv_bv_u32_rotr(s886, 22);+  const SWord32 s891 = s889 ^ s890;+  const SWord32 s892 = s875 & s886;+  const SWord32 s893 = s864 & s886;+  const SWord32 s894 = s892 ^ s893;+  const SWord32 s895 = s881 ^ s894;+  const SWord32 s896 = sbv_bv_u32_add(s891, s895);+  const SWord32 s897 = sbv_bv_u32_add(s842, s896);+  const SWord32 s898 = sbv_bv_u32_add(s842, s853);+  const SWord32 s899 = sbv_bv_u32_rotr(s898, 6);+  const SWord32 s900 = sbv_bv_u32_rotr(s898, 11);+  const SWord32 s901 = s899 ^ s900;+  const SWord32 s902 = sbv_bv_u32_rotr(s898, 25);+  const SWord32 s903 = s901 ^ s902;+  const SWord32 s904 = sbv_bv_u32_add(s759, s903);+  const SWord32 s905 = s815 & s898;+  const SWord32 s906 = ~s898;+  const SWord32 s907 = s787 & s906;+  const SWord32 s908 = s905 ^ s907;+  const SWord32 s909 = sbv_bv_u32_add(s904, s908);+  const SWord32 s911 = sbv_bv_u32_add(s909, 0x983e5152UL);+  const SWord32 s912 = sbv_bv_u32_rotr(s813, 17);+  const SWord32 s913 = sbv_bv_u32_rotr(s813, 19);+  const SWord32 s914 = s912 ^ s913;+  const SWord32 s915 = sbv_bv_u32_lshr(s813, 0x0000000aUL);+  const SWord32 s916 = s914 ^ s915;+  const SWord32 s917 = sbv_bv_u32_add(s640, s916);+  const SWord32 s918 = sbv_bv_u32_rotr(s386, 7);+  const SWord32 s919 = sbv_bv_u32_rotr(s386, 18);+  const SWord32 s920 = s918 ^ s919;+  const SWord32 s921 = sbv_bv_u32_lshr(s386, 0x00000003UL);+  const SWord32 s922 = s920 ^ s921;+  const SWord32 s923 = sbv_bv_u32_add(s917, s922);+  const SWord32 s924 = sbv_bv_u32_add(s368, s923);+  const SWord32 s925 = sbv_bv_u32_add(s911, s924);+  const SWord32 s926 = sbv_bv_u32_add(s864, s925);+  const SWord32 s927 = sbv_bv_u32_rotr(s926, 6);+  const SWord32 s928 = sbv_bv_u32_rotr(s926, 11);+  const SWord32 s929 = s927 ^ s928;+  const SWord32 s930 = sbv_bv_u32_rotr(s926, 25);+  const SWord32 s931 = s929 ^ s930;+  const SWord32 s932 = sbv_bv_u32_add(s787, s931);+  const SWord32 s933 = s898 & s926;+  const SWord32 s934 = ~s926;+  const SWord32 s935 = s815 & s934;+  const SWord32 s936 = s933 ^ s935;+  const SWord32 s937 = sbv_bv_u32_add(s932, s936);+  const SWord32 s939 = sbv_bv_u32_add(s937, 0xa831c66dUL);+  const SWord32 s940 = sbv_bv_u32_rotr(s841, 17);+  const SWord32 s941 = sbv_bv_u32_rotr(s841, 19);+  const SWord32 s942 = s940 ^ s941;+  const SWord32 s943 = sbv_bv_u32_lshr(s841, 0x0000000aUL);+  const SWord32 s944 = s942 ^ s943;+  const SWord32 s945 = sbv_bv_u32_add(s668, s944);+  const SWord32 s946 = sbv_bv_u32_rotr(s404, 7);+  const SWord32 s947 = sbv_bv_u32_rotr(s404, 18);+  const SWord32 s948 = s946 ^ s947;+  const SWord32 s949 = sbv_bv_u32_lshr(s404, 0x00000003UL);+  const SWord32 s950 = s948 ^ s949;+  const SWord32 s951 = sbv_bv_u32_add(s945, s950);+  const SWord32 s952 = sbv_bv_u32_add(s386, s951);+  const SWord32 s953 = sbv_bv_u32_add(s939, s952);+  const SWord32 s954 = sbv_bv_u32_add(s875, s953);+  const SWord32 s955 = sbv_bv_u32_rotr(s954, 6);+  const SWord32 s956 = sbv_bv_u32_rotr(s954, 11);+  const SWord32 s957 = s955 ^ s956;+  const SWord32 s958 = sbv_bv_u32_rotr(s954, 25);+  const SWord32 s959 = s957 ^ s958;+  const SWord32 s960 = sbv_bv_u32_add(s815, s959);+  const SWord32 s961 = s926 & s954;+  const SWord32 s962 = ~s954;+  const SWord32 s963 = s898 & s962;+  const SWord32 s964 = s961 ^ s963;+  const SWord32 s965 = sbv_bv_u32_add(s960, s964);+  const SWord32 s967 = sbv_bv_u32_add(s965, 0xb00327c8UL);+  const SWord32 s968 = sbv_bv_u32_rotr(s924, 17);+  const SWord32 s969 = sbv_bv_u32_rotr(s924, 19);+  const SWord32 s970 = s968 ^ s969;+  const SWord32 s971 = sbv_bv_u32_lshr(s924, 0x0000000aUL);+  const SWord32 s972 = s970 ^ s971;+  const SWord32 s973 = sbv_bv_u32_add(s696, s972);+  const SWord32 s974 = sbv_bv_u32_rotr(s422, 7);+  const SWord32 s975 = sbv_bv_u32_rotr(s422, 18);+  const SWord32 s976 = s974 ^ s975;+  const SWord32 s977 = sbv_bv_u32_lshr(s422, 0x00000003UL);+  const SWord32 s978 = s976 ^ s977;+  const SWord32 s979 = sbv_bv_u32_add(s973, s978);+  const SWord32 s980 = sbv_bv_u32_add(s404, s979);+  const SWord32 s981 = sbv_bv_u32_add(s967, s980);+  const SWord32 s982 = sbv_bv_u32_add(s886, s981);+  const SWord32 s983 = sbv_bv_u32_rotr(s982, 6);+  const SWord32 s984 = sbv_bv_u32_rotr(s982, 11);+  const SWord32 s985 = s983 ^ s984;+  const SWord32 s986 = sbv_bv_u32_rotr(s982, 25);+  const SWord32 s987 = s985 ^ s986;+  const SWord32 s988 = sbv_bv_u32_add(s898, s987);+  const SWord32 s989 = s954 & s982;+  const SWord32 s990 = ~s982;+  const SWord32 s991 = s926 & s990;+  const SWord32 s992 = s989 ^ s991;+  const SWord32 s993 = sbv_bv_u32_add(s988, s992);+  const SWord32 s995 = sbv_bv_u32_add(s993, 0xbf597fc7UL);+  const SWord32 s996 = sbv_bv_u32_rotr(s952, 17);+  const SWord32 s997 = sbv_bv_u32_rotr(s952, 19);+  const SWord32 s998 = s996 ^ s997;+  const SWord32 s999 = sbv_bv_u32_lshr(s952, 0x0000000aUL);+  const SWord32 s1000 = s998 ^ s999;+  const SWord32 s1001 = sbv_bv_u32_add(s757, s1000);+  const SWord32 s1002 = sbv_bv_u32_rotr(s473, 7);+  const SWord32 s1003 = sbv_bv_u32_rotr(s473, 18);+  const SWord32 s1004 = s1002 ^ s1003;+  const SWord32 s1005 = sbv_bv_u32_lshr(s473, 0x00000003UL);+  const SWord32 s1006 = s1004 ^ s1005;+  const SWord32 s1007 = sbv_bv_u32_add(s1001, s1006);+  const SWord32 s1008 = sbv_bv_u32_add(s422, s1007);+  const SWord32 s1009 = sbv_bv_u32_add(s995, s1008);+  const SWord32 s1010 = sbv_bv_u32_add(s897, s1009);+  const SWord32 s1011 = sbv_bv_u32_rotr(s897, 2);+  const SWord32 s1012 = sbv_bv_u32_rotr(s897, 13);+  const SWord32 s1013 = s1011 ^ s1012;+  const SWord32 s1014 = sbv_bv_u32_rotr(s897, 22);+  const SWord32 s1015 = s1013 ^ s1014;+  const SWord32 s1016 = s886 & s897;+  const SWord32 s1017 = s875 & s897;+  const SWord32 s1018 = s1016 ^ s1017;+  const SWord32 s1019 = s892 ^ s1018;+  const SWord32 s1020 = sbv_bv_u32_add(s1015, s1019);+  const SWord32 s1021 = sbv_bv_u32_add(s925, s1020);+  const SWord32 s1022 = sbv_bv_u32_rotr(s1021, 2);+  const SWord32 s1023 = sbv_bv_u32_rotr(s1021, 13);+  const SWord32 s1024 = s1022 ^ s1023;+  const SWord32 s1025 = sbv_bv_u32_rotr(s1021, 22);+  const SWord32 s1026 = s1024 ^ s1025;+  const SWord32 s1027 = s897 & s1021;+  const SWord32 s1028 = s886 & s1021;+  const SWord32 s1029 = s1027 ^ s1028;+  const SWord32 s1030 = s1016 ^ s1029;+  const SWord32 s1031 = sbv_bv_u32_add(s1026, s1030);+  const SWord32 s1032 = sbv_bv_u32_add(s953, s1031);+  const SWord32 s1033 = sbv_bv_u32_rotr(s1032, 2);+  const SWord32 s1034 = sbv_bv_u32_rotr(s1032, 13);+  const SWord32 s1035 = s1033 ^ s1034;+  const SWord32 s1036 = sbv_bv_u32_rotr(s1032, 22);+  const SWord32 s1037 = s1035 ^ s1036;+  const SWord32 s1038 = s1021 & s1032;+  const SWord32 s1039 = s897 & s1032;+  const SWord32 s1040 = s1038 ^ s1039;+  const SWord32 s1041 = s1027 ^ s1040;+  const SWord32 s1042 = sbv_bv_u32_add(s1037, s1041);+  const SWord32 s1043 = sbv_bv_u32_add(s981, s1042);+  const SWord32 s1044 = sbv_bv_u32_rotr(s1010, 6);+  const SWord32 s1045 = sbv_bv_u32_rotr(s1010, 11);+  const SWord32 s1046 = s1044 ^ s1045;+  const SWord32 s1047 = sbv_bv_u32_rotr(s1010, 25);+  const SWord32 s1048 = s1046 ^ s1047;+  const SWord32 s1049 = sbv_bv_u32_add(s926, s1048);+  const SWord32 s1050 = s982 & s1010;+  const SWord32 s1051 = ~s1010;+  const SWord32 s1052 = s954 & s1051;+  const SWord32 s1053 = s1050 ^ s1052;+  const SWord32 s1054 = sbv_bv_u32_add(s1049, s1053);+  const SWord32 s1056 = sbv_bv_u32_add(s1054, 0xc6e00bf3UL);+  const SWord32 s1057 = sbv_bv_u32_rotr(s980, 17);+  const SWord32 s1058 = sbv_bv_u32_rotr(s980, 19);+  const SWord32 s1059 = s1057 ^ s1058;+  const SWord32 s1060 = sbv_bv_u32_lshr(s980, 0x0000000aUL);+  const SWord32 s1061 = s1059 ^ s1060;+  const SWord32 s1062 = sbv_bv_u32_add(s785, s1061);+  const SWord32 s1063 = sbv_bv_u32_rotr(s491, 7);+  const SWord32 s1064 = sbv_bv_u32_rotr(s491, 18);+  const SWord32 s1065 = s1063 ^ s1064;+  const SWord32 s1066 = sbv_bv_u32_lshr(s491, 0x00000003UL);+  const SWord32 s1067 = s1065 ^ s1066;+  const SWord32 s1068 = sbv_bv_u32_add(s1062, s1067);+  const SWord32 s1069 = sbv_bv_u32_add(s473, s1068);+  const SWord32 s1070 = sbv_bv_u32_add(s1056, s1069);+  const SWord32 s1071 = sbv_bv_u32_add(s1021, s1070);+  const SWord32 s1072 = sbv_bv_u32_rotr(s1071, 6);+  const SWord32 s1073 = sbv_bv_u32_rotr(s1071, 11);+  const SWord32 s1074 = s1072 ^ s1073;+  const SWord32 s1075 = sbv_bv_u32_rotr(s1071, 25);+  const SWord32 s1076 = s1074 ^ s1075;+  const SWord32 s1077 = sbv_bv_u32_add(s954, s1076);+  const SWord32 s1078 = s1010 & s1071;+  const SWord32 s1079 = ~s1071;+  const SWord32 s1080 = s982 & s1079;+  const SWord32 s1081 = s1078 ^ s1080;+  const SWord32 s1082 = sbv_bv_u32_add(s1077, s1081);+  const SWord32 s1084 = sbv_bv_u32_add(s1082, 0xd5a79147UL);+  const SWord32 s1085 = sbv_bv_u32_rotr(s1008, 17);+  const SWord32 s1086 = sbv_bv_u32_rotr(s1008, 19);+  const SWord32 s1087 = s1085 ^ s1086;+  const SWord32 s1088 = sbv_bv_u32_lshr(s1008, 0x0000000aUL);+  const SWord32 s1089 = s1087 ^ s1088;+  const SWord32 s1090 = sbv_bv_u32_add(s813, s1089);+  const SWord32 s1091 = sbv_bv_u32_rotr(s509, 7);+  const SWord32 s1092 = sbv_bv_u32_rotr(s509, 18);+  const SWord32 s1093 = s1091 ^ s1092;+  const SWord32 s1094 = sbv_bv_u32_lshr(s509, 0x00000003UL);+  const SWord32 s1095 = s1093 ^ s1094;+  const SWord32 s1096 = sbv_bv_u32_add(s1090, s1095);+  const SWord32 s1097 = sbv_bv_u32_add(s491, s1096);+  const SWord32 s1098 = sbv_bv_u32_add(s1084, s1097);+  const SWord32 s1099 = sbv_bv_u32_add(s1032, s1098);+  const SWord32 s1100 = sbv_bv_u32_rotr(s1099, 6);+  const SWord32 s1101 = sbv_bv_u32_rotr(s1099, 11);+  const SWord32 s1102 = s1100 ^ s1101;+  const SWord32 s1103 = sbv_bv_u32_rotr(s1099, 25);+  const SWord32 s1104 = s1102 ^ s1103;+  const SWord32 s1105 = sbv_bv_u32_add(s982, s1104);+  const SWord32 s1106 = s1071 & s1099;+  const SWord32 s1107 = ~s1099;+  const SWord32 s1108 = s1010 & s1107;+  const SWord32 s1109 = s1106 ^ s1108;+  const SWord32 s1110 = sbv_bv_u32_add(s1105, s1109);+  const SWord32 s1112 = sbv_bv_u32_add(s1110, 0x06ca6351UL);+  const SWord32 s1113 = sbv_bv_u32_rotr(s1069, 17);+  const SWord32 s1114 = sbv_bv_u32_rotr(s1069, 19);+  const SWord32 s1115 = s1113 ^ s1114;+  const SWord32 s1116 = sbv_bv_u32_lshr(s1069, 0x0000000aUL);+  const SWord32 s1117 = s1115 ^ s1116;+  const SWord32 s1118 = sbv_bv_u32_add(s841, s1117);+  const SWord32 s1119 = sbv_bv_u32_rotr(s527, 7);+  const SWord32 s1120 = sbv_bv_u32_rotr(s527, 18);+  const SWord32 s1121 = s1119 ^ s1120;+  const SWord32 s1122 = sbv_bv_u32_lshr(s527, 0x00000003UL);+  const SWord32 s1123 = s1121 ^ s1122;+  const SWord32 s1124 = sbv_bv_u32_add(s1118, s1123);+  const SWord32 s1125 = sbv_bv_u32_add(s509, s1124);+  const SWord32 s1126 = sbv_bv_u32_add(s1112, s1125);+  const SWord32 s1127 = sbv_bv_u32_add(s1043, s1126);+  const SWord32 s1128 = sbv_bv_u32_rotr(s1127, 6);+  const SWord32 s1129 = sbv_bv_u32_rotr(s1127, 11);+  const SWord32 s1130 = s1128 ^ s1129;+  const SWord32 s1131 = sbv_bv_u32_rotr(s1127, 25);+  const SWord32 s1132 = s1130 ^ s1131;+  const SWord32 s1133 = sbv_bv_u32_add(s1010, s1132);+  const SWord32 s1134 = s1099 & s1127;+  const SWord32 s1135 = ~s1127;+  const SWord32 s1136 = s1071 & s1135;+  const SWord32 s1137 = s1134 ^ s1136;+  const SWord32 s1138 = sbv_bv_u32_add(s1133, s1137);+  const SWord32 s1140 = sbv_bv_u32_add(s1138, 0x14292967UL);+  const SWord32 s1141 = sbv_bv_u32_rotr(s1097, 17);+  const SWord32 s1142 = sbv_bv_u32_rotr(s1097, 19);+  const SWord32 s1143 = s1141 ^ s1142;+  const SWord32 s1144 = sbv_bv_u32_lshr(s1097, 0x0000000aUL);+  const SWord32 s1145 = s1143 ^ s1144;+  const SWord32 s1146 = sbv_bv_u32_add(s924, s1145);+  const SWord32 s1147 = sbv_bv_u32_rotr(s612, 7);+  const SWord32 s1148 = sbv_bv_u32_rotr(s612, 18);+  const SWord32 s1149 = s1147 ^ s1148;+  const SWord32 s1150 = sbv_bv_u32_lshr(s612, 0x00000003UL);+  const SWord32 s1151 = s1149 ^ s1150;+  const SWord32 s1152 = sbv_bv_u32_add(s1146, s1151);+  const SWord32 s1153 = sbv_bv_u32_add(s527, s1152);+  const SWord32 s1154 = sbv_bv_u32_add(s1140, s1153);+  const SWord32 s1155 = sbv_bv_u32_rotr(s1043, 2);+  const SWord32 s1156 = sbv_bv_u32_rotr(s1043, 13);+  const SWord32 s1157 = s1155 ^ s1156;+  const SWord32 s1158 = sbv_bv_u32_rotr(s1043, 22);+  const SWord32 s1159 = s1157 ^ s1158;+  const SWord32 s1160 = s1032 & s1043;+  const SWord32 s1161 = s1021 & s1043;+  const SWord32 s1162 = s1160 ^ s1161;+  const SWord32 s1163 = s1038 ^ s1162;+  const SWord32 s1164 = sbv_bv_u32_add(s1159, s1163);+  const SWord32 s1165 = sbv_bv_u32_add(s1009, s1164);+  const SWord32 s1166 = sbv_bv_u32_rotr(s1165, 2);+  const SWord32 s1167 = sbv_bv_u32_rotr(s1165, 13);+  const SWord32 s1168 = s1166 ^ s1167;+  const SWord32 s1169 = sbv_bv_u32_rotr(s1165, 22);+  const SWord32 s1170 = s1168 ^ s1169;+  const SWord32 s1171 = s1043 & s1165;+  const SWord32 s1172 = s1032 & s1165;+  const SWord32 s1173 = s1171 ^ s1172;+  const SWord32 s1174 = s1160 ^ s1173;+  const SWord32 s1175 = sbv_bv_u32_add(s1170, s1174);+  const SWord32 s1176 = sbv_bv_u32_add(s1070, s1175);+  const SWord32 s1177 = sbv_bv_u32_rotr(s1176, 2);+  const SWord32 s1178 = sbv_bv_u32_rotr(s1176, 13);+  const SWord32 s1179 = s1177 ^ s1178;+  const SWord32 s1180 = sbv_bv_u32_rotr(s1176, 22);+  const SWord32 s1181 = s1179 ^ s1180;+  const SWord32 s1182 = s1165 & s1176;+  const SWord32 s1183 = s1043 & s1176;+  const SWord32 s1184 = s1182 ^ s1183;+  const SWord32 s1185 = s1171 ^ s1184;+  const SWord32 s1186 = sbv_bv_u32_add(s1181, s1185);+  const SWord32 s1187 = sbv_bv_u32_add(s1098, s1186);+  const SWord32 s1188 = sbv_bv_u32_rotr(s1187, 2);+  const SWord32 s1189 = sbv_bv_u32_rotr(s1187, 13);+  const SWord32 s1190 = s1188 ^ s1189;+  const SWord32 s1191 = sbv_bv_u32_rotr(s1187, 22);+  const SWord32 s1192 = s1190 ^ s1191;+  const SWord32 s1193 = s1176 & s1187;+  const SWord32 s1194 = s1165 & s1187;+  const SWord32 s1195 = s1193 ^ s1194;+  const SWord32 s1196 = s1182 ^ s1195;+  const SWord32 s1197 = sbv_bv_u32_add(s1192, s1196);+  const SWord32 s1198 = sbv_bv_u32_add(s1126, s1197);+  const SWord32 s1199 = sbv_bv_u32_rotr(s1198, 2);+  const SWord32 s1200 = sbv_bv_u32_rotr(s1198, 13);+  const SWord32 s1201 = s1199 ^ s1200;+  const SWord32 s1202 = sbv_bv_u32_rotr(s1198, 22);+  const SWord32 s1203 = s1201 ^ s1202;+  const SWord32 s1204 = s1187 & s1198;+  const SWord32 s1205 = s1176 & s1198;+  const SWord32 s1206 = s1204 ^ s1205;+  const SWord32 s1207 = s1193 ^ s1206;+  const SWord32 s1208 = sbv_bv_u32_add(s1203, s1207);+  const SWord32 s1209 = sbv_bv_u32_add(s1154, s1208);+  const SWord32 s1210 = sbv_bv_u32_add(s1154, s1165);+  const SWord32 s1211 = sbv_bv_u32_rotr(s1210, 6);+  const SWord32 s1212 = sbv_bv_u32_rotr(s1210, 11);+  const SWord32 s1213 = s1211 ^ s1212;+  const SWord32 s1214 = sbv_bv_u32_rotr(s1210, 25);+  const SWord32 s1215 = s1213 ^ s1214;+  const SWord32 s1216 = sbv_bv_u32_add(s1071, s1215);+  const SWord32 s1217 = s1127 & s1210;+  const SWord32 s1218 = ~s1210;+  const SWord32 s1219 = s1099 & s1218;+  const SWord32 s1220 = s1217 ^ s1219;+  const SWord32 s1221 = sbv_bv_u32_add(s1216, s1220);+  const SWord32 s1223 = sbv_bv_u32_add(s1221, 0x27b70a85UL);+  const SWord32 s1224 = sbv_bv_u32_rotr(s1125, 17);+  const SWord32 s1225 = sbv_bv_u32_rotr(s1125, 19);+  const SWord32 s1226 = s1224 ^ s1225;+  const SWord32 s1227 = sbv_bv_u32_lshr(s1125, 0x0000000aUL);+  const SWord32 s1228 = s1226 ^ s1227;+  const SWord32 s1229 = sbv_bv_u32_add(s952, s1228);+  const SWord32 s1230 = sbv_bv_u32_rotr(s640, 7);+  const SWord32 s1231 = sbv_bv_u32_rotr(s640, 18);+  const SWord32 s1232 = s1230 ^ s1231;+  const SWord32 s1233 = sbv_bv_u32_lshr(s640, 0x00000003UL);+  const SWord32 s1234 = s1232 ^ s1233;+  const SWord32 s1235 = sbv_bv_u32_add(s1229, s1234);+  const SWord32 s1236 = sbv_bv_u32_add(s612, s1235);+  const SWord32 s1237 = sbv_bv_u32_add(s1223, s1236);+  const SWord32 s1238 = sbv_bv_u32_add(s1176, s1237);+  const SWord32 s1239 = sbv_bv_u32_rotr(s1238, 6);+  const SWord32 s1240 = sbv_bv_u32_rotr(s1238, 11);+  const SWord32 s1241 = s1239 ^ s1240;+  const SWord32 s1242 = sbv_bv_u32_rotr(s1238, 25);+  const SWord32 s1243 = s1241 ^ s1242;+  const SWord32 s1244 = sbv_bv_u32_add(s1099, s1243);+  const SWord32 s1245 = s1210 & s1238;+  const SWord32 s1246 = ~s1238;+  const SWord32 s1247 = s1127 & s1246;+  const SWord32 s1248 = s1245 ^ s1247;+  const SWord32 s1249 = sbv_bv_u32_add(s1244, s1248);+  const SWord32 s1251 = sbv_bv_u32_add(s1249, 0x2e1b2138UL);+  const SWord32 s1252 = sbv_bv_u32_rotr(s1153, 17);+  const SWord32 s1253 = sbv_bv_u32_rotr(s1153, 19);+  const SWord32 s1254 = s1252 ^ s1253;+  const SWord32 s1255 = sbv_bv_u32_lshr(s1153, 0x0000000aUL);+  const SWord32 s1256 = s1254 ^ s1255;+  const SWord32 s1257 = sbv_bv_u32_add(s980, s1256);+  const SWord32 s1258 = sbv_bv_u32_rotr(s668, 7);+  const SWord32 s1259 = sbv_bv_u32_rotr(s668, 18);+  const SWord32 s1260 = s1258 ^ s1259;+  const SWord32 s1261 = sbv_bv_u32_lshr(s668, 0x00000003UL);+  const SWord32 s1262 = s1260 ^ s1261;+  const SWord32 s1263 = sbv_bv_u32_add(s1257, s1262);+  const SWord32 s1264 = sbv_bv_u32_add(s640, s1263);+  const SWord32 s1265 = sbv_bv_u32_add(s1251, s1264);+  const SWord32 s1266 = sbv_bv_u32_add(s1187, s1265);+  const SWord32 s1267 = sbv_bv_u32_rotr(s1266, 6);+  const SWord32 s1268 = sbv_bv_u32_rotr(s1266, 11);+  const SWord32 s1269 = s1267 ^ s1268;+  const SWord32 s1270 = sbv_bv_u32_rotr(s1266, 25);+  const SWord32 s1271 = s1269 ^ s1270;+  const SWord32 s1272 = sbv_bv_u32_add(s1127, s1271);+  const SWord32 s1273 = s1238 & s1266;+  const SWord32 s1274 = ~s1266;+  const SWord32 s1275 = s1210 & s1274;+  const SWord32 s1276 = s1273 ^ s1275;+  const SWord32 s1277 = sbv_bv_u32_add(s1272, s1276);+  const SWord32 s1279 = sbv_bv_u32_add(s1277, 0x4d2c6dfcUL);+  const SWord32 s1280 = sbv_bv_u32_rotr(s1236, 17);+  const SWord32 s1281 = sbv_bv_u32_rotr(s1236, 19);+  const SWord32 s1282 = s1280 ^ s1281;+  const SWord32 s1283 = sbv_bv_u32_lshr(s1236, 0x0000000aUL);+  const SWord32 s1284 = s1282 ^ s1283;+  const SWord32 s1285 = sbv_bv_u32_add(s1008, s1284);+  const SWord32 s1286 = sbv_bv_u32_rotr(s696, 7);+  const SWord32 s1287 = sbv_bv_u32_rotr(s696, 18);+  const SWord32 s1288 = s1286 ^ s1287;+  const SWord32 s1289 = sbv_bv_u32_lshr(s696, 0x00000003UL);+  const SWord32 s1290 = s1288 ^ s1289;+  const SWord32 s1291 = sbv_bv_u32_add(s1285, s1290);+  const SWord32 s1292 = sbv_bv_u32_add(s668, s1291);+  const SWord32 s1293 = sbv_bv_u32_add(s1279, s1292);+  const SWord32 s1294 = sbv_bv_u32_add(s1198, s1293);+  const SWord32 s1295 = sbv_bv_u32_rotr(s1294, 6);+  const SWord32 s1296 = sbv_bv_u32_rotr(s1294, 11);+  const SWord32 s1297 = s1295 ^ s1296;+  const SWord32 s1298 = sbv_bv_u32_rotr(s1294, 25);+  const SWord32 s1299 = s1297 ^ s1298;+  const SWord32 s1300 = sbv_bv_u32_add(s1210, s1299);+  const SWord32 s1301 = s1266 & s1294;+  const SWord32 s1302 = ~s1294;+  const SWord32 s1303 = s1238 & s1302;+  const SWord32 s1304 = s1301 ^ s1303;+  const SWord32 s1305 = sbv_bv_u32_add(s1300, s1304);+  const SWord32 s1307 = sbv_bv_u32_add(s1305, 0x53380d13UL);+  const SWord32 s1308 = sbv_bv_u32_rotr(s1264, 17);+  const SWord32 s1309 = sbv_bv_u32_rotr(s1264, 19);+  const SWord32 s1310 = s1308 ^ s1309;+  const SWord32 s1311 = sbv_bv_u32_lshr(s1264, 0x0000000aUL);+  const SWord32 s1312 = s1310 ^ s1311;+  const SWord32 s1313 = sbv_bv_u32_add(s1069, s1312);+  const SWord32 s1314 = sbv_bv_u32_rotr(s757, 7);+  const SWord32 s1315 = sbv_bv_u32_rotr(s757, 18);+  const SWord32 s1316 = s1314 ^ s1315;+  const SWord32 s1317 = sbv_bv_u32_lshr(s757, 0x00000003UL);+  const SWord32 s1318 = s1316 ^ s1317;+  const SWord32 s1319 = sbv_bv_u32_add(s1313, s1318);+  const SWord32 s1320 = sbv_bv_u32_add(s696, s1319);+  const SWord32 s1321 = sbv_bv_u32_add(s1307, s1320);+  const SWord32 s1322 = sbv_bv_u32_add(s1209, s1321);+  const SWord32 s1323 = sbv_bv_u32_rotr(s1209, 2);+  const SWord32 s1324 = sbv_bv_u32_rotr(s1209, 13);+  const SWord32 s1325 = s1323 ^ s1324;+  const SWord32 s1326 = sbv_bv_u32_rotr(s1209, 22);+  const SWord32 s1327 = s1325 ^ s1326;+  const SWord32 s1328 = s1198 & s1209;+  const SWord32 s1329 = s1187 & s1209;+  const SWord32 s1330 = s1328 ^ s1329;+  const SWord32 s1331 = s1204 ^ s1330;+  const SWord32 s1332 = sbv_bv_u32_add(s1327, s1331);+  const SWord32 s1333 = sbv_bv_u32_add(s1237, s1332);+  const SWord32 s1334 = sbv_bv_u32_rotr(s1333, 2);+  const SWord32 s1335 = sbv_bv_u32_rotr(s1333, 13);+  const SWord32 s1336 = s1334 ^ s1335;+  const SWord32 s1337 = sbv_bv_u32_rotr(s1333, 22);+  const SWord32 s1338 = s1336 ^ s1337;+  const SWord32 s1339 = s1209 & s1333;+  const SWord32 s1340 = s1198 & s1333;+  const SWord32 s1341 = s1339 ^ s1340;+  const SWord32 s1342 = s1328 ^ s1341;+  const SWord32 s1343 = sbv_bv_u32_add(s1338, s1342);+  const SWord32 s1344 = sbv_bv_u32_add(s1265, s1343);+  const SWord32 s1345 = sbv_bv_u32_rotr(s1344, 2);+  const SWord32 s1346 = sbv_bv_u32_rotr(s1344, 13);+  const SWord32 s1347 = s1345 ^ s1346;+  const SWord32 s1348 = sbv_bv_u32_rotr(s1344, 22);+  const SWord32 s1349 = s1347 ^ s1348;+  const SWord32 s1350 = s1333 & s1344;+  const SWord32 s1351 = s1209 & s1344;+  const SWord32 s1352 = s1350 ^ s1351;+  const SWord32 s1353 = s1339 ^ s1352;+  const SWord32 s1354 = sbv_bv_u32_add(s1349, s1353);+  const SWord32 s1355 = sbv_bv_u32_add(s1293, s1354);+  const SWord32 s1356 = sbv_bv_u32_rotr(s1322, 6);+  const SWord32 s1357 = sbv_bv_u32_rotr(s1322, 11);+  const SWord32 s1358 = s1356 ^ s1357;+  const SWord32 s1359 = sbv_bv_u32_rotr(s1322, 25);+  const SWord32 s1360 = s1358 ^ s1359;+  const SWord32 s1361 = sbv_bv_u32_add(s1238, s1360);+  const SWord32 s1362 = s1294 & s1322;+  const SWord32 s1363 = ~s1322;+  const SWord32 s1364 = s1266 & s1363;+  const SWord32 s1365 = s1362 ^ s1364;+  const SWord32 s1366 = sbv_bv_u32_add(s1361, s1365);+  const SWord32 s1368 = sbv_bv_u32_add(s1366, 0x650a7354UL);+  const SWord32 s1369 = sbv_bv_u32_rotr(s1292, 17);+  const SWord32 s1370 = sbv_bv_u32_rotr(s1292, 19);+  const SWord32 s1371 = s1369 ^ s1370;+  const SWord32 s1372 = sbv_bv_u32_lshr(s1292, 0x0000000aUL);+  const SWord32 s1373 = s1371 ^ s1372;+  const SWord32 s1374 = sbv_bv_u32_add(s1097, s1373);+  const SWord32 s1375 = sbv_bv_u32_rotr(s785, 7);+  const SWord32 s1376 = sbv_bv_u32_rotr(s785, 18);+  const SWord32 s1377 = s1375 ^ s1376;+  const SWord32 s1378 = sbv_bv_u32_lshr(s785, 0x00000003UL);+  const SWord32 s1379 = s1377 ^ s1378;+  const SWord32 s1380 = sbv_bv_u32_add(s1374, s1379);+  const SWord32 s1381 = sbv_bv_u32_add(s757, s1380);+  const SWord32 s1382 = sbv_bv_u32_add(s1368, s1381);+  const SWord32 s1383 = sbv_bv_u32_add(s1333, s1382);+  const SWord32 s1384 = sbv_bv_u32_rotr(s1383, 6);+  const SWord32 s1385 = sbv_bv_u32_rotr(s1383, 11);+  const SWord32 s1386 = s1384 ^ s1385;+  const SWord32 s1387 = sbv_bv_u32_rotr(s1383, 25);+  const SWord32 s1388 = s1386 ^ s1387;+  const SWord32 s1389 = sbv_bv_u32_add(s1266, s1388);+  const SWord32 s1390 = s1322 & s1383;+  const SWord32 s1391 = ~s1383;+  const SWord32 s1392 = s1294 & s1391;+  const SWord32 s1393 = s1390 ^ s1392;+  const SWord32 s1394 = sbv_bv_u32_add(s1389, s1393);+  const SWord32 s1396 = sbv_bv_u32_add(s1394, 0x766a0abbUL);+  const SWord32 s1397 = sbv_bv_u32_rotr(s1320, 17);+  const SWord32 s1398 = sbv_bv_u32_rotr(s1320, 19);+  const SWord32 s1399 = s1397 ^ s1398;+  const SWord32 s1400 = sbv_bv_u32_lshr(s1320, 0x0000000aUL);+  const SWord32 s1401 = s1399 ^ s1400;+  const SWord32 s1402 = sbv_bv_u32_add(s1125, s1401);+  const SWord32 s1403 = sbv_bv_u32_rotr(s813, 7);+  const SWord32 s1404 = sbv_bv_u32_rotr(s813, 18);+  const SWord32 s1405 = s1403 ^ s1404;+  const SWord32 s1406 = sbv_bv_u32_lshr(s813, 0x00000003UL);+  const SWord32 s1407 = s1405 ^ s1406;+  const SWord32 s1408 = sbv_bv_u32_add(s1402, s1407);+  const SWord32 s1409 = sbv_bv_u32_add(s785, s1408);+  const SWord32 s1410 = sbv_bv_u32_add(s1396, s1409);+  const SWord32 s1411 = sbv_bv_u32_add(s1344, s1410);+  const SWord32 s1412 = sbv_bv_u32_rotr(s1411, 6);+  const SWord32 s1413 = sbv_bv_u32_rotr(s1411, 11);+  const SWord32 s1414 = s1412 ^ s1413;+  const SWord32 s1415 = sbv_bv_u32_rotr(s1411, 25);+  const SWord32 s1416 = s1414 ^ s1415;+  const SWord32 s1417 = sbv_bv_u32_add(s1294, s1416);+  const SWord32 s1418 = s1383 & s1411;+  const SWord32 s1419 = ~s1411;+  const SWord32 s1420 = s1322 & s1419;+  const SWord32 s1421 = s1418 ^ s1420;+  const SWord32 s1422 = sbv_bv_u32_add(s1417, s1421);+  const SWord32 s1424 = sbv_bv_u32_add(s1422, 0x81c2c92eUL);+  const SWord32 s1425 = sbv_bv_u32_rotr(s1381, 17);+  const SWord32 s1426 = sbv_bv_u32_rotr(s1381, 19);+  const SWord32 s1427 = s1425 ^ s1426;+  const SWord32 s1428 = sbv_bv_u32_lshr(s1381, 0x0000000aUL);+  const SWord32 s1429 = s1427 ^ s1428;+  const SWord32 s1430 = sbv_bv_u32_add(s1153, s1429);+  const SWord32 s1431 = sbv_bv_u32_rotr(s841, 7);+  const SWord32 s1432 = sbv_bv_u32_rotr(s841, 18);+  const SWord32 s1433 = s1431 ^ s1432;+  const SWord32 s1434 = sbv_bv_u32_lshr(s841, 0x00000003UL);+  const SWord32 s1435 = s1433 ^ s1434;+  const SWord32 s1436 = sbv_bv_u32_add(s1430, s1435);+  const SWord32 s1437 = sbv_bv_u32_add(s813, s1436);+  const SWord32 s1438 = sbv_bv_u32_add(s1424, s1437);+  const SWord32 s1439 = sbv_bv_u32_add(s1355, s1438);+  const SWord32 s1440 = sbv_bv_u32_rotr(s1439, 6);+  const SWord32 s1441 = sbv_bv_u32_rotr(s1439, 11);+  const SWord32 s1442 = s1440 ^ s1441;+  const SWord32 s1443 = sbv_bv_u32_rotr(s1439, 25);+  const SWord32 s1444 = s1442 ^ s1443;+  const SWord32 s1445 = sbv_bv_u32_add(s1322, s1444);+  const SWord32 s1446 = s1411 & s1439;+  const SWord32 s1447 = ~s1439;+  const SWord32 s1448 = s1383 & s1447;+  const SWord32 s1449 = s1446 ^ s1448;+  const SWord32 s1450 = sbv_bv_u32_add(s1445, s1449);+  const SWord32 s1452 = sbv_bv_u32_add(s1450, 0x92722c85UL);+  const SWord32 s1453 = sbv_bv_u32_rotr(s1409, 17);+  const SWord32 s1454 = sbv_bv_u32_rotr(s1409, 19);+  const SWord32 s1455 = s1453 ^ s1454;+  const SWord32 s1456 = sbv_bv_u32_lshr(s1409, 0x0000000aUL);+  const SWord32 s1457 = s1455 ^ s1456;+  const SWord32 s1458 = sbv_bv_u32_add(s1236, s1457);+  const SWord32 s1459 = sbv_bv_u32_rotr(s924, 7);+  const SWord32 s1460 = sbv_bv_u32_rotr(s924, 18);+  const SWord32 s1461 = s1459 ^ s1460;+  const SWord32 s1462 = sbv_bv_u32_lshr(s924, 0x00000003UL);+  const SWord32 s1463 = s1461 ^ s1462;+  const SWord32 s1464 = sbv_bv_u32_add(s1458, s1463);+  const SWord32 s1465 = sbv_bv_u32_add(s841, s1464);+  const SWord32 s1466 = sbv_bv_u32_add(s1452, s1465);+  const SWord32 s1467 = sbv_bv_u32_rotr(s1355, 2);+  const SWord32 s1468 = sbv_bv_u32_rotr(s1355, 13);+  const SWord32 s1469 = s1467 ^ s1468;+  const SWord32 s1470 = sbv_bv_u32_rotr(s1355, 22);+  const SWord32 s1471 = s1469 ^ s1470;+  const SWord32 s1472 = s1344 & s1355;+  const SWord32 s1473 = s1333 & s1355;+  const SWord32 s1474 = s1472 ^ s1473;+  const SWord32 s1475 = s1350 ^ s1474;+  const SWord32 s1476 = sbv_bv_u32_add(s1471, s1475);+  const SWord32 s1477 = sbv_bv_u32_add(s1321, s1476);+  const SWord32 s1478 = sbv_bv_u32_rotr(s1477, 2);+  const SWord32 s1479 = sbv_bv_u32_rotr(s1477, 13);+  const SWord32 s1480 = s1478 ^ s1479;+  const SWord32 s1481 = sbv_bv_u32_rotr(s1477, 22);+  const SWord32 s1482 = s1480 ^ s1481;+  const SWord32 s1483 = s1355 & s1477;+  const SWord32 s1484 = s1344 & s1477;+  const SWord32 s1485 = s1483 ^ s1484;+  const SWord32 s1486 = s1472 ^ s1485;+  const SWord32 s1487 = sbv_bv_u32_add(s1482, s1486);+  const SWord32 s1488 = sbv_bv_u32_add(s1382, s1487);+  const SWord32 s1489 = sbv_bv_u32_rotr(s1488, 2);+  const SWord32 s1490 = sbv_bv_u32_rotr(s1488, 13);+  const SWord32 s1491 = s1489 ^ s1490;+  const SWord32 s1492 = sbv_bv_u32_rotr(s1488, 22);+  const SWord32 s1493 = s1491 ^ s1492;+  const SWord32 s1494 = s1477 & s1488;+  const SWord32 s1495 = s1355 & s1488;+  const SWord32 s1496 = s1494 ^ s1495;+  const SWord32 s1497 = s1483 ^ s1496;+  const SWord32 s1498 = sbv_bv_u32_add(s1493, s1497);+  const SWord32 s1499 = sbv_bv_u32_add(s1410, s1498);+  const SWord32 s1500 = sbv_bv_u32_rotr(s1499, 2);+  const SWord32 s1501 = sbv_bv_u32_rotr(s1499, 13);+  const SWord32 s1502 = s1500 ^ s1501;+  const SWord32 s1503 = sbv_bv_u32_rotr(s1499, 22);+  const SWord32 s1504 = s1502 ^ s1503;+  const SWord32 s1505 = s1488 & s1499;+  const SWord32 s1506 = s1477 & s1499;+  const SWord32 s1507 = s1505 ^ s1506;+  const SWord32 s1508 = s1494 ^ s1507;+  const SWord32 s1509 = sbv_bv_u32_add(s1504, s1508);+  const SWord32 s1510 = sbv_bv_u32_add(s1438, s1509);+  const SWord32 s1511 = sbv_bv_u32_rotr(s1510, 2);+  const SWord32 s1512 = sbv_bv_u32_rotr(s1510, 13);+  const SWord32 s1513 = s1511 ^ s1512;+  const SWord32 s1514 = sbv_bv_u32_rotr(s1510, 22);+  const SWord32 s1515 = s1513 ^ s1514;+  const SWord32 s1516 = s1499 & s1510;+  const SWord32 s1517 = s1488 & s1510;+  const SWord32 s1518 = s1516 ^ s1517;+  const SWord32 s1519 = s1505 ^ s1518;+  const SWord32 s1520 = sbv_bv_u32_add(s1515, s1519);+  const SWord32 s1521 = sbv_bv_u32_add(s1466, s1520);+  const SWord32 s1522 = sbv_bv_u32_add(s1466, s1477);+  const SWord32 s1523 = sbv_bv_u32_rotr(s1522, 6);+  const SWord32 s1524 = sbv_bv_u32_rotr(s1522, 11);+  const SWord32 s1525 = s1523 ^ s1524;+  const SWord32 s1526 = sbv_bv_u32_rotr(s1522, 25);+  const SWord32 s1527 = s1525 ^ s1526;+  const SWord32 s1528 = sbv_bv_u32_add(s1383, s1527);+  const SWord32 s1529 = s1439 & s1522;+  const SWord32 s1530 = ~s1522;+  const SWord32 s1531 = s1411 & s1530;+  const SWord32 s1532 = s1529 ^ s1531;+  const SWord32 s1533 = sbv_bv_u32_add(s1528, s1532);+  const SWord32 s1535 = sbv_bv_u32_add(s1533, 0xa2bfe8a1UL);+  const SWord32 s1536 = sbv_bv_u32_rotr(s1437, 17);+  const SWord32 s1537 = sbv_bv_u32_rotr(s1437, 19);+  const SWord32 s1538 = s1536 ^ s1537;+  const SWord32 s1539 = sbv_bv_u32_lshr(s1437, 0x0000000aUL);+  const SWord32 s1540 = s1538 ^ s1539;+  const SWord32 s1541 = sbv_bv_u32_add(s1264, s1540);+  const SWord32 s1542 = sbv_bv_u32_rotr(s952, 7);+  const SWord32 s1543 = sbv_bv_u32_rotr(s952, 18);+  const SWord32 s1544 = s1542 ^ s1543;+  const SWord32 s1545 = sbv_bv_u32_lshr(s952, 0x00000003UL);+  const SWord32 s1546 = s1544 ^ s1545;+  const SWord32 s1547 = sbv_bv_u32_add(s1541, s1546);+  const SWord32 s1548 = sbv_bv_u32_add(s924, s1547);+  const SWord32 s1549 = sbv_bv_u32_add(s1535, s1548);+  const SWord32 s1550 = sbv_bv_u32_add(s1488, s1549);+  const SWord32 s1551 = sbv_bv_u32_rotr(s1550, 6);+  const SWord32 s1552 = sbv_bv_u32_rotr(s1550, 11);+  const SWord32 s1553 = s1551 ^ s1552;+  const SWord32 s1554 = sbv_bv_u32_rotr(s1550, 25);+  const SWord32 s1555 = s1553 ^ s1554;+  const SWord32 s1556 = sbv_bv_u32_add(s1411, s1555);+  const SWord32 s1557 = s1522 & s1550;+  const SWord32 s1558 = ~s1550;+  const SWord32 s1559 = s1439 & s1558;+  const SWord32 s1560 = s1557 ^ s1559;+  const SWord32 s1561 = sbv_bv_u32_add(s1556, s1560);+  const SWord32 s1563 = sbv_bv_u32_add(s1561, 0xa81a664bUL);+  const SWord32 s1564 = sbv_bv_u32_rotr(s1465, 17);+  const SWord32 s1565 = sbv_bv_u32_rotr(s1465, 19);+  const SWord32 s1566 = s1564 ^ s1565;+  const SWord32 s1567 = sbv_bv_u32_lshr(s1465, 0x0000000aUL);+  const SWord32 s1568 = s1566 ^ s1567;+  const SWord32 s1569 = sbv_bv_u32_add(s1292, s1568);+  const SWord32 s1570 = sbv_bv_u32_rotr(s980, 7);+  const SWord32 s1571 = sbv_bv_u32_rotr(s980, 18);+  const SWord32 s1572 = s1570 ^ s1571;+  const SWord32 s1573 = sbv_bv_u32_lshr(s980, 0x00000003UL);+  const SWord32 s1574 = s1572 ^ s1573;+  const SWord32 s1575 = sbv_bv_u32_add(s1569, s1574);+  const SWord32 s1576 = sbv_bv_u32_add(s952, s1575);+  const SWord32 s1577 = sbv_bv_u32_add(s1563, s1576);+  const SWord32 s1578 = sbv_bv_u32_add(s1499, s1577);+  const SWord32 s1579 = sbv_bv_u32_rotr(s1578, 6);+  const SWord32 s1580 = sbv_bv_u32_rotr(s1578, 11);+  const SWord32 s1581 = s1579 ^ s1580;+  const SWord32 s1582 = sbv_bv_u32_rotr(s1578, 25);+  const SWord32 s1583 = s1581 ^ s1582;+  const SWord32 s1584 = sbv_bv_u32_add(s1439, s1583);+  const SWord32 s1585 = s1550 & s1578;+  const SWord32 s1586 = ~s1578;+  const SWord32 s1587 = s1522 & s1586;+  const SWord32 s1588 = s1585 ^ s1587;+  const SWord32 s1589 = sbv_bv_u32_add(s1584, s1588);+  const SWord32 s1591 = sbv_bv_u32_add(s1589, 0xc24b8b70UL);+  const SWord32 s1592 = sbv_bv_u32_rotr(s1548, 17);+  const SWord32 s1593 = sbv_bv_u32_rotr(s1548, 19);+  const SWord32 s1594 = s1592 ^ s1593;+  const SWord32 s1595 = sbv_bv_u32_lshr(s1548, 0x0000000aUL);+  const SWord32 s1596 = s1594 ^ s1595;+  const SWord32 s1597 = sbv_bv_u32_add(s1320, s1596);+  const SWord32 s1598 = sbv_bv_u32_rotr(s1008, 7);+  const SWord32 s1599 = sbv_bv_u32_rotr(s1008, 18);+  const SWord32 s1600 = s1598 ^ s1599;+  const SWord32 s1601 = sbv_bv_u32_lshr(s1008, 0x00000003UL);+  const SWord32 s1602 = s1600 ^ s1601;+  const SWord32 s1603 = sbv_bv_u32_add(s1597, s1602);+  const SWord32 s1604 = sbv_bv_u32_add(s980, s1603);+  const SWord32 s1605 = sbv_bv_u32_add(s1591, s1604);+  const SWord32 s1606 = sbv_bv_u32_add(s1510, s1605);+  const SWord32 s1607 = sbv_bv_u32_rotr(s1606, 6);+  const SWord32 s1608 = sbv_bv_u32_rotr(s1606, 11);+  const SWord32 s1609 = s1607 ^ s1608;+  const SWord32 s1610 = sbv_bv_u32_rotr(s1606, 25);+  const SWord32 s1611 = s1609 ^ s1610;+  const SWord32 s1612 = sbv_bv_u32_add(s1522, s1611);+  const SWord32 s1613 = s1578 & s1606;+  const SWord32 s1614 = ~s1606;+  const SWord32 s1615 = s1550 & s1614;+  const SWord32 s1616 = s1613 ^ s1615;+  const SWord32 s1617 = sbv_bv_u32_add(s1612, s1616);+  const SWord32 s1619 = sbv_bv_u32_add(s1617, 0xc76c51a3UL);+  const SWord32 s1620 = sbv_bv_u32_rotr(s1576, 17);+  const SWord32 s1621 = sbv_bv_u32_rotr(s1576, 19);+  const SWord32 s1622 = s1620 ^ s1621;+  const SWord32 s1623 = sbv_bv_u32_lshr(s1576, 0x0000000aUL);+  const SWord32 s1624 = s1622 ^ s1623;+  const SWord32 s1625 = sbv_bv_u32_add(s1381, s1624);+  const SWord32 s1626 = sbv_bv_u32_rotr(s1069, 7);+  const SWord32 s1627 = sbv_bv_u32_rotr(s1069, 18);+  const SWord32 s1628 = s1626 ^ s1627;+  const SWord32 s1629 = sbv_bv_u32_lshr(s1069, 0x00000003UL);+  const SWord32 s1630 = s1628 ^ s1629;+  const SWord32 s1631 = sbv_bv_u32_add(s1625, s1630);+  const SWord32 s1632 = sbv_bv_u32_add(s1008, s1631);+  const SWord32 s1633 = sbv_bv_u32_add(s1619, s1632);+  const SWord32 s1634 = sbv_bv_u32_add(s1521, s1633);+  const SWord32 s1635 = sbv_bv_u32_rotr(s1521, 2);+  const SWord32 s1636 = sbv_bv_u32_rotr(s1521, 13);+  const SWord32 s1637 = s1635 ^ s1636;+  const SWord32 s1638 = sbv_bv_u32_rotr(s1521, 22);+  const SWord32 s1639 = s1637 ^ s1638;+  const SWord32 s1640 = s1510 & s1521;+  const SWord32 s1641 = s1499 & s1521;+  const SWord32 s1642 = s1640 ^ s1641;+  const SWord32 s1643 = s1516 ^ s1642;+  const SWord32 s1644 = sbv_bv_u32_add(s1639, s1643);+  const SWord32 s1645 = sbv_bv_u32_add(s1549, s1644);+  const SWord32 s1646 = sbv_bv_u32_rotr(s1645, 2);+  const SWord32 s1647 = sbv_bv_u32_rotr(s1645, 13);+  const SWord32 s1648 = s1646 ^ s1647;+  const SWord32 s1649 = sbv_bv_u32_rotr(s1645, 22);+  const SWord32 s1650 = s1648 ^ s1649;+  const SWord32 s1651 = s1521 & s1645;+  const SWord32 s1652 = s1510 & s1645;+  const SWord32 s1653 = s1651 ^ s1652;+  const SWord32 s1654 = s1640 ^ s1653;+  const SWord32 s1655 = sbv_bv_u32_add(s1650, s1654);+  const SWord32 s1656 = sbv_bv_u32_add(s1577, s1655);+  const SWord32 s1657 = sbv_bv_u32_rotr(s1656, 2);+  const SWord32 s1658 = sbv_bv_u32_rotr(s1656, 13);+  const SWord32 s1659 = s1657 ^ s1658;+  const SWord32 s1660 = sbv_bv_u32_rotr(s1656, 22);+  const SWord32 s1661 = s1659 ^ s1660;+  const SWord32 s1662 = s1645 & s1656;+  const SWord32 s1663 = s1521 & s1656;+  const SWord32 s1664 = s1662 ^ s1663;+  const SWord32 s1665 = s1651 ^ s1664;+  const SWord32 s1666 = sbv_bv_u32_add(s1661, s1665);+  const SWord32 s1667 = sbv_bv_u32_add(s1605, s1666);+  const SWord32 s1668 = sbv_bv_u32_rotr(s1634, 6);+  const SWord32 s1669 = sbv_bv_u32_rotr(s1634, 11);+  const SWord32 s1670 = s1668 ^ s1669;+  const SWord32 s1671 = sbv_bv_u32_rotr(s1634, 25);+  const SWord32 s1672 = s1670 ^ s1671;+  const SWord32 s1673 = sbv_bv_u32_add(s1550, s1672);+  const SWord32 s1674 = s1606 & s1634;+  const SWord32 s1675 = ~s1634;+  const SWord32 s1676 = s1578 & s1675;+  const SWord32 s1677 = s1674 ^ s1676;+  const SWord32 s1678 = sbv_bv_u32_add(s1673, s1677);+  const SWord32 s1680 = sbv_bv_u32_add(s1678, 0xd192e819UL);+  const SWord32 s1681 = sbv_bv_u32_rotr(s1604, 17);+  const SWord32 s1682 = sbv_bv_u32_rotr(s1604, 19);+  const SWord32 s1683 = s1681 ^ s1682;+  const SWord32 s1684 = sbv_bv_u32_lshr(s1604, 0x0000000aUL);+  const SWord32 s1685 = s1683 ^ s1684;+  const SWord32 s1686 = sbv_bv_u32_add(s1409, s1685);+  const SWord32 s1687 = sbv_bv_u32_rotr(s1097, 7);+  const SWord32 s1688 = sbv_bv_u32_rotr(s1097, 18);+  const SWord32 s1689 = s1687 ^ s1688;+  const SWord32 s1690 = sbv_bv_u32_lshr(s1097, 0x00000003UL);+  const SWord32 s1691 = s1689 ^ s1690;+  const SWord32 s1692 = sbv_bv_u32_add(s1686, s1691);+  const SWord32 s1693 = sbv_bv_u32_add(s1069, s1692);+  const SWord32 s1694 = sbv_bv_u32_add(s1680, s1693);+  const SWord32 s1695 = sbv_bv_u32_add(s1645, s1694);+  const SWord32 s1696 = sbv_bv_u32_rotr(s1695, 6);+  const SWord32 s1697 = sbv_bv_u32_rotr(s1695, 11);+  const SWord32 s1698 = s1696 ^ s1697;+  const SWord32 s1699 = sbv_bv_u32_rotr(s1695, 25);+  const SWord32 s1700 = s1698 ^ s1699;+  const SWord32 s1701 = sbv_bv_u32_add(s1578, s1700);+  const SWord32 s1702 = s1634 & s1695;+  const SWord32 s1703 = ~s1695;+  const SWord32 s1704 = s1606 & s1703;+  const SWord32 s1705 = s1702 ^ s1704;+  const SWord32 s1706 = sbv_bv_u32_add(s1701, s1705);+  const SWord32 s1708 = sbv_bv_u32_add(s1706, 0xd6990624UL);+  const SWord32 s1709 = sbv_bv_u32_rotr(s1632, 17);+  const SWord32 s1710 = sbv_bv_u32_rotr(s1632, 19);+  const SWord32 s1711 = s1709 ^ s1710;+  const SWord32 s1712 = sbv_bv_u32_lshr(s1632, 0x0000000aUL);+  const SWord32 s1713 = s1711 ^ s1712;+  const SWord32 s1714 = sbv_bv_u32_add(s1437, s1713);+  const SWord32 s1715 = sbv_bv_u32_rotr(s1125, 7);+  const SWord32 s1716 = sbv_bv_u32_rotr(s1125, 18);+  const SWord32 s1717 = s1715 ^ s1716;+  const SWord32 s1718 = sbv_bv_u32_lshr(s1125, 0x00000003UL);+  const SWord32 s1719 = s1717 ^ s1718;+  const SWord32 s1720 = sbv_bv_u32_add(s1714, s1719);+  const SWord32 s1721 = sbv_bv_u32_add(s1097, s1720);+  const SWord32 s1722 = sbv_bv_u32_add(s1708, s1721);+  const SWord32 s1723 = sbv_bv_u32_add(s1656, s1722);+  const SWord32 s1724 = sbv_bv_u32_rotr(s1723, 6);+  const SWord32 s1725 = sbv_bv_u32_rotr(s1723, 11);+  const SWord32 s1726 = s1724 ^ s1725;+  const SWord32 s1727 = sbv_bv_u32_rotr(s1723, 25);+  const SWord32 s1728 = s1726 ^ s1727;+  const SWord32 s1729 = sbv_bv_u32_add(s1606, s1728);+  const SWord32 s1730 = s1695 & s1723;+  const SWord32 s1731 = ~s1723;+  const SWord32 s1732 = s1634 & s1731;+  const SWord32 s1733 = s1730 ^ s1732;+  const SWord32 s1734 = sbv_bv_u32_add(s1729, s1733);+  const SWord32 s1736 = sbv_bv_u32_add(s1734, 0xf40e3585UL);+  const SWord32 s1737 = sbv_bv_u32_rotr(s1693, 17);+  const SWord32 s1738 = sbv_bv_u32_rotr(s1693, 19);+  const SWord32 s1739 = s1737 ^ s1738;+  const SWord32 s1740 = sbv_bv_u32_lshr(s1693, 0x0000000aUL);+  const SWord32 s1741 = s1739 ^ s1740;+  const SWord32 s1742 = sbv_bv_u32_add(s1465, s1741);+  const SWord32 s1743 = sbv_bv_u32_rotr(s1153, 7);+  const SWord32 s1744 = sbv_bv_u32_rotr(s1153, 18);+  const SWord32 s1745 = s1743 ^ s1744;+  const SWord32 s1746 = sbv_bv_u32_lshr(s1153, 0x00000003UL);+  const SWord32 s1747 = s1745 ^ s1746;+  const SWord32 s1748 = sbv_bv_u32_add(s1742, s1747);+  const SWord32 s1749 = sbv_bv_u32_add(s1125, s1748);+  const SWord32 s1750 = sbv_bv_u32_add(s1736, s1749);+  const SWord32 s1751 = sbv_bv_u32_add(s1667, s1750);+  const SWord32 s1752 = sbv_bv_u32_rotr(s1751, 6);+  const SWord32 s1753 = sbv_bv_u32_rotr(s1751, 11);+  const SWord32 s1754 = s1752 ^ s1753;+  const SWord32 s1755 = sbv_bv_u32_rotr(s1751, 25);+  const SWord32 s1756 = s1754 ^ s1755;+  const SWord32 s1757 = sbv_bv_u32_add(s1634, s1756);+  const SWord32 s1758 = s1723 & s1751;+  const SWord32 s1759 = ~s1751;+  const SWord32 s1760 = s1695 & s1759;+  const SWord32 s1761 = s1758 ^ s1760;+  const SWord32 s1762 = sbv_bv_u32_add(s1757, s1761);+  const SWord32 s1764 = sbv_bv_u32_add(s1762, 0x106aa070UL);+  const SWord32 s1765 = sbv_bv_u32_rotr(s1721, 17);+  const SWord32 s1766 = sbv_bv_u32_rotr(s1721, 19);+  const SWord32 s1767 = s1765 ^ s1766;+  const SWord32 s1768 = sbv_bv_u32_lshr(s1721, 0x0000000aUL);+  const SWord32 s1769 = s1767 ^ s1768;+  const SWord32 s1770 = sbv_bv_u32_add(s1548, s1769);+  const SWord32 s1771 = sbv_bv_u32_rotr(s1236, 7);+  const SWord32 s1772 = sbv_bv_u32_rotr(s1236, 18);+  const SWord32 s1773 = s1771 ^ s1772;+  const SWord32 s1774 = sbv_bv_u32_lshr(s1236, 0x00000003UL);+  const SWord32 s1775 = s1773 ^ s1774;+  const SWord32 s1776 = sbv_bv_u32_add(s1770, s1775);+  const SWord32 s1777 = sbv_bv_u32_add(s1153, s1776);+  const SWord32 s1778 = sbv_bv_u32_add(s1764, s1777);+  const SWord32 s1779 = sbv_bv_u32_rotr(s1667, 2);+  const SWord32 s1780 = sbv_bv_u32_rotr(s1667, 13);+  const SWord32 s1781 = s1779 ^ s1780;+  const SWord32 s1782 = sbv_bv_u32_rotr(s1667, 22);+  const SWord32 s1783 = s1781 ^ s1782;+  const SWord32 s1784 = s1656 & s1667;+  const SWord32 s1785 = s1645 & s1667;+  const SWord32 s1786 = s1784 ^ s1785;+  const SWord32 s1787 = s1662 ^ s1786;+  const SWord32 s1788 = sbv_bv_u32_add(s1783, s1787);+  const SWord32 s1789 = sbv_bv_u32_add(s1633, s1788);+  const SWord32 s1790 = sbv_bv_u32_rotr(s1789, 2);+  const SWord32 s1791 = sbv_bv_u32_rotr(s1789, 13);+  const SWord32 s1792 = s1790 ^ s1791;+  const SWord32 s1793 = sbv_bv_u32_rotr(s1789, 22);+  const SWord32 s1794 = s1792 ^ s1793;+  const SWord32 s1795 = s1667 & s1789;+  const SWord32 s1796 = s1656 & s1789;+  const SWord32 s1797 = s1795 ^ s1796;+  const SWord32 s1798 = s1784 ^ s1797;+  const SWord32 s1799 = sbv_bv_u32_add(s1794, s1798);+  const SWord32 s1800 = sbv_bv_u32_add(s1694, s1799);+  const SWord32 s1801 = sbv_bv_u32_rotr(s1800, 2);+  const SWord32 s1802 = sbv_bv_u32_rotr(s1800, 13);+  const SWord32 s1803 = s1801 ^ s1802;+  const SWord32 s1804 = sbv_bv_u32_rotr(s1800, 22);+  const SWord32 s1805 = s1803 ^ s1804;+  const SWord32 s1806 = s1789 & s1800;+  const SWord32 s1807 = s1667 & s1800;+  const SWord32 s1808 = s1806 ^ s1807;+  const SWord32 s1809 = s1795 ^ s1808;+  const SWord32 s1810 = sbv_bv_u32_add(s1805, s1809);+  const SWord32 s1811 = sbv_bv_u32_add(s1722, s1810);+  const SWord32 s1812 = sbv_bv_u32_rotr(s1811, 2);+  const SWord32 s1813 = sbv_bv_u32_rotr(s1811, 13);+  const SWord32 s1814 = s1812 ^ s1813;+  const SWord32 s1815 = sbv_bv_u32_rotr(s1811, 22);+  const SWord32 s1816 = s1814 ^ s1815;+  const SWord32 s1817 = s1800 & s1811;+  const SWord32 s1818 = s1789 & s1811;+  const SWord32 s1819 = s1817 ^ s1818;+  const SWord32 s1820 = s1806 ^ s1819;+  const SWord32 s1821 = sbv_bv_u32_add(s1816, s1820);+  const SWord32 s1822 = sbv_bv_u32_add(s1750, s1821);+  const SWord32 s1823 = sbv_bv_u32_rotr(s1822, 2);+  const SWord32 s1824 = sbv_bv_u32_rotr(s1822, 13);+  const SWord32 s1825 = s1823 ^ s1824;+  const SWord32 s1826 = sbv_bv_u32_rotr(s1822, 22);+  const SWord32 s1827 = s1825 ^ s1826;+  const SWord32 s1828 = s1811 & s1822;+  const SWord32 s1829 = s1800 & s1822;+  const SWord32 s1830 = s1828 ^ s1829;+  const SWord32 s1831 = s1817 ^ s1830;+  const SWord32 s1832 = sbv_bv_u32_add(s1827, s1831);+  const SWord32 s1833 = sbv_bv_u32_add(s1778, s1832);+  const SWord32 s1834 = sbv_bv_u32_add(s1778, s1789);+  const SWord32 s1835 = sbv_bv_u32_rotr(s1834, 6);+  const SWord32 s1836 = sbv_bv_u32_rotr(s1834, 11);+  const SWord32 s1837 = s1835 ^ s1836;+  const SWord32 s1838 = sbv_bv_u32_rotr(s1834, 25);+  const SWord32 s1839 = s1837 ^ s1838;+  const SWord32 s1840 = sbv_bv_u32_add(s1695, s1839);+  const SWord32 s1841 = s1751 & s1834;+  const SWord32 s1842 = ~s1834;+  const SWord32 s1843 = s1723 & s1842;+  const SWord32 s1844 = s1841 ^ s1843;+  const SWord32 s1845 = sbv_bv_u32_add(s1840, s1844);+  const SWord32 s1847 = sbv_bv_u32_add(s1845, 0x19a4c116UL);+  const SWord32 s1848 = sbv_bv_u32_rotr(s1749, 17);+  const SWord32 s1849 = sbv_bv_u32_rotr(s1749, 19);+  const SWord32 s1850 = s1848 ^ s1849;+  const SWord32 s1851 = sbv_bv_u32_lshr(s1749, 0x0000000aUL);+  const SWord32 s1852 = s1850 ^ s1851;+  const SWord32 s1853 = sbv_bv_u32_add(s1576, s1852);+  const SWord32 s1854 = sbv_bv_u32_rotr(s1264, 7);+  const SWord32 s1855 = sbv_bv_u32_rotr(s1264, 18);+  const SWord32 s1856 = s1854 ^ s1855;+  const SWord32 s1857 = sbv_bv_u32_lshr(s1264, 0x00000003UL);+  const SWord32 s1858 = s1856 ^ s1857;+  const SWord32 s1859 = sbv_bv_u32_add(s1853, s1858);+  const SWord32 s1860 = sbv_bv_u32_add(s1236, s1859);+  const SWord32 s1861 = sbv_bv_u32_add(s1847, s1860);+  const SWord32 s1862 = sbv_bv_u32_add(s1800, s1861);+  const SWord32 s1863 = sbv_bv_u32_rotr(s1862, 6);+  const SWord32 s1864 = sbv_bv_u32_rotr(s1862, 11);+  const SWord32 s1865 = s1863 ^ s1864;+  const SWord32 s1866 = sbv_bv_u32_rotr(s1862, 25);+  const SWord32 s1867 = s1865 ^ s1866;+  const SWord32 s1868 = sbv_bv_u32_add(s1723, s1867);+  const SWord32 s1869 = s1834 & s1862;+  const SWord32 s1870 = ~s1862;+  const SWord32 s1871 = s1751 & s1870;+  const SWord32 s1872 = s1869 ^ s1871;+  const SWord32 s1873 = sbv_bv_u32_add(s1868, s1872);+  const SWord32 s1875 = sbv_bv_u32_add(s1873, 0x1e376c08UL);+  const SWord32 s1876 = sbv_bv_u32_rotr(s1777, 17);+  const SWord32 s1877 = sbv_bv_u32_rotr(s1777, 19);+  const SWord32 s1878 = s1876 ^ s1877;+  const SWord32 s1879 = sbv_bv_u32_lshr(s1777, 0x0000000aUL);+  const SWord32 s1880 = s1878 ^ s1879;+  const SWord32 s1881 = sbv_bv_u32_add(s1604, s1880);+  const SWord32 s1882 = sbv_bv_u32_rotr(s1292, 7);+  const SWord32 s1883 = sbv_bv_u32_rotr(s1292, 18);+  const SWord32 s1884 = s1882 ^ s1883;+  const SWord32 s1885 = sbv_bv_u32_lshr(s1292, 0x00000003UL);+  const SWord32 s1886 = s1884 ^ s1885;+  const SWord32 s1887 = sbv_bv_u32_add(s1881, s1886);+  const SWord32 s1888 = sbv_bv_u32_add(s1264, s1887);+  const SWord32 s1889 = sbv_bv_u32_add(s1875, s1888);+  const SWord32 s1890 = sbv_bv_u32_add(s1811, s1889);+  const SWord32 s1891 = sbv_bv_u32_rotr(s1890, 6);+  const SWord32 s1892 = sbv_bv_u32_rotr(s1890, 11);+  const SWord32 s1893 = s1891 ^ s1892;+  const SWord32 s1894 = sbv_bv_u32_rotr(s1890, 25);+  const SWord32 s1895 = s1893 ^ s1894;+  const SWord32 s1896 = sbv_bv_u32_add(s1751, s1895);+  const SWord32 s1897 = s1862 & s1890;+  const SWord32 s1898 = ~s1890;+  const SWord32 s1899 = s1834 & s1898;+  const SWord32 s1900 = s1897 ^ s1899;+  const SWord32 s1901 = sbv_bv_u32_add(s1896, s1900);+  const SWord32 s1903 = sbv_bv_u32_add(s1901, 0x2748774cUL);+  const SWord32 s1904 = sbv_bv_u32_rotr(s1860, 17);+  const SWord32 s1905 = sbv_bv_u32_rotr(s1860, 19);+  const SWord32 s1906 = s1904 ^ s1905;+  const SWord32 s1907 = sbv_bv_u32_lshr(s1860, 0x0000000aUL);+  const SWord32 s1908 = s1906 ^ s1907;+  const SWord32 s1909 = sbv_bv_u32_add(s1632, s1908);+  const SWord32 s1910 = sbv_bv_u32_rotr(s1320, 7);+  const SWord32 s1911 = sbv_bv_u32_rotr(s1320, 18);+  const SWord32 s1912 = s1910 ^ s1911;+  const SWord32 s1913 = sbv_bv_u32_lshr(s1320, 0x00000003UL);+  const SWord32 s1914 = s1912 ^ s1913;+  const SWord32 s1915 = sbv_bv_u32_add(s1909, s1914);+  const SWord32 s1916 = sbv_bv_u32_add(s1292, s1915);+  const SWord32 s1917 = sbv_bv_u32_add(s1903, s1916);+  const SWord32 s1918 = sbv_bv_u32_add(s1822, s1917);+  const SWord32 s1919 = sbv_bv_u32_rotr(s1918, 6);+  const SWord32 s1920 = sbv_bv_u32_rotr(s1918, 11);+  const SWord32 s1921 = s1919 ^ s1920;+  const SWord32 s1922 = sbv_bv_u32_rotr(s1918, 25);+  const SWord32 s1923 = s1921 ^ s1922;+  const SWord32 s1924 = sbv_bv_u32_add(s1834, s1923);+  const SWord32 s1925 = s1890 & s1918;+  const SWord32 s1926 = ~s1918;+  const SWord32 s1927 = s1862 & s1926;+  const SWord32 s1928 = s1925 ^ s1927;+  const SWord32 s1929 = sbv_bv_u32_add(s1924, s1928);+  const SWord32 s1931 = sbv_bv_u32_add(s1929, 0x34b0bcb5UL);+  const SWord32 s1932 = sbv_bv_u32_rotr(s1888, 17);+  const SWord32 s1933 = sbv_bv_u32_rotr(s1888, 19);+  const SWord32 s1934 = s1932 ^ s1933;+  const SWord32 s1935 = sbv_bv_u32_lshr(s1888, 0x0000000aUL);+  const SWord32 s1936 = s1934 ^ s1935;+  const SWord32 s1937 = sbv_bv_u32_add(s1693, s1936);+  const SWord32 s1938 = sbv_bv_u32_rotr(s1381, 7);+  const SWord32 s1939 = sbv_bv_u32_rotr(s1381, 18);+  const SWord32 s1940 = s1938 ^ s1939;+  const SWord32 s1941 = sbv_bv_u32_lshr(s1381, 0x00000003UL);+  const SWord32 s1942 = s1940 ^ s1941;+  const SWord32 s1943 = sbv_bv_u32_add(s1937, s1942);+  const SWord32 s1944 = sbv_bv_u32_add(s1320, s1943);+  const SWord32 s1945 = sbv_bv_u32_add(s1931, s1944);+  const SWord32 s1946 = sbv_bv_u32_add(s1833, s1945);+  const SWord32 s1947 = sbv_bv_u32_rotr(s1833, 2);+  const SWord32 s1948 = sbv_bv_u32_rotr(s1833, 13);+  const SWord32 s1949 = s1947 ^ s1948;+  const SWord32 s1950 = sbv_bv_u32_rotr(s1833, 22);+  const SWord32 s1951 = s1949 ^ s1950;+  const SWord32 s1952 = s1822 & s1833;+  const SWord32 s1953 = s1811 & s1833;+  const SWord32 s1954 = s1952 ^ s1953;+  const SWord32 s1955 = s1828 ^ s1954;+  const SWord32 s1956 = sbv_bv_u32_add(s1951, s1955);+  const SWord32 s1957 = sbv_bv_u32_add(s1861, s1956);+  const SWord32 s1958 = sbv_bv_u32_rotr(s1957, 2);+  const SWord32 s1959 = sbv_bv_u32_rotr(s1957, 13);+  const SWord32 s1960 = s1958 ^ s1959;+  const SWord32 s1961 = sbv_bv_u32_rotr(s1957, 22);+  const SWord32 s1962 = s1960 ^ s1961;+  const SWord32 s1963 = s1833 & s1957;+  const SWord32 s1964 = s1822 & s1957;+  const SWord32 s1965 = s1963 ^ s1964;+  const SWord32 s1966 = s1952 ^ s1965;+  const SWord32 s1967 = sbv_bv_u32_add(s1962, s1966);+  const SWord32 s1968 = sbv_bv_u32_add(s1889, s1967);+  const SWord32 s1969 = sbv_bv_u32_rotr(s1968, 2);+  const SWord32 s1970 = sbv_bv_u32_rotr(s1968, 13);+  const SWord32 s1971 = s1969 ^ s1970;+  const SWord32 s1972 = sbv_bv_u32_rotr(s1968, 22);+  const SWord32 s1973 = s1971 ^ s1972;+  const SWord32 s1974 = s1957 & s1968;+  const SWord32 s1975 = s1833 & s1968;+  const SWord32 s1976 = s1974 ^ s1975;+  const SWord32 s1977 = s1963 ^ s1976;+  const SWord32 s1978 = sbv_bv_u32_add(s1973, s1977);+  const SWord32 s1979 = sbv_bv_u32_add(s1917, s1978);+  const SWord32 s1980 = sbv_bv_u32_rotr(s1946, 6);+  const SWord32 s1981 = sbv_bv_u32_rotr(s1946, 11);+  const SWord32 s1982 = s1980 ^ s1981;+  const SWord32 s1983 = sbv_bv_u32_rotr(s1946, 25);+  const SWord32 s1984 = s1982 ^ s1983;+  const SWord32 s1985 = sbv_bv_u32_add(s1862, s1984);+  const SWord32 s1986 = s1918 & s1946;+  const SWord32 s1987 = ~s1946;+  const SWord32 s1988 = s1890 & s1987;+  const SWord32 s1989 = s1986 ^ s1988;+  const SWord32 s1990 = sbv_bv_u32_add(s1985, s1989);+  const SWord32 s1992 = sbv_bv_u32_add(s1990, 0x391c0cb3UL);+  const SWord32 s1993 = sbv_bv_u32_rotr(s1916, 17);+  const SWord32 s1994 = sbv_bv_u32_rotr(s1916, 19);+  const SWord32 s1995 = s1993 ^ s1994;+  const SWord32 s1996 = sbv_bv_u32_lshr(s1916, 0x0000000aUL);+  const SWord32 s1997 = s1995 ^ s1996;+  const SWord32 s1998 = sbv_bv_u32_add(s1721, s1997);+  const SWord32 s1999 = sbv_bv_u32_rotr(s1409, 7);+  const SWord32 s2000 = sbv_bv_u32_rotr(s1409, 18);+  const SWord32 s2001 = s1999 ^ s2000;+  const SWord32 s2002 = sbv_bv_u32_lshr(s1409, 0x00000003UL);+  const SWord32 s2003 = s2001 ^ s2002;+  const SWord32 s2004 = sbv_bv_u32_add(s1998, s2003);+  const SWord32 s2005 = sbv_bv_u32_add(s1381, s2004);+  const SWord32 s2006 = sbv_bv_u32_add(s1992, s2005);+  const SWord32 s2007 = sbv_bv_u32_add(s1957, s2006);+  const SWord32 s2008 = sbv_bv_u32_rotr(s2007, 6);+  const SWord32 s2009 = sbv_bv_u32_rotr(s2007, 11);+  const SWord32 s2010 = s2008 ^ s2009;+  const SWord32 s2011 = sbv_bv_u32_rotr(s2007, 25);+  const SWord32 s2012 = s2010 ^ s2011;+  const SWord32 s2013 = sbv_bv_u32_add(s1890, s2012);+  const SWord32 s2014 = s1946 & s2007;+  const SWord32 s2015 = ~s2007;+  const SWord32 s2016 = s1918 & s2015;+  const SWord32 s2017 = s2014 ^ s2016;+  const SWord32 s2018 = sbv_bv_u32_add(s2013, s2017);+  const SWord32 s2020 = sbv_bv_u32_add(s2018, 0x4ed8aa4aUL);+  const SWord32 s2021 = sbv_bv_u32_rotr(s1944, 17);+  const SWord32 s2022 = sbv_bv_u32_rotr(s1944, 19);+  const SWord32 s2023 = s2021 ^ s2022;+  const SWord32 s2024 = sbv_bv_u32_lshr(s1944, 0x0000000aUL);+  const SWord32 s2025 = s2023 ^ s2024;+  const SWord32 s2026 = sbv_bv_u32_add(s1749, s2025);+  const SWord32 s2027 = sbv_bv_u32_rotr(s1437, 7);+  const SWord32 s2028 = sbv_bv_u32_rotr(s1437, 18);+  const SWord32 s2029 = s2027 ^ s2028;+  const SWord32 s2030 = sbv_bv_u32_lshr(s1437, 0x00000003UL);+  const SWord32 s2031 = s2029 ^ s2030;+  const SWord32 s2032 = sbv_bv_u32_add(s2026, s2031);+  const SWord32 s2033 = sbv_bv_u32_add(s1409, s2032);+  const SWord32 s2034 = sbv_bv_u32_add(s2020, s2033);+  const SWord32 s2035 = sbv_bv_u32_add(s1968, s2034);+  const SWord32 s2036 = sbv_bv_u32_rotr(s2035, 6);+  const SWord32 s2037 = sbv_bv_u32_rotr(s2035, 11);+  const SWord32 s2038 = s2036 ^ s2037;+  const SWord32 s2039 = sbv_bv_u32_rotr(s2035, 25);+  const SWord32 s2040 = s2038 ^ s2039;+  const SWord32 s2041 = sbv_bv_u32_add(s1918, s2040);+  const SWord32 s2042 = s2007 & s2035;+  const SWord32 s2043 = ~s2035;+  const SWord32 s2044 = s1946 & s2043;+  const SWord32 s2045 = s2042 ^ s2044;+  const SWord32 s2046 = sbv_bv_u32_add(s2041, s2045);+  const SWord32 s2048 = sbv_bv_u32_add(s2046, 0x5b9cca4fUL);+  const SWord32 s2049 = sbv_bv_u32_rotr(s2005, 17);+  const SWord32 s2050 = sbv_bv_u32_rotr(s2005, 19);+  const SWord32 s2051 = s2049 ^ s2050;+  const SWord32 s2052 = sbv_bv_u32_lshr(s2005, 0x0000000aUL);+  const SWord32 s2053 = s2051 ^ s2052;+  const SWord32 s2054 = sbv_bv_u32_add(s1777, s2053);+  const SWord32 s2055 = sbv_bv_u32_rotr(s1465, 7);+  const SWord32 s2056 = sbv_bv_u32_rotr(s1465, 18);+  const SWord32 s2057 = s2055 ^ s2056;+  const SWord32 s2058 = sbv_bv_u32_lshr(s1465, 0x00000003UL);+  const SWord32 s2059 = s2057 ^ s2058;+  const SWord32 s2060 = sbv_bv_u32_add(s2054, s2059);+  const SWord32 s2061 = sbv_bv_u32_add(s1437, s2060);+  const SWord32 s2062 = sbv_bv_u32_add(s2048, s2061);+  const SWord32 s2063 = sbv_bv_u32_add(s1979, s2062);+  const SWord32 s2064 = sbv_bv_u32_rotr(s2063, 6);+  const SWord32 s2065 = sbv_bv_u32_rotr(s2063, 11);+  const SWord32 s2066 = s2064 ^ s2065;+  const SWord32 s2067 = sbv_bv_u32_rotr(s2063, 25);+  const SWord32 s2068 = s2066 ^ s2067;+  const SWord32 s2069 = sbv_bv_u32_add(s1946, s2068);+  const SWord32 s2070 = s2035 & s2063;+  const SWord32 s2071 = ~s2063;+  const SWord32 s2072 = s2007 & s2071;+  const SWord32 s2073 = s2070 ^ s2072;+  const SWord32 s2074 = sbv_bv_u32_add(s2069, s2073);+  const SWord32 s2076 = sbv_bv_u32_add(s2074, 0x682e6ff3UL);+  const SWord32 s2077 = sbv_bv_u32_rotr(s2033, 17);+  const SWord32 s2078 = sbv_bv_u32_rotr(s2033, 19);+  const SWord32 s2079 = s2077 ^ s2078;+  const SWord32 s2080 = sbv_bv_u32_lshr(s2033, 0x0000000aUL);+  const SWord32 s2081 = s2079 ^ s2080;+  const SWord32 s2082 = sbv_bv_u32_add(s1860, s2081);+  const SWord32 s2083 = sbv_bv_u32_rotr(s1548, 7);+  const SWord32 s2084 = sbv_bv_u32_rotr(s1548, 18);+  const SWord32 s2085 = s2083 ^ s2084;+  const SWord32 s2086 = sbv_bv_u32_lshr(s1548, 0x00000003UL);+  const SWord32 s2087 = s2085 ^ s2086;+  const SWord32 s2088 = sbv_bv_u32_add(s2082, s2087);+  const SWord32 s2089 = sbv_bv_u32_add(s1465, s2088);+  const SWord32 s2090 = sbv_bv_u32_add(s2076, s2089);+  const SWord32 s2091 = sbv_bv_u32_rotr(s1979, 2);+  const SWord32 s2092 = sbv_bv_u32_rotr(s1979, 13);+  const SWord32 s2093 = s2091 ^ s2092;+  const SWord32 s2094 = sbv_bv_u32_rotr(s1979, 22);+  const SWord32 s2095 = s2093 ^ s2094;+  const SWord32 s2096 = s1968 & s1979;+  const SWord32 s2097 = s1957 & s1979;+  const SWord32 s2098 = s2096 ^ s2097;+  const SWord32 s2099 = s1974 ^ s2098;+  const SWord32 s2100 = sbv_bv_u32_add(s2095, s2099);+  const SWord32 s2101 = sbv_bv_u32_add(s1945, s2100);+  const SWord32 s2102 = sbv_bv_u32_rotr(s2101, 2);+  const SWord32 s2103 = sbv_bv_u32_rotr(s2101, 13);+  const SWord32 s2104 = s2102 ^ s2103;+  const SWord32 s2105 = sbv_bv_u32_rotr(s2101, 22);+  const SWord32 s2106 = s2104 ^ s2105;+  const SWord32 s2107 = s1979 & s2101;+  const SWord32 s2108 = s1968 & s2101;+  const SWord32 s2109 = s2107 ^ s2108;+  const SWord32 s2110 = s2096 ^ s2109;+  const SWord32 s2111 = sbv_bv_u32_add(s2106, s2110);+  const SWord32 s2112 = sbv_bv_u32_add(s2006, s2111);+  const SWord32 s2113 = sbv_bv_u32_rotr(s2112, 2);+  const SWord32 s2114 = sbv_bv_u32_rotr(s2112, 13);+  const SWord32 s2115 = s2113 ^ s2114;+  const SWord32 s2116 = sbv_bv_u32_rotr(s2112, 22);+  const SWord32 s2117 = s2115 ^ s2116;+  const SWord32 s2118 = s2101 & s2112;+  const SWord32 s2119 = s1979 & s2112;+  const SWord32 s2120 = s2118 ^ s2119;+  const SWord32 s2121 = s2107 ^ s2120;+  const SWord32 s2122 = sbv_bv_u32_add(s2117, s2121);+  const SWord32 s2123 = sbv_bv_u32_add(s2034, s2122);+  const SWord32 s2124 = sbv_bv_u32_rotr(s2123, 2);+  const SWord32 s2125 = sbv_bv_u32_rotr(s2123, 13);+  const SWord32 s2126 = s2124 ^ s2125;+  const SWord32 s2127 = sbv_bv_u32_rotr(s2123, 22);+  const SWord32 s2128 = s2126 ^ s2127;+  const SWord32 s2129 = s2112 & s2123;+  const SWord32 s2130 = s2101 & s2123;+  const SWord32 s2131 = s2129 ^ s2130;+  const SWord32 s2132 = s2118 ^ s2131;+  const SWord32 s2133 = sbv_bv_u32_add(s2128, s2132);+  const SWord32 s2134 = sbv_bv_u32_add(s2062, s2133);+  const SWord32 s2135 = sbv_bv_u32_rotr(s2134, 2);+  const SWord32 s2136 = sbv_bv_u32_rotr(s2134, 13);+  const SWord32 s2137 = s2135 ^ s2136;+  const SWord32 s2138 = sbv_bv_u32_rotr(s2134, 22);+  const SWord32 s2139 = s2137 ^ s2138;+  const SWord32 s2140 = s2123 & s2134;+  const SWord32 s2141 = s2112 & s2134;+  const SWord32 s2142 = s2140 ^ s2141;+  const SWord32 s2143 = s2129 ^ s2142;+  const SWord32 s2144 = sbv_bv_u32_add(s2139, s2143);+  const SWord32 s2145 = sbv_bv_u32_add(s2090, s2144);+  const SWord32 s2146 = sbv_bv_u32_add(s2090, s2101);+  const SWord32 s2147 = sbv_bv_u32_rotr(s2146, 6);+  const SWord32 s2148 = sbv_bv_u32_rotr(s2146, 11);+  const SWord32 s2149 = s2147 ^ s2148;+  const SWord32 s2150 = sbv_bv_u32_rotr(s2146, 25);+  const SWord32 s2151 = s2149 ^ s2150;+  const SWord32 s2152 = sbv_bv_u32_add(s2007, s2151);+  const SWord32 s2153 = s2063 & s2146;+  const SWord32 s2154 = ~s2146;+  const SWord32 s2155 = s2035 & s2154;+  const SWord32 s2156 = s2153 ^ s2155;+  const SWord32 s2157 = sbv_bv_u32_add(s2152, s2156);+  const SWord32 s2159 = sbv_bv_u32_add(s2157, 0x748f82eeUL);+  const SWord32 s2160 = sbv_bv_u32_rotr(s2061, 17);+  const SWord32 s2161 = sbv_bv_u32_rotr(s2061, 19);+  const SWord32 s2162 = s2160 ^ s2161;+  const SWord32 s2163 = sbv_bv_u32_lshr(s2061, 0x0000000aUL);+  const SWord32 s2164 = s2162 ^ s2163;+  const SWord32 s2165 = sbv_bv_u32_add(s1888, s2164);+  const SWord32 s2166 = sbv_bv_u32_rotr(s1576, 7);+  const SWord32 s2167 = sbv_bv_u32_rotr(s1576, 18);+  const SWord32 s2168 = s2166 ^ s2167;+  const SWord32 s2169 = sbv_bv_u32_lshr(s1576, 0x00000003UL);+  const SWord32 s2170 = s2168 ^ s2169;+  const SWord32 s2171 = sbv_bv_u32_add(s2165, s2170);+  const SWord32 s2172 = sbv_bv_u32_add(s1548, s2171);+  const SWord32 s2173 = sbv_bv_u32_add(s2159, s2172);+  const SWord32 s2174 = sbv_bv_u32_add(s2112, s2173);+  const SWord32 s2175 = sbv_bv_u32_rotr(s2174, 6);+  const SWord32 s2176 = sbv_bv_u32_rotr(s2174, 11);+  const SWord32 s2177 = s2175 ^ s2176;+  const SWord32 s2178 = sbv_bv_u32_rotr(s2174, 25);+  const SWord32 s2179 = s2177 ^ s2178;+  const SWord32 s2180 = sbv_bv_u32_add(s2035, s2179);+  const SWord32 s2181 = s2146 & s2174;+  const SWord32 s2182 = ~s2174;+  const SWord32 s2183 = s2063 & s2182;+  const SWord32 s2184 = s2181 ^ s2183;+  const SWord32 s2185 = sbv_bv_u32_add(s2180, s2184);+  const SWord32 s2187 = sbv_bv_u32_add(s2185, 0x78a5636fUL);+  const SWord32 s2188 = sbv_bv_u32_rotr(s2089, 17);+  const SWord32 s2189 = sbv_bv_u32_rotr(s2089, 19);+  const SWord32 s2190 = s2188 ^ s2189;+  const SWord32 s2191 = sbv_bv_u32_lshr(s2089, 0x0000000aUL);+  const SWord32 s2192 = s2190 ^ s2191;+  const SWord32 s2193 = sbv_bv_u32_add(s1916, s2192);+  const SWord32 s2194 = sbv_bv_u32_rotr(s1604, 7);+  const SWord32 s2195 = sbv_bv_u32_rotr(s1604, 18);+  const SWord32 s2196 = s2194 ^ s2195;+  const SWord32 s2197 = sbv_bv_u32_lshr(s1604, 0x00000003UL);+  const SWord32 s2198 = s2196 ^ s2197;+  const SWord32 s2199 = sbv_bv_u32_add(s2193, s2198);+  const SWord32 s2200 = sbv_bv_u32_add(s1576, s2199);+  const SWord32 s2201 = sbv_bv_u32_add(s2187, s2200);+  const SWord32 s2202 = sbv_bv_u32_add(s2123, s2201);+  const SWord32 s2203 = sbv_bv_u32_rotr(s2202, 6);+  const SWord32 s2204 = sbv_bv_u32_rotr(s2202, 11);+  const SWord32 s2205 = s2203 ^ s2204;+  const SWord32 s2206 = sbv_bv_u32_rotr(s2202, 25);+  const SWord32 s2207 = s2205 ^ s2206;+  const SWord32 s2208 = sbv_bv_u32_add(s2063, s2207);+  const SWord32 s2209 = s2174 & s2202;+  const SWord32 s2210 = ~s2202;+  const SWord32 s2211 = s2146 & s2210;+  const SWord32 s2212 = s2209 ^ s2211;+  const SWord32 s2213 = sbv_bv_u32_add(s2208, s2212);+  const SWord32 s2215 = sbv_bv_u32_add(s2213, 0x84c87814UL);+  const SWord32 s2216 = sbv_bv_u32_rotr(s2172, 17);+  const SWord32 s2217 = sbv_bv_u32_rotr(s2172, 19);+  const SWord32 s2218 = s2216 ^ s2217;+  const SWord32 s2219 = sbv_bv_u32_lshr(s2172, 0x0000000aUL);+  const SWord32 s2220 = s2218 ^ s2219;+  const SWord32 s2221 = sbv_bv_u32_add(s1944, s2220);+  const SWord32 s2222 = sbv_bv_u32_rotr(s1632, 7);+  const SWord32 s2223 = sbv_bv_u32_rotr(s1632, 18);+  const SWord32 s2224 = s2222 ^ s2223;+  const SWord32 s2225 = sbv_bv_u32_lshr(s1632, 0x00000003UL);+  const SWord32 s2226 = s2224 ^ s2225;+  const SWord32 s2227 = sbv_bv_u32_add(s2221, s2226);+  const SWord32 s2228 = sbv_bv_u32_add(s1604, s2227);+  const SWord32 s2229 = sbv_bv_u32_add(s2215, s2228);+  const SWord32 s2230 = sbv_bv_u32_add(s2134, s2229);+  const SWord32 s2231 = sbv_bv_u32_rotr(s2230, 6);+  const SWord32 s2232 = sbv_bv_u32_rotr(s2230, 11);+  const SWord32 s2233 = s2231 ^ s2232;+  const SWord32 s2234 = sbv_bv_u32_rotr(s2230, 25);+  const SWord32 s2235 = s2233 ^ s2234;+  const SWord32 s2236 = sbv_bv_u32_add(s2146, s2235);+  const SWord32 s2237 = s2202 & s2230;+  const SWord32 s2238 = ~s2230;+  const SWord32 s2239 = s2174 & s2238;+  const SWord32 s2240 = s2237 ^ s2239;+  const SWord32 s2241 = sbv_bv_u32_add(s2236, s2240);+  const SWord32 s2243 = sbv_bv_u32_add(s2241, 0x8cc70208UL);+  const SWord32 s2244 = sbv_bv_u32_rotr(s2200, 17);+  const SWord32 s2245 = sbv_bv_u32_rotr(s2200, 19);+  const SWord32 s2246 = s2244 ^ s2245;+  const SWord32 s2247 = sbv_bv_u32_lshr(s2200, 0x0000000aUL);+  const SWord32 s2248 = s2246 ^ s2247;+  const SWord32 s2249 = sbv_bv_u32_add(s2005, s2248);+  const SWord32 s2250 = sbv_bv_u32_rotr(s1693, 7);+  const SWord32 s2251 = sbv_bv_u32_rotr(s1693, 18);+  const SWord32 s2252 = s2250 ^ s2251;+  const SWord32 s2253 = sbv_bv_u32_lshr(s1693, 0x00000003UL);+  const SWord32 s2254 = s2252 ^ s2253;+  const SWord32 s2255 = sbv_bv_u32_add(s2249, s2254);+  const SWord32 s2256 = sbv_bv_u32_add(s1632, s2255);+  const SWord32 s2257 = sbv_bv_u32_add(s2243, s2256);+  const SWord32 s2258 = sbv_bv_u32_add(s2145, s2257);+  const SWord32 s2259 = sbv_bv_u32_rotr(s2145, 2);+  const SWord32 s2260 = sbv_bv_u32_rotr(s2145, 13);+  const SWord32 s2261 = s2259 ^ s2260;+  const SWord32 s2262 = sbv_bv_u32_rotr(s2145, 22);+  const SWord32 s2263 = s2261 ^ s2262;+  const SWord32 s2264 = s2134 & s2145;+  const SWord32 s2265 = s2123 & s2145;+  const SWord32 s2266 = s2264 ^ s2265;+  const SWord32 s2267 = s2140 ^ s2266;+  const SWord32 s2268 = sbv_bv_u32_add(s2263, s2267);+  const SWord32 s2269 = sbv_bv_u32_add(s2173, s2268);+  const SWord32 s2270 = sbv_bv_u32_rotr(s2269, 2);+  const SWord32 s2271 = sbv_bv_u32_rotr(s2269, 13);+  const SWord32 s2272 = s2270 ^ s2271;+  const SWord32 s2273 = sbv_bv_u32_rotr(s2269, 22);+  const SWord32 s2274 = s2272 ^ s2273;+  const SWord32 s2275 = s2145 & s2269;+  const SWord32 s2276 = s2134 & s2269;+  const SWord32 s2277 = s2275 ^ s2276;+  const SWord32 s2278 = s2264 ^ s2277;+  const SWord32 s2279 = sbv_bv_u32_add(s2274, s2278);+  const SWord32 s2280 = sbv_bv_u32_add(s2201, s2279);+  const SWord32 s2281 = sbv_bv_u32_rotr(s2280, 2);+  const SWord32 s2282 = sbv_bv_u32_rotr(s2280, 13);+  const SWord32 s2283 = s2281 ^ s2282;+  const SWord32 s2284 = sbv_bv_u32_rotr(s2280, 22);+  const SWord32 s2285 = s2283 ^ s2284;+  const SWord32 s2286 = s2269 & s2280;+  const SWord32 s2287 = s2145 & s2280;+  const SWord32 s2288 = s2286 ^ s2287;+  const SWord32 s2289 = s2275 ^ s2288;+  const SWord32 s2290 = sbv_bv_u32_add(s2285, s2289);+  const SWord32 s2291 = sbv_bv_u32_add(s2229, s2290);+  const SWord32 s2292 = sbv_bv_u32_rotr(s2258, 6);+  const SWord32 s2293 = sbv_bv_u32_rotr(s2258, 11);+  const SWord32 s2294 = s2292 ^ s2293;+  const SWord32 s2295 = sbv_bv_u32_rotr(s2258, 25);+  const SWord32 s2296 = s2294 ^ s2295;+  const SWord32 s2297 = sbv_bv_u32_add(s2174, s2296);+  const SWord32 s2298 = s2230 & s2258;+  const SWord32 s2299 = ~s2258;+  const SWord32 s2300 = s2202 & s2299;+  const SWord32 s2301 = s2298 ^ s2300;+  const SWord32 s2302 = sbv_bv_u32_add(s2297, s2301);+  const SWord32 s2304 = sbv_bv_u32_add(s2302, 0x90befffaUL);+  const SWord32 s2305 = sbv_bv_u32_rotr(s2228, 17);+  const SWord32 s2306 = sbv_bv_u32_rotr(s2228, 19);+  const SWord32 s2307 = s2305 ^ s2306;+  const SWord32 s2308 = sbv_bv_u32_lshr(s2228, 0x0000000aUL);+  const SWord32 s2309 = s2307 ^ s2308;+  const SWord32 s2310 = sbv_bv_u32_add(s2033, s2309);+  const SWord32 s2311 = sbv_bv_u32_rotr(s1721, 7);+  const SWord32 s2312 = sbv_bv_u32_rotr(s1721, 18);+  const SWord32 s2313 = s2311 ^ s2312;+  const SWord32 s2314 = sbv_bv_u32_lshr(s1721, 0x00000003UL);+  const SWord32 s2315 = s2313 ^ s2314;+  const SWord32 s2316 = sbv_bv_u32_add(s2310, s2315);+  const SWord32 s2317 = sbv_bv_u32_add(s1693, s2316);+  const SWord32 s2318 = sbv_bv_u32_add(s2304, s2317);+  const SWord32 s2319 = sbv_bv_u32_add(s2269, s2318);+  const SWord32 s2320 = sbv_bv_u32_rotr(s2319, 6);+  const SWord32 s2321 = sbv_bv_u32_rotr(s2319, 11);+  const SWord32 s2322 = s2320 ^ s2321;+  const SWord32 s2323 = sbv_bv_u32_rotr(s2319, 25);+  const SWord32 s2324 = s2322 ^ s2323;+  const SWord32 s2325 = sbv_bv_u32_add(s2202, s2324);+  const SWord32 s2326 = s2258 & s2319;+  const SWord32 s2327 = ~s2319;+  const SWord32 s2328 = s2230 & s2327;+  const SWord32 s2329 = s2326 ^ s2328;+  const SWord32 s2330 = sbv_bv_u32_add(s2325, s2329);+  const SWord32 s2332 = sbv_bv_u32_add(s2330, 0xa4506cebUL);+  const SWord32 s2333 = sbv_bv_u32_rotr(s2256, 17);+  const SWord32 s2334 = sbv_bv_u32_rotr(s2256, 19);+  const SWord32 s2335 = s2333 ^ s2334;+  const SWord32 s2336 = sbv_bv_u32_lshr(s2256, 0x0000000aUL);+  const SWord32 s2337 = s2335 ^ s2336;+  const SWord32 s2338 = sbv_bv_u32_add(s2061, s2337);+  const SWord32 s2339 = sbv_bv_u32_rotr(s1749, 7);+  const SWord32 s2340 = sbv_bv_u32_rotr(s1749, 18);+  const SWord32 s2341 = s2339 ^ s2340;+  const SWord32 s2342 = sbv_bv_u32_lshr(s1749, 0x00000003UL);+  const SWord32 s2343 = s2341 ^ s2342;+  const SWord32 s2344 = sbv_bv_u32_add(s2338, s2343);+  const SWord32 s2345 = sbv_bv_u32_add(s1721, s2344);+  const SWord32 s2346 = sbv_bv_u32_add(s2332, s2345);+  const SWord32 s2347 = sbv_bv_u32_add(s2280, s2346);+  const SWord32 s2348 = sbv_bv_u32_rotr(s2347, 6);+  const SWord32 s2349 = sbv_bv_u32_rotr(s2347, 11);+  const SWord32 s2350 = s2348 ^ s2349;+  const SWord32 s2351 = sbv_bv_u32_rotr(s2347, 25);+  const SWord32 s2352 = s2350 ^ s2351;+  const SWord32 s2353 = sbv_bv_u32_add(s2230, s2352);+  const SWord32 s2354 = s2319 & s2347;+  const SWord32 s2355 = ~s2347;+  const SWord32 s2356 = s2258 & s2355;+  const SWord32 s2357 = s2354 ^ s2356;+  const SWord32 s2358 = sbv_bv_u32_add(s2353, s2357);+  const SWord32 s2360 = sbv_bv_u32_add(s2358, 0xbef9a3f7UL);+  const SWord32 s2361 = sbv_bv_u32_rotr(s2317, 17);+  const SWord32 s2362 = sbv_bv_u32_rotr(s2317, 19);+  const SWord32 s2363 = s2361 ^ s2362;+  const SWord32 s2364 = sbv_bv_u32_lshr(s2317, 0x0000000aUL);+  const SWord32 s2365 = s2363 ^ s2364;+  const SWord32 s2366 = sbv_bv_u32_add(s2089, s2365);+  const SWord32 s2367 = sbv_bv_u32_rotr(s1777, 7);+  const SWord32 s2368 = sbv_bv_u32_rotr(s1777, 18);+  const SWord32 s2369 = s2367 ^ s2368;+  const SWord32 s2370 = sbv_bv_u32_lshr(s1777, 0x00000003UL);+  const SWord32 s2371 = s2369 ^ s2370;+  const SWord32 s2372 = sbv_bv_u32_add(s2366, s2371);+  const SWord32 s2373 = sbv_bv_u32_add(s1749, s2372);+  const SWord32 s2374 = sbv_bv_u32_add(s2360, s2373);+  const SWord32 s2375 = sbv_bv_u32_add(s2291, s2374);+  const SWord32 s2376 = sbv_bv_u32_rotr(s2375, 6);+  const SWord32 s2377 = sbv_bv_u32_rotr(s2375, 11);+  const SWord32 s2378 = s2376 ^ s2377;+  const SWord32 s2379 = sbv_bv_u32_rotr(s2375, 25);+  const SWord32 s2380 = s2378 ^ s2379;+  const SWord32 s2381 = sbv_bv_u32_add(s2258, s2380);+  const SWord32 s2382 = s2347 & s2375;+  const SWord32 s2383 = ~s2375;+  const SWord32 s2384 = s2319 & s2383;+  const SWord32 s2385 = s2382 ^ s2384;+  const SWord32 s2386 = sbv_bv_u32_add(s2381, s2385);+  const SWord32 s2388 = sbv_bv_u32_add(s2386, 0xc67178f2UL);+  const SWord32 s2389 = sbv_bv_u32_rotr(s2345, 17);+  const SWord32 s2390 = sbv_bv_u32_rotr(s2345, 19);+  const SWord32 s2391 = s2389 ^ s2390;+  const SWord32 s2392 = sbv_bv_u32_lshr(s2345, 0x0000000aUL);+  const SWord32 s2393 = s2391 ^ s2392;+  const SWord32 s2394 = sbv_bv_u32_add(s2172, s2393);+  const SWord32 s2395 = sbv_bv_u32_rotr(s1860, 7);+  const SWord32 s2396 = sbv_bv_u32_rotr(s1860, 18);+  const SWord32 s2397 = s2395 ^ s2396;+  const SWord32 s2398 = sbv_bv_u32_lshr(s1860, 0x00000003UL);+  const SWord32 s2399 = s2397 ^ s2398;+  const SWord32 s2400 = sbv_bv_u32_add(s2394, s2399);+  const SWord32 s2401 = sbv_bv_u32_add(s1777, s2400);+  const SWord32 s2402 = sbv_bv_u32_add(s2388, s2401);+  const SWord32 s2403 = sbv_bv_u32_rotr(s2291, 2);+  const SWord32 s2404 = sbv_bv_u32_rotr(s2291, 13);+  const SWord32 s2405 = s2403 ^ s2404;+  const SWord32 s2406 = sbv_bv_u32_rotr(s2291, 22);+  const SWord32 s2407 = s2405 ^ s2406;+  const SWord32 s2408 = s2280 & s2291;+  const SWord32 s2409 = s2269 & s2291;+  const SWord32 s2410 = s2408 ^ s2409;+  const SWord32 s2411 = s2286 ^ s2410;+  const SWord32 s2412 = sbv_bv_u32_add(s2407, s2411);+  const SWord32 s2413 = sbv_bv_u32_add(s2257, s2412);+  const SWord32 s2414 = sbv_bv_u32_rotr(s2413, 2);+  const SWord32 s2415 = sbv_bv_u32_rotr(s2413, 13);+  const SWord32 s2416 = s2414 ^ s2415;+  const SWord32 s2417 = sbv_bv_u32_rotr(s2413, 22);+  const SWord32 s2418 = s2416 ^ s2417;+  const SWord32 s2419 = s2291 & s2413;+  const SWord32 s2420 = s2280 & s2413;+  const SWord32 s2421 = s2419 ^ s2420;+  const SWord32 s2422 = s2408 ^ s2421;+  const SWord32 s2423 = sbv_bv_u32_add(s2418, s2422);+  const SWord32 s2424 = sbv_bv_u32_add(s2318, s2423);+  const SWord32 s2425 = sbv_bv_u32_rotr(s2424, 2);+  const SWord32 s2426 = sbv_bv_u32_rotr(s2424, 13);+  const SWord32 s2427 = s2425 ^ s2426;+  const SWord32 s2428 = sbv_bv_u32_rotr(s2424, 22);+  const SWord32 s2429 = s2427 ^ s2428;+  const SWord32 s2430 = s2413 & s2424;+  const SWord32 s2431 = s2291 & s2424;+  const SWord32 s2432 = s2430 ^ s2431;+  const SWord32 s2433 = s2419 ^ s2432;+  const SWord32 s2434 = sbv_bv_u32_add(s2429, s2433);+  const SWord32 s2435 = sbv_bv_u32_add(s2346, s2434);+  const SWord32 s2436 = sbv_bv_u32_rotr(s2435, 2);+  const SWord32 s2437 = sbv_bv_u32_rotr(s2435, 13);+  const SWord32 s2438 = s2436 ^ s2437;+  const SWord32 s2439 = sbv_bv_u32_rotr(s2435, 22);+  const SWord32 s2440 = s2438 ^ s2439;+  const SWord32 s2441 = s2424 & s2435;+  const SWord32 s2442 = s2413 & s2435;+  const SWord32 s2443 = s2441 ^ s2442;+  const SWord32 s2444 = s2430 ^ s2443;+  const SWord32 s2445 = sbv_bv_u32_add(s2440, s2444);+  const SWord32 s2446 = sbv_bv_u32_add(s2374, s2445);+  const SWord32 s2447 = sbv_bv_u32_rotr(s2446, 2);+  const SWord32 s2448 = sbv_bv_u32_rotr(s2446, 13);+  const SWord32 s2449 = s2447 ^ s2448;+  const SWord32 s2450 = sbv_bv_u32_rotr(s2446, 22);+  const SWord32 s2451 = s2449 ^ s2450;+  const SWord32 s2452 = s2435 & s2446;+  const SWord32 s2453 = s2424 & s2446;+  const SWord32 s2454 = s2452 ^ s2453;+  const SWord32 s2455 = s2441 ^ s2454;+  const SWord32 s2456 = sbv_bv_u32_add(s2451, s2455);+  const SWord32 s2457 = sbv_bv_u32_add(s2402, s2456);+  const SWord32 s2458 = sbv_bv_u32_add(s98, s2457);+  const SWord8  s2459 = sbv_bv_extract_u32_31_24_u8(s2458);+  const SWord8  s2460 = sbv_bv_extract_u32_23_16_u8(s2458);+  const SWord8  s2461 = sbv_bv_extract_u32_15_8_u8(s2458);+  const SWord8  s2462 = sbv_bv_extract_u32_7_0_u8(s2458);+  const SWord32 s2463 = sbv_bv_u32_add(s104, s2446);+  const SWord8  s2464 = sbv_bv_extract_u32_31_24_u8(s2463);+  const SWord8  s2465 = sbv_bv_extract_u32_23_16_u8(s2463);+  const SWord8  s2466 = sbv_bv_extract_u32_15_8_u8(s2463);+  const SWord8  s2467 = sbv_bv_extract_u32_7_0_u8(s2463);+  const SWord32 s2468 = sbv_bv_u32_add(s110, s2435);+  const SWord8  s2469 = sbv_bv_extract_u32_31_24_u8(s2468);+  const SWord8  s2470 = sbv_bv_extract_u32_23_16_u8(s2468);+  const SWord8  s2471 = sbv_bv_extract_u32_15_8_u8(s2468);+  const SWord8  s2472 = sbv_bv_extract_u32_7_0_u8(s2468);+  const SWord32 s2473 = sbv_bv_u32_add(s116, s2424);+  const SWord8  s2474 = sbv_bv_extract_u32_31_24_u8(s2473);+  const SWord8  s2475 = sbv_bv_extract_u32_23_16_u8(s2473);+  const SWord8  s2476 = sbv_bv_extract_u32_15_8_u8(s2473);+  const SWord8  s2477 = sbv_bv_extract_u32_7_0_u8(s2473);+  const SWord32 s2478 = sbv_bv_u32_add(s2402, s2413);+  const SWord32 s2479 = sbv_bv_u32_add(s101, s2478);+  const SWord8  s2480 = sbv_bv_extract_u32_31_24_u8(s2479);+  const SWord8  s2481 = sbv_bv_extract_u32_23_16_u8(s2479);+  const SWord8  s2482 = sbv_bv_extract_u32_15_8_u8(s2479);+  const SWord8  s2483 = sbv_bv_extract_u32_7_0_u8(s2479);+  const SWord32 s2484 = sbv_bv_u32_add(s107, s2375);+  const SWord8  s2485 = sbv_bv_extract_u32_31_24_u8(s2484);+  const SWord8  s2486 = sbv_bv_extract_u32_23_16_u8(s2484);+  const SWord8  s2487 = sbv_bv_extract_u32_15_8_u8(s2484);+  const SWord8  s2488 = sbv_bv_extract_u32_7_0_u8(s2484);+  const SWord32 s2489 = sbv_bv_u32_add(s113, s2347);+  const SWord8  s2490 = sbv_bv_extract_u32_31_24_u8(s2489);+  const SWord8  s2491 = sbv_bv_extract_u32_23_16_u8(s2489);+  const SWord8  s2492 = sbv_bv_extract_u32_15_8_u8(s2489);+  const SWord8  s2493 = sbv_bv_extract_u32_7_0_u8(s2489);+  const SWord32 s2494 = sbv_bv_u32_add(s119, s2319);+  const SWord8  s2495 = sbv_bv_extract_u32_31_24_u8(s2494);+  const SWord8  s2496 = sbv_bv_extract_u32_23_16_u8(s2494);+  const SWord8  s2497 = sbv_bv_extract_u32_15_8_u8(s2494);+  const SWord8  s2498 = sbv_bv_extract_u32_7_0_u8(s2494);++  sbv_output_0[0] = s2459;+  sbv_output_0[1] = s2460;+  sbv_output_0[2] = s2461;+  sbv_output_0[3] = s2462;+  sbv_output_0[4] = s2464;+  sbv_output_0[5] = s2465;+  sbv_output_0[6] = s2466;+  sbv_output_0[7] = s2467;+  sbv_output_0[8] = s2469;+  sbv_output_0[9] = s2470;+  sbv_output_0[10] = s2471;+  sbv_output_0[11] = s2472;+  sbv_output_0[12] = s2474;+  sbv_output_0[13] = s2475;+  sbv_output_0[14] = s2476;+  sbv_output_0[15] = s2477;+  sbv_output_0[16] = s2480;+  sbv_output_0[17] = s2481;+  sbv_output_0[18] = s2482;+  sbv_output_0[19] = s2483;+  sbv_output_0[20] = s2485;+  sbv_output_0[21] = s2486;+  sbv_output_0[22] = s2487;+  sbv_output_0[23] = s2488;+  sbv_output_0[24] = s2490;+  sbv_output_0[25] = s2491;+  sbv_output_0[26] = s2492;+  sbv_output_0[27] = s2493;+  sbv_output_0[28] = s2495;+  sbv_output_0[29] = s2496;+  sbv_output_0[30] = s2497;+  sbv_output_0[31] = s2498; } == END: "sha256HashBlock.c" ==================
SBVTestSuite/GoldFiles/unint-axioms-empty.gold view
@@ -12,10 +12,8 @@ [GOOD] (declare-sort Thing 0) ; N.B. Uninterpreted sort. [GOOD] ; --- literal constants --- [GOOD] ; --- top level inputs ----[GOOD] (declare-fun s2 () Thing) ; tracks user variable "__internal_sbv_s2"-[GOOD] (declare-fun s3 () Thing) ; tracks user variable "__internal_sbv_s3"-[GOOD] (declare-fun s5 () Thing)-[GOOD] (declare-fun s6 () Thing)+[GOOD] (declare-fun s2 () Thing)+[GOOD] (declare-fun s3 () Thing) [GOOD] ; --- constant tables --- [GOOD] ; --- non-constant tables --- [GOOD] ; --- uninterpreted constants ---@@ -29,15 +27,14 @@                                  (let ((l1_s2 (thingMerge l1_s0 l1_s1)))                                  (let ((l1_s3 (distinct l1_s0 l1_s2)))                                  l1_s3))))-[GOOD] (define-fun s4 () Thing (thingMerge s2 s3))-[GOOD] (define-fun s7 () Bool (= s5 s6))-[GOOD] (define-fun s8 () Bool (thingCompare s5 s6))-[GOOD] (define-fun s9 () Bool (=> s7 s8))+[GOOD] (define-fun s4 () Bool (= s2 s3))+[GOOD] (define-fun s5 () Bool (thingCompare s2 s3))+[GOOD] (define-fun s6 () Bool (=> s4 s5)) [GOOD] ; --- delayedEqualities --- [GOOD] ; --- formula --- [GOOD] (assert s0) [GOOD] (assert s1)-[GOOD] (assert (not s9))+[GOOD] (assert (not s6)) [SEND] (check-sat) [RECV] unsat *** Solver   : Z3
SBVTestSuite/SBVTest.hs view
@@ -19,6 +19,7 @@ import qualified TestSuite.ADT.Expr import qualified TestSuite.ADT.MutRec import qualified TestSuite.ADT.PExpr+import qualified TestSuite.ADT.Registration import qualified TestSuite.Arrays.InitVals import qualified TestSuite.Arrays.Memory import qualified TestSuite.Arrays.Query@@ -64,12 +65,21 @@ import qualified TestSuite.CantTypeCheck.Misc import qualified TestSuite.Char.Char import qualified TestSuite.CodeGeneration.AddSub+import qualified TestSuite.CodeGeneration.ArbitraryBits+import qualified TestSuite.CodeGeneration.ArbitraryFloats+import qualified TestSuite.CodeGeneration.ArrayCaptures+import qualified TestSuite.CodeGeneration.Boundaries import qualified TestSuite.CodeGeneration.CgTests import qualified TestSuite.CodeGeneration.CRC_USB5+import qualified TestSuite.CodeGeneration.ExactNumbers import qualified TestSuite.CodeGeneration.Fibonacci import qualified TestSuite.CodeGeneration.Floats import qualified TestSuite.CodeGeneration.GCD import qualified TestSuite.CodeGeneration.PopulationCount+import qualified TestSuite.CodeGeneration.LibraryBuild+import qualified TestSuite.CodeGeneration.PseudoBoolean+import qualified TestSuite.CodeGeneration.RegExp+import qualified TestSuite.CodeGeneration.ScalarSafety import qualified TestSuite.CodeGeneration.Uninterpreted import qualified TestSuite.CRC.CCITT import qualified TestSuite.CRC.CCITT_Unidir@@ -116,6 +126,7 @@ import qualified TestSuite.Queries.Int_Z3 import qualified TestSuite.Queries.Interpolants import qualified TestSuite.Queries.Lists+import qualified TestSuite.Queries.Registration import qualified TestSuite.Queries.Strings import qualified TestSuite.Queries.Sums import qualified TestSuite.Queries.Tables@@ -142,6 +153,7 @@                       , TestSuite.ADT.Expr.tests                       , TestSuite.ADT.MutRec.tests                       , TestSuite.ADT.PExpr.tests+                      , TestSuite.ADT.Registration.tests                       , TestSuite.Arrays.InitVals.tests                       , TestSuite.Arrays.Memory.tests                       , TestSuite.Arrays.Query.tests@@ -189,12 +201,21 @@                       , TestSuite.CantTypeCheck.Misc.tests                       , TestSuite.Char.Char.tests                       , TestSuite.CodeGeneration.AddSub.tests+                      , TestSuite.CodeGeneration.ArbitraryBits.tests+                      , TestSuite.CodeGeneration.ArbitraryFloats.tests+                      , TestSuite.CodeGeneration.ArrayCaptures.tests+                      , TestSuite.CodeGeneration.Boundaries.tests                       , TestSuite.CodeGeneration.CgTests.tests                       , TestSuite.CodeGeneration.CRC_USB5.tests+                      , TestSuite.CodeGeneration.ExactNumbers.tests                       , TestSuite.CodeGeneration.Fibonacci.tests                       , TestSuite.CodeGeneration.Floats.tests                       , TestSuite.CodeGeneration.GCD.tests                       , TestSuite.CodeGeneration.PopulationCount.tests+                      , TestSuite.CodeGeneration.LibraryBuild.tests+                      , TestSuite.CodeGeneration.PseudoBoolean.tests+                      , TestSuite.CodeGeneration.RegExp.tests+                      , TestSuite.CodeGeneration.ScalarSafety.tests                       , TestSuite.CodeGeneration.Uninterpreted.tests                       , TestSuite.CRC.CCITT.tests                       , TestSuite.CRC.CCITT_Unidir.tests@@ -241,6 +262,7 @@                       , TestSuite.Queries.Int_Mathsat.tests                       , TestSuite.Queries.Int_Yices.tests                       , TestSuite.Queries.Lists.tests+                      , TestSuite.Queries.Registration.tests                       , TestSuite.Queries.Strings.tests                       , TestSuite.Queries.Sums.tests                       , TestSuite.Queries.Tables.tests
+ SBVTestSuite/TestSuite/ADT/Registration.hs view
@@ -0,0 +1,124 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.ADT.Registration+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Registration of ADT dependencies without incidental uses of their fields.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds           #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell     #-}+{-# LANGUAGE TypeApplications    #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.ADT.Registration (tests) where++import Data.Proxy (Proxy(..))+import Control.DeepSeq (force)+import Control.Exception (evaluate)+import Control.Monad (void)+import Data.SBV.Control+import Test.Tasty.HUnit (assertEqual)+import Utils.SBVTestFramework++-- | A parameterized leaf whose definition must be discovered from its uses.+newtype RegistrationLeaf a = RegistrationLeaf a deriving (Eq, Ord, Show)++-- | An ADT reference underneath a tuple field.+newtype RegistrationTuple = RegistrationTuple (RegistrationLeaf Word8, Word8) deriving Show++-- | An ADT reference underneath a list field.+newtype RegistrationList = RegistrationList [RegistrationLeaf Word8] deriving Show++-- | An ADT reference underneath a set field.+newtype RegistrationSet = RegistrationSet (RCSet (RegistrationLeaf Word8)) deriving Show++-- | An ADT reference in an array's index type.+newtype RegistrationKey = RegistrationKey (ArrayModel (RegistrationLeaf Word8) Word8) deriving Show++-- | An ADT reference in an array's element type.+newtype RegistrationValue = RegistrationValue (ArrayModel Word8 (RegistrationLeaf Word8)) deriving Show++-- | A synonym must not hide dependencies from the registration traversal.+type RegistrationAlias = ([RegistrationLeaf Word8], Word8)++-- | A field whose container structure is supplied by a type synonym.+newtype RegistrationSynonym = RegistrationSynonym RegistrationAlias deriving Show++-- | Type arguments may themselves contain ADT references behind containers.+newtype RegistrationParameter a = RegistrationParameter (Maybe ([RegistrationLeaf a], a)) deriving Show++-- | Discover dependencies of an ADT that is itself only referenced by name.+newtype RegistrationChain = RegistrationChain RegistrationTuple deriving Show++-- | The root of a mutually recursive group, with a nested reference to its peer.+data RegistrationEven = RegistrationEnd | RegistrationEven (RegistrationOdd, Word8) deriving Show++-- | The return edge of the mutually recursive group.+newtype RegistrationOdd = RegistrationOdd RegistrationEven deriving Show++-- | Recursion through a type argument must not make retained metadata cyclic.+data RegistrationParamCycle = RegistrationParamEnd+                            | RegistrationParamNext (RegistrationParamLink RegistrationParamCycle)+                            deriving Show++-- | A parameter carrying the return edge of a recursive dependency.+newtype RegistrationParamLink a = RegistrationParamLink a deriving Show++-- | Generate all schemas without registering any symbolic values in advance.+mkSymbolic [''RegistrationLeaf, ''RegistrationTuple, ''RegistrationList, ''RegistrationSet, ''RegistrationKey, ''RegistrationValue, ''RegistrationSynonym, ''RegistrationParameter, ''RegistrationChain, ''RegistrationEven, ''RegistrationOdd, ''RegistrationParamCycle, ''RegistrationParamLink]++-- | Each fresh solver session uses only its root type, through either a literal+-- or a fresh variable. Field selectors and extra inner-type inputs must not mask+-- missing schemas.+tests :: TestTree+tests = testGroup "ADT.Registration" $+  [ testCase "literal-only symbolic constraint" $ do+      result <- runSMT $ do+        constrain (uninterpret "observeRegistrationEnd" (literal RegistrationEnd) :: SBool)+        query checkSat+      assertEqual "A leaf literal must register its unused recursive partner" Sat result+  , testCase "literal-only query constraint" $ do+      result <- runSMT $ query $ do+        constrain (uninterpret "observeRegistrationEnd" (literal RegistrationEnd) :: SBool)+        checkSat+      assertEqual "A query literal must register its unused recursive partner" Sat result+  , testCase "finite parameter-mediated recursive metadata" $ do+      let leaf = literal RegistrationParamEnd+      void $ evaluate (force (kindOf leaf))+      result <- runSMT $ do+        constrain (uninterpret "observeRegistrationParamEnd" leaf :: SBool)+        query checkSat+      assertEqual "Recursive type arguments must retain a finite declaration registry" Sat result+  ] ++ [ testGroup phase+           [ check interactive "tuple"         (Proxy @RegistrationTuple)+           , check interactive "list"          (Proxy @RegistrationList)+           , check interactive "set"           (Proxy @RegistrationSet)+           , check interactive "array key"     (Proxy @RegistrationKey)+           , check interactive "array value"   (Proxy @RegistrationValue)+           , check interactive "type synonym"  (Proxy @RegistrationSynonym)+           , check interactive "parameter"     (Proxy @(RegistrationParameter Word8))+           , check interactive "transitive"    (Proxy @RegistrationChain)+           , check interactive "mutual root"   (Proxy @RegistrationEven)+           , check interactive "mutual peer"   (Proxy @RegistrationOdd)+           ]+       | (phase, interactive) <- [("symbolic", Nothing), ("query named", Just False), ("query unnamed", Just True)]+       ]+ where check :: forall a. SymVal a => Maybe Bool -> String -> Proxy a -> TestTree+       check interactive testName _ = testCase testName $ do+         result <- runSMT $ case interactive of+           Just anonymous -> query $ do left  <- if anonymous then freshVar_ @a else freshVar @a "left"+                                        right <- if anonymous then freshVar_ @a else freshVar @a "right"+                                        constrain (left ./= right)+                                        checkSat+           Nothing -> do left  <- free "left"  :: Symbolic (SBV a)+                         right <- free "right" :: Symbolic (SBV a)+                         constrain (left ./= right)+                         query checkSat+         assertEqual "Distinct root values must be satisfiable without explicit subfield registration" Sat result
SBVTestSuite/TestSuite/Basics/ArbFloats.hs view
@@ -17,14 +17,23 @@ module TestSuite.Basics.ArbFloats(tests) where  import Utils.SBVTestFramework+import Test.Tasty.HUnit (assertEqual)+import Control.Monad (forM, forM_)+import Data.SBV.Control --- # of inhabitants is 2^sb(2^eb - 1) + 3+-- | Number of inhabitants: @2^sb(2^eb - 1) + 3@. count :: Integer -> Integer -> Integer count eb sb = 2^sb * (2^eb - 1) + 3 +-- | Concrete and symbolic arbitrary-format floating-point checks. tests :: TestTree tests = testGroup "Basics.ArbFloats"-  [ testCase "FP_2_2" (assert $ (== fromIntegral (count 2 2)) <$> numberOfModels (const sTrue :: SFloatingPoint 2 2 -> SBool))+  [ testCase "integral conversion rounding" integralConversionRounding+  , testCase "integral conversion format widths" integralConversionWidths+  , testCase "symbolic integral conversion rounding" symbolicIntegralConversionRounding+  , testCase "native integral conversion rounding" nativeIntegralConversionRounding+  , testCase "native integral conversion solver agreement" nativeIntegralConversionAgreement+  , testCase "FP_2_2" (assert $ (== fromIntegral (count 2 2)) <$> numberOfModels (const sTrue :: SFloatingPoint 2 2 -> SBool))   , testCase "FP_2_3" (assert $ (== fromIntegral (count 2 3)) <$> numberOfModels (const sTrue :: SFloatingPoint 2 3 -> SBool))   , testCase "FP_2_4" (assert $ (== fromIntegral (count 2 4)) <$> numberOfModels (const sTrue :: SFloatingPoint 2 4 -> SBool)) @@ -38,3 +47,128 @@    , goldenVsStringShow "arbFp_opt_1" (optimize Lexicographic $ \x -> do {constrain (fpIsPoint x);  maximize "x" (x::SFPHalf)})   ]++-- | Integer literals must fold in the requested direction, including both+-- tie parities and overflow. Expectations use exactly representable values.+integralConversionRounding :: Assertion+integralConversionRounding = do+  mapM_ check+    [ (0,      [0, 0, 0, 0, 0])+    , (2049,   [2048, 2050, 2050, 2048, 2048])+    , (2051,   [2052, 2052, 2052, 2050, 2050])+    , (-2049,  [-2048, -2050, -2048, -2050, -2048])+    , (-2051,  [-2052, -2052, -2050, -2052, -2050])+    , (65536,  [halfInfinity, halfInfinity, halfInfinity, 65504, 65504])+    , (-65536, [-halfInfinity, -halfInfinity, -65504, -halfInfinity, -65504])+    , (2 ^ (200 :: Int), [halfInfinity, halfInfinity, halfInfinity, 65504, 65504])+    ]+  mapM_ (\(mode, signed, unsigned) -> do+           assertEqual (show mode ++ ": signed native source") (Just signed)+             (unliteral (toSFloatingPoint (literal mode) (literal (-2049 :: Int16))) :: Maybe FPHalf)+           assertEqual (show mode ++ ": unsigned native source") (Just unsigned)+             (unliteral (toSFloatingPoint (literal mode) (literal (2049 :: Word16))) :: Maybe FPHalf))+    (zip3 modes [-2048, -2050, -2048, -2050, -2048] [2048, 2050, 2050, 2048, 2048])+ where modes = [RoundNearestTiesToEven, RoundNearestTiesToAway, RoundTowardPositive, RoundTowardNegative, RoundTowardZero]+       halfInfinity = 1 / 0 :: FPHalf++       check (sample, expected) = mapM_ (\(mode, value) ->+           assertEqual (show (sample, mode) ++ ": integer source") (Just value)+             (unliteral (toSFloatingPoint (literal mode) (literal sample :: SInteger))))+         (zip modes expected)++-- | Conversion must use the target format, not a binary64 intermediate.+-- Check a tiny nonstandard format and integer information beyond double's+-- precision, including a halfway value beyond quadruple's precision.+integralConversionWidths :: Assertion+integralConversionWidths = do+  assertEqual "tiny upward tie" (Just 10)+    (unliteral (toSFloatingPoint sRTP (9 :: SInteger)) :: Maybe (FloatingPoint 4 3))+  assertEqual "tiny downward negative tie" (Just (-10))+    (unliteral (toSFloatingPoint sRTN (-9 :: SInteger)) :: Maybe (FloatingPoint 4 3))+  let large = 2 ^ (100 :: Int) + 1+      tie   = 2 ^ (113 :: Int) + 1+  assertEqual "retain integer bits beyond binary64" (Just (fromInteger large))+    (unliteral (toSFloatingPoint sRNE (literal large :: SInteger)) :: Maybe FPQuad)+  assertEqual "quadruple upward tie" (Just (fromInteger (tie + 1)))+    (unliteral (toSFloatingPoint sRTP (literal tie :: SInteger)) :: Maybe FPQuad)++-- | Symbolic operands must still reach the solver; a symbolic rounding mode+-- must not be ignored merely because the integer operand is concrete.+symbolicIntegralConversionRounding :: Assertion+symbolicIntegralConversionRounding = do+  assertIsThm $ \mode -> (toSFloatingPoint mode (2049 :: SInteger) :: SFPHalf)+                     .== ite (mode .== sRNA .|| mode .== sRTP) 2050 2048+  assertIsThm $ \(value :: SInt16) -> value .== -2049+                                .=> (toSFloatingPoint sRTN value :: SFPHalf) .== -2050++-- | Check both native target formats at ties of either parity, with both+-- signs and directed overflow. All expectations are exactly representable.+nativeIntegralConversionRounding :: Assertion+nativeIntegralConversionRounding = do+  check (toSFloat, 24, 128)+  check (toSDouble, 53, 1024)+  source (literal (-127)              :: SInt8)+  source (literal (-32767)            :: SInt16)+  source (literal (-16777217)         :: SInt32)+  source (literal (-9007199254740993) :: SInt64)+  source (literal 255                 :: SWord8)+  source (literal 65535               :: SWord16)+  source (literal 16777217            :: SWord32)+  source (literal 9007199254740993    :: SWord64)+ where check :: (RealFloat a, SymVal a, Show a) => (SRoundingMode -> SInteger -> SBV a, Int, Int) -> Assertion+       check (convert, precision, exponentLimit) = do+         let base           = 2 ^ precision :: Integer+             number         = fromInteger+             nativeInfinity = 1 / 0+             largest        = number ((2 ^ precision - 1) * 2 ^ (exponentLimit - precision))+             cases = [ (0, [0, 0, 0, 0, 0])+                     , (base + 1, map number [base, base + 2, base + 2, base, base])+                     , (base + 3, map number [base + 4, base + 4, base + 4, base + 2, base + 2])+                     , (negate (base + 1), map (negate . number) [base, base + 2, base, base + 2, base])+                     , (negate (base + 3), map (negate . number) [base + 4, base + 4, base + 2, base + 4, base + 2])+                     , (2 ^ exponentLimit, [nativeInfinity, nativeInfinity, nativeInfinity, largest, largest])+                     , (negate (2 ^ exponentLimit), [-nativeInfinity, -nativeInfinity, -largest, -nativeInfinity, -largest])+                     , (2 ^ (exponentLimit + 200), [nativeInfinity, nativeInfinity, nativeInfinity, largest, largest])+                     ]+         forM_ cases $ \(sample, expected) ->+           forM_ (zip [minBound .. maxBound] expected) $ \(mode, value) ->+             assertEqual (show (precision, sample, mode)) (Just value) (unliteral (convert (literal mode) (literal sample)))+         forM_ [sRNE, sRNA, sRTP, sRTN, sRTZ] $ \mode ->+           assertEqual "Integer zero stays positive" (Just False) (isNegativeZero <$> unliteral (convert mode 0))++       source :: (Integral a, IEEEFloatConvertible a) => SBV a -> Assertion+       source value = forM_ [minBound .. maxBound] $ \mode -> do+         let integer = literal (maybe (error "Expected a literal source") toInteger (unliteral value)) :: SInteger+             rm      = literal mode+         assertEqual "Native source to Float"  (unliteral (toSFloat  rm integer)) (unliteral (toSFloat  rm value))+         assertEqual "Native source to Double" (unliteral (toSDouble rm integer)) (unliteral (toSDouble rm value))++-- | Compare native folding with solver casts, keeping both the integer and+-- rounding mode symbolic. Include near-ties that exceed binary64 precision+-- to detect accidental rounding through Double on the way to Float.+nativeIntegralConversionAgreement :: Assertion+nativeIntegralConversionAgreement = do+  observations <- runSMT $ do+    input <- sInteger "input"+    mode  <- free "mode"+    query $ forM [(n, rm) | n <- samples, rm <- [minBound .. maxBound]] $ \(n, rm) -> inNewAssertionStack $ do+      constrain (input .== literal n)+      constrain (mode .== literal rm)+      status <- checkSat+      case status of+        Sat -> do f <- getValue (toSFloat mode input)+                  d <- getValue (toSDouble mode input)+                  pure (n, rm, status, Just f, Just d)+        _   -> pure (n, rm, status, Nothing, Nothing)+  forM_ observations $ \(n, rm, status, f, d) -> do+    assertEqual "Concrete input and rounding mode are satisfiable" Sat status+    assertEqual (show (n, rm) ++ ": Float")  f (unliteral (toSFloat  (literal rm) (literal n :: SInteger)))+    assertEqual (show (n, rm) ++ ": Double") d (unliteral (toSDouble (literal rm) (literal n :: SInteger)))+  assertIsThm $ \mode -> toSFloat mode (16777217 :: SInteger)+                     .== ite (mode .== sRNA .|| mode .== sRTP) 16777218 16777216+  assertIsThm $ \mode -> toSDouble mode (-9007199254740993 :: SInteger)+                     .== ite (mode .== sRNA .|| mode .== sRTN) (-9007199254740994) (-9007199254740992)+ where samples = 0 : [sign * n | sign <- [1, -1], n <- [2 ^ (24 :: Int) + 1, 2 ^ (24 :: Int) + 3,+                                                      2 ^ (53 :: Int) + 1, 2 ^ (53 :: Int) + 3,+                                                      2 ^ (54 :: Int) + 2 ^ (30 :: Int) + 1,+                                                      2 ^ (128 :: Int), 2 ^ (1024 :: Int)]]
SBVTestSuite/TestSuite/Basics/String.hs view
@@ -26,8 +26,10 @@ import qualified Data.SBV.Char   as SC import qualified Data.SBV.RegExp as R -import Control.Monad (unless)-import Data.List (sort)+import Control.Monad (forM, forM_, replicateM, unless, void)+import Control.Exception (ErrorCall, displayException, evaluate, try)+import Data.List (isInfixOf, nub, sort)+import Test.Tasty.HUnit (assertBool, assertEqual)  import qualified Data.Map.Strict as M @@ -55,7 +57,109 @@     , goldenCapturedIO "strExamples12" $ \rf -> checkWith z3{redirectVerbose=Just rf} strExamples12   Unsat     , goldenCapturedIO "strExamples13" $ \rf -> checkWith z3{redirectVerbose=Just rf} strExamples13   Unsat     , testCase         "strExamples14" $ assert strExamples14+    , testGroup "literal regex semantics"+        [testCase (show sample P.++ " against " P.++ show regex)+           (assertEqual "Literal regex membership" (Just expected) (unliteral (literal sample `R.match` regex)))+        | (sample, regex, expected) <- regexLiteralCases]+    , testCase "regex literal and solver agreement" regexLiteralAgreement+    , testCase "invalid regex repetition bounds" regexInvalidBounds     ]++-- | Regressions for continuation handling: universal matching must not+-- discard a suffix, and Boolean operations must inspect the same prefix.+-- Include nullable repetition, empty inputs, Unicode, and embedded NULs.+regexLiteralCases :: [(String, R.RegExp, Bool)]+regexLiteralCases =+  [ ("", R.Conc [], True)+  , ("a", R.Conc [], False)+  , ("a", R.Conc [R.Conc [], "a", R.Conc []], True)+  , ("", R.Loop 0 0 "a", True)+  , ("a", R.Loop 0 0 "a", False)+  , ("", R.Power 0 "a", True)+  , ("aa", R.Loop 2 2 "a", True)+  , ("a", R.Conc [R.All, "b"], False)+  , ("ab", R.Conc [R.All, "b"], True)+  , ("b", R.Conc [R.All, "b"], True)+  , ("", R.Conc [R.All, "b"], False)+  , ("", R.All, True)+  , ("a", R.Conc [R.Comp "a", "b"], False)+  , ("b", R.Conc [R.Comp "a", "b"], True)+  , ("ab", R.Conc [R.Comp "a", "b"], False)+  , ("aab", R.Conc [R.Comp "a", "b"], True)+  , ("ab", R.Conc [R.Diff "ab" "a", R.Opt "b"], True)+  , ("ab", R.Conc [R.Diff "a" "ab", R.Opt "b"], True)+  , ("ab", R.Conc [R.Inter "a" "ab", R.All], False)+  , ("ab", R.Conc [R.Inter "a" (R.Opt "a"), "b"], True)+  , ("a", R.Conc [R.Diff R.All "", "a"], False)+  , ("ba", R.Conc [R.Diff R.All "", "a"], True)+  , ("", R.KStar (R.Opt "a"), True)+  , ("aaa", R.KStar (R.Inter (R.Opt "a") (R.Comp "b")), True)+  , ("b", R.KStar (R.Inter (R.Opt "a") (R.Comp "b")), False)+  , ("a", R.KStar (R.Conc [R.All, "b"]), False)+  , ("b", R.Conc [R.Loop 0 2 (R.Opt "a"), "b"], True)+  , ("aab", R.Conc [R.Power 2 (R.Diff "a" "b"), "b"], True)+  , ("a\0", R.Conc [R.Comp "b", "\0"], True)+  , ("\0a", R.Conc [R.All, "\0"], False)+  , ("\955b", R.Conc [R.Inter R.All (R.Comp "a"), "b"], True)+  , ("\955a", R.Conc [R.All, "b"], False)+  ]++-- | Compare folding with actual solver evaluation over a bounded matrix of+-- regexes and strings. Keep the solver input symbolic and constrain its value+-- so the reference path cannot silently reuse literal constant folding.+regexLiteralAgreement :: Assertion+regexLiteralAgreement = do+  observations <- runSMT $ do+    input <- sString "input"+    query $ forM samples $ \sample -> inNewAssertionStack $ do+      constrain (input .== literal sample)+      status <- checkSat+      actual <- case status of+                  Sat -> getValue (S.implode [input `R.match` regex | regex <- regexes])+                  _   -> pure []+      pure (sample, status, actual)+  forM_ observations $ \(sample, status, actual) -> do+    assertEqual "A concrete string assignment must be satisfiable" Sat status+    assertEqual "One result per regex" (length regexes) (length actual)+    forM_ (zip regexes actual) $ \(regex, expected) ->+      assertEqual ("Literal/solver disagreement for " P.++ show sample P.++ " against " P.++ show regex)+                  (Just expected) (unliteral (literal sample `R.match` regex))+ where atoms   = [R.All, R.None, R.Conc [], "", "a", "ab"]+       unary   = [op regex | op <- [R.Comp, R.KStar, R.KPlus, R.Opt, R.Loop 0 2], regex <- atoms]+       binary  = [op left right | op <- [R.Inter, R.Diff, \a b -> R.Union [a, b]], left <- atoms, right <- atoms]+       base    = atoms P.++ unary P.++ binary+       regexes = nub $ [regex | (_, regex, _) <- regexLiteralCases]+                  P.++ [wrapped | regex <- base, wrapped <- [regex, R.Conc [regex, "b"], R.Conc ["a", regex]]]+       samples = nub $ concatMap (`replicateM` "ab") [0 .. 3] P.++ [sample | (sample, _, _) <- regexLiteralCases]++-- | Invalid bounds must fail on both literal and symbolic inputs, even when+-- matching could skip the offending branch. The printer uses the same check.+regexInvalidBounds :: Assertion+regexInvalidBounds = forM_ invalid $ \(regex, diagnostic) ->+  forM_ wrappers $ \wrap -> do+    let r = wrap regex+    forM_ ["", "aa"] $ \sample ->+      rejects diagnostic $ void $ evaluate (unliteral ((literal sample :: SString) `R.match` r))+    rejects diagnostic $ void $ evaluate (length (show r))+    rejects diagnostic $ runSMT $ do+      input <- sString "input"+      constrain (input `R.match` r)+    -- Language equality bypasses match and exercises SMT serialization itself.+    rejects diagnostic $ void $ sat (r .== R.All)+ where invalid = [ (R.Loop 2 1 "a", "Loop with arguments: (2,1)")+                 , (R.Loop (-1) 2 "a", "Loop with arguments: (-1,2)")+                 , (R.Loop 0 (-1) "a", "Loop with arguments: (0,-1)")+                 , (R.Power (-1) "a", "Power with arguments: -1")+                 ]+       wrappers = [id, \r -> R.Union [R.All, r], \r -> R.Conc [R.None, r],+                   R.KStar, R.KPlus, R.Opt, R.Comp, R.Loop 0 0, R.Power 0,+                   R.Inter R.None, R.Diff R.None]++       rejects diagnostic action = do+         result <- try action :: IO (Either ErrorCall ())+         case result of+           Left err -> assertBool ("Expected diagnostic: " P.++ diagnostic) (diagnostic `isInfixOf` displayException err)+           Right () -> assertFailure ("Accepted invalid regex: " P.++ diagnostic)  checkWith :: SMTConfig -> Symbolic () -> CheckSatResult -> IO () checkWith cfg props csExpected = runSMTWith cfg{verbose=True} $ do
SBVTestSuite/TestSuite/Basics/UISat.hs view
@@ -9,12 +9,17 @@ -- Testing UI function sat examples ----------------------------------------------------------------------------- +{-# LANGUAGE DataKinds           #-}+{-# LANGUAGE ScopedTypeVariables #-}+ {-# OPTIONS_GHC -Wall -Werror #-}  module TestSuite.Basics.UISat(tests)  where  import Utils.SBVTestFramework +import Data.SBV.Control+ -- Test suite tests :: TestTree tests =@@ -22,6 +27,36 @@       goldenCapturedIO "uiSat_test1" $ \rf -> checkWith rf test1     , goldenCapturedIO "uiSat_test2" $ \rf -> checkWith rf test2     , goldenCapturedIO "uiSat_test3" $ \rf -> checkWith rf test3+    , testCase "register_float_nan" $ assertIsSat $ do+        let f = uninterpret "nanFloat" :: SInteger -> SFloat+        constrain $ \(Forall x) -> fpIsNaN (f x)+        registerFunction f+        pure sTrue+    , testCase "register_double_nan" $ assertIsSat $ do+        let f = uninterpret "nanDouble" :: SInteger -> SDouble+        constrain $ \(Forall x) -> fpIsNaN (f x)+        registerFunction f+        pure sTrue+    , testCase "register_sized_float_nan" $ assertIsSat $ do+        let f = uninterpret "nanHalf" :: SInteger -> SFPHalf+        constrain $ \(Forall x) -> fpIsNaN (f x)+        registerFunction f+        pure sTrue+    , testCase "register_defined_nan" $ assertIsSat $ do+        let f = smtFunction "definedNaN" $ \(_ :: SInteger) -> (sNaN :: SFloat)+        registerFunction f+        pure sTrue+    , testCase "register_nan_literal" $ assertIsSat $ do+        registerFunction (sNaN :: SFloat)+        pure sTrue+    , testCase "register_unused_binary_function_model" $ do+        result <- runSMT $ do+          registerFunction q2+          query $ do ensureSat+                     getFunction q2+        case result of+          Right{} -> pure ()+          Left{}  -> assertFailure "Expected a binary Boolean function interpretation"     ]  cfg :: FilePath -> SMTConfig
+ SBVTestSuite/TestSuite/CodeGeneration/ArbitraryBits.hs view
@@ -0,0 +1,450 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.ArbitraryBits+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Compile-and-run tests for C lowering of arbitrary-width bit-vectors.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds #-}+{-# LANGUAGE TypeApplications #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.ArbitraryBits (tests) where++import Data.List                 (isInfixOf)+import Data.Proxy                (Proxy(..))+import Numeric                   (showHex)+import System.Environment        (lookupEnv)+import System.Exit               (ExitCode(..))+import System.FilePath           ((</>))+import System.IO.Temp            (withSystemTempDirectory)+import System.Process            (readProcessWithExitCode)+import Test.Tasty.HUnit          (assertBool, assertEqual)++import Data.SBV.Internals+import Data.SBV.Tools.Overflow++import Utils.SBVTestFramework hiding ((#), bvExtract)++-- | Arbitrary-width C backend tests.+tests :: TestTree+tests = testGroup "CodeGeneration.ArbitraryBits"+  [ testCase "compile and execute 673-bit arithmetic" wide673+  , testCase "compile and execute signed 673-bit arithmetic" signed673+  , testCase "compile and execute non-aligned join/extract" joinExtract+  , testCase "compile and execute unsigned overflow predicates" unsignedOverflow+  , testCase "compile and execute signed overflow predicates" signedOverflow+  , testCase "compile and execute native overflow predicates" nativeOverflow+  , testCase "compile and execute one-bit overflow predicates" oneBitOverflow+  , testCase "compile and execute exact native bit operations" nativeBitOperations+  , testCase "compile and execute exact native arithmetic" nativeArithmetic+  , testCase "convert mapped integers and arbitrary-width bit-vectors" mappedIntegerBitVectorCasts+  , testCase "compile and execute checked wide table lookup" wideLookup+  , testCase "compile and execute wide array keys and values" wideArray+  , testCase "compile and execute a wide callback-backed array" wideArrayInput+  , testCase "compile and execute a wide structured lambda array" wideLambdaArray+  , testCase "compile and execute a wide structured lambda table" wideLambdaTable+  , testCase "compile and execute arithmetic boundary cases" arithmeticBoundaries+  ]++-- | Mapped integers sign-extend from their selected representation and reduce+-- incoming bit-vectors modulo that width. One-bit targets must retain bit 0,+-- not C's nonzero-to-Boolean interpretation.+mappedIntegerBitVectorCasts :: Assertion+mappedIntegerBitVectorCasts = mapM_ check [(width, sample) | width <- [8, 16, 32, 64], sample <- [-2, negate (2 ^ (width - 1)), 2 ^ (width - 1) - 1]]+ where check (width, sample) = withSystemTempDirectory "sbv-mapped-integer-bit-vectors" $ \dir -> do+         let signedSample   = negate (2 ^ (670 :: Int)) - 129+             unsignedSample = 2 ^ (672 :: Int) + 131+             program = do+               cgOverwriteFiles True+               cgIntegerSize width+               cgSetDriverValues [sample, signedSample, unsignedSample, 2 ^ (64 :: Int) - 1, -3]+               value    <- cgInput "value"         :: SBVCodeGen SInteger+               signed   <- cgInput "signedValue"   :: SBVCodeGen (SInt 673)+               unsigned <- cgInput "unsignedValue" :: SBVCodeGen (SWord 673)+               native   <- cgInput "native"        :: SBVCodeGen SWord64+               small    <- cgInput "small"         :: SBVCodeGen SInt8+               cgReturn $ sAnd+                 [ (sFromIntegral value :: SWord 1)     .== fromInteger sample+                 , (sFromIntegral value :: SInt 7)      .== fromInteger sample+                 , (sFromIntegral value :: SWord 9)     .== fromInteger sample+                 , (sFromIntegral value :: SInt 65)     .== fromInteger sample+                 , (sFromIntegral value :: SWord 673)   .== fromInteger sample+                 , (sFromIntegral value :: SInt64)      .== fromInteger sample+                 , (sFromIntegral signed :: SInteger)   .== fromInteger signedSample+                 , (sFromIntegral unsigned :: SInteger) .== fromInteger unsignedSample+                 , (sFromIntegral native :: SInteger)   .== -1+                 , (sFromIntegral small :: SInteger)    .== -3+                 ]+         compileAndRun dir "mappedIntegerBitVectors" program ") = 1"++-- | Exercise unsigned 673-bit arithmetic, shifts, rotation, and division.+wide673 :: Assertion+wide673 = withSystemTempDirectory "sbv-wide673" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [x, y]+        a <- cgInput "a" :: SBVCodeGen (SWord 673)+        b <- cgInput "b" :: SBVCodeGen (SWord 673)+        let symbolicResult = rotateL (((a + b) * (a - b)) `xor` shiftR a 67) 193+        cgReturn (symbolicResult `sQuot` (b + 1))+  compileAndRun dir "wide673" program (asHex 11 result)+ where w                 = 673+       modulus           = 2 ^ w+       mask              = modulus - 1+       x                 = 2 ^ (672 :: Int) + 9+       y                 = 17+       add a b           = (a + b) .&. mask+       sub a b           = (a - b) .&. mask+       mul a b           = (a * b) .&. mask+       shr a n           = a `shiftR` n+       rotl a n          = let r = n `mod` w in ((a `shiftLInteger` r) .|. (a `shiftR` (w - r))) .&. mask+       expectedZ         = rotl (mul (add x y) (sub x y) `xor` shr x 67) 193+       result            = expectedZ `quot` add y 1+       shiftLInteger a n = a * (2 ^ n)++-- | Exercise signed 673-bit ordering, quotient, remainder, and arithmetic shift.+signed673 :: Assertion+signed673 = withSystemTempDirectory "sbv-signed673" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [x, y]+        a <- cgInput "a" :: SBVCodeGen (SInt 673)+        b <- cgInput "b" :: SBVCodeGen (SInt 673)+        let q = a `sQuot` b+            r = a `sRem` b+        cgReturn $ ite (a .< b) (q + r) (shiftR a 130)+  compileAndRun dir "signed673" program (asHex 11 expectedRaw)+ where modulus     = 2 ^ (673 :: Int)+       x           = negate (2 ^ (671 :: Int)) + 12345+       y           = -17+       expectedRaw = ((x `quot` y) + (x `rem` y)) `mod` modulus++-- | Exercise non-aligned concatenation and extraction across limb boundaries.+joinExtract :: Assertion+joinExtract = withSystemTempDirectory "sbv-join-extract" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [hi, lo]+        a <- cgInput "high" :: SBVCodeGen (SWord 337)+        b <- cgInput "low"  :: SBVCodeGen (SWord 336)+        let joined = a # b :: SWord 673+        cgReturn (bvExtract (Proxy @511) (Proxy @128) joined :: SWord 384)+  compileAndRun dir "joinExtract" program (asHex 6 expected)+ where hi             = 2 ^ (336 :: Int) + 0x123456789abcdef+       lo             = 2 ^ (335 :: Int) + 0xfedcba987654321+       expectedJoined = hi * 2 ^ (336 :: Int) + lo+       expected       = (expectedJoined `shiftR` 128) .&. (2 ^ (384 :: Int) - 1)++-- | Exercise unsigned overflow and underflow predicates at a non-native width.+unsignedOverflow :: Assertion+unsignedOverflow = withSystemTempDirectory "sbv-unsigned-overflow" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2 ^ (65 :: Int) - 1, 2]+        a <- cgInput "a" :: SBVCodeGen (SWord 65)+        b <- cgInput "b" :: SBVCodeGen (SWord 65)+        cgReturn $ pack [bvAddO a b, bvSubO 0 b, bvMulO a b, bvMulO b 3]+  compileAndRun dir "unsignedOverflow" program (asHex 2 7)+ where pack :: [SBool] -> SWord 65+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8])++-- | Exercise signed overflow predicates, including both signed extrema.+signedOverflow :: Assertion+signedOverflow = withSystemTempDirectory "sbv-signed-overflow" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2 ^ (64 :: Int) - 1, 1]+        a <- cgInput "a" :: SBVCodeGen (SInt 65)+        b <- cgInput "b" :: SBVCodeGen (SInt 65)+        let minValue = fromInteger (negate (2 ^ (64 :: Int))) :: SInt 65+        cgReturn $ pack [bvAddO a b, bvSubO minValue b, bvMulO a (b + b), bvDivO minValue (negate b), bvNegO minValue, bvMulO a b]+  compileAndRun dir "signedOverflow" program (asHex 2 31)+ where pack :: [SBool] -> SWord 65+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32])++-- | Exercise every unsigned and signed overflow predicate at native C widths,+-- including promotion-sensitive 8-bit and undefined-in-C 64-bit boundaries.+nativeOverflow :: Assertion+nativeOverflow = withSystemTempDirectory "sbv-native-overflow" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [maxWord, 2, maxInt, 1, minInt, minInt8]+        unsignedMax <- cgInput "unsignedMax" :: SBVCodeGen SWord64+        unsignedTwo <- cgInput "unsignedTwo" :: SBVCodeGen SWord64+        signedMax   <- cgInput "signedMax"   :: SBVCodeGen SInt64+        signedOne   <- cgInput "signedOne"   :: SBVCodeGen SInt64+        signedMin   <- cgInput "signedMin"   :: SBVCodeGen SInt64+        signedMin8  <- cgInput "signedMin8"  :: SBVCodeGen SInt8+        let flags = [ bvAddO unsignedMax unsignedTwo+                    , bvSubO 0 unsignedTwo+                    , bvMulO unsignedMax unsignedTwo+                    , bvMulO unsignedTwo 3+                    , bvAddO signedMax signedOne+                    , bvSubO signedMin signedOne+                    , bvMulO signedMax 2+                    , bvDivO signedMin (negate signedOne)+                    , bvNegO signedMin+                    , bvMulO signedMax signedOne+                    , bvNegO signedMin8+                    , bvMulO signedMin8 (-1)+                    ]+        cgReturn $ pack flags+      maxWord = 2 ^ (64 :: Int) - 1+      maxInt  = 2 ^ (63 :: Int) - 1+      minInt  = negate (2 ^ (63 :: Int))+      minInt8 = -128+  compileAndRun dir "nativeOverflow" program "0x0df7U"+ where pack :: [SBool] -> SWord16+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048])++-- | Exercise the Boolean truth tables for overflow and underflow on an+-- unsigned one-bit vector, including the public constant-false predicates.+oneBitOverflow :: Assertion+oneBitOverflow = withSystemTempDirectory "sbv-one-bit-overflow" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 0]+        oneBit  <- cgInput "oneBit"  :: SBVCodeGen (SWord 1)+        zeroBit <- cgInput "zeroBit" :: SBVCodeGen (SWord 1)+        cgReturn $ pack [ bvAddO oneBit oneBit+                        , bvAddO oneBit zeroBit+                        , bvAddO zeroBit oneBit+                        , bvAddO zeroBit zeroBit+                        , bvSubO zeroBit oneBit+                        , bvSubO oneBit zeroBit+                        , bvSubO oneBit oneBit+                        , bvSubO zeroBit zeroBit+                        , bvMulO oneBit oneBit+                        , bvMulO oneBit zeroBit+                        , bvMulO zeroBit oneBit+                        , bvMulO zeroBit zeroBit+                        , bvDivO oneBit oneBit+                        , bvNegO oneBit+                        ]+  compileAndRun dir "oneBitOverflow" program "0x0011U"+ where pack :: [SBool] -> SWord16+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192])++-- | Exercise non-byte-aligned native extraction and signed rotations,+-- including counts larger than the operand width and SBV's unchanged result+-- for a negative constant count.+nativeBitOperations :: Assertion+nativeBitOperations = withSystemTempDirectory "sbv-native-bit-operations" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [wordSample, signedSample]+        wordValue   <- cgInput "wordValue"   :: SBVCodeGen (SWord 32)+        signedValue <- cgInput "signedValue" :: SBVCodeGen (SInt 32)+        let extracted    = bvExtract (Proxy @10) (Proxy @3) wordValue :: SWord 8+            highHalf     = bvExtract (Proxy @31) (Proxy @16) wordValue :: SWord 16+            lowHalf      = bvExtract (Proxy @15) (Proxy @0) wordValue :: SWord 16+            rejoined     = highHalf # lowHalf :: SWord 32+            signExtended = signExtend signedValue :: SInt 64+            zeroExtended = zeroExtend wordValue :: SWord 64+            narrowed     = sFromIntegral signedValue :: SWord8+            shiftedLeft  = signed32 (raw32 (raw32 signedSample * 2 ^ (3 :: Int)))+            shiftedRight = signedSample `div` 2 ^ (3 :: Int)+            flags        = [ extracted .== fromInteger extractedExpected+                           , rotateL signedValue 37   .== fromInteger rotatedLeftExpected+                           , rotateR signedValue 39   .== fromInteger rotatedRightExpected+                           , rotateR signedValue (-5) .== signedValue+                           , signExtended .== fromInteger signedSample+                           , zeroExtended .== fromInteger wordSample+                           , narrowed .== fromInteger (raw32 signedSample `mod` 2 ^ (8 :: Int))+                           , rejoined .== wordValue+                           , shiftL signedValue 3  .== fromInteger shiftedLeft+                           , shiftR signedValue 3  .== fromInteger shiftedRight+                           , shiftL signedValue 32 .== 0+                           , shiftR signedValue 32 .== (-1)+                           ]+        cgReturn $ pack flags+  compileAndRun dir "nativeBitOperations" program "0x0fffU"+ where wordSample :: Integer+       wordSample           = 0xdeadbeef++       signedSample :: Integer+       signedSample         = -19088744++       extractedExpected :: Integer+       extractedExpected    = (wordSample `div` (2 ^ (3 :: Int))) `mod` (2 ^ (8 :: Int))++       rotatedLeftExpected :: Integer+       rotatedLeftExpected  = signed32 (rotateLeft32 signedSample 5)++       rotatedRightExpected :: Integer+       rotatedRightExpected = signed32 (rotateRight32 signedSample 7)++       rotateLeft32 :: Integer -> Int -> Integer+       rotateLeft32 value amount = (raw32 value * 2 ^ amount + raw32 value `div` 2 ^ (32 - amount)) `mod` 2 ^ (32 :: Int)++       rotateRight32 :: Integer -> Int -> Integer+       rotateRight32 value amount = (raw32 value `div` 2 ^ amount + raw32 value * 2 ^ (32 - amount)) `mod` 2 ^ (32 :: Int)++       raw32 :: Integer -> Integer+       raw32 value = value `mod` 2 ^ (32 :: Int)++       signed32 :: Integer -> Integer+       signed32 value+         | value >= 2 ^ (31 :: Int) = value - 2 ^ (32 :: Int)+         | True                     = value++       pack :: [SBool] -> SWord16+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048])++-- | Exercise modular native arithmetic and the two division cases that would+-- otherwise be undefined in C.+nativeArithmetic :: Assertion+nativeArithmetic = withSystemTempDirectory "sbv-native-arithmetic" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [minimumInt64, -1, maximumInt64, maximumInt32, maximumWord16]+        minimum64 <- cgInput "minimum64" :: SBVCodeGen SInt64+        negative1 <- cgInput "negative1" :: SBVCodeGen SInt64+        maximum64 <- cgInput "maximum64" :: SBVCodeGen SInt64+        maximum32 <- cgInput "maximum32" :: SBVCodeGen SInt32+        maximum16 <- cgInput "maximum16" :: SBVCodeGen SWord16+        let flags = [ maximum64 + 1 .== fromInteger minimumInt64+                    , minimum64 + negative1 .== fromInteger maximumInt64+                    , minimum64 - 1 .== fromInteger maximumInt64+                    , maximum64 * 2 .== (-2)+                    , negate minimum64 .== minimum64+                    , abs minimum64 .== minimum64+                    , minimum64 `sQuot` negative1 .== minimum64+                    , minimum64 `sRem` negative1 .== 0+                    , minimum64 `sQuot` 0 .== 0+                    , minimum64 `sRem` 0 .== minimum64+                    , maximum32 * maximum32 .== 1+                    , maximum16 * maximum16 .== 1+                    ]+        cgReturn $ pack flags+  compileAndRun dir "nativeArithmetic" program "0x0fffU"+ where minimumInt64 :: Integer+       minimumInt64 = negate (2 ^ (63 :: Int))++       maximumInt64 :: Integer+       maximumInt64 = 2 ^ (63 :: Int) - 1++       maximumInt32 :: Integer+       maximumInt32 = 2 ^ (31 :: Int) - 1++       maximumWord16 :: Integer+       maximumWord16 = 2 ^ (16 :: Int) - 1++       pack :: [SBool] -> SWord16+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048])++-- | Exercise checked table lookup with both a wide index and wide elements.+wideLookup :: Assertion+wideLookup = withSystemTempDirectory "sbv-wide-lookup" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgPerformRTCs True+        cgSetDriverValues [2 ^ (64 :: Int) + 1]+        index <- cgInput "index" :: SBVCodeGen (SWord 65)+        cgReturn (select [11, 22] 99 index :: SWord 673)+  compileAndRun dir "wideLookup" program (asHex 11 99)++-- | Exercise persistent arrays whose keys and values both use exact-width+-- limb representations.+wideArray :: Assertion+wideArray = withSystemTempDirectory "sbv-wide-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [keySample, valueSample]+        key   <- cgInput "key"   :: SBVCodeGen (SWord 673)+        value <- cgInput "value" :: SBVCodeGen (SWord 257)+        let base    = constArray 3+            updated = writeArray base key value+        cgOutput "defaultRead" (readArray updated (key + 1))+        cgReturn (readArray updated key)+      keySample   = 2 ^ (672 :: Int) + 17+      valueSample = 2 ^ (256 :: Int) + 5+  compileAndRun dir "wideArray" program (asHex 5 valueSample)++-- | Exercise the public callback descriptor when both its key and returned+-- value use multi-limb bit-vector representations.+wideArrayInput :: Assertion+wideArrayInput = withSystemTempDirectory "sbv-wide-array-input" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [valueSample, keySample]+        source <- cgInput "source" :: SBVCodeGen (SArray (WordN 673) (WordN 257))+        key    <- cgInput "key"    :: SBVCodeGen (SWord 673)+        cgReturn (readArray source key)+      keySample   = 2 ^ (672 :: Int) + 17+      valueSample = 2 ^ (256 :: Int) + 5+  compileAndRun dir "wideArrayInput" program (asHex 5 valueSample)++-- | Exercise a structured array lambda whose parameter, local arithmetic,+-- and result all use the 673-bit limb representation.+wideLambdaArray :: Assertion+wideLambdaArray = withSystemTempDirectory "sbv-wide-lambda-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [keySample]+        key <- cgInput "key" :: SBVCodeGen (SWord 673)+        let source = lambdaArray (\index -> index * 3 + 5) :: SArray (WordN 673) (WordN 673)+        cgReturn (readArray source key)+      keySample = 2 ^ (672 :: Int) + 17+      expected  = (keySample * 3 + 5) `mod` (2 ^ (673 :: Int))+  compileAndRun dir "wideLambdaArray" program (asHex 11 expected)++-- | Exercise a parameter-dependent lookup table entirely within a structured+-- lambda using arbitrary-width indices, elements, and results.+wideLambdaTable :: Assertion+wideLambdaTable = withSystemTempDirectory "sbv-wide-lambda-table" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        key <- cgInput "key" :: SBVCodeGen (SWord 673)+        let source = lambdaArray (\index -> select [index + 1, index * 3] 99 index) :: SArray (WordN 673) (WordN 673)+        cgReturn (readArray source key)+  compileAndRun dir "wideLambdaTable" program (asHex 11 3)++-- | Exercise division-by-zero, extreme shifts, and signed-minimum division.+arithmeticBoundaries :: Assertion+arithmeticBoundaries = withSystemTempDirectory "sbv-arithmetic-boundaries" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [negate (2 ^ (64 :: Int))]+        a <- cgInput "a" :: SBVCodeGen (SInt 65)+        let z = 0 :: SInt 65+        cgReturn $ pack [a `sQuot` z .== z+                        , a `sRem` z .== a+                        , shiftL a 65 .== z+                        , shiftR a 65 .== (-1)+                        , a `sQuot` (-1) .== a+                        , a `sRem` (-1) .== z+                        , rotateL a 66 .== 1]+  compileAndRun dir "arithmeticBoundaries" program (asHex 2 127)+ where pack :: [SBool] -> SWord 65+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64])++-- | Generate, compile, and execute a C program, checking its encoded result.+-- @SBV_C_TEST_FLAGS@ supplies extra flags for optimization and sanitizer runs.+compileAndRun :: FilePath -> String -> SBVCodeGen () -> String -> Assertion+compileAndRun dir functionName program expected = do+  (_, cfg, bundle) <- compileToC' functionName program+  renderCgPgmBundle (Just dir) (cfg, bundle)++  let source = dir </> functionName ++ ".c"+      driver = dir </> functionName ++ "_driver.c"+      exe    = dir </> functionName ++ "_driver"+  extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+  (ccExit, _, ccErr) <- readProcessWithExitCode "cc" (["-std=c11", "-Wall", "-Werror", source, driver, "-o", exe] ++ extraFlags) ""+  assertEqual ccErr ExitSuccess ccExit++  (runExit, out, runErr) <- readProcessWithExitCode exe [] ""+  assertEqual runErr ExitSuccess runExit+  assertBool ("Expected generated output to contain " ++ expected ++ ", received:\n" ++ out) (expected `isInfixOf` out)++-- | Render the fixed-limb hexadecimal form printed by generated drivers.+asHex :: Int -> Integer -> String+asHex limbCount value = "0x" ++ replicate (16 * limbCount - length h) '0' ++ h+ where h = showHex value ""
+ SBVTestSuite/TestSuite/CodeGeneration/ArbitraryFloats.hs view
@@ -0,0 +1,1073 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.ArbitraryFloats+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Compile-and-run tests for LibBF-backed arbitrary floating-point C lowering.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.ArbitraryFloats (tests) where++import Control.Monad             (when)+import Data.List                 (isInfixOf)+import Data.Maybe                (fromMaybe)+import Numeric                   (showHex)+import System.Directory          (doesFileExist)+import System.Environment        (lookupEnv)+import System.Exit               (ExitCode(..))+import System.FilePath           ((</>))+import System.IO.Temp            (withSystemTempDirectory)+import System.Process            (readProcessWithExitCode)+import Test.Tasty.HUnit          (assertBool, assertEqual)++import qualified Data.SBV.Dynamic as D+import qualified Data.SBV.Rational as Rat++import Data.SBV.Internals+import Data.SBV.Tuple (tuple, untuple)++import Utils.SBVTestFramework hiding ((#))+import Utils.CCodeGen (locateLibBF, generatedMakeOptions)++-- | Arbitrary floating-point C backend tests.+tests :: TestTree+tests = testGroup "CodeGeneration.ArbitraryFloats"+  [ testCase "compile and execute arithmetic" arbitraryFloatArithmetic+  , testCase "preserve division, signed zero, and extreme-exponent FMA" reviewedFloatArithmetic+  , testCase "compile and execute a nonstandard wide format" arbitraryFloatWideFormat+  , testCase "compile and execute classification" arbitraryFloatClassification+  , testCase "compile and execute rounding modes" arbitraryFloatRoundingModes+  , testCase "compile and execute symbolic rounding modes" arbitraryFloatSymbolicRoundingMode+  , testCase "compile and execute native rounding modes" nativeFloatRoundingModes+  , testCase "preserve native floating rounding steps under optimization" nativeFloatRoundingSteps+  , testCase "reject unsafe floating compiler modes" nativeFloatCompilerModes+  , testCase "convert between native floats and bit-vectors" nativeFloatBitVectorConversions+  , testCase "convert native floats across non-native widths" nativeFloatWidthConversions+  , testCase "preserve native floating casts under caller rounding modes" nativeFloatCastEnvironment+  , testCase "totalize exceptional native floating casts without C overflow" nativeFloatExceptionalCasts+  , testCase "keep exact native floating casts free of LibBF" nativeExactFloatConversions+  , testCase "convert between native floats and exact numbers" nativeFloatExactConversions+  , testCase "convert mapped integers with explicit float rounding" mappedIntegerFloatConversions+  , testCase "convert mapped reals across numeric representations" mappedRealConversions+  , testCase "preserve target long-double precision across numeric bridges" longDoubleNumericBoundaries+  , testCase "reject unsupported target long-double formats explicitly" unsupportedLongDoubleFormat+  , testCase "compile and execute special arithmetic" arbitraryFloatSpecialArithmetic+  , testCase "compile and execute arbitrary-float table lookup" arbitraryFloatTableLookup+  , testCase "preserve arbitrary floating-point array-key equality" arbitraryFloatArrayKeys+  , testCase "compile and execute an arbitrary-float callback-backed array" arbitraryFloatArrayInput+  , testCase "compile and execute an arbitrary-float structured lambda array" arbitraryFloatLambdaArray+  , testCase "compile and execute an arbitrary-float structured lambda table" arbitraryFloatLambdaTable+  , testCase "convert between arbitrary floats and exact numbers" arbitraryFloatExactConversions+  , testCase "compile and execute a mixed repeated-type library" mixedRepeatedTypeLibrary+  , testCase "compile a repeated-type library without a driver" repeatedTypeLibraryWithoutDriver+  , testCase "compile a wide arbitrary-float tuple" wideFloatingTuple+  , testCase "preserve dependencies with optional library files" optionalLibraryFiles+  ]++-- | Exercise the ordinary fractional operator, both same-sign zero arguments,+-- and cancellation after a product beyond the target format's exponent range.+reviewedFloatArithmetic :: Assertion+reviewedFloatArithmetic = withSystemTempDirectory "sbv-reviewed-floats" $ \dir -> do+  let bias = 2 ^ (28 :: Int) - 1+      aBits = (bias + 2 ^ (27 :: Int)) * 4+      cBits = 2 ^ (31 :: Int) + (2 ^ (29 :: Int) - 2) * 4 + 3+      program = do+        cgOverwriteFiles True+        cgSetDriverValues [6, 2, 0x8000, 0x8000, aBits, cBits]+        dividendValue <- cgInput "numerator" :: SBVCodeGen SFPQuad+        divisorValue <- cgInput "denominator" :: SBVCodeGen SFPQuad+        negativeZeroBits <- cgInput "zeroBits" :: SBVCodeGen (SWord 16)+        otherZeroBits <- cgInput "otherZeroBits" :: SBVCodeGen (SWord 16)+        aRaw <- cgInput "aBits" :: SBVCodeGen (SWord 32)+        cRaw <- cgInput "cBits" :: SBVCodeGen (SWord 32)+        let negativeZero = sWordAsSFloatingPoint negativeZeroBits :: SFPHalf+            otherNegativeZero = sWordAsSFloatingPoint otherZeroBits :: SFPHalf+            a = sWordAsSFloatingPoint aRaw :: SFloatingPoint 29 3+            c = sWordAsSFloatingPoint cRaw :: SFloatingPoint 29 3+            result = fpFMA sRNE a a c+            expected = literal (fromInteger ((bias + 2 ^ (28 :: Int) - 3) * 4)) :: SWord 32+        cgReturn $ dividendValue / divisorValue .== 3+               .&& fpIsEqualObject (fpMin negativeZero otherNegativeZero) negativeZero+               .&& fpIsEqualObject (fpMax negativeZero otherNegativeZero) negativeZero+               .&& sFloatingPointAsSWord result .== expected+  compileAndRunLibBF dir "reviewedFloatArithmetic" program ") = 1"++-- | Keep LibBF requirements when its component disables Makefile generation,+-- and associate an enabled driver with its own component after a disabled one.+optionalLibraryFiles :: Assertion+optionalLibraryFiles = mapM_ check [False, True]+ where check generateMakefile = withSystemTempDirectory "sbv-optional-library-files" $ \dir -> do+         (includeDir, archive) <- locateLibBF+         (_, cfg, bundle) <- compileToCLib' "optionalLibrary"+           [ ("scalar", do+                 cgOverwriteFiles True+                 cgGenerateDriver False+                 cgGenerateMakefile generateMakefile+                 value <- cgInput "value" :: SBVCodeGen SWord8+                 cgReturn (value + 1))+           , ("half", do+                 cgOverwriteFiles True+                 cgGenerateMakefile False+                 cgSetDriverValues [1]+                 value <- cgInput "value" :: SBVCodeGen SFPHalf+                 cgReturn (value + 1))+           ]+         renderCgPgmBundle (Just dir) (cfg, bundle)+         hasMakefile <- doesFileExist (dir </> "Makefile")+         assertEqual "Unexpected optional Makefile" generateMakefile hasMakefile+         when generateMakefile $ do+           makefile <- readFile (dir </> "Makefile")+           assertBool "Hidden component lost its LibBF link dependency" ("-lbf" `isInfixOf` makefile)+         let driverPath = dir </> "driver"+         extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+         (buildExit, _, buildError) <- readProcessWithExitCode "cc"+           ([ "-std=c11", "-Wall", "-Werror", "-I" ++ includeDir+           , dir </> "scalar.c", dir </> "half.c", dir </> "optionalLibrary_driver.c"+           , archive, "-lm", "-o", driverPath+           ] ++ extraFlags) ""+         assertEqual buildError ExitSuccess buildExit+         (runExit, outputText, runError) <- readProcessWithExitCode driverPath [] ""+         assertEqual runError ExitSuccess runExit+         assertBool outputText ("Driver run for half:" `isInfixOf` outputText && asHex 1 0x4000 `isInfixOf` outputText)++-- | Exercise tuple fields whose value representations are generated wide+-- bit-vector and arbitrary floating-point structures.+wideFloatingTuple :: Assertion+wideFloatingTuple = withSystemTempDirectory "sbv-wide-floating-tuple" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5]+        source <- cgInput "source" :: SBVCodeGen (SBV (WordN 65, FloatingPoint 7 19))+        let (word, float) = untuple source+        cgReturn (tuple (word + 1, float + 1))++  compileAndRunLibBF dir "wideFloatingTuple" program "(0x00000000000000000000000000000006, 0x"++-- | Exercise LibBF-backed quadruple arithmetic and floating-point predicates.+arbitraryFloatArithmetic :: Assertion+arbitraryFloatArithmetic = withSystemTempDirectory "sbv-arbitrary-float" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 2, -17]+        a <- cgInput "a" :: SBVCodeGen SFPQuad+        b <- cgInput "b" :: SBVCodeGen SFPQuad+        c <- cgInput "c" :: SBVCodeGen SInt64+        let added     = fpAdd sRNE a b+            fused     = fpFMA sRNE a b b+            half      = toSFloatingPoint sRNE fused :: SFPHalf+            viaHalf   = toSFloatingPoint sRNE half :: SFPQuad+            asDouble  = fromSFloatingPoint sRNE fused :: SDouble+            viaDouble = toSFloatingPoint sRNE asDouble :: SFPQuad+            fromInt   = toSFloatingPoint sRNE c :: SFPQuad+            backInt   = fromSFloatingPoint sRNE fromInt :: SInt64+            bits      = sFloatingPointAsSWord viaDouble :: SWord 128+            roundTrip = sWordAsSFloatingPoint bits :: SFPQuad+        cgOutput "added" added+        cgOutput "fusedBits" bits+        cgReturn $ ite (fpIsNormal a .&& a .> b .&& fpIsEqualObject fused viaHalf .&& fpIsEqualObject fused roundTrip .&& backInt .== c) roundTrip added+      bias     = 2 ^ (14 :: Int) - 1 :: Integer+      eightRaw = (bias + 3) * 2 ^ (112 :: Int)+  compileAndRunLibBF dir "arbitraryFloatArithmetic" program (asHex 2 eightRaw)++-- | Exercise a nonstandard format whose interchange value spans four limbs.+arbitraryFloatWideFormat :: Assertion+arbitraryFloatWideFormat = withSystemTempDirectory "sbv-arbitrary-float-wide-format" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 5]+        a <- cgInput "a" :: SBVCodeGen (SFloatingPoint 17 237)+        b <- cgInput "b" :: SBVCodeGen (SFloatingPoint 17 237)+        let result = fpAdd sRNE a b+            bits   = sFloatingPointAsSWord result :: SWord 254+        cgOutput "bits" bits+        cgReturn result+      bias     = 2 ^ (16 :: Int) - 1 :: Integer+      eightRaw = (bias + 3) * 2 ^ (236 :: Int)+  compileAndRunLibBF dir "arbitraryFloatWideFormat" program (asHex 4 eightRaw)++-- | Exercise special-value classification through raw half-precision inputs.+arbitraryFloatClassification :: Assertion+arbitraryFloatClassification = withSystemTempDirectory "sbv-arbitrary-float-classification" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x7e00, 0x8000, 0x0001, 0x7c00]+        nanBits <- cgInput "nanBits"          :: SBVCodeGen (SWord 16)+        nzBits  <- cgInput "negativeZeroBits" :: SBVCodeGen (SWord 16)+        subBits <- cgInput "subnormalBits"    :: SBVCodeGen (SWord 16)+        infBits <- cgInput "infinityBits"     :: SBVCodeGen (SWord 16)+        let nanValue     = sWordAsSFloatingPoint nanBits :: SFPHalf+            negativeZero = sWordAsSFloatingPoint nzBits :: SFPHalf+            subnormal    = sWordAsSFloatingPoint subBits :: SFPHalf+            infValue     = sWordAsSFloatingPoint infBits :: SFPHalf+            positiveZero = 0 :: SFPHalf+        cgReturn $ pack [fpIsNaN nanValue+                        , nanValue ./= nanValue+                        , fpIsEqualObject nanValue nanValue+                        , fpIsZero negativeZero+                        , fpIsNegative negativeZero+                        , sNot (fpIsEqualObject negativeZero positiveZero)+                        , negativeZero .== positiveZero+                        , fpIsSubnormal subnormal+                        , fpIsPositive subnormal+                        , sNot (fpIsNormal subnormal)+                        , fpIsInfinite infValue+                        , sNot (fpIsNormal infValue)+                        , distinct [nanValue, nanValue, positiveZero]+                        , sNot (distinct [negativeZero, positiveZero])]+  compileAndRunLibBF dir "arbitraryFloatClassification" program "0x3fff"+ where pack :: [SBool] -> SWord16+       pack flags = sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192])++-- | Exercise all IEEE rounding modes on an exactly halfway format conversion.+arbitraryFloatRoundingModes :: Assertion+arbitraryFloatRoundingModes = withSystemTempDirectory "sbv-arbitrary-float-rounding" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2049, 2048]+        numValue <- cgInput "numerator"   :: SBVCodeGen SFPQuad+        denValue <- cgInput "denominator" :: SBVCodeGen SFPQuad+        let value = fpDiv sRNE numValue denValue+            rne   = rawHalf (toSFloatingPoint sRNE value)+            rna   = rawHalf (toSFloatingPoint sRNA value)+            rtp   = rawHalf (toSFloatingPoint sRTP value)+            rtn   = rawHalf (toSFloatingPoint sRTN value)+            rtz   = rawHalf (toSFloatingPoint sRTZ value)+        cgReturn (rne # rna # rtp # rtn # rtz :: SWord 80)+      expected = foldl (\acc word -> acc * 2 ^ (16 :: Int) + word) 0 [0x3c00, 0x3c01, 0x3c01, 0x3c00, 0x3c00]+  compileAndRunLibBF dir "arbitraryFloatRoundingModes" program (asHex 2 expected)+ where rawHalf :: SFPHalf -> SWord 16+       rawHalf = sFloatingPointAsSWord++-- | Exercise a runtime-selected rounding mode in arithmetic and conversion.+arbitraryFloatSymbolicRoundingMode :: Assertion+arbitraryFloatSymbolicRoundingMode = withSystemTempDirectory "sbv-arbitrary-float-symbolic-rounding" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 0, 1, 2, 3, 4, 2049, 2048, 1, 3]+        choose    <- cgInput "chooseInputMode" :: SBVCodeGen SBool+        modeRNE   <- cgInput "rne"             :: SBVCodeGen SRoundingMode+        modeRNA   <- cgInput "rna"             :: SBVCodeGen SRoundingMode+        modeRTP   <- cgInput "rtp"             :: SBVCodeGen SRoundingMode+        modeRTN   <- cgInput "rtn"             :: SBVCodeGen SRoundingMode+        modeRTZ   <- cgInput "rtz"             :: SBVCodeGen SRoundingMode+        numValue  <- cgInput "numerator"       :: SBVCodeGen SFPQuad+        denValue  <- cgInput "denominator"     :: SBVCodeGen SFPQuad+        one       <- cgInput "one"             :: SBVCodeGen SFPHalf+        three     <- cgInput "three"           :: SBVCodeGen SFPHalf+        let runtimeMode mode = ite choose mode sRTZ+            value            = fpDiv sRNE numValue denValue+            rne              = rawHalf (toSFloatingPoint (runtimeMode modeRNE) value)+            rna              = rawHalf (toSFloatingPoint (runtimeMode modeRNA) value)+            rtp              = rawHalf (toSFloatingPoint (runtimeMode modeRTP) value)+            rtn              = rawHalf (toSFloatingPoint (runtimeMode modeRTN) value)+            rtz              = rawHalf (toSFloatingPoint (runtimeMode modeRTZ) value)+            divided          = rawHalf (fpDiv (runtimeMode modeRTP) one three)+        cgOutput "selectedMode" (runtimeMode modeRTP)+        cgReturn (rne # rna # rtp # rtn # rtz # divided :: SWord 96)+      expected = foldl (\acc word -> acc * 2 ^ (16 :: Int) + word) 0 [0x3c00, 0x3c01, 0x3c01, 0x3c00, 0x3c00, 0x3556]+  compileAndRunLibBF dir "arbitraryFloatSymbolicRoundingMode" program (asHex 2 expected)+ where rawHalf :: SFPHalf -> SWord 16+       rawHalf = sFloatingPointAsSWord++-- | Separate multiplication and addition round the product before adding;+-- explicit FMA must keep the exact product until the final rounding. The+-- near-one factors make these results differ in both native formats.+nativeRoundingProgram :: SBVCodeGen ()+nativeRoundingProgram = do+  cgOverwriteFiles True+  cgSetDriverValues [0x3f800001, 0x3f7ffffe, 0x3ff0000000000001, 0x3feffffffffffffe]+  floatLeft   <- cgInput "floatLeft"   :: SBVCodeGen SWord32+  floatRight  <- cgInput "floatRight"  :: SBVCodeGen SWord32+  doubleLeft  <- cgInput "doubleLeft"  :: SBVCodeGen SWord64+  doubleRight <- cgInput "doubleRight" :: SBVCodeGen SWord64+  let xf = sWord32AsSFloat floatLeft+      yf = sWord32AsSFloat floatRight+      xd = sWord64AsSDouble doubleLeft+      yd = sWord64AsSDouble doubleRight+  cgReturn $ sAnd+    [ fpAdd sRNE (fpMul sRNE xf yf) (-1) .== 0+    , fpAdd sRNE (fpMul sRNE xd yd) (-1) .== 0+    , xf * yf - 1 .== 0+    , xd * yd - 1 .== 0+    , fpFMA sRNE xf yf (-1) .== literal (-(2 ** (-46)) :: Float)+    , fpFMA sRNE xd yd (-1) .== literal (-(2 ** (-104)) :: Double)+    ]++-- | Generated standalone and library Makefiles must preserve rounding steps+-- under optimization and LTO, even when user CCFLAGS enable contraction.+nativeFloatRoundingSteps :: Assertion+nativeFloatRoundingSteps = mapM_ check [(library, flags) | library <- [False, True], flags <- ["-O3", "-O3 -ffp-contract=fast", "-O3 -flto -ffp-contract=fast"]]+ where check (library, flags) = withSystemTempDirectory "sbv-native-rounding-steps" $ \dir -> do+         let functionName = "nativeRoundingSteps"+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("roundingComponent", nativeRoundingProgram)]+                               else compileToC' functionName ((:[]) <$> nativeRoundingProgram)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         extraFlags <- fromMaybe "" <$> lookupEnv "SBV_C_TEST_FLAGS"+         writeFile (dir </> "rounding.mk") ("CCFLAGS=-Wall -Werror " ++ flags ++ " " ++ extraFlags ++ "\n")+         (makeExit, _, makeError) <- readProcessWithExitCode "make" ["-C", dir] ""+         assertEqual makeError ExitSuccess makeExit+         (runExit, outputText, runError) <- readProcessWithExitCode (dir </> functionName ++ "_driver") [] ""+         assertEqual runError ExitSuccess runExit+         assertBool (flags ++ ":\n" ++ outputText) (") = 1" `isInfixOf` outputText)++-- | Reject detectable compiler modes that can discard NaNs, signed zeros,+-- or IEEE rounding, instead of silently compiling a different computation.+nativeFloatCompilerModes :: Assertion+nativeFloatCompilerModes = withSystemTempDirectory "sbv-native-unsafe-compiler-modes" $ \dir -> do+  let functionName = "nativeCompilerModes"+  (_, cfg, bundle) <- compileToC' functionName nativeRoundingProgram+  renderCgPgmBundle (Just dir) (cfg, bundle)+  let check flag = do+        (ccExit, _, ccError) <- readProcessWithExitCode "cc"+          ["-std=c11", "-O3", flag, "-c", dir </> functionName ++ ".c", "-o", dir </> "unsafe.o"] ""+        assertBool ("Expected rejection of " ++ flag) (ccExit /= ExitSuccess)+        assertBool ccError ("SBV-generated C requires IEEE floating-point semantics" `isInfixOf` ccError)+  mapM_ check ["-ffast-math", "-ffinite-math-only"]++-- | Exercise all constant rounding modes and runtime-selected modes while+-- retaining native @float@ and @double@ values at the generated C boundary.+nativeFloatRoundingModes :: Assertion+nativeFloatRoundingModes = withSystemTempDirectory "sbv-native-float-rounding" $ \dir -> do+  let floatProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [0x3f800000, 0x33800000, 1, 2]+        oneRaw   <- cgInput "oneBits"  :: SBVCodeGen SWord32+        halfBits <- cgInput "halfBits" :: SBVCodeGen SWord32+        modeRNA  <- cgInput "modeRNA"  :: SBVCodeGen SRoundingMode+        modeRTP  <- cgInput "modeRTP"  :: SBVCodeGen SRoundingMode+        let one     = sWord32AsSFloat oneRaw+            halfUlp = sWord32AsSFloat halfBits+            raw mode = sFromIntegral (sFloatAsSWord32 (fpAdd mode one halfUlp)) :: SWord 32+        cgReturn (raw sRNE # raw sRNA # raw sRTP # raw sRTN # raw sRTZ # raw modeRNA # raw modeRTP :: SWord 224)++      doubleProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [0x3ff0000000000000, 0x3ca0000000000000, 1, 2]+        oneRaw   <- cgInput "oneBits"  :: SBVCodeGen SWord64+        halfBits <- cgInput "halfBits" :: SBVCodeGen SWord64+        modeRNA  <- cgInput "modeRNA"  :: SBVCodeGen SRoundingMode+        modeRTP  <- cgInput "modeRTP"  :: SBVCodeGen SRoundingMode+        let one     = sWord64AsSDouble oneRaw+            halfUlp = sWord64AsSDouble halfBits+            raw mode = sFromIntegral (sDoubleAsSWord64 (fpAdd mode one halfUlp)) :: SWord 64+        cgReturn (raw sRNE # raw sRNA # raw sRTP # raw sRTN # raw sRTZ # raw modeRNA # raw modeRTP :: SWord 448)++      scalarProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [0x3f800000, 0x33800000]+        oneRaw   <- cgInput "oneBits"  :: SBVCodeGen SWord32+        halfBits <- cgInput "halfBits" :: SBVCodeGen SWord32+        let result = fpAdd sRNA (sWord32AsSFloat oneRaw) (sWord32AsSFloat halfBits)+        cgOutput "resultBits" (sFloatAsSWord32 result)+        cgReturn result++      floatOne      = 0x3f800000+      floatNext     = 0x3f800001+      doubleOne     = 0x3ff0000000000000+      doubleNext    = 0x3ff0000000000001+      assemble width = foldl (\acc word -> acc * 2 ^ width + word) 0+      floatExpected  = assemble (32 :: Int) [floatOne, floatNext, floatNext, floatOne, floatOne, floatNext, floatNext]+      doubleExpected = assemble (64 :: Int) [doubleOne, doubleNext, doubleNext, doubleOne, doubleOne, doubleNext, doubleNext]++  compileAndRunLibBF dir "nativeFloatRoundingModesFloat" floatProgram (asHex 4 floatExpected)+  compileAndRunLibBF dir "nativeFloatRoundingModesDouble" doubleProgram (asHex 7 doubleExpected)+  compileAndRunLibBF dir "nativeFloatRoundingScalar" scalarProgram "resultBits = 0x3f800001UL"++-- | Exercise all rounding directions between native floats and exact-width+-- bit-vectors.+nativeFloatBitVectorConversions :: Assertion+nativeFloatBitVectorConversions = withSystemTempDirectory "sbv-native-float-bit-vector" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [16777217, 5, 2]+        nativeInteger <- cgInput "nativeInteger" :: SBVCodeGen SInt32+        five          <- cgInput "five"          :: SBVCodeGen SFloat+        two           <- cgInput "two"           :: SBVCodeGen SFloat+        let nativeRNE   = toSFloat sRNE nativeInteger+            nativeRTP   = toSFloat sRTP nativeInteger+            twoAndAHalf = fpDiv sRNE five two+            nativeEven  = fromSFloat sRNE twoAndAHalf :: SInt32+            nativeAway  = fromSFloat sRNA twoAndAHalf :: SInt32+            nativeDown  = fromSFloat sRTN twoAndAHalf :: SInt32+            nativeUp    = fromSFloat sRTP twoAndAHalf :: SInt32+        cgReturn $ nativeRNE .== 16777216+               .&& nativeRTP .== 16777218+               .&& nativeEven .== 2+               .&& nativeAway .== 3+               .&& nativeDown .== 2+               .&& nativeUp   .== 3+  compileAndRunLibBF dir "nativeFloatBitVectorConversions" program "= 1"++-- | Exercise explicitly rounded native float-to-float conversion, RNE+-- conversion to and from a limb-backed bit-vector, and the one-bit scalar+-- fallback type.+nativeFloatWidthConversions :: Assertion+nativeFloatWidthConversions = withSystemTempDirectory "sbv-native-float-width-conversions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [halfwayBits, 42, 1, 1]+        rawHalfway <- cgInput "rawHalfway" :: SBVCodeGen SWord64+        wideValue  <- svCgInput wideKind "wideValue"+        oneBit     <- svCgInput oneBitKind "oneBit"+        runtimeRNA <- cgInput "runtimeRNA" :: SBVCodeGen SRoundingMode+        let halfway      = sWord64AsSDouble rawHalfway+            floatBits rm = sFloatAsSWord32 (toSFloat rm halfway)+            nativeChecks = floatBits sRNE       .== floatOne+                       .&& floatBits sRNA       .== floatNext+                       .&& floatBits sRTP       .== floatNext+                       .&& floatBits sRTN       .== floatOne+                       .&& floatBits sRTZ       .== floatOne+                       .&& floatBits runtimeRNA .== floatNext+            wideAsDouble = D.svCastToFP KDouble rneValue wideValue+            wideAgain    = D.svCastFromFP wideKind rneValue wideAsDouble+            oneAsFloat   = D.svCastToFP KFloat rneValue oneBit+            oneAgain     = D.svCastFromFP oneBitKind rneValue oneAsFloat+            allChecks    = foldl D.svAnd (unSBV nativeChecks) [D.svEqual wideAgain wideValue, D.svEqual oneAgain oneBit]+        svCgReturn allChecks+      halfwayBits = 0x3ff0000010000000+      floatOne    = 0x3f800000+      floatNext   = 0x3f800001+      rneValue    = unSBV sRNE+      wideKind    = KBounded True 673+      oneBitKind  = KBounded False 1+  compileAndRunLibBF dir "nativeFloatWidthConversions" program "= 1"++-- | A separately compiled caller changes the hardware rounding mode around+-- explicitly rounded casts. Check halfway values at native and non-native+-- bit widths, large signed/unsigned integers, and binary64-to-binary32 narrowing.+-- This deliberately tests a stronger property of the conversion bridges than+-- the public FE_TONEAREST entry-point precondition; it is not a supported+-- calling convention for general generated arithmetic.+nativeFloatCastEnvironment :: Assertion+nativeFloatCastEnvironment = withSystemTempDirectory "sbv-native-float-cast-environment" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgGenerateDriver False+        floatBits  <- cgInput "floatBits"     :: SBVCodeGen SWord32+        doubleBits <- cgInput "doubleBits"    :: SBVCodeGen SWord64+        halfBits   <- cgInput "halfBits"      :: SBVCodeGen SWord32+        signed     <- cgInput "signedValue"   :: SBVCodeGen SInt64+        unsigned   <- cgInput "unsignedValue" :: SBVCodeGen SWord64+        let float    = sWord32AsSFloat floatBits+            double   = sWord64AsSDouble doubleBits+            half     = sWord32AsSFloat halfBits+            modes    = [sRNE, sRNA, sRTP, sRTN, sRTZ]+            widths   = [1, 7, 8, 9, 16, 32, 64, 65, 673]+            checks signedKind width = zipWith check modes expected+              where kind     = KBounded signedKind width+                    positive = if width == 1 then half else float+                    value    = if signedKind then negate positive else positive+                    expected+                      | width == 1 = if signedKind then [0, -1, 0, -1, 0] else [0, 1, 1, 0, 0]+                      | signedKind = [-2, -3, -2, -3, -2]+                      | True       = [2, 3, 3, 2, 2]+                    check rm result = D.svEqual (D.svCastFromFP kind (unSBV rm) (unSBV value)) (D.svInteger kind result)+            nativeChecks = sFloatAsSWord32 (toSFloat sRNE double) .== 0x3f800000+                       .&& toSDouble sRNE signed .== -9007199254740992+                       .&& toSFloat sRNE signed .== -9007199254740992+                       .&& toSDouble sRNE unsigned .== 18446744073709551616+                       .&& toSFloat sRNE unsigned .== 18446744073709551616+        svCgReturn (foldl D.svAnd (unSBV nativeChecks) (concat [checks sign width | sign <- [False, True], width <- widths]))+      caller = unlines+        [ "#include <fenv.h>"+        , "#include \"nativeFloatCastEnvironment.h\""+        , "int main(void)"+        , "{"+        , "  const int modes[] = { FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO };"+        , "  const int original = fegetround();"+        , "  for (size_t i = 0; i < sizeof modes / sizeof modes[0]; ++i) {"+        , "    if (fesetround(modes[i]) != 0) return 1;"+        , "    if (!nativeFloatCastEnvironment(UINT32_C(0x40200000), UINT64_C(0x3ff0000010000000), UINT32_C(0x3f000000), -INT64_C(9007199254740993), UINT64_MAX)) return 2;"+        , "    if (fegetround() != modes[i]) return 3;"+        , "  }"+        , "  return fesetround(original) != 0;"+        , "}"+        ]+  compileAndRunLibBFCaller dir "nativeFloatCastEnvironment" program caller++-- | SMT leaves non-finite and out-of-range floating-to-bit-vector results+-- unspecified. The backend chooses zero for non-finite inputs and low bits+-- for finite ones, without invoking an overflowing native C integer cast.+nativeFloatExceptionalCasts :: Assertion+nativeFloatExceptionalCasts = mapM_ check [0x7ff0000000000000, 0xfff0000000000000, 0x7ff8000000000000, 0x8000000000000000, 0x7e70000000000000, 0xfe70000000000000]+ where check bits = withSystemTempDirectory "sbv-native-float-exceptional-casts" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSetDriverValues [bits]+               raw <- cgInput "raw" :: SBVCodeGen SWord64+               let value  = sWord64AsSDouble raw+                   values = [unSBV value, unSBV (toSFloat sRNE value)]+                   kinds  = [KBounded sign width | sign <- [False, True], width <- [1, 7, 8, 16, 32, 64, 65, 673]]+                   checks = [D.svEqual (D.svCastFromFP kind (unSBV sRNE) source) (D.svInteger kind 0) | kind <- kinds, source <- values]+               svCgReturn (foldl D.svAnd (unSBV sTrue) checks)+         compileAndRunLibBF dir "nativeFloatExceptionalCasts" program ") = 1"++-- | Exactly representable casts stay native even with symbolic rounding.+-- Include negative zero so widening cannot accidentally change its sign.+nativeExactFloatConversions :: Assertion+nativeExactFloatConversions = withSystemTempDirectory "sbv-exact-native-float-casts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [-32768, 4294967295, 0x80000000, 2]+        small    <- cgInput "small"    :: SBVCodeGen SInt16+        unsigned <- cgInput "word"     :: SBVCodeGen SWord32+        zeroRaw  <- cgInput "zeroBits" :: SBVCodeGen SWord32+        mode     <- cgInput "mode"     :: SBVCodeGen SRoundingMode+        let checks rm = [ toSFloat rm small .== -32768+                        , toSDouble rm unsigned .== 4294967295+                        , sDoubleAsSWord64 (toSDouble rm (sWord32AsSFloat zeroRaw)) .== 0x8000000000000000+                        ]+        cgReturn (sAnd (concatMap checks [sRNE, sRNA, sRTP, sRTN, sRTZ, mode]))+  compileAndRunWith ["-lm"] dir "nativeExactFloatConversions" program ") = 1"+  source <- readFile (dir </> "nativeExactFloatConversions.c")+  makefile <- readFile (dir </> "Makefile")+  assertBool "Exact native conversions must not include LibBF" (not ("<libbf.h>" `isInfixOf` source))+  assertBool "Exact native conversions must not link LibBF" (not ("-lbf" `isInfixOf` makefile))++-- | Exercise LibBF-mediated conversion between native floats and GMP-backed+-- exact numbers without introducing an arbitrary floating-point format.+nativeFloatExactConversions :: Assertion+nativeFloatExactConversions = withSystemTempDirectory "sbv-native-float-exact" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [16777217, 3, 2, 5, 2]+        integer         <- cgInput "integer"         :: SBVCodeGen SInteger+        realNumerator   <- cgInput "realNumerator"   :: SBVCodeGen SReal+        realDenominator <- cgInput "realDenominator" :: SBVCodeGen SReal+        five            <- cgInput "five"            :: SBVCodeGen SFloat+        two             <- cgInput "two"             :: SBVCodeGen SFloat+        let rational      = realNumerator / realDenominator+            integerRNE    = toSFloat sRNE integer+            integerRTP    = toSFloat sRTP integer+            rationalValue = toSDouble sRNE rational+            twoAndAHalf   = fpDiv sRNE five two+            roundedEven   = fromSFloat sRNE twoAndAHalf :: SInteger+            roundedAway   = fromSFloat sRNA twoAndAHalf :: SInteger+            roundedUp     = fromSFloat sRTP twoAndAHalf :: SInteger+            roundedDown   = fromSFloat sRTN twoAndAHalf :: SInteger+            roundedZero   = fromSFloat sRTZ twoAndAHalf :: SInteger+            exactRational = fromSDouble sRNE rationalValue :: SReal+        cgReturn $ integerRNE .== 16777216+               .&& integerRTP .== 16777218+               .&& rationalValue .== 1.5+               .&& roundedEven .== 2+               .&& roundedAway .== 3+               .&& roundedUp   .== 3+               .&& roundedDown .== 2+               .&& roundedZero .== 2+               .&& exactRational .== 3 / 2+  compileAndRunLibBFGMP dir "nativeFloatExactConversions" program "= 1"++-- | Mapped integer casts must use the selected width in both directions while+-- preserving every explicit rounding mode, including halfway negative values.+mappedIntegerFloatConversions :: Assertion+mappedIntegerFloatConversions = mapM_ check [(width, exposeChecks, arbitraryResult) | width <- [8, 16, 32, 64], exposeChecks <- [True, False], arbitraryResult <- [False, True]]+ where check (width, exposeChecks, arbitraryResult) = withSystemTempDirectory "sbv-mapped-integer-float" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgIntegerSize width+               cgSetDriverValues [sample, -5, 65539]+               value <- cgInput "value" :: SBVCodeGen SInteger+               five  <- cgInput "five"  :: SBVCodeGen SDouble+               large <- cgInput "large" :: SBVCodeGen SDouble+               let fraction = fpDiv sRNE five 2+                   half rm = toSFloatingPoint rm value :: SFPHalf+                   halfFraction = fpDiv sRNE (toSFloatingPoint sRNE five :: SFPHalf) 2+                   reference rm+                     | width == 8 = 5+                     | True       = ite (rm .== sRNA .|| rm .== sRTP) 2050 2048 :: SFPHalf+                   checks (rm, expected) =+                     [ sFloatingPointAsSWord (half rm) .== sFloatingPointAsSWord (reference rm)+                     , (fromSDouble rm fraction :: SInteger) .== expected+                     , toSDouble rm value .== fromInteger sample+                     ]+                     ++ [(fromSFloatingPoint rm halfFraction :: SInteger) .== expected | arbitraryResult]+                   allChecks = ((fromSDouble sRNE large :: SInteger) .== 65539)+                             : concatMap checks [(sRNE, -2), (sRNA, -3), (sRTP, -2), (sRTN, -3), (sRTZ, -2)]+               when exposeChecks $ do+                 cgOutputArr "checks" allChecks+                 cgOutputArr "actual" (map (sFloatingPointAsSWord . half) [sRNE, sRNA, sRTP, sRTN, sRTZ])+                 cgOutputArr "expected" (map (sFloatingPointAsSWord . reference) [sRNE, sRNA, sRTP, sRTN, sRTZ])+               cgReturn (sAnd allChecks)+             sample = if width == 8 then 5 else 2049+         compileAndRunLibBF dir "mappedIntegerFloat" program ") = 1"++-- | Native real mappings still require representation-aware conversion:+-- exact integers round to the selected real format, real-to-integer casts+-- floor, and explicit floating casts honor their requested rounding mode.+mappedRealConversions :: Assertion+mappedRealConversions = mapM_ check [(realType, mappedInteger) | realType <- [CgFloat, CgDouble, CgLongDouble], mappedInteger <- [False, True]]+ where check (realType, mappedInteger) = withSystemTempDirectory "sbv-mapped-real-conversions" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSRealType realType+               when mappedInteger $ cgIntegerSize 32+               cgSetDriverValues [16777217, -5, 7]+               value <- cgInput "value" :: SBVCodeGen SInteger+               real  <- cgInput "real"  :: SBVCodeGen SReal+               seven <- cgInput "seven" :: SBVCodeGen SFPHalf+               let expected = case realType of+                                CgFloat -> 16777216+                                _       -> 16777217+                   half = toSFloatingPoint sRTP real :: SFPHalf+               cgReturn $ (sFromIntegral value :: SReal) .== expected+                      .&& sRealToSIntegerFloor (real / 2) .== -3+                      .&& (fromSFloatingPoint sRNE seven :: SReal) .== 7+                      .&& half .== -5+                      .&& toSDouble sRNE real .== -5+         compileAndRunLibBFGMP dir "mappedRealConversions" program "= 1"++-- | Exercise target-dependent precision, exponent extremes, signed zero, NaN,+-- and all five rounding modes through an independent library caller. On targets+-- wider than binary64 the same tests explicitly preserve the additional bits.+longDoubleNumericBoundaries :: Assertion+longDoubleNumericBoundaries = withSystemTempDirectory "sbv-long-double-bridges" $ \dir -> do+  let prepare program = cgOverwriteFiles True >> cgGenerateDriver False >> cgSRealType CgLongDouble >> program+      wide :: SReal -> SFloatingPoint 20 200+      wide = toSFloatingPoint sRNE+      components =+        [ ("integerToLong", do+            value <- cgInput "value" :: SBVCodeGen SInteger+            cgReturn (sFromIntegral value :: SReal))+        , ("wordToLong", do+            value <- cgInput "value" :: SBVCodeGen SWord64+            cgReturn (sFromIntegral value :: SReal))+        , ("rationalToLong", do+            value <- cgInput "value" :: SBVCodeGen SRational+            cgReturn (Rat.sRationalToSReal value))+        , ("floorLong", do+            value <- cgInput "value" :: SBVCodeGen SReal+            cgOutput "result" (sRealToSIntegerFloor value))+        , ("roundedInteger", do+            mode  <- cgInput "mode"  :: SBVCodeGen SRoundingMode+            value <- cgInput "value" :: SBVCodeGen SInteger+            let exact = toSFloatingPoint sRNE value :: SFloatingPoint 20 200+            cgReturn (fromSFloatingPoint mode exact :: SReal))+        , ("wideRoundTrip", do+            value <- cgInput "value" :: SBVCodeGen SReal+            cgReturn (fromSFloatingPoint sRNE (wide value) :: SReal))+        , ("tinyLong", do+            mode  <- cgInput "mode"  :: SBVCodeGen SRoundingMode+            value <- cgInput "value" :: SBVCodeGen SReal+            cgReturn (fromSFloatingPoint mode (fpDiv sRNE (wide value) 2) :: SReal))+        , ("narrowFloat", do+            mode  <- cgInput "mode"  :: SBVCodeGen SRoundingMode+            value <- cgInput "value" :: SBVCodeGen SReal+            cgReturn (toSFloat mode value))+        , ("nativeRoundTrip", do+            value <- cgInput "value" :: SBVCodeGen SDouble+            cgReturn (toSDouble sRNE (fromSDouble sRNE value :: SReal)))+        ]+  _ <- D.compileToCLib (Just dir) "longBridges" [(functionName, prepare program) | (functionName, program) <- components]+  writeFile (dir </> "caller.c") $ unlines+    [ "#include <assert.h>"+    , "#include <float.h>"+    , "#include <math.h>"+    , "#include \"longBridges.h\""+    , "int main(int argc, char **argv)"+    , "{"+    , "  mpz_t input, output; mpz_inits(input, output, NULL);"+    , "  (void) argv; if (argc > 1) { floorLong(HUGE_VALL, output); return 0; }"+    , "  const long double base = ldexpl(1.0L, LDBL_MANT_DIG);"+    , "  for (int negative = 0; negative < 2; ++negative) for (int odd = 0; odd < 2; ++odd) {"+    , "    mpz_set_ui(input, 1); mpz_mul_2exp(input, input, LDBL_MANT_DIG); mpz_add_ui(input, input, 1 + 2 * odd);"+    , "    if (negative) mpz_neg(input, input);"+    , "    for (int mode = 0; mode < 5; ++mode) {"+    , "      const bool up = mode == SBV_RM_RNA || (mode == SBV_RM_RNE && odd) || (mode == SBV_RM_RTP && !negative) || (mode == SBV_RM_RTN && negative);"+    , "      const long double magnitude = base + 2 * odd + (up ? 2 : 0);"+    , "      assert(roundedInteger((RoundingMode) mode, input) == (negative ? -magnitude : magnitude));"+    , "    }"+    , "    const long double nearest = base + (odd ? 4 : 0);"+    , "    assert(integerToLong(input) == (negative ? -nearest : nearest));"+    , "  }"+    , "  mpz_set_ui(input, 1); mpz_mul_2exp(input, input, LDBL_MANT_DIG - 1); mpz_add_ui(input, input, 1);"+    , "  const long double precise = ldexpl(1.0L, LDBL_MANT_DIG - 1) + 1;"+    , "  assert(integerToLong(input) == precise); floorLong(precise, output); assert(mpz_cmp(input, output) == 0);"+    , "  mpq_t rational; mpq_init(rational); mpz_set(mpq_numref(rational), input);"+    , "  mpz_set_ui(mpq_denref(rational), 1); mpz_mul_2exp(mpq_denref(rational), mpq_denref(rational), LDBL_MANT_DIG - 1);"+    , "  assert(rationalToLong(rational) == 1.0L + ldexpl(1.0L, 1 - LDBL_MANT_DIG)); mpq_clear(rational);"+    , "  assert(wordToLong(UINT64_C(9007199254740993)) == (LDBL_MANT_DIG > 53 ? 9007199254740993.0L : 9007199254740992.0L));"+    , "  floorLong(-2.5L, output); assert(mpz_cmp_si(output, -3) == 0);"+    , "  const long double tiny = nextafterl(0.0L, 1.0L);"+    , "  const long double values[] = {0.0L, -0.0L, tiny, -tiny, LDBL_MIN, -LDBL_MIN, LDBL_MAX, -LDBL_MAX, precise, -precise, HUGE_VALL, -HUGE_VALL};"+    , "  for (size_t i = 0; i < sizeof values / sizeof *values; ++i) {"+    , "    const long double result = wideRoundTrip(values[i]);"+    , "    assert(result == values[i] && (signbit(result) != 0) == (signbit(values[i]) != 0));"+    , "  }"+    , "  assert(isnan(wideRoundTrip(nanl(\"\"))));"+    , "  for (int mode = 0; mode < 5; ++mode) {"+    , "    const RoundingMode rm = (RoundingMode) mode;"+    , "    const long double positive = tinyLong(rm, tiny), negative = tinyLong(rm, -tiny);"+    , "    assert(positive == ((rm == SBV_RM_RNA || rm == SBV_RM_RTP) ? tiny : 0));"+    , "    assert(negative == ((rm == SBV_RM_RNA || rm == SBV_RM_RTN) ? -tiny : 0));"+    , "    assert(signbit(negative));"+    , "    assert(narrowFloat(rm, 1.0L + 0x1p-24L) == ((rm == SBV_RM_RNA || rm == SBV_RM_RTP) ? 0x1.000002p0f : 1.0f));"+    , "    mpz_set_ui(input, 1); mpz_mul_2exp(input, input, LDBL_MAX_EXP);"+    , "    const long double large = roundedInteger(rm, input);"+    , "    assert(large == ((rm == SBV_RM_RTZ || rm == SBV_RM_RTN) ? LDBL_MAX : HUGE_VALL));"+    , "    mpz_neg(input, input); const long double small = roundedInteger(rm, input);"+    , "    assert(small == ((rm == SBV_RM_RTZ || rm == SBV_RM_RTP) ? -LDBL_MAX : -HUGE_VALL));"+    , "  }"+    , "  assert(nativeRoundTrip(DBL_MAX) == DBL_MAX); assert(signbit(nativeRoundTrip(-0.0)));"+    , "  assert(isinf(nativeRoundTrip(HUGE_VAL))); assert(isnan(nativeRoundTrip(NAN)));"+    , "  mpz_clears(input, output, NULL); return 0;"+    , "}"+    ]+  writeFile (dir </> "caller.mk") $ unlines+    [ "caller: caller.c longBridges.h longBridges.a"+    , "\t${CC} ${CCFLAGS} ${GMP_CFLAGS} caller.c longBridges.a ${LDFLAGS} ${SBV_LIBS} -o $@"+    ]+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, "caller"] ++ makeOptions) ""+  assertEqual buildError ExitSuccess buildExit+  (runExit, _, runError) <- readProcessWithExitCode (dir </> "caller") [] ""+  assertEqual runError ExitSuccess runExit+  (invalidExit, _, invalidError) <- readProcessWithExitCode (dir </> "caller") ["nonfinite"] ""+  assertBool "Non-finite real flooring must terminate" (invalidExit /= ExitSuccess)+  assertBool invalidError ("Cannot convert a non-finite mapped SReal to exact SInteger" `isInfixOf` invalidError)++-- | Simulate an unsupported double-double target format at the generated+-- translation unit's feature check, without pretending to execute that ABI.+unsupportedLongDoubleFormat :: Assertion+unsupportedLongDoubleFormat = withSystemTempDirectory "sbv-long-double-format" $ \dir -> do+  D.compileToC (Just dir) "unsupportedLongDouble" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    cgSRealType CgLongDouble+    cgAddDecl ["#include <float.h>", "#undef LDBL_MANT_DIG", "#define LDBL_MANT_DIG 106"]+    value <- cgInput "value" :: SBVCodeGen SReal+    cgReturn (toSFloatingPoint sRNE value :: SFPHalf)+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, "unsupportedLongDouble.o"] ++ makeOptions) ""+  assertBool "Unsupported long-double formats must not compile" (buildExit /= ExitSuccess)+  assertBool buildError ("long-double conversions require binary64, x87 extended, or binary128" `isInfixOf` buildError)++-- | Exercise LibBF encoding of subnormal results, NaN, and signed zero.+arbitraryFloatSpecialArithmetic :: Assertion+arbitraryFloatSpecialArithmetic = withSystemTempDirectory "sbv-arbitrary-float-special" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x0001, 0x7c00, 0x8000, 5, 2]+        subBits <- cgInput "subnormalBits"    :: SBVCodeGen (SWord 16)+        infBits <- cgInput "infinityBits"     :: SBVCodeGen (SWord 16)+        nzBits  <- cgInput "negativeZeroBits" :: SBVCodeGen (SWord 16)+        five    <- cgInput "five"             :: SBVCodeGen SFPHalf+        two     <- cgInput "two"              :: SBVCodeGen SFPHalf+        let subnormal    = sWordAsSFloatingPoint subBits :: SFPHalf+            infValue     = sWordAsSFloatingPoint infBits :: SFPHalf+            negativeZero = sWordAsSFloatingPoint nzBits :: SFPHalf+            doubled      = rawHalf (fpAdd sRNE subnormal subnormal)+            nanResult    = rawHalf (fpSub sRNE infValue infValue)+            zeroResult   = rawHalf (fpSqrt sRNE negativeZero)+            remResult    = rawHalf (fpRem five two)+            roundResult  = rawHalf (fpRoundToIntegral sRNE (fpDiv sRNE five two))+            minResult    = rawHalf (fpMin five two)+            maxResult    = rawHalf (fpMax five two)+            absResult    = rawHalf (abs (negate five))+        cgReturn (doubled # nanResult # zeroResult # remResult # roundResult # minResult # maxResult # absResult :: SWord 128)+      expected = foldl (\acc word -> acc * 2 ^ (16 :: Int) + word) 0 [0x0002, 0x7e00, 0x8000, 0x3c00, 0x4000, 0x4000, 0x4500, 0x4500]+  compileAndRunLibBF dir "arbitraryFloatSpecialArithmetic" program (asHex 2 expected)+ where rawHalf :: SFPHalf -> SWord 16+       rawHalf = sFloatingPointAsSWord++-- | Exercise a finite table containing computed arbitrary-precision floating+-- point values. The table is emitted after the computation on which it+-- depends and its result remains an ordinary by-value interchange object.+arbitraryFloatTableLookup :: Assertion+arbitraryFloatTableLookup = withSystemTempDirectory "sbv-arbitrary-float-table" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgPerformRTCs True+        cgSetDriverValues [1, 3]+        index <- cgInput "index" :: SBVCodeGen SWord8+        value <- cgInput "value" :: SBVCodeGen SFPQuad+        let selected = select [value, fpAdd sRNE value 2] 99 index+        cgReturn (sFloatingPointAsSWord selected :: SWord 128)+      bias    = 2 ^ (14 :: Int) - 1 :: Integer+      fiveRaw = (bias + 2) * 2 ^ (112 :: Int) + 2 ^ (110 :: Int)+  compileAndRunLibBF dir "arbitraryFloatTableLookup" program (asHex 2 fiveRaw)++-- | Check that LibBF-backed array keys use SMT object equality: NaNs match,+-- while positive and negative zero remain distinct.+arbitraryFloatArrayKeys :: Assertion+arbitraryFloatArrayKeys = withSystemTempDirectory "sbv-arbitrary-float-array-keys" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x7e00, 0x0000, 0x8000]+        nanBits      <- cgInput "nanBits"      :: SBVCodeGen (SWord 16)+        positiveBits <- cgInput "positiveBits" :: SBVCodeGen (SWord 16)+        negativeBits <- cgInput "negativeBits" :: SBVCodeGen (SWord 16)+        let nanKey       = sWordAsSFloatingPoint nanBits :: SFPHalf+            positiveZero = sWordAsSFloatingPoint positiveBits :: SFPHalf+            negativeZero = sWordAsSFloatingPoint negativeBits :: SFPHalf+            base         = constArray 3+            withNaN      = writeArray base nanKey 11+            withZero     = writeArray withNaN positiveZero 12+            flags        = [ readArray withZero nanKey .== (11 :: SWord8)+                           , readArray withZero positiveZero .== (12 :: SWord8)+                           , readArray withZero negativeZero .== (3 :: SWord8)+                           ]+        cgReturn (sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4]) :: SWord8)+  compileAndRunLibBF dir "arbitraryFloatArrayKeys" program "= 7"++-- | Exercise a callback-backed array whose returned values use LibBF's raw+-- arbitrary floating-point interchange representation.+arbitraryFloatArrayInput :: Assertion+arbitraryFloatArrayInput = withSystemTempDirectory "sbv-arbitrary-float-array-input" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 7]+        source <- cgInput "source" :: SBVCodeGen (SArray Word8 (FloatingPoint 15 113))+        key    <- cgInput "key"    :: SBVCodeGen SWord8+        cgReturn (sFloatingPointAsSWord (readArray source key) :: SWord 128)+      bias     = 2 ^ (14 :: Int) - 1 :: Integer+      threeRaw = (bias + 1) * 2 ^ (112 :: Int) + 2 ^ (111 :: Int)+  compileAndRunLibBF dir "arbitraryFloatArrayInput" program (asHex 2 threeRaw)++-- | Exercise a LibBF conversion that occurs only inside a retained array+-- lambda, ensuring its format-specific runtime helper is still discovered.+arbitraryFloatLambdaArray :: Assertion+arbitraryFloatLambdaArray = withSystemTempDirectory "sbv-arbitrary-float-lambda-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let source = lambdaArray (\index -> toSFloatingPoint sRNE index :: SFloatingPoint 15 113)+                     :: SArray Word8 (FloatingPoint 15 113)+        cgReturn (sFloatingPointAsSWord (readArray source key) :: SWord 128)+      bias     = 2 ^ (14 :: Int) - 1 :: Integer+      threeRaw = (bias + 1) * 2 ^ (112 :: Int) + 2 ^ (111 :: Int)+  compileAndRunLibBF dir "arbitraryFloatLambdaArray" program (asHex 2 threeRaw)++-- | Exercise LibBF-valued table entries constructed from a structured+-- lambda's parameter and selected entirely inside its retained DAG.+arbitraryFloatLambdaTable :: Assertion+arbitraryFloatLambdaTable = withSystemTempDirectory "sbv-arbitrary-float-lambda-table" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let source = lambdaArray (\index -> select [toFP index, fpAdd sRNE (toFP index) 1] 0 index)+                     :: SArray Word8 (FloatingPoint 15 113)+        cgReturn (sFloatingPointAsSWord (readArray source key) :: SWord 128)+      toFP value = toSFloatingPoint sRNE value :: SFloatingPoint 15 113+      bias       = 2 ^ (14 :: Int) - 1 :: Integer+      twoRaw     = (bias + 1) * 2 ^ (112 :: Int)+  compileAndRunLibBF dir "arbitraryFloatLambdaTable" program (asHex 2 twoRaw)++-- | Exercise correctly rounded conversions between LibBF formats and+-- GMP-backed unbounded integers and rational reals.+arbitraryFloatExactConversions :: Assertion+arbitraryFloatExactConversions = withSystemTempDirectory "sbv-arbitrary-float-exact" $ \dir -> do+  let largeSample = negate (2 ^ (200 :: Int) + 2 ^ (100 :: Int))+      program = do+        cgOverwriteFiles True+        cgSetDriverValues [2049, largeSample, 7, 2, 5, 2]+        integer         <- cgInput "integer"      :: SBVCodeGen SInteger+        largeInteger    <- cgInput "largeInteger" :: SBVCodeGen SInteger+        realNumerator   <- cgInput "numerator"    :: SBVCodeGen SReal+        realDenominator <- cgInput "denominator"  :: SBVCodeGen SReal+        five            <- cgInput "five"         :: SBVCodeGen SFPHalf+        two             <- cgInput "two"          :: SBVCodeGen SFPHalf+        let rational       = realNumerator / realDenominator+            integerRNE     = toSFloatingPoint sRNE integer :: SFPHalf+            integerRTP     = toSFloatingPoint sRTP integer :: SFPHalf+            largeQuad      = toSFloatingPoint sRNE largeInteger :: SFPQuad+            largeRoundTrip = fromSFloatingPoint sRNE largeQuad :: SInteger+            rationalHalf   = toSFloatingPoint sRNE rational :: SFPHalf+            twoAndAHalf    = fpDiv sRNE five two+            roundedEven    = fromSFloatingPoint sRNE twoAndAHalf :: SInteger+            roundedAway    = fromSFloatingPoint sRNA twoAndAHalf :: SInteger+            roundedUp      = fromSFloatingPoint sRTP twoAndAHalf :: SInteger+            roundedDown    = fromSFloatingPoint sRTN twoAndAHalf :: SInteger+            roundedZero    = fromSFloatingPoint sRTZ twoAndAHalf :: SInteger+            exactRational  = fromSFloatingPoint sRNE rationalHalf :: SReal+            integerRNEBits = sFloatingPointAsSWord integerRNE :: SWord 16+            integerRTPBits = sFloatingPointAsSWord integerRTP :: SWord 16+        cgReturn $ integerRNEBits .== 0x6800+               .&& integerRTPBits .== 0x6801+               .&& largeRoundTrip .== largeInteger+               .&& rationalHalf .== 3.5+               .&& roundedEven .== 2+               .&& roundedAway .== 3+               .&& roundedUp   .== 3+               .&& roundedDown .== 2+               .&& roundedZero .== 2+               .&& exactRational .== 7 / 2+  compileAndRunLibBFGMP dir "arbitraryFloatExactConversions" program "= 1"++-- | Exercise repeated declarations and dependencies in a mixed generated library.+mixedRepeatedTypeLibrary :: Assertion+mixedRepeatedTypeLibrary = withSystemTempDirectory "sbv-mixed-repeated-library" $ \dir -> do+  let configure values = do+        cgOverwriteFiles True+        cgSetDriverValues values++      wideAddProgram = do+        configure [5]+        value <- cgInput "value" :: SBVCodeGen (SWord 673)+        cgReturn (value + 1)++      wideXorProgram = do+        configure [7]+        value <- cgInput "value" :: SBVCodeGen (SWord 673)+        cgReturn (value `xor` 3)++      fpDivideProgram = do+        configure [2, 1, 3]+        mode  <- cgInput "mode"  :: SBVCodeGen SRoundingMode+        value <- cgInput "value" :: SBVCodeGen SFPHalf+        three <- cgInput "three" :: SBVCodeGen SFPHalf+        cgReturn (fpDiv mode value three)++      fpDivideAgainProgram = do+        configure [3, 1, 3]+        mode  <- cgInput "mode"  :: SBVCodeGen SRoundingMode+        value <- cgInput "value" :: SBVCodeGen SFPHalf+        three <- cgInput "three" :: SBVCodeGen SFPHalf+        cgReturn (fpDiv mode value three)++      integerAddProgram = do+        configure [2 ^ (130 :: Int)]+        value <- cgInput "value" :: SBVCodeGen SInteger+        cgReturn (value + 7)++      integerMulProgram = do+        configure [9]+        value <- cgInput "value" :: SBVCodeGen SInteger+        cgReturn (value * 3)++      realDivideProgram = do+        configure [5]+        value <- cgInput "value" :: SBVCodeGen SReal+        cgReturn (value / 3)++      realAddProgram = do+        configure [2]+        value <- cgInput "value" :: SBVCodeGen SReal+        cgReturn (value + 1 / 7)++      components = [ ("wideAdd",       wideAddProgram)+                   , ("wideXor",       wideXorProgram)+                   , ("fpDivide",      fpDivideProgram)+                   , ("fpDivideAgain", fpDivideAgainProgram)+                   , ("integerAdd",    integerAddProgram)+                   , ("integerMul",    integerMulProgram)+                   , ("realDivide",    realDivideProgram)+                   , ("realAdd",       realAddProgram)+                   ]++  (_, cfg, bundle) <- compileToCLib' "mixedRepeatedTypeLibrary" components+  renderCgPgmBundle (Just dir) (cfg, bundle)+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit++  let driverExecutable = dir </> "mixedRepeatedTypeLibrary_driver"+  (runExit, stdoutText, runError) <- readProcessWithExitCode driverExecutable [] ""+  assertEqual runError ExitSuccess runExit+  mapM_ (assertOutput stdoutText)+    [ asHex 11 6+    , asHex 11 4+    , "0x0000000000003556"+    , "0x0000000000003555"+    , show (2 ^ (130 :: Int) + 7 :: Integer)+    , "27"+    , "5/3"+    , "15/7"+    ]++  makefile <- readFile (dir </> "Makefile")+  assertBool "Mixed library Makefile lost the LibBF dependency" ("-lbf" `isInfixOf` makefile)+  assertBool "Mixed library Makefile lost the GMP dependency" ("${GMP_LIBS}" `isInfixOf` makefile)+ where assertOutput stdoutText fragment =+         assertBool ("Expected generated library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText)++-- | Exercise archive-only generation with a type shared across translation units.+repeatedTypeLibraryWithoutDriver :: Assertion+repeatedTypeLibraryWithoutDriver = withSystemTempDirectory "sbv-repeated-library-no-driver" $ \dir -> do+  let component operation = do+        cgOverwriteFiles True+        cgGenerateDriver False+        value <- cgInput "value" :: SBVCodeGen (SWord 673)+        cgReturn (operation value)+      components = [ ("increment", component (+ 1))+                   , ("decrement", component (subtract 1))+                   ]++  (_, cfg, bundle) <- compileToCLib' "repeatedTypeLibraryWithoutDriver" components+  renderCgPgmBundle (Just dir) (cfg, bundle)++  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  archiveExists <- doesFileExist (dir </> "repeatedTypeLibraryWithoutDriver.a")+  driverExists  <- doesFileExist (dir </> "repeatedTypeLibraryWithoutDriver_driver.c")+  assertBool "Generated library archive is missing" archiveExists+  assertBool "Driver generation was disabled, but a driver was emitted" (not driverExists)++-- | Generate and execute a C program linked to the LibBF bundled with the+-- Haskell @libBF@ package.+compileAndRunLibBF :: FilePath -> String -> SBVCodeGen () -> String -> Assertion+compileAndRunLibBF dir functionName program expected = do+  (includeDir, archive) <- locateLibBF+  compileAndRunWith ["-I" ++ includeDir, archive, "-lm"] dir functionName program expected++-- | Generate and execute a C program using both LibBF and GMP.+compileAndRunLibBFGMP :: FilePath -> String -> SBVCodeGen () -> String -> Assertion+compileAndRunLibBFGMP dir functionName program expected = do+  (includeDir, archive) <- locateLibBF+  (pkgExit, pkgOutput, pkgError) <- readProcessWithExitCode "pkg-config" ["--cflags", "--libs", "gmp"] ""+  assertEqual pkgError ExitSuccess pkgExit+  compileAndRunWith (["-I" ++ includeDir, archive, "-lm"] ++ words pkgOutput) dir functionName program expected++-- | Generate, compile, and execute C with additional compiler/linker options.+-- @SBV_C_TEST_FLAGS@ supplies extra flags for optimization and sanitizer runs.+compileAndRunWith :: [String] -> FilePath -> String -> SBVCodeGen () -> String -> Assertion+compileAndRunWith ccOptions dir functionName program expected = do+  (_, cfg, bundle) <- compileToC' functionName program+  renderCgPgmBundle (Just dir) (cfg, bundle)++  out <- compileAndRunGenerated ccOptions dir functionName+  assertBool ("Expected generated output to contain " ++ expected ++ ", received:\n" ++ out) (expected `isInfixOf` out)++-- | Exercise a generated native ABI from an independent caller, linked with+-- LibBF. Enable dynamic rounding for callers that modify the floating-point+-- environment; the caller reports failure through its exit status.+compileAndRunLibBFCaller :: FilePath -> String -> SBVCodeGen () -> String -> Assertion+compileAndRunLibBFCaller dir functionName program caller = do+  (includeDir, archive) <- locateLibBF+  (_, cfg, bundle) <- compileToC' functionName program+  renderCgPgmBundle (Just dir) (cfg, bundle)+  writeFile (dir </> functionName ++ "_driver.c") caller+  _ <- compileAndRunGenerated ["-frounding-math", "-I" ++ includeDir, archive, "-lm"] dir functionName+  pure ()++-- | Compile and run an already rendered program and driver. Honor optional+-- optimization and sanitizer flags supplied by @SBV_C_TEST_FLAGS@.+compileAndRunGenerated :: [String] -> FilePath -> String -> IO String+compileAndRunGenerated ccOptions dir functionName = do+  let source = dir </> functionName ++ ".c"+      driver = dir </> functionName ++ "_driver.c"+      exe    = dir </> functionName ++ "_driver"+  extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+  (ccExit, _, ccErr) <- readProcessWithExitCode "cc" (["-std=c11", "-Wall", "-Werror", source, driver, "-o", exe] ++ extraFlags ++ ccOptions) ""+  assertEqual ccErr ExitSuccess ccExit++  (runExit, out, runErr) <- readProcessWithExitCode exe [] ""+  assertEqual runErr ExitSuccess runExit+  pure out++-- | Render the fixed-limb hexadecimal form printed by generated drivers.+asHex :: Int -> Integer -> String+asHex limbCount value = "0x" ++ replicate (16 * limbCount - length h) '0' ++ h+ where h = showHex value ""
+ SBVTestSuite/TestSuite/CodeGeneration/ArrayCaptures.hs view
@@ -0,0 +1,119 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.ArrayCaptures+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Reject unsupported array-lambda captures before emitting C artifacts.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.ArrayCaptures (tests) where++import Control.Exception (ErrorCall, displayException, try)+import Control.Monad (void)+import Data.List (isInfixOf)+import System.Directory (listDirectory)+import System.IO.Temp (withSystemTempDirectory)+import Test.Tasty.HUnit (assertBool, assertEqual)++import Data.SBV.Tools.CodeGen+import Utils.SBVTestFramework++-- | Captures in ordinary and operator-embedded operands must fail clearly,+-- including in nested callbacks and library components. Existing frontend+-- restrictions remain in place; closed callbacks remain supported.+tests :: TestTree+tests = testGroup "CodeGeneration.ArrayCaptures"+  [ rejects "direct result capture" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (const value) :: SArray Word8 Word32)+  , rejects "arithmetic capture" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (+ value) :: SArray Word32 Word32)+  , rejects "managed value capture" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen SString+      cgReturn (lambdaArray (const value) :: SArray Word8 String)+  , rejects "array descriptor capture" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen (SArray Word32 Word32)+      cgReturn (lambdaArray (readArray value) :: SArray Word32 Word32)+  , rejects "table entry capture" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (select [value, 17] 0) :: SArray Word8 Word32)+  , rejects "table default capture" captureDiagnostic $ do+      cgPerformRTCs True+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (select [3, 17] value) :: SArray Word8 Word32)+  , rejects "unchecked table default capture" captureDiagnostic $ do+      cgPerformRTCs False+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (select [3, 17] value) :: SArray Word8 Word32)+  , rejects "rounding-mode operand capture" captureDiagnostic $ do+      rounding <- cgInput "rounding" :: SBVCodeGen SRoundingMode+      cgReturn (lambdaArray (toSFloat rounding) :: SArray Word32 Float)+  , rejects "capture hidden in nested array" captureDiagnostic $ do+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (lambdaArray (\_ -> lambdaArray (+ value)) :: SArray Word8 (ArrayModel Word32 Word32))+  , rejects "nested parameter hidden in a rounding-mode operand" captureDiagnostic $+      cgReturn (lambdaArray (lambdaArray . toSFloat) :: SArray RoundingMode (ArrayModel Word32 Float))+  , rejects "defined-function parameter hidden in a rounding-mode operand" captureDiagnostic $ do+      rounding <- cgInput "rounding" :: SBVCodeGen SRoundingMode+      cgReturn (smtFunction "rounding array" (\mode -> lambdaArray (toSFloat mode) :: SArray Word32 Float) rounding)+  , rejects "nested parameter capture remains frontend-rejected" "Detected free variables passed to a lambda" $+      cgReturn (lambdaArray (\outer -> lambdaArray (+ outer)) :: SArray Word32 (ArrayModel Word32 Word32))+  , rejects "defined-function parameter capture remains frontend-rejected" "Detected free variables passed to a lambda" $ do+      value <- cgInput "value" :: SBVCodeGen SWord32+      cgReturn (smtFunction "capturing array" (\offset -> lambdaArray (+ offset) :: SArray Word32 Word32) value)+  , testCase "library rejects captures without writing earlier components" libraryCapture+  , testCase "closed nested callbacks with literal constants still compile" closedArrays+  ]++-- | Stable user-facing diagnostic shared by all C-side capture failures.+captureDiagnostic :: String+captureDiagnostic = "Array lambdas that capture outer symbolic values are not supported"++-- | A failed standalone generation must create no files and must not expose+-- the scheduler's internal missing-assignment error as its capture diagnostic.+rejects :: String -> String -> SBVCodeGen () -> TestTree+rejects testName diagnostic program = testCase testName $+  withSystemTempDirectory "sbv-c-array-capture-rejection" $ \dir -> do+    result <- try (compileToC (Just dir) "capturingArray" (cgGenerateDriver False >> program)) :: IO (Either ErrorCall ())+    checkRejection diagnostic result+    assertEqual "Rejected generation must not create files" [] =<< listDirectory dir++-- | Keep whole-library preflight atomic even when a valid component precedes+-- the component with an unsupported capture.+libraryCapture :: Assertion+libraryCapture = withSystemTempDirectory "sbv-c-array-capture-library" $ \dir -> do+  let closed = cgGenerateDriver False >> cgReturn (lambdaArray (+ 3) :: SArray Word32 Word32)+      capturing = do+        cgGenerateDriver False+        value <- cgInput "value" :: SBVCodeGen SWord32+        cgReturn (lambdaArray (+ value) :: SArray Word32 Word32)+  result <- try (void $ compileToCLib (Just dir) "captureLibrary" [("closedArray", closed), ("capturingArray", capturing)])+  checkRejection captureDiagnostic result+  assertEqual "Rejected library must not create any component files" [] =<< listDirectory dir++-- | Check the explicit unsupported boundary instead of accepting any failure.+checkRejection :: String -> Either ErrorCall () -> Assertion+checkRejection diagnostic result = case result of+  Left err -> do+    let message = displayException err+    assertBool message (diagnostic `isInfixOf` message)+    assertBool "Capture diagnostics must not expose an internal scheduling failure"+               (not ("Missing assignment" `isInfixOf` message))+  Right () -> assertFailure "Expected generation to reject an array-lambda capture"++-- | Haskell lexical bindings that contain only literal constants do not+-- require a runtime environment, nor does nesting otherwise closed lambdas.+closedArrays :: Assertion+closedArrays = withSystemTempDirectory "sbv-c-closed-array-lambdas" $ \dir -> do+  compileToC (Just dir) "closedArrays" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    let offset = literal (3 :: Word32)+    cgReturn (lambdaArray (\_ -> lambdaArray (+ offset)) :: SArray Word8 (ArrayModel Word32 Word32))+  assertBool "Closed callbacks still produce C artifacts" . not . null =<< listDirectory dir
+ SBVTestSuite/TestSuite/CodeGeneration/Boundaries.hs view
@@ -0,0 +1,142 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.Boundaries+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Executable contracts for deliberately unsupported C-backend features.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds             #-}+{-# LANGUAGE EmptyDataDecls        #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE TemplateHaskell       #-}+{-# LANGUAGE TypeApplications      #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.Boundaries (tests) where++import Control.Exception (ErrorCall, displayException, try)+import Control.Monad (void)+import Data.List (isInfixOf)+import System.Directory (listDirectory)+import System.IO.Temp (withSystemTempDirectory)+import Test.Tasty.HUnit (assertBool, assertEqual)++import Data.SBV.Internals (AlgRealPoly(..))+import Data.SBV.Control (SMTOption(..))+import qualified Data.SBV.List as SL+import Data.SBV.Tools.CodeGen+import Utils.SBVTestFramework++-- | An abstract solver sort deliberately lacking a C representation.+data Opaque++-- | Recursive references hidden inside a by-value tuple cannot have a finite C layout.+data NestedRecursion = EndRecursion | NestedRecursion (Word8, NestedRecursion)++mkSymbolic [''Opaque, ''NestedRecursion]++-- | Every rejected feature is checked through both public entry points;+-- library failures must not leave even an earlier, valid component behind.+tests :: TestTree+tests = testGroup "CodeGeneration.Boundaries"+  [ rejects "uninterpreted sort" "uninterpreted sorts" $ do+      value <- cgInput "value" :: SBVCodeGen (SBV Opaque)+      cgReturn value+  , rejects "nested recursive ADT" "Recursive ADT references nested inside composite fields" $ do+      value <- cgInput "value" :: SBVCodeGen (SBV NestedRecursion)+      cgReturn value+  , rejects "solver option" "SMT solver options have no executable C semantics" $ do+      setOption (ProduceAssertions True)+      cgReturn sTrue+  , rejects "solver option through cgSym" "SMT solver options have no executable C semantics" $ do+      cgSym $ setOption (ProduceAssertions True)+      cgReturn sTrue+  , rejects "nested uninterpreted sort" "uninterpreted sorts" $ do+      value <- cgInput "value" :: SBVCodeGen (SList (Maybe Opaque))+      cgReturn value+  , rejects "finite quantifier" "quantified" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      cgReturn (quantifiedBool (\(Forall b) -> b .|| value))+  , rejects "infinite quantifier" "quantified" $ do+      value <- cgInput "value" :: SBVCodeGen SInteger+      cgReturn (quantifiedBool (\(Forall n) -> n .>= value))+  , rejects "quantifier in private function" "quantified" $ do+      value <- cgInput "value" :: SBVCodeGen SInteger+      cgReturn (smtFunction "quantifiedFunction" (\v -> quantifiedBool (\(Forall n) -> n .>= v)) value)+  , rejects "quantifier in array lambda" "quantified" $+      cgReturn (lambdaArray (\v -> quantifiedBool (\(Forall n) -> n .>= v)) :: SArray Integer Bool)+  , rejects "special relation" "special relations" $+      cgReturn (isPartialOrder "order" (uncurry ((.<=) :: SInteger -> SInteger -> SBool)))+  , rejects "soft constraint" "Soft constraints" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      softConstrain value+      cgReturn value+  , rejects "SMT-only constraint attribute" "Constraint attributes: :weight" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      constrainWithAttribute [(":weight", "2")] value+      cgReturn value+  , rejects "minimize" "Optimization objectives require a solver" $ do+      value <- cgInput "value" :: SBVCodeGen SInteger+      cgSym $ minimize "minimum" value+      cgReturn value+  , rejects "maximize" "Optimization objectives require a solver" $ do+      value <- cgInput "value" :: SBVCodeGen SWord8+      cgSym $ maximize "maximum" value+      cgReturn value+  , rejects "implicit higher-order capture" "Defined functions with implicit captures" $ do+      offset <- cgInput "offset" :: SBVCodeGen SInteger+      values <- cgInput "values" :: SBVCodeGen (SList Integer)+      cgReturn (SL.map (+ offset) values)+  , rejects "implicit managed higher-order capture" "Defined functions with implicit captures" $ do+      offset <- cgInput "offset" :: SBVCodeGen SString+      values <- cgInput "values" :: SBVCodeGen (SList String)+      cgReturn (SL.map (.== offset) values)+  , rejects "penalized assertion" "Optimization objectives require a solver" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      cgSym $ assertWithPenalty "penalty" value DefaultPenalty+      cgReturn value+  , rejects "algebraic real literal" "Algebraic SReal literals" $ cgReturn (literal algebraic)+  , rejects "nested algebraic real literal" "Algebraic SReal literals" $ cgReturn (literal [algebraic])+  , rejects "mapped algebraic real literal" "Algebraic SReal literals" $ cgSRealType CgDouble >> cgReturn (literal algebraic)+  , rejects "inexact real literal" "Inexact SReal literals" $ cgReturn (literal (AlgRational False (1 / 3)))+  , rejects "exact transcendental" "exact GMP-rational SReal representation cannot represent" $ do+      value <- cgInput "value" :: SBVCodeGen SReal+      cgReturn (sin value)+  , rejects "private exact transcendental" "exact GMP-rational SReal representation cannot represent" $ do+      value <- cgInput "value" :: SBVCodeGen SReal+      cgReturn (smtFunction "exactSine" sin value)+  , rejects "sparse infinite-domain equality" "cannot enumerate key domain" $ do+      value <- cgInput "value" :: SBVCodeGen SWord8+      let base = constArray 0 :: SArray Integer Word8+      cgReturn (writeArray base 1 value .== writeArray base 2 value)+  ]++-- | The positive square root of two, represented without an approximation.+algebraic :: AlgReal+algebraic = AlgPolyRoot (2, AlgRealPoly [(1, 2), (-2, 0)]) Nothing++-- | Check an intentional diagnostic, not just any exception, and ensure that+-- validation completes before standalone or library output is written.+rejects :: String -> String -> SBVCodeGen () -> TestTree+rejects testName diagnostic program = testGroup testName+  [ testCase mode $ withSystemTempDirectory "sbv-c-boundary" $ \dir -> do+      let prepare body = cgGenerateDriver False >> cgOverwriteFiles True >> body+          action | library = void $ compileToCLib (Just dir) "rejectedLibrary"+                               [("validComponent", prepare (cgReturn sTrue)), ("rejectedComponent", prepare program)]+                 | True    = compileToC (Just dir) "rejectedComponent" (prepare program)+      result <- try action :: IO (Either ErrorCall ())+      case result of+        Left exception -> do+          let message = displayException exception+          assertBool message (diagnostic `isInfixOf` message)+          assertBool message (not (any (`isInfixOf` message) ["Unexpected:", "Missing assignment", "Impossible happened"]))+        Right () -> assertFailure "Expected an explicit unsupported-feature diagnostic"+      assertEqual "Rejected generation must not write any files" [] =<< listDirectory dir+  | (mode, library) <- [("standalone", False), ("library", True)]+  ]
SBVTestSuite/TestSuite/CodeGeneration/CgTests.hs view
@@ -9,37 +9,5074 @@ -- Test suite for code-generation features ----------------------------------------------------------------------------- -{-# LANGUAGE ScopedTypeVariables #-}--{-# OPTIONS_GHC -Wall -Werror #-}--module TestSuite.CodeGeneration.CgTests(tests) where--import Data.SBV.Internals--import Utils.SBVTestFramework---- Test suite-tests :: TestTree-tests = testGroup "CodeGeneration.CgTests" [-   goldenVsStringShow "selChecked"   $ genSelect True  "selChecked"- , goldenVsStringShow "selUnchecked" $ genSelect False "selUnChecked"- , goldenVsStringShow "codeGen1"       foo- ]- where thd (_, _, r) = r--       genSelect b n = thd <$> compileToC' n (do-                         cgSetDriverValues [65]-                         cgPerformRTCs b-                         let sel :: SWord8 -> SWord8-                             sel x = select [1, x+2] 3 x-                         x <- cgInput "x"-                         cgReturn $ sel x)-       foo = thd <$> compileToC' "foo" (do-                        cgSetDriverValues $ repeat 0-                        (x::SInt16)    <- cgInput "x"-                        (ys::[SInt64]) <- cgInputArr 45 "xArr"-                        cgOutput "z" (5 :: SWord16)-                        cgOutputArr "zArr" (replicate 7 (x+1))-                        cgOutputArr "yArr" ys-                        cgReturn (x*2))+{-# LANGUAGE DataKinds           #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell     #-}+{-# LANGUAGE TypeApplications    #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.CgTests(tests) where++import Control.Exception (ErrorCall, displayException, evaluate, try)+import Control.DeepSeq (force)+import Control.Monad (forM, forM_, unless, void, when)+import qualified Data.Bifunctor as B+import Data.List (isInfixOf)+import Data.Proxy (Proxy(..))+import Data.SBV.Internals+import Data.SBV.Tools.CodeGen (compileToC, compileToCLib)+import qualified Data.SBV.Char as SC+import qualified Data.SBV.List as SL+import qualified Data.SBV.Set as SS+import Data.SBV.Tuple (tuple, untuple)+import qualified Data.SBV.Tools.CodeGen.Legacy as PublicLegacy++import System.Directory (listDirectory)+import System.Exit      (ExitCode(..))+import System.FilePath  ((</>))+import System.IO.Temp   (withSystemTempDirectory)+import System.Process   (readProcessWithExitCode)++import Test.Tasty.HUnit (assertBool, assertEqual)++import Utils.SBVTestFramework+import Utils.CCodeGen (generatedMakeOptions)++-- | A non-recursive, parameterized sum type used to exercise C tagged-union+-- generation with nullary, unary, and product constructors.+data CodeGenADT a = CGEmpty+                  | CGOne a+                  | CGPair a Word16+                  deriving Show++-- | A finite enumeration used to check that constructor order is preserved by+-- the C tag representation.+data CodeGenEnum = CGRed | CGGreen | CGBlue deriving (Eq, Ord, Show)++-- | An acyclic parameterized ADT reference used to exercise 'KApp'+-- resolution and dependency-ordered C declarations.+data CodeGenEnvelope a = CGNoEnvelope | CGEnvelope (CodeGenADT a) deriving Show++-- | A recursive type used to verify the current C ABI boundary.+data CodeGenTree = CGLeaf Word8 | CGNode CodeGenTree CodeGenTree deriving (Eq, Ord, Show)++-- | An acyclic wrapper around a recursive value, used to check transitive+-- ownership without changing its embedded by-value layout.+newtype CodeGenForest = CGForest CodeGenTree deriving Show++-- | The even layer of a mutually recursive pair used to exercise C forward+-- declarations and cross-type ownership helpers.+data CodeGenEven = CGEvenEnd Word8 | CGEvenStep CodeGenOdd deriving Show++-- | The odd layer of the mutually recursive code-generation test pair.+newtype CodeGenOdd = CGOddStep CodeGenEven deriving Show++-- | A recursive type with no finite inhabitant, used to check generated-driver+-- diagnostics.+newtype CodeGenLoop = CGLoop CodeGenLoop deriving Show++-- | A managed aggregate used to exercise direct and tuple-nested collection+-- fields in generated C ADTs.+data CodeGenCollections = CGNoCollections+                        | CGCollections [Integer] (RCSet Rational) ([Integer], RCSet Rational)+                        deriving Show++-- | A managed aggregate used to exercise native-width collection ownership+-- without relying on exact-element storage to select the owned ABI.+data CodeGenNativeCollections = CGNativeCollections [Word16] (RCSet Word16) deriving Show++-- | A managed aggregate used to exercise direct text fields and collections+-- whose elements are strings.+data CodeGenText = CGText String [String] (RCSet String) deriving Show++-- | An aggregate used to exercise retained array fields in generated C ADTs.+data CodeGenArrayBox = CGArrayBox (ArrayModel Word8 Word32) Word8 deriving Show++-- | An ADT that hides an array-owning ADT behind an intermediate tuple.+newtype CodeGenArrayEnvelope = CGArrayEnvelope (CodeGenArrayBox, Word16) deriving Show++-- | A recursive managed aggregate whose leaf owns exact-element collections.+data CodeGenCollectionTree = CGCollectionLeaf [Integer] (RCSet Rational)+                           | CGCollectionBranch CodeGenCollectionTree+                           deriving Show++-- | A recursive type whose spelling differs from 'CodeGenCASE' only in case.+data CodeGenCase = CGCaseLeaf Word8 | CGCaseNext CodeGenCase deriving (Eq, Ord, Show)++-- | The case-sensitive companion used to expose collisions in generated+-- declaration guards, constructor tags, and transitive collection helpers.+data CodeGenCASE = CGCASELeaf Word8 | CGCASENext CodeGenCASE deriving (Eq, Ord, Show)++-- | Generate the symbolic interfaces for the code-generation ADTs.+mkSymbolic [''CodeGenADT, ''CodeGenEnum, ''CodeGenEnvelope, ''CodeGenTree, ''CodeGenForest, ''CodeGenEven, ''CodeGenOdd, ''CodeGenLoop, ''CodeGenCollections, ''CodeGenNativeCollections, ''CodeGenText, ''CodeGenArrayBox, ''CodeGenArrayEnvelope, ''CodeGenCollectionTree, ''CodeGenCase, ''CodeGenCASE]++-- | Code-generation tests.+tests :: TestTree+tests = testGroup "CodeGeneration.CgTests"+  [ goldenVsStringShow "selChecked"   $ genSelect True  "selChecked"+  , goldenVsStringShow "selUnchecked" $ genSelect False "selUnChecked"+  , goldenVsStringShow "codeGen1"       foo+  , testCase "compile through the public legacy facade" legacyPublicFacade+  , testCase "execute guarded pseudo-Boolean reductions in functions and array lambdas" scopedPseudoBoolean+  , testCase "floor long doubles inside functions and array lambdas" scopedMappedRealFloor+  , testCase "collect C runtime requirements" dependencyRequirements+  , testCase "escape assertion messages in generated C" escapedAssertionMessages+  , escapedValueLabels+  , testCase "execute IEEE native floating-point remainders" nativeFloatingRemainders+  , testCase "declare rounding modes in nested collections" collectionRoundingModes+  , testCase "relink library drivers after component changes" libraryDriverDependencies+  , arrayCollectionComparisons+  , testCase "preserve external prototypes in libraries" libraryExternalPrototypes+  , testCase "reject empty or conflicting libraries before rendering" libraryValidation+  , testCase "terminate on failed library preconditions and assertions" libraryRuntimeFailures+  , testCase "reject invalid and reserved public C names before rendering" publicCNameValidation+  , testCase "preserve public C names without local collisions" privateCBindings+  , testCase "preserve case through ADTs and structural type guards" caseSensitiveCKinds+  , testCase "frame nested array key and value type names" structuralCNameFraming+  , testCase "honor ownership across independent C library calls" libraryOwnershipContract+  , testCase "compare finite ADT set universes" finiteADTSetUniverses+  , testCase "compile exact symbolic rationals" exactSymbolicRationals+  , testCase "compile rationals with mapped integers" mappedIntegerRationals+  , testCase "compile divisibility with mapped integers" mappedIntegerDivisibility+  , testCase "compile mapped real non-linear operations" mappedRealNonLinearOperations+  , testCase "compile mapped integer exponentiation" mappedIntegerExponentiation+  , testCase "execute mapped integer arithmetic at every native width" mappedIntegerArithmetic+  , testCase "reject non-linear exact real operations" exactRealNonLinearDiagnostic+  , testCase "compile repeated exact rationals into a library" exactRationalLibrary+  , testCase "compile and execute persistent arrays" persistentArrays+  , testCase "compare finite arrays including callback and defined-function values" finiteArrayEquality+  , testCase "configure finite array equality limits" finiteArrayEqualityLimits+  , testCase "enumerate scalar and aggregate finite array keys" finiteArrayKeyKinds+  , testCase "observe finite array callback coverage and short circuiting" finiteArrayCallbacks+  , testCase "reject unsupported finite array equality domains before rendering" finiteArrayRejections+  , testCase "compare managed and floating finite array values" finiteArrayValues+  , testCase "compile and execute nested persistent arrays" nestedPersistentArrays+  , testCase "compile and execute arrays stored in tuples" tupleStoredArrays+  , testCase "compile and execute arrays stored in ADTs" adtStoredArrays+  , testCase "compile and execute arrays stored in lists" listStoredArrays+  , testCase "initialize aggregate inputs containing arrays" aggregateArrayInputs+  , testCase "initialize transitively nested array inputs" transitiveAggregateArrayInputs+  , testCase "preserve native floating-point array-key equality" nativeFloatArrayKeys+  , testCase "compile repeated array types into a library" persistentArrayLibrary+  , testCase "compile and execute a callback-backed array input" callbackArrayInput+  , testCase "compile and execute a structured lambda array" structuredLambdaArray+  , testCase "compile managed structured lambda arrays" managedStructuredLambdaArrays+  , testCase "retain an escaping managed lambda array" escapingManagedLambdaArray+  , testCase "call defined functions inside array lambdas" definedFunctionsInsideArrayLambdas+  , testCase "call defined functions from library array lambdas" definedFunctionArrayLambdaLibrary+  , testCase "return arrays from structured array lambdas" arrayValuedLambdaResults+  , testCase "return array-valued lambdas from a library" arrayValuedLambdaLibrary+  , testCase "compile nested structured array lambdas" nestedStructuredArrayLambdas+  , testCase "compile nested structured lambdas in a library" nestedStructuredArrayLambdaLibrary+  , testCase "compile and execute structured lambda tables" structuredLambdaTables+  , testCase "compile and execute a defined SBV function" definedSBVFunction+  , testCase "compose acyclic defined SBV functions" composedDefinedSBVFunctions+  , testCase "guard inactive branches in acyclic defined functions" guardedAcyclicDefinedFunctions+  , testCase "guard inactive branches in entry points" (guardedProgramEvaluation False)+  , testCase "guard inactive branches in array lambdas" (guardedProgramEvaluation True)+  , testCase "retain checks as demand-driven evaluation roots" guardedRuntimeChecks+  , testCase "preserve sharing across guarded evaluation diamonds" guardedEvaluationSharing+  , testCase "evaluate shared external calls at most once on each path" guardedExternalSharing+  , testCase "force and execute a deep memoized chain beneath nested branches" deepGuardedSharing+  , testCase "reuse the full ADT registry for nested and leaf-only literals" sharedADTConstantRegistry+  , testCase "register ADT dependencies without symbolic ADT inputs" literalADTRegistration+  , testCase "straight-line sharing needs no runtime readiness flags" straightLineSharing+  , testCase "text arena rejects allocation-size overflow" textAllocationOverflow+  , testCase "shared arenas preserve allocation and cleanup contracts" ownershipArenaChecks+  , testCase "empty concatenation borrows internally and owns outputs" emptyConcatenation+  , testCase "original bundle header patterns cover both backends" compatibleHeaderPatterns+  , testCase "merged configuration describes artifacts and protects existing files" mergedConfiguration+  , testCase "reject excess-precision floating-point compilation" excessFloatingPrecision+  , testCase "honor linker overrides, ignored assertions, and nonreserved macro prefixes" reviewedBuildOptions+  , testCase "remove all matching elements from borrowed duplicate sets" borrowedDuplicateRemoval+  , testCase "guard unselected finite-table entries and defaults" guardedTableEvaluation+  , testCase "check wide and exact indices before guarded table selection" guardedTableIndices+  , testCase "compile structural defined SBV functions" structuralDefinedSBVFunctions+  , testCase "compile managed scalar defined SBV functions" managedScalarDefinedSBVFunctions+  , testCase "compile collection defined SBV functions" collectionDefinedSBVFunctions+  , testCase "compile persistent-array defined SBV functions" persistentArrayDefinedSBVFunctions+  , testCase "compile owned-ADT defined SBV functions" ownedADTDefinedSBVFunctions+  , testCase "compile recursive defined SBV functions" recursiveDefinedSBVFunctions+  , testCase "compile recursive defined SBV functions in a library" recursiveDefinedSBVFunctionLibrary+  , testCase "compile recursive persistent-array functions" recursivePersistentArrayFunctions+  , testCase "compile recursive ADT functions" recursiveADTDefinedSBVFunctions+  , testCase "compile recursive ADT functions in a library" recursiveADTDefinedSBVFunctionLibrary+  , testCase "compile firstified higher-order list functions" higherOrderListFunctions+  , testCase "compile higher-order list functions in a library" higherOrderListFunctionLibrary+  , testCase "compile explicit hard constraints" explicitHardConstraints+  , testCase "reject solver-only constraint features" unsupportedConstraintFeatures+  , testCase "return a non-atomic value group" nonAtomicReturnGroup+  , testCase "return multiple value groups" multipleReturnGroups+  , testCase "return managed non-atomic value groups" managedReturnGroups+  , testCase "return grouped values from a library" groupedReturnLibrary+  , testCase "borrow symbolic-array input groups" (groupedArrayInputs False)+  , testCase "borrow symbolic-array input groups in a library" (groupedArrayInputs True)+  , testCase "retain grouped callback inputs across independent library calls" groupedArrayInputOwnership+  , testCase "initialize and release managed input groups" (groupedManagedInputs False)+  , testCase "share driver initialization for mixed aggregate fields" sharedDriverInitialization+  , testCase "pair collection driver cleanup with storage selection" collectionDriverStorageModes+  , testCase "initialize and release managed input groups in a library" (groupedManagedInputs True)+  , testCase "compile and execute a free array with a C definition" definedFreeArray+  , testCase "return and output owned arrays" ownedArrayResults+  , testCase "retain an escaping callback array" escapingCallbackArray+  , testCase "compile arrays with managed aggregate fields" managedAggregateArrays+  , testCase "return managed aggregate arrays from a library" managedAggregateArrayLibrary+  , testCase "compile managed aggregate lookup tables" managedAggregateTables+  , testCase "compile array-valued lookup tables" (arrayValuedTables False)+  , testCase "retain ready array-valued lookup tables" (arrayValuedTables True)+  , testCase "return managed table values from a library" managedAggregateTableLibrary+  , testCase "compile and execute structural tuples" structuralTuples+  , testCase "compile repeated tuple types into a library" structuralTupleLibrary+  , testCase "compile and execute tuples containing strings" ownedTextTuples+  , testCase "return string tuples from a generated library" ownedTextTupleLibrary+  , testCase "compile and execute tuples containing collections" ownedCollectionTuples+  , testCase "return collection tuples from a generated library" ownedCollectionTupleLibrary+  , testCase "compile tuple-valued symbolic collections" tupleValuedCollections+  , testCase "return tuple-valued collections from a library" tupleValuedCollectionLibrary+  , testCase "compile managed tuple-valued collections" managedTupleValuedCollections+  , testCase "return managed tuple-valued collections from a library" managedTupleValuedCollectionLibrary+  , testCase "compile string-valued collections and text ADTs" textAggregateCollections+  , testCase "return text ADTs from a library" textAggregateLibrary+  , testCase "compile directly nested collections" directlyNestedCollections+  , testCase "return nested collections from a library" directlyNestedCollectionLibrary+  , testCase "compile ADT-valued collections" adtValuedCollections+  , testCase "return ADT-valued collections from a library" adtValuedCollectionLibrary+  , testCase "compile and execute characters and strings" characterStrings+  , testCase "compile strings with mapped integers" mappedIntegerStrings+  , testCase "return owned strings from a generated library" ownedStringLibrary+  , testCase "compile and execute symbolic lists" symbolicLists+  , testCase "compile arbitrary-width symbolic lists" wideSymbolicLists+  , testCase "compile arbitrary floating-point symbolic lists" arbitraryFloatLists+  , testCase "preserve native floating-point list equality" nativeFloatLists+  , testCase "compile lists with mapped numeric elements" mappedNumericLists+  , testCase "return owned lists from a generated library" ownedListLibrary+  , testCase "compile lists of exact GMP values" exactGMPLists+  , testCase "compile and execute symbolic sets" symbolicSets+  , testCase "compare finite and cofinite Boolean sets" finiteUniverseSets+  , testCase "compile arbitrary-width symbolic sets" wideSymbolicSets+  , testCase "compile character symbolic sets" characterSets+  , testCase "compile arbitrary floating-point symbolic sets" arbitraryFloatSets+  , testCase "preserve native floating-point set equality" nativeFloatSets+  , testCase "compile sets with mapped numeric elements" mappedNumericSets+  , testCase "return owned sets from a generated library" ownedSetLibrary+  , testCase "compile sets of exact GMP values" exactGMPSets+  , testCase "compile and execute non-recursive ADTs" nonRecursiveADTs+  , testCase "compile and execute nested ADTs" nestedADTs+  , testCase "compile repeated ADT types into a library" nonRecursiveADTLibrary+  , testCase "compile ADTs containing managed collections" collectionADTs+  , testCase "compile recursive ADTs containing collections" recursiveCollectionADTs+  , testCase "return collection ADTs from a generated library" collectionADTLibrary+  , testCase "preserve ADT aggregate equality" adtAggregateEquality+  , testCase "compile and execute recursive ADTs" recursiveADTs+  , testCase "embed recursive ADTs by value" wrappedRecursiveADTs+  , testCase "compile and execute mutually recursive ADTs" mutuallyRecursiveADTs+  , testCase "compile repeated recursive ADTs into a library" recursiveADTLibrary+  , testCase "report recursive ADTs without finite samples" uninhabitedRecursiveADT+  ]+ where thd (_, _, r) = r++       genSelect b n = thd <$> compileToC' n (do+                         cgSetDriverValues [65]+                         cgPerformRTCs b+                         let sel :: SWord8 -> SWord8+                             sel x = select [1, x+2] 3 x+                         x <- cgInput "x"+                         cgReturn $ sel x)+       foo = thd <$> compileToC' "foo" fooProgram++       fooProgram = do+                        cgSetDriverValues $ repeat 0+                        (x::SInt16)    <- cgInput "x"+                        (ys::[SInt64]) <- cgInputArr 45 "xArr"+                        cgOutput "z" (5 :: SWord16)+                        cgOutputArr "zArr" (replicate 7 (x+1))+                        cgOutputArr "yArr" ys+                        cgReturn (x*2)++-- | Preserve diagnostic text literally, both in C comments and as a printf+-- argument, including characters that could otherwise alter the generated C.+escapedAssertionMessages :: Assertion+escapedAssertionMessages = withSystemTempDirectory "sbv-assertion-escaping" $ \dir -> do+  let message = "must be \"small\"; 100% %n */\n\\\n??/"+  compileToC (Just dir) "escapedAssertion" $ do+    cgOverwriteFiles True+    cgSetDriverValues [7]+    value <- cgInput "value" :: SBVCodeGen SWord8+    cgReturn (sAssert Nothing message (value .< 5) value)+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  (runExit, _, runError) <- readProcessWithExitCode (dir </> "escapedAssertion_driver") [] ""+  assertBool "Expected the violated assertion to terminate the driver" (runExit /= ExitSuccess)+  assertBool ("Assertion text was changed: " ++ runError) (("ASSERTION FAILED: " ++ message) `isInfixOf` runError)++-- | Labels are semantic no-ops even when their text contains C statements,+-- nested comment markers, preprocessing splices, trigraphs, or control bytes.+-- Exercise scalar, tuple, acyclic/recursive ADT, and persistent-array labels in+-- entry points, private functions, and closed lambdas, including static libraries.+escapedValueLabels :: TestTree+escapedValueLabels = testGroup "escaped C labels"+  [ testCase (form ++ "/" ++ scopeName ++ "/" ++ sampleName) (check (library, scope, message))+  | (form, library) <- [("program", False), ("library", True)]+  , (scopeName, scope) <- [("entry", 0 :: Int), ("function", 1), ("array lambda", 2)]+  , (sampleName, message) <- messages+  ]+ where messages = [ ("statements", "*/; abort(); /*")+                  , ("preprocessing", "nested /* comment; \\\n??/\n*/")+                  , ("control characters", "Unicode \955, NUL \0, CR \r, tab \t and control \SOH")+                  ]++       check (library, scope, message) = withSystemTempDirectory "sbv-c-label-escaping" $ \dir -> do+         let functionName = "escapedLabels"+             evaluateValue :: SWord8 -> SBool+             evaluateValue value =+               let annotate :: SymVal a => SBV a -> SBV a+                   annotate = label message+                   (firstField, secondField) = untuple (annotate (tuple (value, value + 1)))+                   tagged = annotate (sCGOne value)+                   tree   = annotate (sCGNode (sCGLeaf value) (sCGLeaf (value + 1)))+                   array  = annotate (constArray value :: SArray Word8 Word8)+               in sAnd [ annotate value .== value+                       , firstField .== value+                       , secondField .== value + 1+                       , getCGOne_1 tagged .== value+                       , getCGLeaf_1 (getCGNode_1 tree) .== value+                       , readArray array value .== value+                       ]+             evaluateScoped value = case scope of+               0 -> evaluateValue value+               1 -> smtFunction "C escaped labels" evaluateValue value+               _ -> readArray (lambdaArray evaluateValue) value+             program = do+               cgOverwriteFiles True+               cgSetDriverValues [7]+               value <- cgInput "value"+               cgReturn (evaluateScoped value)+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("labelComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Compare executed native remainders against constant SBV evaluation,+-- including quotient ties, negative operands, and a negative divisor.+nativeFloatingRemainders :: Assertion+nativeFloatingRemainders = mapM_ check [(7, 4), (6, 4), (-7, 4), (7, -4)]+ where check (left, right) = withSystemTempDirectory "sbv-native-remainder" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSetDriverValues [left, right, left, right]+               leftFloat   <- cgInput "leftFloat"   :: SBVCodeGen SFloat+               rightFloat  <- cgInput "rightFloat"  :: SBVCodeGen SFloat+               leftDouble  <- cgInput "leftDouble"  :: SBVCodeGen SDouble+               rightDouble <- cgInput "rightDouble" :: SBVCodeGen SDouble+               let expectedFloat  = fpRem (fromInteger left) (fromInteger right) :: SFloat+                   expectedDouble = fpRem (fromInteger left) (fromInteger right) :: SDouble+               cgReturn ((fpRem leftFloat rightFloat .== expectedFloat) .&& (fpRem leftDouble rightDouble .== expectedDouble))+         outputText <- compileProgramAndRunGenerated dir "nativeRemainder" program+         assertBool ("Incorrect native remainder: " ++ outputText) ("= 1" `isInfixOf` outputText)++-- | Equality observes every key, including a mismatch at the last key. The+-- same helper is available inside defined functions and retained lambdas.+finiteArrayEquality :: Assertion+finiteArrayEquality = mapM_ check [(library, identical) | library <- [False, True], identical <- [False, True]]+ where check (library, identical) = withSystemTempDirectory "sbv-finite-array-equality" $ \dir -> do+         let functionName = "finiteArrayEquality"+             program = do+               cgOverwriteFiles True+               cgSetDriverValues [3, if identical then 3 else 4]+               left  <- cgInput "left"  :: SBVCodeGen (SArray Word8 Word32)+               right <- cgInput "right" :: SBVCodeGen (SArray Word8 Word32)+               let equalArrays = smtFunction "C finite array equality" ((.==) :: SArray Word8 Word32 -> SArray Word8 Word32 -> SBool)+                   changed     = writeArray left 255 (readArray left 255 + 1)+                   another     = writeArray left 255 (readArray left 255 + 2)+                   callback    = lambdaArray (\key -> (constArray key :: SArray Bool Bool) .== constArray sTrue) :: SArray Bool Bool+               cgReturn $ sAnd [ (left .== right) .== literal identical+                               , equalArrays left right .== literal identical+                               , left ./= changed+                               , distinct [left, changed, another]+                               , (left .=== right) .== literal identical+                               , readArray callback sTrue+                               , sNot (readArray callback sFalse)+                               ]+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("equalityComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | The limit rejects excessive work during generation, can be raised to+-- admit a 16-bit key domain, and can be set to zero to disable enumeration.+finiteArrayEqualityLimits :: Assertion+finiteArrayEqualityLimits = do+  let program limit = do+        cgOverwriteFiles True+        cgSetDriverValues [7, 7]+        mapM_ cgArrayEqualityLimit limit+        left  <- cgInput "left"  :: SBVCodeGen (SArray Word16 Word8)+        right <- cgInput "right" :: SBVCodeGen (SArray Word16 Word8)+        cgReturn (left .== right)+  mapM_ (\limit -> do+    result <- try (do (_, _, bundle) <- compileToC' "limitedEquality" (program limit)+                      evaluate (length (show bundle))) :: IO (Either ErrorCall Int)+    case result of+      Left exception -> assertBool (displayException exception) ("cgArrayEqualityLimit" `isInfixOf` displayException exception)+      Right _        -> assertFailure "Expected the array equality limit to reject generation") [Nothing, Just 0, Just (-1)]+  withSystemTempDirectory "sbv-configured-array-equality" $ \dir -> do+    outputText <- compileProgramAndRunGenerated dir "configuredEquality" (program (Just 65536))+    sourceText <- readFile (dir </> "configuredEquality.c")+    assertBool outputText (") = 1" `isInfixOf` outputText)+    assertBool "Equality must use a compact loop, not an unrolled key table" (length sourceText < 50000)++-- | Enumerate signed bit patterns, sub-native bit-vectors, sums, products,+-- and rounding modes without relying on the example driver's sample keys.+finiteArrayKeyKinds :: Assertion+finiteArrayKeyKinds = withSystemTempDirectory "sbv-finite-array-key-kinds" $ \dir -> do+  let pair :: forall key. SymVal key => Proxy key -> String -> SBVCodeGen SBool+      pair _ prefix = do+        left  <- cgInput (prefix ++ "Left")  :: SBVCodeGen (SArray key Word8)+        right <- cgInput (prefix ++ "Right") :: SBVCodeGen (SArray key Word8)+        pure (left .=== right)+      program = do+        cgOverwriteFiles True+        cgSetDriverValues (repeat 3)+        results <- sequence [ pair (Proxy @Bool) "bool"+                            , pair (Proxy @Int8) "signed"+                            , pair (Proxy @(WordN 1)) "bit"+                            , pair (Proxy @(IntN 1)) "signedBit"+                            , pair (Proxy @(WordN 5)) "wide"+                            , pair (Proxy @(IntN 5)) "signedWide"+                            , pair (Proxy @(Bool, WordN 2)) "tuple"+                            , pair (Proxy @(Maybe Bool)) "maybe"+                            , pair (Proxy @(Either Bool (WordN 2))) "either"+                            , pair (Proxy @CodeGenEnum) "enum"+                            , pair (Proxy @RoundingMode) "rounding"+                            , pair (Proxy @(FloatingPoint 2 3)) "tinyFloat"+                            , pair (Proxy @()) "unit"+                            ]+        cgReturn (sAnd results)+  outputText <- compileProgramAndRunGenerated dir "finiteArrayKeys" program+  assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Exercise actual C callbacks, counting complete enumeration and early+-- mismatches. Tiny floats cover every object exactly once, including both+-- zeros and a single NaN, and library components retain independent limits.+finiteArrayCallbacks :: Assertion+finiteArrayCallbacks = withSystemTempDirectory "sbv-finite-array-callbacks" $ \dir -> do+  let component :: forall key. SymVal key => Proxy key -> Integer -> SBVCodeGen ()+      component _ limit = do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgArrayEqualityLimit limit+        left  <- cgInput "left"  :: SBVCodeGen (SArray key Word8)+        right <- cgInput "right" :: SBVCodeGen (SArray key Word8)+        cgReturn (left .=== right)+      large = do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgArrayEqualityLimit 65536+        left  <- cgInput "left"  :: SBVCodeGen (SArray Word16 Word8)+        right <- cgInput "right" :: SBVCodeGen (SArray Word16 Word8)+        let compareArrays = smtFunction "C configured equality" ((.==) :: SArray Word16 Word8 -> SArray Word16 Word8 -> SBool)+        cgReturn (compareArrays left right)+  _ <- compileToCLib (Just dir) "arrayEqualityLibrary"+    [("compareBytes", component (Proxy @Word8) 256)+    , ("compareTinyFloats", component (Proxy @(FloatingPoint 2 3)) 27)+    , ("compareChars", component (Proxy @Char) 0x30000)+    , ("compareLarge", large)+    ]+  compileAndRunCaller dir "arrayEqualityLibrary" $ unlines+    ["#include \"arrayEqualityLibrary.h\""+    , "#include <assert.h>"+    , "static unsigned calls, nans, positive_zeros, negative_zeros;"+    , "static SWord8 byte_lookup(const void *context, SWord8 key)"+    , "{ ++calls; return context != NULL && key == *(const unsigned *) context; }"+    , "static SWord8 float_lookup(const void *context, SFP2_3 key)"+    , "{"+    , "  (void) context; ++calls;"+    , "  unsigned raw = (unsigned) key.limb[0];"+    , "  bool nan = (raw & 12) == 12 && (raw & 3) != 0;"+    , "  nans += nan; positive_zeros += raw == 0; negative_zeros += raw == 16;"+    , "  return nan ? 1 : (SWord8) raw;"+    , "}"+    , "static SWord8 char_lookup(const void *context, SChar key)"+    , "{ (void) context; ++calls; return (SWord8) key; }"+    , "static SWord8 large_lookup(const void *context, SWord16 key)"+    , "{ (void) context; ++calls; return (SWord8) key; }"+    , "int main(void)"+    , "{"+    , "  unsigned changed = 255;"+    , "  SBVArrayInput_2_u8_2_u8 left = {byte_lookup, NULL, NULL, NULL};"+    , "  SBVArrayInput_2_u8_2_u8 right = {byte_lookup, &changed, NULL, NULL};"+    , "  assert(!compareBytes(left, right) && calls == 512);"+    , "  calls = 0; changed = 0; assert(!compareBytes(left, right) && calls == 2);"+    , "  calls = 0; assert(compareBytes(left, left) && calls == 512);"+    , "  SBVArrayInput_8_fp_e2_s3_2_u8 floats = {float_lookup, NULL, NULL, NULL};"+    , "  calls = 0; assert(compareTinyFloats(floats, floats) && calls == 54);"+    , "  assert(nans == 2 && positive_zeros == 2 && negative_zeros == 2);"+    , "  SBVArrayInput_4_char_2_u8 chars = {char_lookup, NULL, NULL, NULL};"+    , "  calls = 0; assert(compareChars(chars, chars) && calls == 0x60000);"+    , "  SBVArrayInput_3_u16_2_u8 large = {large_lookup, NULL, NULL, NULL};"+    , "  calls = 0; assert(compareLarge(large, large) && calls == 131072);"+    , "  return 0;"+    , "}"+    ]++-- | Reject disabled, oversized, infinite, recursive, and nested-array comparisons+-- with user-facing diagnostics before creating standalone or library files.+-- Opt-in permits compact native-floating and wide+-- bit-vector loops to be generated without attempting to execute them.+finiteArrayRejections :: Assertion+finiteArrayRejections = do+  let comparison :: forall key. SymVal key => Proxy key -> SBVCodeGen ()+      comparison _ = do+        cgGenerateDriver False+        left  <- cgInput "left"  :: SBVCodeGen (SArray key Word8)+        right <- cgInput "right" :: SBVCodeGen (SArray key Word8)+        cgReturn (left .=== right)+      reject diagnostic program = mapM_ (checkRejection diagnostic program) [False, True]+      checkRejection diagnostic program library = withSystemTempDirectory "sbv-array-equality-rejection" $ \dir -> do+        let closed = cgGenerateDriver False >> cgReturn sTrue+            action | library = void $ compileToCLib (Just dir) "rejectedLibrary" [("closedComponent", closed), ("rejectedEquality", program)]+                   | True    = compileToC (Just dir) "rejectedEquality" program+        result <- try action :: IO (Either ErrorCall ())+        case result of+          Left exception -> do+            let message = displayException exception+            assertBool message (diagnostic `isInfixOf` message)+            assertBool "An intentional array-equality limit must not be reported as an internal error"+                       (not ("Unexpected" `isInfixOf` message))+          Right _ -> assertFailure "Expected array equality to reject generation"+        assertEqual "Rejected equality must not create any component files" [] =<< listDirectory dir+      checkCompact program = do+        (_, _, bundle) <- compileToC' "largeDomain" (cgArrayEqualityLimit (2 ^ (673 :: Int)) >> program)+        assertBool "Explicitly admitted large domains must generate compact loops" (length (show bundle) < 100000)+  mapM_ (reject "cgArrayEqualityLimit")+    [comparison (Proxy @Word32), comparison (Proxy @(WordN 673)), comparison (Proxy @Float)+    , cgArrayEqualityLimit 26 >> comparison (Proxy @(FloatingPoint 2 3))]+  reject "disabled by cgArrayEqualityLimit 0" (cgArrayEqualityLimit 0 >> comparison (Proxy @Bool))+  mapM_ (reject "cannot enumerate key domain")+    [comparison (Proxy @Integer), comparison (Proxy @String), comparison (Proxy @CodeGenTree)]+  reject "Nested extensional array equality" $ do+    cgGenerateDriver False+    left  <- cgInput "left"  :: SBVCodeGen (SArray Bool (ArrayModel Bool Word8))+    right <- cgInput "right" :: SBVCodeGen (SArray Bool (ArrayModel Bool Word8))+    cgReturn (left .== right)+  mapM_ checkCompact [comparison (Proxy @Float), comparison (Proxy @Double), comparison (Proxy @(WordN 673))]++-- | Array values use structural object equality, including managed GMP,+-- collection and ADT values, NaNs, and the distinction between signed zeros.+finiteArrayValues :: Assertion+finiteArrayValues = withSystemTempDirectory "sbv-finite-array-values" $ \dir -> do+  let pair :: forall value. SymVal value => Proxy value -> String -> SBVCodeGen SBool+      pair _ prefix = do+        left  <- cgInput (prefix ++ "Left")  :: SBVCodeGen (SArray Bool value)+        right <- cgInput (prefix ++ "Right") :: SBVCodeGen (SArray Bool value)+        pure (left .=== right)+      program = do+        cgOverwriteFiles True+        cgSetDriverValues (repeat 3)+        results <- sequence [ pair (Proxy @Integer) "integer"+                            , pair (Proxy @Rational) "rational"+                            , pair (Proxy @String) "string"+                            , pair (Proxy @[Integer]) "list"+                            , pair (Proxy @(RCSet Word8)) "set"+                            , pair (Proxy @(Maybe Integer)) "adt"+                            ]+        bits <- cgInput "bits" :: SBVCodeGen SWord32+        let array value = constArray value :: SArray Bool Float+            nanValue    = sWord32AsSFloat (bits .|. 0x7fc00000)+            positive    = sWord32AsSFloat (bits .&. 0)+            negative    = sWord32AsSFloat ((bits .&. 0) .|. 0x80000000)+        cgReturn $ sAnd (results ++ [array nanValue .=== array (nanValue + 1), sNot (array positive .=== array negative)])+  outputText <- compileProgramAndRunGenerated dir "finiteArrayValues" program+  assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Discover rounding-mode declarations through collection element kinds,+-- and compile their borrowed/owned interfaces with strict C warnings.+collectionRoundingModes :: Assertion+collectionRoundingModes = withSystemTempDirectory "sbv-collection-rounding" $ \dir -> do+  compileToC (Just dir) "collectionRounding" $ do+    cgOverwriteFiles True+    values <- cgInput "values" :: SBVCodeGen (SList RoundingMode)+    modes  <- cgInput "modes"  :: SBVCodeGen (SList [RoundingMode])+    cgOutput "modesResult" modes+    cgReturn values+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  _ <- compileAndRunGenerated dir "collectionRounding"+  pure ()++-- | The driver must wait for its archive in parallel builds and become stale+-- whenever a component source changes, even if the public header is unchanged.+libraryDriverDependencies :: Assertion+libraryDriverDependencies = withSystemTempDirectory "sbv-library-dependencies" $ \dir -> do+  _ <- compileToCLib (Just dir) "dependencyLibrary"+    [("component", do cgOverwriteFiles True+                      value <- cgInput "value" :: SBVCodeGen SWord8+                      cgReturn (value + 1))]+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-j2", "-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  (queryExit, _, queryError) <- readProcessWithExitCode "make" ["-q", "-C", dir, "-W", "component.c", "dependencyLibrary_driver"] ""+  assertEqual queryError (ExitFailure 1) queryExit++-- | Reject direct and nested array comparisons, including sequence operations+-- that implicitly compare elements and comparisons inside defined functions.+-- Every rejection must precede file creation, even after a valid library entry.+arrayCollectionComparisons :: TestTree+arrayCollectionComparisons = testGroup "reject comparisons of array-valued collections"+  [ testCase (testName ++ if library then " library" else " standalone") (checkOutput testName program library)+  | (testName, program) <- programs, library <- [False, True]+  ]+ where binary :: forall a b. (SymVal a, SymVal b) => Proxy a -> (SBV a -> SBV a -> SBV b) -> SBVCodeGen ()+       binary _ operation = do+         cgGenerateDriver False+         left  <- cgInput "left"  :: SBVCodeGen (SBV a)+         right <- cgInput "right" :: SBVCodeGen (SBV a)+         cgReturn (operation left right)++       comparisons :: SymVal a => Proxy a -> [(String, SBVCodeGen ())]+       comparisons proxy = [("equal", binary proxy (.==)), ("distinct", binary proxy (./=)), ("objectEqual", binary proxy (.===))]++       -- ArrayModel deliberately has no Haskell Eq instance, so construct the+       -- sequence primitives directly to test the backend boundary independently+       -- of the public list API's concrete-folding constraints.+       sequenceExpr :: forall a b. (SymVal a, SymVal b)+                    => (Kind -> SeqOp) -> SList a -> SList a -> [SVal] -> SBV b+       sequenceExpr operation left right extra = SBV $ SVal resultKind $ Right $ cache $ \st -> do+         arguments <- mapM (svToSV st) ([unSBV left, unSBV right] ++ extra)+         newExpr st resultKind (SBVApp (SeqOp (operation (kindOf (Proxy @a)))) arguments)+        where resultKind = kindOf (Proxy @b)++       sequences :: forall a. SymVal a => Proxy [a] -> [(String, SBVCodeGen ())]+       sequences proxy = comparisons proxy +++         [ ("indexOf",  binary proxy (\left right -> sequenceExpr SeqIndexOf left right [unSBV (1 :: SInteger)] :: SInteger))+         , ("contains", predicate SeqContains)+         , ("prefix",   predicate SeqPrefixOf)+         , ("suffix",   predicate SeqSuffixOf)+         , ("replace",  binary proxy (\left right -> sequenceExpr SeqReplace left right [unSBV left] :: SList a))+         ]+        where predicate operation = binary proxy (\left right -> sequenceExpr operation left right [] :: SBool)++       named prefix = map (B.first (prefix ++))++       programs = named "list_"      (sequences   (Proxy @[ArrayModel Word8 Word8]))+               ++ named "listTuple_" (sequences   (Proxy @[(Word8, ArrayModel Word8 Word8)]))+               ++ named "nested_"    (sequences   (Proxy @[[ArrayModel Word8 Word8]]))+               ++ named "tuple_"     (comparisons (Proxy @(Word8, ArrayModel Word8 Word8)))+               ++ named "adt_"       (comparisons (Proxy @CodeGenArrayBox))+               ++ named "envelope_"  (comparisons (Proxy @CodeGenArrayEnvelope))+               ++ named "recursive_" (comparisons (Proxy @(Either CodeGenTree CodeGenArrayBox)))+               ++ [ ("defined", binary (Proxy @[ArrayModel Word8 Word8]) (smtFunction "compareArrayElements" (.===)))+                  , ("definedSearch", binary (Proxy @[ArrayModel Word8 Word8])+                      (smtFunction "findArrayElements" (\left right -> sequenceExpr SeqIndexOf left right [unSBV (0 :: SInteger)] :: SInteger)))+                  , ("lambda", cgReturn (lambdaArray (\index -> tuple (constArray index :: SArray Word8 Word8, index)+                                                          .=== tuple (constArray (index + 1) :: SArray Word8 Word8, index))+                                         :: SArray Word8 Bool))+                  , ("arrayKeys", do value <- cgInput "value" :: SBVCodeGen (SArray (Word8, ArrayModel Word8 Word8) Word8)+                                     cgReturn value)+                  ]++       checkOutput testName program library = withSystemTempDirectory "sbv-array-comparison-rejection" $ \dir -> do+         let valid = cgGenerateDriver False >> cgReturn sTrue+             action | library = void $ compileToCLib (Just dir) "rejectedLibrary" [("validComponent", valid), (testName, program)]+                    | True    = compileToC (Just dir) testName program+         result <- try action :: IO (Either ErrorCall ())+         case result of+           Left exception -> do+             let message = displayException exception+             assertBool (testName ++ ": " ++ message) ("extensional array equality" `isInfixOf` message)+             assertBool (testName ++ ": intentional rejection must not be an internal compiler error")+                        (not ("Unexpected" `isInfixOf` message))+           Right _ -> assertFailure (testName ++ ": expected generation to reject array-element comparison")+         assertEqual (testName ++ ": rejected comparisons must not create any files") [] =<< listDirectory dir++-- | An external C provider may return a borrowed set containing duplicates.+-- Removing an element must count every retained slot before exporting it.+borrowedDuplicateRemoval :: Assertion+borrowedDuplicateRemoval = withSystemTempDirectory "sbv-duplicate-set" $ \dir -> do+  compileToC (Just dir) "removeDuplicates" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    cgAddPrototype ["SBVSet_u8 duplicates(SWord8);"]+    cgAddDecl [ "SBVSet_u8 duplicates(SWord8 unused) { (void) unused; static const SWord8 values[] = {7, 7, 9};"+              , "return (SBVSet_u8) {values, 3, false}; }"+              , "int main(void) { SBVSet_u8 result = removeDuplicates(0);"+              , "int failed = result.length != 1 || result.data[0] != 9;"+              , "sbv_set_release_u8(&result); return failed; }"+              ]+    input <- cgInput "input" :: SBVCodeGen SWord8+    cgReturn (SS.delete 7 (uninterpret "duplicates" input :: SSet Word8))+  runEmbeddedCaller dir "removeDuplicates"++-- | Instrument an external function: a branch-local demand followed by an+-- unconditional demand must not repeat the call, and a dead arm must not call it.+guardedExternalSharing :: Assertion+guardedExternalSharing = withSystemTempDirectory "sbv-shared-external" $ \dir -> do+  compileToC (Just dir) "sharedExternal" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    cgAddPrototype ["SWord8 counted(SWord8);"]+    cgAddDecl [ "static unsigned calls;"+              , "SWord8 counted(SWord8 x) { ++calls; return x; }"+              , "int main(void) { SWord8 first, second;"+              , "sharedExternal(true, 7, &first, &second); if (calls != 1 || first != 7 || second != 7) return 1;"+              , "calls = 0; sharedExternal(false, 8, &first, &second); return calls != 1 || first != 0 || second != 8; }"+              ]+    condition <- cgInput "condition" :: SBVCodeGen SBool+    value <- cgInput "value" :: SBVCodeGen SWord8+    let shared = uninterpret "counted" value :: SWord8+    cgOutput "first" (ite condition shared 0)+    cgOutput "second" shared+  source <- readFile (dir </> "sharedExternal.c")+  assertEqual "Only the post-join demand needs a readiness guard" 1+    (length (filter ("if(!sbv_ready_" `isInfixOf`) (lines source)))+  runEmbeddedCaller dir "sharedExternal"++-- | Force the full bundle for a three-stage dependency chain first demanded+-- beneath nested branches. All eight paths must reuse every computed stage;+-- a later unconditional demand must also compute any previously skipped stage.+deepGuardedSharing :: Assertion+deepGuardedSharing = withSystemTempDirectory "sbv-deep-sharing" $ \dir -> do+  (_, cfg, bundle) <- compileToC' "deepSharing" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    cgAddPrototype ["SWord8 stageOne(SWord8);", "SWord8 stageTwo(SWord8);", "SWord8 stageThree(SWord8);"]+    cgAddDecl [ "static unsigned calls[3];"+              , "SWord8 stageOne(SWord8 x) { ++calls[0]; return x + 1; }"+              , "SWord8 stageTwo(SWord8 x) { ++calls[1]; return x + 1; }"+              , "SWord8 stageThree(SWord8 x) { ++calls[2]; return x + 1; }"+              , "int main(void) {"+              , "  for (SWord8 flags = 0; flags < 8; ++flags) {"+              , "    SWord8 first, second, intermediate; calls[0] = calls[1] = calls[2] = 0;"+              , "    deepSharing(flags, 7, &first, &second, &intermediate);"+              , "    if (first != (flags == 7 ? 10 : 0) || second != 10 || intermediate != 9) return 1;"+              , "    if (calls[0] != 1 || calls[1] != 1 || calls[2] != 1) return 2;"+              , "  }"+              , "  return 0;"+              , "}"+              ]+    flags <- cgInput "flags" :: SBVCodeGen SWord8+    value <- cgInput "value" :: SBVCodeGen SWord8+    let stage1 = uninterpret "stageOne"   value  :: SWord8+        stage2 = uninterpret "stageTwo"   stage1 :: SWord8+        stage3 = uninterpret "stageThree" stage2 :: SWord8+    cgOutput "first" (ite (sTestBit flags 0) (ite (sTestBit flags 1) (ite (sTestBit flags 2) stage3 0) 0) 0)+    cgOutput "second" stage3+    cgOutput "intermediate" stage2+  void $ evaluate (length (show bundle))+  renderCgPgmBundle (Just dir) (cfg, bundle)+  source <- readFile (dir </> "deepSharing.c")+  assertEqual "Each stage needs a post-join readiness guard" 3+    (length (filter ("if(!sbv_ready_" `isInfixOf`) (lines source)))+  runEmbeddedCaller dir "deepSharing"++-- | A leaf literal contains no value of the mutually recursive partner type,+-- but its type's other constructor still needs that partner's declaration.+-- An ADT input registers the full mutually recursive group; both leaf-only and+-- nested literals inside a managed collection must reuse that same registry.+sharedADTConstantRegistry :: Assertion+sharedADTConstantRegistry = mapM_ check [0, 1]+ where check seed = withSystemTempDirectory "sbv-adt-constant-registry" $ \dir -> do+         outputText <- compileProgramAndRunGenerated dir "sharedADTRegistry" $ do+           cgOverwriteFiles True+           cgSetDriverValues [seed, 0]+           chooseLeaf <- cgInput "chooseLeaf" :: SBVCodeGen SBool+           value <- cgInput "value" :: SBVCodeGen SCodeGenEven+           cgOutput "copy" value+           cgReturn (ite chooseLeaf (literal [CGEvenEnd 7])+                                    (literal [CGEvenStep (CGOddStep (CGEvenEnd 9))]))+         let expected | seed == 0 = "CGEvenStep(CGOddStep(CGEvenEnd(9)))"+                      | True      = "CGEvenEnd(7)"+         assertBool outputText (expected `isInfixOf` outputText)++-- | Literal-only ADTs retain their complete declarations without an ADT input+-- or explicit registration. Metadata remains finite and does not affect kind+-- identity, structural traversal, or constant folding, even under containers.+literalADTRegistration :: Assertion+literalADTRegistration = do+  let leaf     = literal (CGEvenEnd 7)+      rootKind = kindOf leaf+  assertEqual "The leaf remains concrete" (Just "CGEvenEnd 7") (show <$> unliteral leaf)+  assertEqual "The symbolic constructor remains concrete" (Just "CGEvenEnd 7") (show <$> unliteral (sCGEvenEnd 7))+  void $ evaluate (force rootKind)+  case rootKind of+    KADT typeName parameters constructors -> do+      let bare = KADT typeName parameters constructors+      assertEqual "Metadata preserves kind equality" bare rootKind+      assertEqual "Metadata preserves kind ordering" EQ (compare bare rootKind)+      assertEqual "Metadata is not part of structural kind traversal" (expandKinds bare) (expandKinds rootKind)+    _ -> assertFailure "Expected an ADT kind"+  let parameterKind = kindOf (Proxy @(CodeGenEnvelope Word8))+  assertEqual "Substitution must not enter independent declaration scopes"+              (adtKindDependencies parameterKind)+              (adtKindDependencies (substituteADTVars "CodeGenEnvelope" [("a", KBounded False 8)] parameterKind))+  forM_ [ ("literalLeaf", cgReturn leaf, "CGEvenEnd(7)")+        , ("constructorLeaf", cgReturn (sCGEvenEnd 7), "CGEvenEnd(7)")+        , ("literalLeaves", cgReturn (literal [CGEvenEnd 7]), "CGEvenEnd(7)")+        , ("literalEmptyLeaves", cgReturn (literal [] :: SList CodeGenEven), "")+        , ("literalTupleLeaf", cgReturn (literal (CGEvenEnd 7, True)), "CGEvenEnd(7)")+        , ("literalArrayLeaf", cgReturn (constArray leaf :: SArray Word8 CodeGenEven), "CGEvenEnd(7)")+        ] $ \(entry, program, expected) -> withSystemTempDirectory "sbv-literal-adt" $ \dir -> do+          outputText <- compileProgramAndRunGenerated dir entry program+          headerText <- readFile (dir </> entry ++ ".h")+          assertBool outputText (expected `isInfixOf` outputText)+          assertBool "The unused partner still needs a declaration"+                     ("typedef struct SBVADT_CodeGenOdd SBVADT_CodeGenOdd;" `isInfixOf` headerText)+  withSystemTempDirectory "sbv-literal-adt-parameter" $ \dir -> do+    outputText <- compileProgramAndRunGenerated dir "literalEnvelope" $+      cgReturn (literal CGNoEnvelope :: SCodeGenEnvelope Word8)+    headerText <- readFile (dir </> "literalEnvelope.h")+    assertBool outputText ("CGNoEnvelope" `isInfixOf` outputText)+    assertBool "The unused constructor must instantiate its dependency at Word8"+               ("SBVADT_CodeGenADT_2_u8" `isInfixOf` headerText)+    assertBool "The placeholder registration schema is not the generated ADT"+               (not ("SBVADT_CodeGenADT_7_integer" `isInfixOf` headerText))++-- | The original four-way file-kind match must stay exhaustive under -Werror+-- and expose signatures for current and legacy generated headers alike.+compatibleHeaderPatterns :: Assertion+compatibleHeaderPatterns = mapM_ check [compileToC', PublicLegacy.compileToC']+ where check compiler = do+         (_, _, CgPgmBundle _ files) <- compiler "compatibleHeader" $ do+           value <- cgInput "value" :: SBVCodeGen SWord8+           cgReturn (value + 1)+         assertEqual "One header with one public signature" [1]+           [count | (_, (fileKind, _)) <- files, Just count <- [signatures fileKind]]+       signatures (CgMakefile _) = Nothing+       signatures (CgHeader ds)  = Just (length ds)+       signatures CgSource       = Nothing+       signatures CgDriver       = Nothing++-- | Per-component generation options need not agree, but a library's returned+-- artifact flags must reflect the union, and overwriting needs unanimous opt-in.+mergedConfiguration :: Assertion+mergedConfiguration = do+  (_, cfg, _) <- compileToCLib' "mixedConfiguration"+    [ ("withoutDriver", do cgGenerateDriver False+                           cgGenerateMakefile False+                           cgOverwriteFiles True+                           cgReturn sTrue)+    , ("withDriver", cgReturn sFalse)+    ]+  assertBool "Merged library includes a driver" (cgGenDriver cfg)+  assertBool "Merged library includes a Makefile" (cgGenMakefile cfg)+  assertBool "One component cannot authorize overwriting for the others" (not (cgOverwriteGenerated cfg))++-- | Detect unsupported excess precision at C compilation, without depending+-- on whether the local processor offers an x87-style evaluation mode.+excessFloatingPrecision :: Assertion+excessFloatingPrecision = mapM_ check [-1, 1, 2 :: Int]+ where check evaluationMethod = withSystemTempDirectory "sbv-excess-precision" $ \dir -> do+         compileToC (Just dir) "floatingPrecision" $ do+           cgOverwriteFiles True+           cgGenerateDriver False+           value <- cgInput "value" :: SBVCodeGen SDouble+           cgReturn (value + 1)+         writeFile (dir </> "excess.c") $ unlines+           [ "#include <float.h>"+           , "#undef FLT_EVAL_METHOD"+           , "#define FLT_EVAL_METHOD " ++ show evaluationMethod+           , "#include \"floatingPrecision.h\""+           ]+         (compileExit, _, compileError) <- readProcessWithExitCode "cc" ["-std=c11", "-fsyntax-only", dir </> "excess.c"] ""+         assertBool "Excess precision must be rejected" (compileExit /= ExitSuccess)+         assertBool compileError ("indeterminate or excess-precision floating evaluation is unsupported" `isInfixOf` compileError)++-- | Exercise the arena's size check directly, without constructing an invalid+-- borrowed string or relying on an enormous allocation to fail incidentally.+textAllocationOverflow :: Assertion+textAllocationOverflow = withSystemTempDirectory "sbv-text-overflow" $ \dir -> do+  compileToC (Just dir) "textOverflow" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    value <- cgInput "value" :: SBVCodeGen SString+    cgReturn (value SL.++ value)+  appendFile (dir </> "textOverflow.c") $ unlines+    [ "int main(void) {"+    , "  sbv_text_ctx ctx = {NULL};"+    , "  (void) sbv_text_alloc(&ctx, SIZE_MAX);"+    , "  sbv_text_ctx_end(&ctx); return 0;"+    , "}"+    ]+  writeFile (dir </> "caller.mk") $ unlines+    [ "textOverflow: textOverflow.o"+    , "\t${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS} ${SBV_LIBS}"+    ]+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, "textOverflow"] ++ makeOptions) ""+  assertEqual buildError ExitSuccess buildExit+  (runExit, _, runError) <- readProcessWithExitCode (dir </> "textOverflow") [] ""+  assertBool ("Expected allocation overflow to abort: " ++ runError) (runExit /= ExitSuccess)++-- | Mix literal-backed collections with owned numbers, ADTs, and collections+-- of ADTs in one driver input. Only fields needing initialization get element+-- variables, and the cloned output survives cleanup of the borrowed input.+sharedDriverInitialization :: Assertion+sharedDriverInitialization = withSystemTempDirectory "sbv-shared-driver-init" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5]+        value <- cgInput "value" :: SBVCodeGen (SBV (Integer, [Word8], RCSet Word8, CodeGenADT Integer, [CodeGenADT Word8]))+        let (_, listValue, setValue, _, _) = untuple value+        cgOutput "copy" value+        cgReturn (SL.head listValue .== 6 .&& sNot (SS.member 7 setValue))+  stdoutText <- compileProgramAndRunGenerated dir "sharedDriverInitialization" program+  assertBool ("Expected the mixed input's driver samples to agree: " ++ stdoutText) (") = 1" `isInfixOf` stdoutText)+  driverText <- readFile (dir </> "sharedDriverInitialization_driver.c")+  assertBool "Literal-backed list elements need no separate driver variables"+             (not ("sbv_driver_input_0_field_2_element_" `isInfixOf` driverText))+  assertBool "Literal-backed set elements need no separate driver variables"+             (not ("sbv_driver_input_0_field_3_element_" `isInfixOf` driverText))+  assertBool "ADT collection elements retain their explicit initialization"+             ("sbv_driver_input_0_field_5_element_0" `isInfixOf` driverText)++-- | The same tuple-element collections require individual initialization and+-- cleanup with exact integers, but borrow compound literals with mapped ones.+-- Keep both decisions tied to the selected representation, including when the+-- collections occur inside an independently owned outer tuple.+collectionDriverStorageModes :: Assertion+collectionDriverStorageModes = mapM_ check [False, True]+ where check mapped = withSystemTempDirectory "sbv-collection-driver-storage" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               when mapped (cgIntegerSize 64)+               cgSetDriverValues [10]+               value <- cgInput "value" :: SBVCodeGen (SBV (String, [(Integer, Word8)], RCSet (Integer, Word8)))+               let (_, listValue, setValue) = untuple value+                   (firstValue, _) = untuple (SL.head listValue)+               cgOutput "copy" value+               cgReturn (firstValue .== 11 .&& SS.member (tuple (12, 13)) setValue)+         stdoutText <- compileProgramAndRunGenerated dir "collectionDriverStorage" program+         assertBool ("Expected the collection driver samples to agree: " ++ stdoutText) (") = 1" `isInfixOf` stdoutText)+         driverText <- readFile (dir </> "collectionDriverStorage_driver.c")+         forM_ [2, 3 :: Int] $ \fieldIndex -> forM_ [0 .. 2 :: Int] $ \elementIndex -> do+           let elementName = "sbv_driver_input_0_field_" ++ show fieldIndex ++ "_element_" ++ show elementIndex+               clearsElement line = "sbv_tuple_owned_release_" `isInfixOf` line && ("(&" ++ elementName ++ ");") `isInfixOf` line+           assertEqual ("Element variables follow storage selection: " ++ elementName)+                       (not mapped) (elementName `isInfixOf` driverText)+           assertEqual ("Element cleanup follows initialization: " ++ elementName)+                       (not mapped) (any clearsElement (lines driverText))++-- | Exercise all three instances of the shared arena emitter, including empty+-- allocation, element alignment, independent payloads, repeated cleanup, and+-- overflow of both the payload multiplication and allocation-header addition.+ownershipArenaChecks :: Assertion+ownershipArenaChecks = withSystemTempDirectory "sbv-ownership-arenas" $ \dir -> do+  compileToC (Just dir) "ownershipArenas" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    stringValue <- cgInput "string" :: SBVCodeGen SString+    listValue   <- cgInput "list"   :: SBVCodeGen (SList Word32)+    setValue    <- cgInput "set"    :: SBVCodeGen (SSet Word32)+    cgOutput "stringCopy" (stringValue SL.++ stringValue)+    cgOutput "listCopy"   (listValue SL.++ listValue)+    cgOutput "setCopy"    (SS.insert 7 setValue)+  appendFile (dir </> "ownershipArenas.c") $ unlines+    [ "int main(int argc, char **argv) {"+    , "  sbv_text_ctx text_ctx = {NULL};"+    , "  sbv_list_ctx list_ctx = {NULL};"+    , "  sbv_set_ctx set_ctx = {NULL};"+    , "  if (argc != 2) return 2;"+    , "  switch (argv[1][0]) {"+    , "    case '0': {"+    , "      if (sbv_text_alloc(&text_ctx, 0) != NULL) return 3;"+    , "      if (sbv_list_alloc(&list_ctx, 0, 0) != NULL) return 4;"+    , "      if (sbv_set_alloc(&set_ctx, 0, 0) != NULL) return 5;"+    , "      if (text_ctx.head != NULL || list_ctx.head != NULL || set_ctx.head != NULL) return 6;"+    , "      uint8_t *first = sbv_text_alloc(&text_ctx, 2); first[0] = 17; first[1] = 19;"+    , "      uint8_t *second = sbv_text_alloc(&text_ctx, 1); second[0] = 23;"+    , "      long double *items = (long double *) sbv_list_alloc(&list_ctx, 2, sizeof(*items));"+    , "      long double *members = (long double *) sbv_set_alloc(&set_ctx, 2, sizeof(*members));"+    , "      if ((uintptr_t) items % _Alignof(long double) != 0) return 7;"+    , "      if ((uintptr_t) members % _Alignof(long double) != 0) return 8;"+    , "      items[0] = 29; items[1] = 31; members[0] = 37; members[1] = 41;"+    , "      (void) sbv_list_alloc(&list_ctx, 3, sizeof(*items));"+    , "      (void) sbv_set_alloc(&set_ctx, 3, sizeof(*members));"+    , "      if (first[0] != 17 || first[1] != 19 || second[0] != 23) return 9;"+    , "      if (items[0] != 29 || items[1] != 31 || members[0] != 37 || members[1] != 41) return 10;"+    , "      break;"+    , "    }"+    , "    case '1': (void) sbv_text_alloc(&text_ctx, SIZE_MAX); break;"+    , "    case '2': (void) sbv_list_alloc(&list_ctx, 1, 0); break;"+    , "    case '3': (void) sbv_set_alloc(&set_ctx, 1, 0); break;"+    , "    case '4': (void) sbv_list_alloc(&list_ctx, SIZE_MAX / 2 + 1, 2); break;"+    , "    case '5': (void) sbv_set_alloc(&set_ctx, SIZE_MAX / 2 + 1, 2); break;"+    , "    case '6': (void) sbv_list_alloc(&list_ctx, SIZE_MAX, 1); break;"+    , "    case '7': (void) sbv_set_alloc(&set_ctx, SIZE_MAX, 1); break;"+    , "    default: return 11;"+    , "  }"+    , "  sbv_text_ctx_end(&text_ctx); sbv_list_ctx_end(&list_ctx); sbv_set_ctx_end(&set_ctx);"+    , "  if (text_ctx.head != NULL || list_ctx.head != NULL || set_ctx.head != NULL) return 12;"+    , "  sbv_text_ctx_end(&text_ctx); sbv_list_ctx_end(&list_ctx); sbv_set_ctx_end(&set_ctx);"+    , "  return 0;"+    , "}"+    ]+  writeFile (dir </> "caller.mk") $ unlines+    [ "ownershipArenas: ownershipArenas.o"+    , "\t${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS} ${SBV_LIBS}"+    ]+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, "ownershipArenas"] ++ makeOptions) ""+  assertEqual buildError ExitSuccess buildExit+  (normalExit, _, normalError) <- readProcessWithExitCode (dir </> "ownershipArenas") ["0"] ""+  assertEqual normalError ExitSuccess normalExit+  forM_ [1 :: Int .. 7] $ \scenario -> do+    (runExit, _, runError) <- readProcessWithExitCode (dir </> "ownershipArenas") [show scenario] ""+    assertBool ("Expected arena size check " ++ show scenario ++ " to abort: " ++ runError) (runExit /= ExitSuccess)++-- | Runtime-empty operands require no arena allocation for text, scalar lists,+-- or lists of owned strings. Public outputs must still be independent copies,+-- including when both operands are nonempty or contain embedded NULs and UTF-8.+emptyConcatenation :: Assertion+emptyConcatenation = withSystemTempDirectory "sbv-empty-concat" $ \dir -> do+  compileToC (Just dir) "emptyConcat" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    textLeft   <- cgInput "textLeft"   :: SBVCodeGen SString+    textRight  <- cgInput "textRight"  :: SBVCodeGen SString+    listLeft   <- cgInput "listLeft"   :: SBVCodeGen (SList Word32)+    listRight  <- cgInput "listRight"  :: SBVCodeGen (SList Word32)+    ownedLeft  <- cgInput "ownedLeft"  :: SBVCodeGen (SList String)+    ownedRight <- cgInput "ownedRight" :: SBVCodeGen (SList String)+    cgOutput "textCopy"  (textLeft SL.++ textRight)+    cgOutput "listCopy"  (listLeft SL.++ listRight)+    cgOutput "ownedCopy" (ownedLeft SL.++ ownedRight)+  appendFile (dir </> "emptyConcat.c") $ unlines+    [ "#include <assert.h>"+    , "int main(void) {"+    , "  for (unsigned scenario = 0; scenario < 4; ++scenario) {"+    , "    sbv_text_ctx text_ctx = {NULL}; sbv_list_ctx list_ctx = {NULL};"+    , "    uint8_t bytes[] = {0xc3, 0xa9, 0}; SWord32 numbers[] = {7, 11};"+    , "    SString text_value = sbv_string_borrow(bytes, 3, 2);"+    , "    SString text_empty = sbv_string_borrow(NULL, 0, 0);"+    , "    SBVList_u32 list_value = {numbers, 2}, list_empty = {NULL, 0};"+    , "    SBVList_string owned_value = {&text_value, 1}, owned_empty = {NULL, 0};"+    , "    SString text_left = (scenario & 1) ? text_value : text_empty;"+    , "    SString text_right = (scenario & 2) ? text_value : text_empty;"+    , "    SBVList_u32 list_left = (scenario & 1) ? list_value : list_empty;"+    , "    SBVList_u32 list_right = (scenario & 2) ? list_value : list_empty;"+    , "    SBVList_string owned_left = (scenario & 1) ? owned_value : owned_empty;"+    , "    SBVList_string owned_right = (scenario & 2) ? owned_value : owned_empty;"+    , "    SString text_result = sbv_text_concat(&text_ctx, text_left, text_right);"+    , "    SBVList_u32 list_result = sbv_list_u32_concat(&list_ctx, list_left, list_right);"+    , "    SBVList_string owned_result = sbv_list_string_concat(&list_ctx, owned_left, owned_right);"+    , "    const size_t copies = ((scenario & 1) != 0) + ((scenario & 2) != 0);"+    , "    assert(text_result.byte_length == 3 * copies && text_result.length == 2 * copies);"+    , "    assert(list_result.length == 2 * copies && owned_result.length == copies);"+    , "    if (scenario != 3) {"+    , "      assert(text_ctx.head == NULL && list_ctx.head == NULL);"+    , "      assert(text_result.data == (scenario == 0 ? NULL : bytes));"+    , "      assert(list_result.data == (scenario == 0 ? NULL : numbers));"+    , "      assert(owned_result.data == (scenario == 0 ? NULL : &text_value));"+    , "    } else {"+    , "      assert(text_ctx.head != NULL && list_ctx.head != NULL);"+    , "    }"+    , "    sbv_text_ctx_end(&text_ctx); sbv_list_ctx_end(&list_ctx);"+    , "    SString text_copy; SBVList_u32 list_copy; SBVList_string owned_copy;"+    , "    emptyConcat(text_left, text_right, list_left, list_right, owned_left, owned_right,"+    , "                &text_copy, &list_copy, &owned_copy);"+    , "    bytes[0] = 'x'; numbers[0] = 99;"+    , "    assert(text_copy.byte_length == 3 * copies && text_copy.length == 2 * copies);"+    , "    assert(list_copy.length == 2 * copies && owned_copy.length == copies);"+    , "    for (size_t i = 0; i < copies; ++i) {"+    , "      assert(text_copy.data[3 * i] == 0xc3 && text_copy.data[3 * i + 1] == 0xa9 && text_copy.data[3 * i + 2] == 0);"+    , "      assert(list_copy.data[2 * i] == 7 && list_copy.data[2 * i + 1] == 11);"+    , "      assert(owned_copy.data[i].byte_length == 3 && owned_copy.data[i].length == 2);"+    , "      assert(owned_copy.data[i].data[0] == 0xc3 && owned_copy.data[i].data[1] == 0xa9 && owned_copy.data[i].data[2] == 0);"+    , "    }"+    , "    sbv_string_release(&text_copy); sbv_list_release_u32(&list_copy); sbv_list_release_string(&owned_copy);"+    , "  }"+    , "  return 0;"+    , "}"+    ]+  runEmbeddedCaller dir "emptyConcat"++-- | Sharing non-speculatable arithmetic in a straight-line program needs one+-- assignment, not a zero initializer, readiness flag, or conditional wrapper.+straightLineSharing :: Assertion+straightLineSharing = mapM_ check [("sharedDouble", doubles), ("sharedInteger", integers)]+ where doubles = do+         value <- cgInput "value" :: SBVCodeGen SDouble+         let productValue = value * value+         cgOutput "first" productValue+         cgOutput "second" productValue+       integers = do+         value <- cgInput "value" :: SBVCodeGen SInteger+         let productValue = value * value+         cgOutput "first" productValue+         cgOutput "second" productValue+       check (entry, program) = withSystemTempDirectory "sbv-straight-sharing" $ \dir -> do+         outputText <- compileProgramAndRunGenerated dir entry $ do+           cgOverwriteFiles True+           cgSetDriverValues [7]+           program+         source <- readFile (dir </> entry ++ ".c")+         assertBool source (not ("sbv_ready_" `isInfixOf` source))+         assertBool source (not ("= {0}" `isInfixOf` source))+         assertBool source (not ("sbv_gmp_integer_shift" `isInfixOf` source))+         assertBool outputText ("49" `isInfixOf` outputText || "0x1.88p+5" `isInfixOf` outputText)++-- | Build a translation unit containing its own test main, preserving the+-- same compilation, sanitizer, and dependency flags at the final link step.+runEmbeddedCaller :: FilePath -> String -> Assertion+runEmbeddedCaller dir entry = do+  writeFile (dir </> "caller.mk") $ unlines+    [entry ++ ": " ++ entry ++ ".o"+    , "\t${CC} ${CCFLAGS} $^ -o $@ ${LDFLAGS} ${SBV_LIBS}"+    ]+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, entry] ++ makeOptions) ""+  assertEqual buildError ExitSuccess buildExit+  (runExit, _, runError) <- readProcessWithExitCode (dir </> entry) [] ""+  assertEqual runError ExitSuccess runExit++-- | Linker settings must survive a caller's LDFLAGS, and disabling assertions+-- must remove executable checks without imposing floating rules on integer C.+reviewedBuildOptions :: Assertion+reviewedBuildOptions = withSystemTempDirectory "sbv-reviewed-options" $ \dir -> do+  compileToC (Just dir) "INTERVAL" $ do+    cgOverwriteFiles True+    cgIgnoreSAssert True+    cgAddLDFlags ["-lm"]+    cgSetDriverValues [7]+    value <- cgInput "PRIMARY" :: SBVCodeGen SInteger+    cgReturn (sAssert Nothing "deliberately disabled" (value .< 0) (value + 1))+  makefile <- readFile (dir </> "Makefile")+  header <- readFile (dir </> "INTERVAL.h")+  assertBool makefile (not ("-ffp-contract" `isInfixOf` makefile))+  assertBool "cgAddLDFlags must contribute to separately retained link dependencies"+             ("SBV_LIBS?=" `isInfixOf` makefile && "-lm" `isInfixOf` makefile)+  assertBool header (not ("__FAST_MATH__" `isInfixOf` header))+  makeOptions <- generatedMakeOptions dir+  (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir, "LDFLAGS="] ++ makeOptions) ""+  assertEqual buildError ExitSuccess buildExit+  (runExit, outputText, runError) <- readProcessWithExitCode (dir </> "INTERVAL_driver") [] ""+  assertEqual runError ExitSuccess runExit+  assertBool outputText ("=8" `isInfixOf` outputText)++-- | A library header must retain user prototypes needed by its translation+-- units, even when the external implementation is supplied at final linking.+libraryExternalPrototypes :: Assertion+libraryExternalPrototypes = withSystemTempDirectory "sbv-library-prototypes" $ \dir -> do+  _ <- compileToCLib (Just dir) "prototypeLibrary"+    [("externalCall", do cgOverwriteFiles True+                         cgAddPrototype ["SWord8 external(SWord8);"]+                         value <- cgInput "value" :: SBVCodeGen SWord8+                         cgReturn (uninterpret "external" value :: SWord8))]+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir, "externalCall.o"] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit++-- | Reject invalid library layouts before rendering any files. Driver symbols+-- are checked separately from file names, and disabled drivers reserve neither.+libraryValidation :: Assertion+libraryValidation = do+  mapM_ check+    [("emptyLibrary", [], "at least one component")+    , ("duplicateLibrary", [("duplicate", program True), ("duplicate", program True)], "Duplicate component names")+    , ("fileLibrary", [("fileLibrary_driver", program True)], "Conflicting generated file names")+    , ("symbolLibrary", [("entry", program True), ("entry_driver", program False)], "Conflicting generated entry points")+    , ("mainLibrary", [("main", program True)], "reserved C/backend name")+    , ("caseLibrary", [("entry", program True), ("Entry", program True)], "Conflicting generated file names")+    ]+  withSystemTempDirectory "sbv-library-no-drivers" $ \dir -> do+    _ <- compileToCLib (Just dir) "noDriverLibrary"+      [("noDriverLibrary_driver", program False), ("entry", program False), ("entry_driver", program False)]+    makeOptions <- generatedMakeOptions dir+    (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+    assertEqual makeError ExitSuccess makeExit+ where program driver = do+         cgOverwriteFiles True+         cgGenerateDriver driver+         value <- cgInput "value" :: SBVCodeGen SWord8+         cgReturn value++       check (libName, components, diagnostic) = withSystemTempDirectory "sbv-library-validation" $ \dir -> do+         result <- try (compileToCLib (Just dir) libName components) :: IO (Either ErrorCall [()])+         case result of+           Left exception -> assertBool (displayException exception) (diagnostic `isInfixOf` displayException exception)+           Right _        -> assertBool ("Expected library rejection: " ++ libName) False+         assertEqual "Invalid libraries must not write files" [] =<< listDirectory dir++-- | Check all public naming entry points and ensure diagnostics precede any+-- file writes, including names that could otherwise escape the output directory.+publicCNameValidation :: Assertion+publicCNameValidation = do+  mapM_ (\badName -> rejects $ \dir -> compileToC (Just dir) badName scalar)+    ["", "my-function", "../escape", "line\nbreak", "switch", "9lives", "caf\233", "sbv_bv_s16_mul", "SBVList_u8", "SFP7_19", "__result", "printf", "remainder", "uint32_t"]+  rejects $ \dir -> compileToC (Just dir) "badInput" $ do+    value <- cgInput "switch" :: SBVCodeGen SWord8+    cgReturn value+  rejects $ \dir -> compileToC (Just dir) "badOutput" $ do+    value <- cgInput "value" :: SBVCodeGen SWord8+    cgOutput "sbv_output_0" value+  rejects $ \dir -> compileToC (Just dir) "badInputGroup" $ do+    values <- cgInputArr 2 "my-values" :: SBVCodeGen [SWord8]+    cgReturnArr values+  rejects $ \dir -> compileToC (Just dir) "badOutputGroup" $ cgOutputArr "int" [literal (3 :: Word8)]+  rejects $ \dir -> void $ compileToCLib (Just dir) "my-library" [("component", scalar)]+  rejects $ \dir -> void $ compileToCLib (Just dir) "validLibrary" [("my-component", scalar)]+ where scalar = do+         value <- cgInput "value" :: SBVCodeGen SWord8+         cgReturn value++       rejects generate = withSystemTempDirectory "sbv-c-names" $ \dir -> do+         result <- try (generate dir) :: IO (Either ErrorCall ())+         case result of+           Left exception -> assertBool (displayException exception) ("Invalid" `isInfixOf` displayException exception)+           Right _        -> assertBool "Expected a public name diagnostic" False+         assertEqual "Invalid names must not write files" [] =<< listDirectory dir++-- | Keep valid identifiers in the ABI while isolating symbolic temporaries,+-- table names, and recursively generated driver storage from user names.+privateCBindings :: Assertion+privateCBindings = withSystemTempDirectory "sbv-private-c-bindings" $ \dir -> do+  compileToC (Just dir) "s0" $ do+    cgOverwriteFiles True+    cgSetDriverValues [7, 2, 3, 4, 5]+    value      <- cgInput "s0" :: SBVCodeGen SWord8+    tableValue <- cgInput "table0" :: SBVCodeGen SWord8+    values     <- cgInput "values" :: SBVCodeGen (SList Integer)+    moreValues <- cgInput "values_data" :: SBVCodeGen (SList Integer)+    group      <- cgInputArr 1 "group" :: SBVCodeGen [SWord8]+    cgOutput "s1" (select [value, value+1, value+2] 0 tableValue)+    cgOutput "group_ctr" (sum group)+    cgOutput "values_element_0" moreValues+    cgReturn values+  headerText <- readFile (dir </> "s0.h")+  mapM_ (\fragment -> assertBool headerText (fragment `isInfixOf` headerText))+    ["SWord8 s0", "SWord8 table0", "*s1", "*group_ctr"]+  outputText <- compileAndRunGenerated dir "s0"+  mapM_ (\fragment -> assertBool outputText (fragment `isInfixOf` outputText))+    ["s1 = 9", "group_ctr = 5", "values_element_0 =", "s0(7, 2, values, values_data, group"]++-- | Distinct recursive ADTs must coexist both directly and through every+-- structural wrapper. Repeated library components must deduplicate each+-- type's helpers without suppressing the differently-cased companion.+caseSensitiveCKinds :: Assertion+caseSensitiveCKinds = mapM_ check [False, True]+ where check library = withSystemTempDirectory "sbv-case-sensitive-kinds" $ \dir -> do+         if library+            then do _ <- compileToCLib (Just dir) "caseSensitiveKinds" [("firstCase", program), ("secondCase", program)]+                    pure ()+            else compileToC (Just dir) "caseSensitiveKinds" program+         outputText <- compileAndRunGenerated dir "caseSensitiveKinds"+         mapM_ (\fragment -> assertBool outputText (fragment `isInfixOf` outputText))+           ["CGCaseNext", "CGCASENext", "lowerList =", "upperList =", "lowerSet =", "upperSet ="]++       program = do+         cgOverwriteFiles True+         cgSetDriverValues (repeat 1)+         lower      <- cgInput "lower"      :: SBVCodeGen (SBV CodeGenCase)+         upper      <- cgInput "upper"      :: SBVCodeGen (SBV CodeGenCASE)+         lowerTuple <- cgInput "lowerTuple" :: SBVCodeGen (SBV (CodeGenCase, Word8))+         upperTuple <- cgInput "upperTuple" :: SBVCodeGen (SBV (CodeGenCASE, Word8))+         lowerList  <- cgInput "lowerListInput" :: SBVCodeGen (SList CodeGenCase)+         upperList  <- cgInput "upperListInput" :: SBVCodeGen (SList CodeGenCASE)+         lowerSet   <- cgInput "lowerSetInput"  :: SBVCodeGen (SSet CodeGenCase)+         upperSet   <- cgInput "upperSetInput"  :: SBVCodeGen (SSet CodeGenCASE)+         lowerArray <- cgInput "lowerArray" :: SBVCodeGen (SArray Word8 CodeGenCase)+         upperArray <- cgInput "upperArray" :: SBVCodeGen (SArray Word8 CodeGenCASE)+         cgOutput "lowerChild" (getCGCaseNext_1 lower)+         cgOutput "upperChild" (getCGCASENext_1 upper)+         cgOutput "lowerPair" lowerTuple+         cgOutput "upperPair" upperTuple+         cgOutput "lowerList" lowerList+         cgOutput "upperList" upperList+         cgOutput "lowerSet" lowerSet+         cgOutput "upperSet" upperSet+         cgOutput "lowerArrayResult" (writeArray lowerArray 0 lower)+         cgOutput "upperArrayResult" (writeArray upperArray 0 upper)+         cgReturn (tuple (sCGCaseNext lower, sCGCASENext upper))++-- | Different placements of tuple and array boundaries produce distinct C+-- descriptor names, and the framed names agree across declarations, storage,+-- access helpers, and driver-side ownership operations.+structuralCNameFraming :: Assertion+structuralCNameFraming = withSystemTempDirectory "sbv-structural-c-names" $ \dir -> do+  compileToC (Just dir) "structuralNames" $ do+    cgOverwriteFiles True+    cgSetDriverValues [7, 0, 0]+    value <- cgInput "value" :: SBVCodeGen SWord32+    keyed <- cgInput "keyed" :: SBVCodeGen (SArray (Word8, Word16) Word32)+    paired <- cgInput "paired" :: SBVCodeGen (SArray Word8 (Word16, Word32))+    let key = tuple (1 :: SWord8, 2 :: SWord16)+        keyedResult = writeArray keyed key value+        pairedResult = writeArray paired 1 (tuple (2 :: SWord16, value))+        nested = constArray (constArray value :: SArray Word16 Word32) :: SArray Word8 (ArrayModel Word16 Word32)+        (_, pairedValue) = untuple (readArray pairedResult 1)+    cgOutput "keyedResult" keyedResult+    cgOutput "pairedResult" pairedResult+    cgOutput "nested" nested+    cgReturn (readArray keyedResult key .== value .&& pairedValue .== value .&& readArray (readArray nested 1) 2 .== value)+  headerText <- readFile (dir </> "structuralNames.h")+  mapM_ (\typeName -> assertBool headerText (typeName `isInfixOf` headerText))+    ["SBVArrayOutput_13_t2_2_u8_3_u16_3_u32"+    , "SBVArrayOutput_2_u8_14_t2_3_u16_3_u32"+    , "SBVArrayOutput_2_u8_20_array_11_3_u16_3_u32"+    ]+  outputText <- compileAndRunGenerated dir "structuralNames"+  assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Use a hand-written caller to check output reuse, independent ownership,+-- borrowed array reads, and balanced callback lifetimes across library calls.+libraryOwnershipContract :: Assertion+libraryOwnershipContract = withSystemTempDirectory "sbv-library-ownership" $ \dir -> do+  let component program = do+        cgOverwriteFiles True+        cgGenerateDriver False+        program+  _ <- compileToCLib (Just dir) "ownershipLibrary"+    [("copyLists", component $ do+        values <- cgInput "values" :: SBVCodeGen (SList Word16)+        cgOutput "copy" values+        cgReturn values)+    , ("listArray", component $ do+        values <- cgInput "values" :: SBVCodeGen (SList Word16)+        cgReturn (constArray values :: SArray Word8 [Word16]))+    , ("retainArray", component $ do+        values <- cgInput "values" :: SBVCodeGen (SArray Word8 Word16)+        cgReturn (writeArray values 0 42))+    , ("readArrayValue", component $ do+        values <- cgInput "values" :: SBVCodeGen (SArray Word8 Word16)+        cgReturn (readArray values 1))+    , ("exactOutputs", component $ do+        value <- cgInput "value" :: SBVCodeGen SInteger+        cgOutput "copy" (value + 1)+        cgReturn (value + 2))+    ]+  compileAndRunCaller dir "ownershipLibrary" $ unlines+    ["#include \"ownershipLibrary.h\""+    , "#include <assert.h>"+    , "typedef struct { unsigned references; SWord16 value; } Context;"+    , "static unsigned live_contexts;"+    , "static SWord16 lookup(const void *opaque, SWord8 key)"+    , "{ const Context *context = opaque; return context->value + key; }"+    , "static const void *retain(const void *opaque)"+    , "{ Context *context = (Context *) opaque; ++context->references; return context; }"+    , "static void release(const void *opaque)"+    , "{ Context *context = (Context *) opaque; if (--context->references == 0) { --live_contexts; free(context); } }"+    , "int main(void)"+    , "{"+    , "  mpz_t input, first, second; mpz_inits(input, first, second, NULL);"+    , "  for (unsigned i = 0; i < 32; ++i) {"+    , "    SWord16 data[] = {7, 11}; SBVList_u16 borrowed = {data, 2}, copy;"+    , "    SBVList_u16 result = copyLists(borrowed, &copy);"+    , "    data[0] = 99;"+    , "    assert(copy.data[0] == 7 && result.data[0] == 7);"+    , "    sbv_list_release_u16(&copy);"+    , "    assert(result.data[1] == 11);"+    , "    copy = copyLists(result, &borrowed);"+    , "    sbv_list_release_u16(&result); sbv_list_release_u16(&borrowed);"+    , "    SBVArrayOutput_2_u8_10_list_3_u16 array = listArray(copy);"+    , "    sbv_list_release_u16(&copy);"+    , "    SBVList_u16 read = sbv_array_output_read_2_u8_10_list_3_u16(array, 3);"+    , "    SBVList_u16 saved = sbv_list_clone_u16(read);"+    , "    sbv_array_output_release_2_u8_10_list_3_u16(&array);"+    , "    assert(saved.length == 2 && saved.data[0] == 7); sbv_list_release_u16(&saved);"+    , "    Context *context = malloc(sizeof *context); assert(context != NULL);"+    , "    *context = (Context) {1, 17}; ++live_contexts;"+    , "    SBVArrayInput_2_u8_3_u16 source = {lookup, context, retain, release};"+    , "    assert(readArrayValue(source) == 18 && context->references == 1);"+    , "    SBVArrayOutput_2_u8_3_u16 owned = retainArray(source);"+    , "    release(context);"+    , "    SBVArrayOutput_2_u8_3_u16 retained = sbv_array_output_retain_2_u8_3_u16(owned);"+    , "    sbv_array_output_release_2_u8_3_u16(&owned);"+    , "    assert(readArrayValue(sbv_array_output_as_input_2_u8_3_u16(retained)) == 18);"+    , "    assert(sbv_array_output_read_2_u8_3_u16(retained, 0) == 42);"+    , "    sbv_array_output_release_2_u8_3_u16(&retained); assert(live_contexts == 0);"+    , "    mpz_set_ui(input, i); exactOutputs(input, first, second);"+    , "    assert(mpz_cmp_ui(first, i + 1) == 0 && mpz_cmp_ui(second, i + 2) == 0);"+    , "  }"+    , "  mpz_clears(input, first, second, NULL); return 0;"+    , "}"+    ]++-- | Compile and execute an independent C caller against a generated library.+-- Use its Makefile so compiler overrides, dependencies, and runtime link flags+-- match those used for the generated translation units.+compileAndRunCaller :: FilePath -> String -> String -> Assertion+compileAndRunCaller dir libraryName source = do+  writeFile (dir </> "caller.c") source+  writeFile (dir </> "caller.mk") $ unlines+    ["caller: caller.c " ++ libraryName ++ ".h " ++ libraryName ++ ".a"+    , "\t${CC} ${CCFLAGS} ${GMP_CFLAGS} caller.c " ++ libraryName ++ ".a ${LDFLAGS} ${SBV_LIBS} -o $@"+    ]+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir, "caller"] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  (runExit, _, runError) <- readProcessWithExitCode (dir </> "caller") [] ""+  assertEqual runError ExitSuccess runExit++-- | Library calls share the standalone fail-fast contract. Exercise both+-- executable hard constraints and explicit assertions in separate processes.+libraryRuntimeFailures :: Assertion+libraryRuntimeFailures = mapM_ check [False, True]+ where check assertion = withSystemTempDirectory "sbv-library-fail-fast" $ \dir -> do+         _ <- compileToCLib (Just dir) "failFastLibrary"+           [("checkedEntry", do cgOverwriteFiles True+                                cgSetDriverValues [7]+                                value <- cgInput "value" :: SBVCodeGen SWord8+                                if assertion+                                   then cgReturn (sAssert Nothing "library assertion" (value .< 5) value)+                                   else do constrain (value .< 5)+                                           cgReturn value)]+         makeOptions <- generatedMakeOptions dir+         (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+         assertEqual makeError ExitSuccess makeExit+         (runExit, _, runError) <- readProcessWithExitCode (dir </> "failFastLibrary_driver") [] ""+         assertBool "Expected a failed library call to terminate the process" (runExit /= ExitSuccess)+         let diagnostic = if assertion then "ASSERTION FAILED" else "CONSTRAINT FAILED"+         assertBool runError (diagnostic `isInfixOf` runError)++-- | Finite sums and products have complete universes even when constructors+-- carry fields. Dynamic inputs prevent constant folding from hiding the C+-- finite/cofinite comparison; both regular and complemented inputs are tested.+finiteADTSetUniverses :: Assertion+finiteADTSetUniverses = mapM_ check [1, 2]+ where check seed = withSystemTempDirectory "sbv-finite-adt-sets" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSetDriverValues [seed, seed]+               simple <- cgInput "simple" :: SBVCodeGen (SSet (Maybe Bool))+               nested <- cgInput "nested" :: SBVCodeGen (SSet (Maybe (Either Bool Bool), Bool))+               let simpleUniverse = SS.fromList [Nothing, Just False, Just True]+                   alternatives   = [Nothing, Just (Left False), Just (Left True), Just (Right False), Just (Right True)]+                   nestedUniverse = SS.fromList [(value, flag) | value <- alternatives, flag <- [False, True]]+                   simpleFull     = simple `SS.union` simpleUniverse+                   nestedFull     = nested `SS.union` nestedUniverse+               cgReturn (simpleFull .== SS.full .&& nestedFull .== SS.full .&& SS.full `SS.isSubsetOf` nestedFull)+         outputText <- compileProgramAndRunGenerated dir "finiteADTUniverses" program+         assertBool outputText ("= 1" `isInfixOf` outputText)++-- | Compile and execute a scalar program using only the public compatibility+-- module's code-generation interface.+legacyPublicFacade :: Assertion+legacyPublicFacade = withSystemTempDirectory "sbv-legacy-c-backend" $ \dir -> do+  let programDir = dir </> "program"+      libraryDir = dir </> "library"++  PublicLegacy.compileToC (Just programDir) "legacyFacade" $ do+    PublicLegacy.cgOverwriteFiles True+    PublicLegacy.cgSetDriverValues [41]+    value <- PublicLegacy.cgInput "value" :: PublicLegacy.SBVCodeGen SWord32+    PublicLegacy.cgReturn (value + 1)++  programOutput <- compileAndRunGenerated programDir "legacyFacade"+  let expectedProgram = "0x0000002aUL"+  assertBool ("Expected legacy generated output to contain " ++ expectedProgram ++ ", received:\n" ++ programOutput) (expectedProgram `isInfixOf` programOutput)++  let component operation = do+        PublicLegacy.cgOverwriteFiles True+        PublicLegacy.cgSetDriverValues [41]+        value <- PublicLegacy.cgInput "value" :: PublicLegacy.SBVCodeGen SWord32+        PublicLegacy.cgReturn (operation value)+  _ <- PublicLegacy.compileToCLib (Just libraryDir) "legacyLibrary"+         [ ("increment", component (+ 1))+         , ("twice", component (* 2))+         ]+  libraryOutput <- compileAndRunGenerated libraryDir "legacyLibrary"+  let expectedLibrary = ["0x0000002aUL", "0x00000052UL"]+  mapM_ (\expected -> assertBool ("Expected legacy library output to contain " ++ expected ++ ", received:\n" ++ libraryOutput) (expected `isInfixOf` libraryOutput)) expectedLibrary+  (_, _, lowLevelProgram) <- PublicLegacy.compileToC' "legacyLowLevel" (component (+ 1))+  (_, _, lowLevelLibrary) <- PublicLegacy.compileToCLib' "legacyLowLevelLibrary" [("increment", component (+ 1))]+  assertBool "Public Legacy low-level entry points must generate bundles"+             ("legacyLowLevel.c" `isInfixOf` show lowLevelProgram && "legacyLowLevelLibrary.a" `isInfixOf` show lowLevelLibrary)++-- | Build and execute a generated C program or library driver with strict+-- warnings so representation and ownership qualifier errors cannot pass silently.+compileAndRunGenerated :: FilePath -> String -> IO String+compileAndRunGenerated dir executableName = do+  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  (runExit, outputText, runError) <- readProcessWithExitCode (dir </> executableName ++ "_driver") [] ""+  assertEqual runError ExitSuccess runExit+  pure outputText++-- | Exercise Unicode and embedded-NUL literals, character-based indexing,+-- string combinators, exact numeric conversions, printing, and owned results.+characterStrings :: Assertion+characterStrings = withSystemTempDirectory "sbv-character-strings" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [7, 1, 65]+        value     <- cgInput "value"     :: SBVCodeGen SString+        index     <- cgInput "index"     :: SBVCodeGen SInteger+        character <- cgInput "character" :: SBVCodeGen SChar+        let joined      = value SL.++ literal "\955\NUL"+            numeric     = SL.replace value value (literal "123")+            parsed      = SL.strToNat numeric+            indexedChar = SL.elemAt joined index+        cgOutput "length"         (SL.length joined)+        cgOutput "lambdaIndex"    (SL.indexOf joined (literal "\955"))+        cgOutput "contains"       (literal "v7" `SL.isInfixOf` joined)+        cgOutput "prefix"         (literal "sbv" `SL.isPrefixOf` joined)+        cgOutput "suffix"         (literal "\955\NUL" `SL.isSuffixOf` joined)+        cgOutput "sameObject"     (value .=== value)+        cgOutput "ordered"        (value .< joined)+        cgOutput "slice"          (SL.subList joined 3 2)+        cgOutput "replacement"    (SL.replace joined (literal "bv") (literal "X"))+        cgOutput "indexedChar"    indexedChar+        cgOutput "characterCode"  (SC.ord indexedChar)+        cgOutput "roundTripChar"  (SC.chr (SC.ord indexedChar))+        cgOutput "inputCharacter" character+        cgOutput "parsed"         parsed+        cgOutput "rendered"       (SL.natToStr (parsed + 1))+        cgReturn joined++  stdoutText <- compileProgramAndRunGenerated dir "characterStrings" program+  headerText <- readFile (dir </> "characterStrings.h")+  mapM_ (\fragment -> assertBool ("Expected generated text output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =sbv7\955\NUL"+    , "length =6"+    , "lambdaIndex =4"+    , "contains = 1"+    , "prefix = 1"+    , "suffix = 1"+    , "sameObject = 1"+    , "ordered = 1"+    , "slice =7\955"+    , "replacement =sX7\955\NUL"+    , "indexedChar =b"+    , "characterCode =98"+    , "roundTripChar =b"+    , "inputCharacter =a"+    , "parsed =123"+    , "rendered =124"+    ]+  assertBool "Expected a length-aware public string descriptor"+             ("size_t byte_length;" `isInfixOf` headerText && "size_t length;" `isInfixOf` headerText)+  assertBool "Expected public string ownership helpers"+             ("sbv_string_clone" `isInfixOf` headerText && "sbv_string_release" `isInfixOf` headerText)++-- | Exercise string indices and numeric conversions when the user explicitly+-- selects the historical lossy native mapping for 'SInteger'.+mappedIntegerStrings :: Assertion+mappedIntegerStrings = withSystemTempDirectory "sbv-mapped-integer-strings" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 64+        cgSetDriverValues [42, 1]+        value <- cgInput "value" :: SBVCodeGen SString+        index <- cgInput "index" :: SBVCodeGen SInteger+        cgOutput "selected" (SL.elemAt value index)+        cgOutput "numeric"  (SL.strToNat (SL.replace value value (literal "99")))+        cgReturn (SL.natToStr (SL.length value + 1))++  stdoutText <- compileProgramAndRunGenerated dir "mappedIntegerStrings" program+  mapM_ (\fragment -> assertBool ("Expected mapped-integer text output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =6"+    , "selected =b"+    , "numeric = 99LL"+    ]++-- | Exercise guarded string declarations and independent owned returns from+-- multiple generated library translation units.+ownedStringLibrary :: Assertion+ownedStringLibrary = withSystemTempDirectory "sbv-owned-string-library" $ \dir -> do+  let component suffix seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        value <- cgInput "value" :: SBVCodeGen SString+        cgReturn (value SL.++ suffix)++  (_, cfg, bundle) <- compileToCLib' "ownedStringLibrary"+    [ ("firstText",  component (literal "\955") 4)+    , ("secondText", component (literal "!") 5)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "ownedStringLibrary"+  assertBool ("Expected both owned string results, received:\n" ++ stdoutText)+             ("sbv4\955" `isInfixOf` stdoutText && "sbv5!" `isInfixOf` stdoutText)++-- | Exercise the primitive symbolic-list operations, exact indices, borrowed+-- inputs, and independently owned output and return values.+symbolicLists :: Assertion+symbolicLists = withSystemTempDirectory "sbv-symbolic-lists" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 1]+        values <- cgInput "values" :: SBVCodeGen (SList Word16)+        index  <- cgInput "index"  :: SBVCodeGen SInteger+        let suffix      = literal ([99, 100] :: [Word16])+            joined      = values SL.++ suffix+            contains    = suffix `SL.isInfixOf` joined+            slice       = SL.subList joined 2 2+            replaced    = SL.replace joined (literal ([11, 12] :: [Word16])) (SL.singleton 77)+        cgOutput "length"      (SL.length joined)+        cgOutput "selected"    (SL.elemAt joined index)+        cgOutput "suffixIndex" (SL.indexOf joined suffix)+        cgOutput "contains"    contains+        cgOutput "prefix"      (values `SL.isPrefixOf` joined)+        cgOutput "suffix"      (suffix `SL.isSuffixOf` joined)+        cgOutput "sameObject"  (values .=== values)+        cgOutput "different"   (values ./== suffix)+        cgOutput "conditional" (ite contains joined values)+        cgOutput "slice"       slice+        cgOutput "replaced"    replaced+        cgReturn joined++  stdoutText <- compileProgramAndRunGenerated dir "symbolicLists" program+  headerText <- readFile (dir </> "symbolicLists.h")+  mapM_ (\fragment -> assertBool ("Expected generated list output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =[0x000aU, 0x000bU, 0x000cU, 0x0063U, 0x0064U]"+    , "length =5"+    , "selected = 0x000bU"+    , "suffixIndex =3"+    , "contains = 1"+    , "prefix = 1"+    , "suffix = 1"+    , "sameObject = 1"+    , "different = 1"+    , "conditional =[0x000aU, 0x000bU, 0x000cU, 0x0063U, 0x0064U]"+    , "slice =[0x000cU, 0x0063U]"+    , "replaced =[0x000aU, 0x004dU, 0x0063U, 0x0064U]"+    ]+  assertBool "Expected a typed public list descriptor"+             ("struct SBVList_u16 { const SWord16 *data; size_t length; };" `isInfixOf` headerText)+  assertBool "Expected public list ownership helpers"+             ("sbv_list_clone_u16" `isInfixOf` headerText && "sbv_list_release_u16" `isInfixOf` headerText)++-- | Check that list descriptors remain agnostic to element width by compiling+-- and executing a list whose elements use the arbitrary-width bit-vector ABI.+wideSymbolicLists :: Assertion+wideSymbolicLists = withSystemTempDirectory "sbv-wide-symbolic-lists" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        values <- cgInput "values" :: SBVCodeGen (SList (WordN 673))+        cgOutput "length" (SL.length values)+        cgReturn values++  stdoutText <- compileProgramAndRunGenerated dir "wideSymbolicLists" program+  headerText <- readFile (dir </> "wideSymbolicLists.h")+  assertBool ("Expected the wide-list driver to report its three sample elements, received:\n" ++ stdoutText)+             ("length =3" `isInfixOf` stdoutText)+  assertBool "Expected an arbitrary-width typed list descriptor"+             ("struct SBVList_u673 { const SWord673 *data; size_t length; };" `isInfixOf` headerText)++-- | Check that arbitrary floating-point elements retain their raw interchange+-- representation and use the LibBF-backed object-equality semantics.+arbitraryFloatLists :: Assertion+arbitraryFloatLists = do+  (_, _, bundle) <- compileToC' "arbitraryFloatLists" $ do+    cgSetDriverValues [1]+    values <- cgInput "values" :: SBVCodeGen (SList (FloatingPoint 7 19))+    cgOutput "sameObject" (values .=== values)+    cgReturn values+  let generated = show bundle+  assertBool "Expected a typed arbitrary-float list descriptor"+             ("struct SBVList_fp_e7_s19 { const SFP7_19 *data; size_t length; };" `isInfixOf` generated)+  assertBool "Expected arbitrary-float list equality to use object equality"+             ("sbv_fp_e7_s19_obj_eq(left, right)" `isInfixOf` generated)++-- | Check that native floating-point list equality treats NaNs as identical+-- objects while distinguishing positive and negative zero.+nativeFloatLists :: Assertion+nativeFloatLists = withSystemTempDirectory "sbv-native-float-lists" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x7fc00000, 0x00000000, 0x80000000]+        nanBits      <- cgInput "nanBits"      :: SBVCodeGen SWord32+        positiveBits <- cgInput "positiveBits" :: SBVCodeGen SWord32+        negativeBits <- cgInput "negativeBits" :: SBVCodeGen SWord32+        let nanList      = SL.singleton (sWord32AsSFloat nanBits)+            positiveList = SL.singleton (sWord32AsSFloat positiveBits)+            negativeList = SL.singleton (sWord32AsSFloat negativeBits)+        cgOutput "nanSameObject" (nanList .=== nanList)+        cgOutput "zeroObjectsDiffer" (positiveList ./== negativeList)+        cgReturn (nanList SL.++ positiveList)++  stdoutText <- compileProgramAndRunGenerated dir "nativeFloatLists" program+  assertBool ("Expected native floating-point list object equality, received:\n" ++ stdoutText)+             ("nanSameObject = 1" `isInfixOf` stdoutText && "zeroObjectsDiffer = 1" `isInfixOf` stdoutText)++-- | Exercise lists after explicitly selecting the historical native mappings+-- for unbounded integers and reals, including declaration dependency order.+mappedNumericLists :: Assertion+mappedNumericLists = withSystemTempDirectory "sbv-mapped-numeric-lists" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 64+        cgSRealType CgDouble+        cgSetDriverValues [7, 9]+        integers <- cgInput "integers" :: SBVCodeGen (SList Integer)+        reals    <- cgInput "reals"    :: SBVCodeGen (SList AlgReal)+        cgOutput "integerLength" (SL.length integers)+        cgOutput "realSameObject" (reals .=== reals)+        cgReturn integers++  stdoutText <- compileProgramAndRunGenerated dir "mappedNumericLists" program+  mapM_ (\fragment -> assertBool ("Expected mapped-numeric list output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "integerLength = 3LL"+    , "realSameObject = 1"+    , "[7LL, 8LL, 9LL]"+    ]++-- | Exercise guarded list declarations and independent owned returns from+-- multiple generated library translation units.+ownedListLibrary :: Assertion+ownedListLibrary = withSystemTempDirectory "sbv-owned-list-library" $ \dir -> do+  let component suffix seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        values <- cgInput "values" :: SBVCodeGen (SList Word16)+        cgReturn (values SL.++ literal suffix)++  (_, cfg, bundle) <- compileToCLib' "ownedListLibrary"+    [ ("firstList",  component ([40] :: [Word16]) 4)+    , ("secondList", component ([50] :: [Word16]) 5)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "ownedListLibrary"+  assertBool ("Expected both owned list results, received:\n" ++ stdoutText)+             ("[0x0004U, 0x0005U, 0x0006U, 0x0028U]" `isInfixOf` stdoutText+           && "[0x0005U, 0x0006U, 0x0007U, 0x0032U]" `isInfixOf` stdoutText)++-- | Exercise borrowed exact elements, exact indexing and comparison, list+-- operations, and deep-cloned list results across the generated C ABI.+exactGMPLists :: Assertion+exactGMPLists = withSystemTempDirectory "sbv-exact-gmp-lists" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 20, 30, 1]+        integers  <- cgInput "integers"  :: SBVCodeGen (SList Integer)+        reals     <- cgInput "reals"     :: SBVCodeGen (SList AlgReal)+        rationals <- cgInput "rationals" :: SBVCodeGen (SList Rational)+        index     <- cgInput "index"     :: SBVCodeGen SInteger+        let joinedIntegers  = integers  SL.++ literal ([13, 14] :: [Integer])+            joinedReals     = reals     SL.++ literal ([23, 24] :: [AlgReal])+            joinedRationals = rationals SL.++ literal ([33, 34] :: [Rational])+        cgOutput "length"           (SL.length joinedIntegers)+        cgOutput "selectedInteger"  (SL.elemAt joinedIntegers index)+        cgOutput "selectedReal"     (SL.elemAt joinedReals index)+        cgOutput "selectedRational" (SL.elemAt joinedRationals index)+        cgOutput "outOfRange"       (SL.elemAt joinedRationals 99)+        cgOutput "sameIntegers"     (joinedIntegers .== literal ([10, 11, 12, 13, 14] :: [Integer]))+        cgOutput "realSlice"        (SL.subList joinedReals 1 3)+        cgOutput "rationalResult"   joinedRationals+        cgReturn joinedIntegers++  stdoutText <- compileProgramAndRunGenerated dir "exactGMPLists" program+  headerText <- readFile (dir </> "exactGMPLists.h")+  mapM_ (\fragment -> assertBool ("Expected exact-list output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =[10, 11, 12, 13, 14]"+    , "length =5"+    , "selectedInteger =11"+    , "selectedReal =21"+    , "selectedRational =31"+    , "outOfRange =0"+    , "sameIntegers = 1"+    , "realSlice =[21, 22, 23]"+    , "rationalResult =[30, 31, 32, 33, 34]"+    ]+  assertBool "Expected exact list ownership to clone and clear individual GMP elements"+             ("mpz_init_set(element, value.data[i]);" `isInfixOf` headerText+           && "mpz_clear(element); free(element);" `isInfixOf` headerText+           && "mpq_set(element, value.data[i]);" `isInfixOf` headerText+           && "mpq_clear(element); free(element);" `isInfixOf` headerText)++-- | Exercise finite and cofinite symbolic sets, normalization, every primitive+-- set operation, and independently owned outputs and returns.+symbolicSets :: Assertion+symbolicSets = withSystemTempDirectory "sbv-symbolic-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 12, 11, 13]+        left       <- cgInput "left"       :: SBVCodeGen (SSet Word16)+        right      <- cgInput "right"      :: SBVCodeGen (SSet Word16)+        cofinite   <- cgInput "cofinite"   :: SBVCodeGen (SSet Word16)+        element    <- cgInput "element"    :: SBVCodeGen SWord16+        let inserted             = SS.insert element left+            deleted              = SS.delete 11 inserted+            unioned              = SS.union left right+            intersected          = SS.intersection left right+            subtracted           = SS.difference left right+            mixedUnion           = SS.union left cofinite+            mixedIntersection    = SS.intersection left cofinite+            cofiniteDifference   = SS.difference cofinite left+            cofiniteInserted     = SS.insert 12 cofinite+            cofiniteDeleted      = SS.delete 14 cofinite+            otherCofinite        = SS.complement right+            cofiniteUnion        = SS.union cofinite otherCofinite+            cofiniteIntersection = SS.intersection cofinite otherCofinite+            cofiniteSubtraction  = SS.difference cofinite otherCofinite+            containsElement      = element `SS.member` unioned+            conditional          = ite containsElement intersected subtracted+        cgOutput "inserted"             inserted+        cgOutput "deleted"              deleted+        cgOutput "unioned"              unioned+        cgOutput "intersected"          intersected+        cgOutput "subtracted"           subtracted+        cgOutput "mixedUnion"           mixedUnion+        cgOutput "mixedIntersection"    mixedIntersection+        cgOutput "cofiniteDifference"   cofiniteDifference+        cgOutput "cofiniteInserted"     cofiniteInserted+        cgOutput "cofiniteDeleted"      cofiniteDeleted+        cgOutput "cofiniteUnion"        cofiniteUnion+        cgOutput "cofiniteIntersection" cofiniteIntersection+        cgOutput "cofiniteSubtraction"  cofiniteSubtraction+        cgOutput "complemented"         (SS.complement left)+        cgOutput "containsElement"      containsElement+        cgOutput "subset"               (intersected `SS.isSubsetOf` left)+        cgOutput "sameObject"           (left .=== left)+        cgOutput "different"            (left ./== right)+        cgOutput "conditional"          conditional+        cgReturn unioned++  stdoutText <- compileProgramAndRunGenerated dir "symbolicSets" program+  headerText <- readFile (dir </> "symbolicSets.h")+  mapM_ (\fragment -> assertBool ("Expected generated set output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") ={0x000aU, 0x000bU, 0x000cU, 0x000dU, 0x000eU}"+    , "inserted ={0x000aU, 0x000bU, 0x000cU, 0x000dU}"+    , "deleted ={0x000aU, 0x000cU, 0x000dU}"+    , "unioned ={0x000aU, 0x000bU, 0x000cU, 0x000dU, 0x000eU}"+    , "intersected ={0x000cU}"+    , "subtracted ={0x000aU, 0x000bU}"+    , "mixedUnion =U - {0x000dU}"+    , "mixedIntersection ={0x000aU}"+    , "cofiniteDifference =U - {0x000bU, 0x000cU, 0x000dU, 0x000aU}"+    , "cofiniteInserted =U - {0x000bU, 0x000dU}"+    , "cofiniteDeleted =U - {0x000bU, 0x000cU, 0x000dU, 0x000eU}"+    , "cofiniteUnion =U - {0x000cU, 0x000dU}"+    , "cofiniteIntersection =U - {0x000bU, 0x000cU, 0x000dU, 0x000eU}"+    , "cofiniteSubtraction ={0x000eU}"+    , "complemented =U - {0x000aU, 0x000bU, 0x000cU}"+    , "containsElement = 1"+    , "subset = 1"+    , "sameObject = 1"+    , "different = 1"+    , "conditional ={0x000cU}"+    ]+  assertBool "Expected a finite/cofinite public set descriptor"+             ("struct SBVSet_u16 { const SWord16 *data; size_t length; bool is_complement; };" `isInfixOf` headerText)+  assertBool "Expected public set ownership helpers"+             ("sbv_set_clone_u16" `isInfixOf` headerText && "sbv_set_release_u16" `isInfixOf` headerText)++-- | Check equality and subset relations when regular and complemented forms+-- denote the same set over the complete Boolean universe.+finiteUniverseSets :: Assertion+finiteUniverseSets = withSystemTempDirectory "sbv-finite-universe-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0]+        inputFull <- cgInput "inputFull" :: SBVCodeGen (SSet Bool)+        let regularTrue   = SS.fromList [True]+            cofiniteFalse = SS.complement (SS.fromList [False])+            regularFull   = SS.fromList [False, True]+            universal     = SS.full :: SSet Bool+        cgOutput "sameSingleton"   (regularTrue .== cofiniteFalse)+        cgOutput "sameUniverse"    (regularFull .== universal)+        cgOutput "leftSubset"      (regularTrue `SS.isSubsetOf` cofiniteFalse)+        cgOutput "rightSubset"     (cofiniteFalse `SS.isSubsetOf` regularTrue)+        cgOutput "normalizedInput" (inputFull .== universal)+        cgReturn (regularTrue .== cofiniteFalse .&& regularFull .== universal .&& inputFull .== universal)++  stdoutText <- compileProgramAndRunGenerated dir "finiteUniverseSets" program+  mapM_ (\fragment -> assertBool ("Expected finite-universe set output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") = 1"+    , "sameSingleton = 1"+    , "sameUniverse = 1"+    , "leftSubset = 1"+    , "rightSubset = 1"+    , "normalizedInput = 1"+    ]++-- | Check that set descriptors remain agnostic to element width by compiling+-- and executing insert and membership over 673-bit elements.+wideSymbolicSets :: Assertion+wideSymbolicSets = withSystemTempDirectory "sbv-wide-symbolic-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 13]+        values  <- cgInput "values"  :: SBVCodeGen (SSet (WordN 673))+        element <- cgInput "element" :: SBVCodeGen (SWord 673)+        let updated = SS.insert element values+        cgOutput "contains" (element `SS.member` updated)+        cgReturn updated++  stdoutText <- compileProgramAndRunGenerated dir "wideSymbolicSets" program+  headerText <- readFile (dir </> "wideSymbolicSets.h")+  assertBool ("Expected arbitrary-width set membership to hold, received:\n" ++ stdoutText)+             ("contains = 1" `isInfixOf` stdoutText)+  assertBool "Expected an arbitrary-width typed set descriptor"+             ("struct SBVSet_u673 { const SWord673 *data; size_t length; bool is_complement; };" `isInfixOf` headerText)++-- | Exercise character elements through the shared scalar text representation+-- without requiring string ownership inside the set descriptor.+characterSets :: Assertion+characterSets = withSystemTempDirectory "sbv-character-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [64, 70]+        values    <- cgInput "values"    :: SBVCodeGen (SSet Char)+        character <- cgInput "character" :: SBVCodeGen SChar+        let updated = SS.insert character values+        cgOutput "contains" (character `SS.member` updated)+        cgReturn updated++  stdoutText <- compileProgramAndRunGenerated dir "characterSets" program+  headerText <- readFile (dir </> "characterSets.h")+  assertBool ("Expected character-set membership to hold, received:\n" ++ stdoutText)+             ("contains = 1" `isInfixOf` stdoutText)+  assertBool "Expected a typed character set descriptor"+             ("struct SBVSet_char { const SChar *data; size_t length; bool is_complement; };" `isInfixOf` headerText)++-- | Check that arbitrary floating-point set elements retain their raw+-- interchange representation and use LibBF-backed object equality.+arbitraryFloatSets :: Assertion+arbitraryFloatSets = do+  (_, _, bundle) <- compileToC' "arbitraryFloatSets" $ do+    cgSetDriverValues [1]+    values <- cgInput "values" :: SBVCodeGen (SSet (FloatingPoint 7 19))+    cgOutput "sameObject" (values .=== values)+    cgReturn values+  let generated = show bundle+  assertBool "Expected a typed arbitrary-float set descriptor"+             ("struct SBVSet_fp_e7_s19 { const SFP7_19 *data; size_t length; bool is_complement; };" `isInfixOf` generated)+  assertBool "Expected arbitrary-float set equality to use object equality"+             ("sbv_fp_e7_s19_obj_eq(left, right)" `isInfixOf` generated)++-- | Check that native floating-point set operations treat NaNs as identical+-- objects while distinguishing positive and negative zero.+nativeFloatSets :: Assertion+nativeFloatSets = withSystemTempDirectory "sbv-native-float-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x7fc00000, 0x00000000, 0x80000000]+        nanBits      <- cgInput "nanBits"      :: SBVCodeGen SWord32+        positiveBits <- cgInput "positiveBits" :: SBVCodeGen SWord32+        negativeBits <- cgInput "negativeBits" :: SBVCodeGen SWord32+        let nanValue      = sWord32AsSFloat nanBits+            positiveValue = sWord32AsSFloat positiveBits+            negativeValue = sWord32AsSFloat negativeBits+            nanSet        = SS.singleton nanValue+            positiveSet   = SS.singleton positiveValue+            negativeSet   = SS.singleton negativeValue+        cgOutput "nanMember" (nanValue `SS.member` nanSet)+        cgOutput "zeroObjectsDiffer" (positiveSet ./== negativeSet)+        cgReturn (SS.union nanSet positiveSet)++  stdoutText <- compileProgramAndRunGenerated dir "nativeFloatSets" program+  assertBool ("Expected native floating-point set object equality, received:\n" ++ stdoutText)+             ("nanMember = 1" `isInfixOf` stdoutText && "zeroObjectsDiffer = 1" `isInfixOf` stdoutText)++-- | Exercise sets after explicitly selecting the historical native mappings+-- for unbounded integers and reals.+mappedNumericSets :: Assertion+mappedNumericSets = withSystemTempDirectory "sbv-mapped-numeric-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 64+        cgSRealType CgDouble+        cgSetDriverValues [8, 10]+        integers <- cgInput "integers" :: SBVCodeGen (SSet Integer)+        reals    <- cgInput "reals"    :: SBVCodeGen (SSet AlgReal)+        cgOutput "integerMember" (8 `SS.member` integers)+        cgOutput "realSameObject" (reals .=== reals)+        cgReturn integers++  stdoutText <- compileProgramAndRunGenerated dir "mappedNumericSets" program+  mapM_ (\fragment -> assertBool ("Expected mapped-numeric set output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "integerMember = 1"+    , "realSameObject = 1"+    , "{8LL, 9LL, 10LL}"+    ]++-- | Exercise guarded set declarations and independent owned returns from+-- multiple generated library translation units.+ownedSetLibrary :: Assertion+ownedSetLibrary = withSystemTempDirectory "sbv-owned-set-library" $ \dir -> do+  let component element seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        values <- cgInput "values" :: SBVCodeGen (SSet Word16)+        cgReturn (SS.insert element values)++  (_, cfg, bundle) <- compileToCLib' "ownedSetLibrary"+    [ ("firstSet",  component 40 4)+    , ("secondSet", component 50 6)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "ownedSetLibrary"+  assertBool ("Expected both owned set results, received:\n" ++ stdoutText)+             ("{0x0004U, 0x0005U, 0x0006U, 0x0028U}" `isInfixOf` stdoutText+           && "{0x0006U, 0x0007U, 0x0008U, 0x0032U}" `isInfixOf` stdoutText)++-- | Exercise exact-value normalization and comparison, finite/cofinite set+-- algebra, and deep-cloned exact set results across the generated C ABI.+exactGMPSets :: Assertion+exactGMPSets = withSystemTempDirectory "sbv-exact-gmp-sets" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 12, 11, 20, 30]+        left      <- cgInput "left"      :: SBVCodeGen (SSet Integer)+        right     <- cgInput "right"     :: SBVCodeGen (SSet Integer)+        cofinite  <- cgInput "cofinite"  :: SBVCodeGen (SSet Integer)+        reals     <- cgInput "reals"     :: SBVCodeGen (SSet AlgReal)+        rationals <- cgInput "rationals" :: SBVCodeGen (SSet Rational)+        let unioned        = SS.union left right+            inserted       = SS.insert 13 left+            intersected    = SS.intersection left right+            mixedUnion     = SS.union left cofinite+            realResult     = SS.insert 23 reals+            rationalResult = SS.delete 31 rationals+        cgOutput "sameIntegers"   (left .== SS.fromList [10, 11, 12])+        cgOutput "member"         (13 `SS.member` unioned)+        cgOutput "inserted"       inserted+        cgOutput "intersected"    intersected+        cgOutput "mixedUnion"     mixedUnion+        cgOutput "realMember"     (21 `SS.member` reals)+        cgOutput "rationalMember" (31 `SS.member` rationals)+        cgOutput "realResult"     realResult+        cgOutput "rationalResult" rationalResult+        cgReturn unioned++  stdoutText <- compileProgramAndRunGenerated dir "exactGMPSets" program+  headerText <- readFile (dir </> "exactGMPSets.h")+  mapM_ (\fragment -> assertBool ("Expected exact-set output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") ={10, 11, 12, 13, 14}"+    , "sameIntegers = 1"+    , "member = 1"+    , "inserted ={10, 11, 12, 13}"+    , "intersected ={12}"+    , "mixedUnion =U - {13}"+    , "realMember = 1"+    , "rationalMember = 1"+    , "realResult ={20, 21, 22, 23}"+    , "rationalResult ={30, 32}"+    ]+  assertBool "Expected exact set ownership to clone and clear individual GMP elements"+             ("mpz_init_set(element, value.data[i]);" `isInfixOf` headerText+           && "mpz_clear(element); free(element);" `isInfixOf` headerText+           && "mpq_set(element, value.data[i]);" `isInfixOf` headerText+           && "mpq_clear(element); free(element);" `isInfixOf` headerText)++-- | Exercise exact symbolic-rational construction, decomposition, arithmetic,+-- comparison, arbitrary-width conversion, and caller-owned results.+exactSymbolicRationals :: Assertion+exactSymbolicRationals = withSystemTempDirectory "sbv-exact-symbolic-rationals" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2, 5, 3, 7, 1]+        input    <- cgInput "input"       :: SBVCodeGen SRational+        top      <- cgInput "numerator"   :: SBVCodeGen SInteger+        bot      <- cgInput "denominator" :: SBVCodeGen SInteger+        wide     <- cgInput "wide"        :: SBVCodeGen (SWord 673)+        selector <- cgInput "selector"    :: SBVCodeGen SWord8+        let constructed = top .% bot+            summed      = input + constructed+            multiplied  = input * constructed+            divided     = constructed / input+            converted   = sFromIntegral wide :: SRational+            paired      = tuple (constructed, summed)+            wrapped     = sCGOne constructed :: SCodeGenADT Rational+            rationalMap = writeArray (constArray input :: SArray Word8 Rational) 1 constructed+            stored      = readArray rationalMap 1+            keyed       = readArray (writeArray (constArray (9 :: SWord8) :: SArray Rational Word8) constructed 7) constructed+            fiveThirds  = 5 / 3 :: SRational+            selected    = select [constructed, summed] input selector+        cgOutput "constructed" constructed+        cgOutput "summed"      summed+        cgOutput "multiplied"  multiplied+        cgOutput "divided"     divided+        cgOutput "ordered"     (constructed .< summed)+        cgOutput "converted"   converted+        cgOutput "paired"      paired+        cgOutput "wrapped"     wrapped+        cgOutput "stored"      stored+        cgOutput "rationalMap" rationalMap+        cgOutput "keyed"       keyed+        cgOutput "sameValue"   (constructed .== fiveThirds)+        cgOutput "wrappedSame" (wrapped .== wrapped)+        cgOutput "selected"    selected+        cgReturn summed++  stdoutText <- compileProgramAndRunGenerated dir "exactSymbolicRationals" program+  headerText <- readFile (dir </> "exactSymbolicRationals.h")+  mapM_ (\fragment -> assertBool ("Expected exact-rational output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =11/3"+    , "constructed =5/3"+    , "summed =11/3"+    , "multiplied =10/3"+    , "divided =5/6"+    , "ordered = 1"+    , "converted =7"+    , "paired =(5/3, 11/3)"+    , "wrapped =CGOne(5/3)"+    , "stored =5/3"+    , "rationalMap[0] =2"+    , "keyed = 7"+    , "sameValue = 1"+    , "wrappedSame = 1"+    , "selected =11/3"+    ]+  assertBool "Expected a public exact-rational input type"+             ("typedef mpq_srcptr SRational;" `isInfixOf` headerText)+  assertBool "Expected caller-owned exact-rational output and return parameters"+             ("mpq_ptr constructed" `isInfixOf` headerText && "mpq_ptr sbv_result" `isInfixOf` headerText)++-- | Exercise exact rationals when their symbolic numerator and denominator+-- operations use an explicitly selected bounded SInteger representation.+mappedIntegerRationals :: Assertion+mappedIntegerRationals = withSystemTempDirectory "sbv-mapped-integer-rationals" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 16+        cgSetDriverValues [2, 5, 3]+        input <- cgInput "input"       :: SBVCodeGen SRational+        top   <- cgInput "numerator"   :: SBVCodeGen SInteger+        bot   <- cgInput "denominator" :: SBVCodeGen SInteger+        let constructed = top .% bot+        cgOutput "constructed" constructed+        cgOutput "converted"   (sFromIntegral top :: SRational)+        cgOutput "asReal"      (sRationalToSReal constructed)+        cgReturn (input + constructed)++  stdoutText <- compileProgramAndRunGenerated dir "mappedIntegerRationals" program+  mapM_ (\fragment -> assertBool ("Expected mapped-integer rational output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =11/3"+    , "constructed =5/3"+    , "converted =5"+    , "asReal =5/3"+    ]++-- | Exercise mapped integer divisibility for an ordinary divisor, the+-- absolute value of the minimum signed integer, and an unrepresentable+-- divisor whose only representable multiple is zero.+mappedIntegerDivisibility :: Assertion+mappedIntegerDivisibility = withSystemTempDirectory "sbv-mapped-integer-divisibility" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 8+        cgSetDriverValues [-126, -128, 0, 127]+        multiple  <- cgInput "multiple" :: SBVCodeGen SInteger+        minValue  <- cgInput "minimum"  :: SBVCodeGen SInteger+        zeroValue <- cgInput "zero"     :: SBVCodeGen SInteger+        maxValue  <- cgInput "maximum"  :: SBVCodeGen SInteger+        cgReturn $ sDivides 3 multiple+               .&& sDivides 128 minValue+               .&& sDivides 129 zeroValue+               .&& sNot (sDivides 128 multiple)+               .&& sNot (sDivides 129 maxValue)++  stdoutText <- compileProgramAndRunGenerated dir "mappedIntegerDivisibility" program+  assertBool ("Expected mapped integer divisibility to succeed, received:\n" ++ stdoutText)+             (") = 1" `isInfixOf` stdoutText)++-- | Exercise every supported mapped-real transcendental operation across+-- the @float@, @double@, and @long double@ C representations.+mappedRealNonLinearOperations :: Assertion+mappedRealNonLinearOperations = withSystemTempDirectory "sbv-mapped-real-non-linear" $ \dir -> do+  let program realType = do+        cgOverwriteFiles True+        cgSRealType realType+        cgSetDriverValues [0, 1, 2, 3, 4]+        zeroValue  <- cgInput "zero"  :: SBVCodeGen SReal+        oneValue   <- cgInput "one"   :: SBVCodeGen SReal+        twoValue   <- cgInput "two"   :: SBVCodeGen SReal+        threeValue <- cgInput "three" :: SBVCodeGen SReal+        fourValue  <- cgInput "four"  :: SBVCodeGen SReal+        cgReturn $ sin zeroValue  .== 0+               .&& cos zeroValue  .== 1+               .&& tan zeroValue  .== 0+               .&& asin zeroValue .== 0+               .&& acos oneValue  .== 0+               .&& atan zeroValue .== 0+               .&& sqrt fourValue .== 2+               .&& sinh zeroValue .== 0+               .&& cosh zeroValue .== 1+               .&& tanh zeroValue .== 0+               .&& exp zeroValue  .== 1+               .&& log oneValue   .== 0+               .&& twoValue ** threeValue .== 8++      mappings = [("float", CgFloat), ("double", CgDouble), ("longDouble", CgLongDouble)]++      runMapping (suffix, realType) = do+        let executableName = "mappedRealNonLinear" ++ suffix+        stdoutText <- compileProgramAndRunGenerated dir executableName (program realType)+        assertBool ("Expected " ++ suffix ++ " non-linear operations to succeed, received:\n" ++ stdoutText)+                   (") = 1" `isInfixOf` stdoutText)++  mapM_ runMapping mappings++-- | Exercise mapped integer exponentiation with modular overflow, negative+-- exponents, signed units, and the @0 ** 0@ boundary.+mappedIntegerExponentiation :: Assertion+mappedIntegerExponentiation = withSystemTempDirectory "sbv-mapped-integer-exponentiation" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgIntegerSize 8+        cgSetDriverValues [3, 5, -1, -3, 2, 0, 0]+        base             <- cgInput "base"             :: SBVCodeGen SInteger+        exponentValue    <- cgInput "exponent"         :: SBVCodeGen SInteger+        negativeUnit     <- cgInput "negativeUnit"     :: SBVCodeGen SInteger+        negativeExponent <- cgInput "negativeExponent" :: SBVCodeGen SInteger+        positiveBase     <- cgInput "positiveBase"     :: SBVCodeGen SInteger+        zeroBase         <- cgInput "zeroBase"         :: SBVCodeGen SInteger+        zeroExponent     <- cgInput "zeroExponent"     :: SBVCodeGen SInteger+        cgReturn $ base         .** exponentValue            .== -13+               .&& negativeUnit .** negativeExponent         .== -1+               .&& negativeUnit .** (negativeExponent + 1)   .== 1+               .&& positiveBase .** negativeExponent         .== 0+               .&& zeroBase     .** zeroExponent             .== 1++  stdoutText <- compileProgramAndRunGenerated dir "mappedIntegerExponentiation" program+  assertBool ("Expected mapped integer exponentiation to succeed, received:\n" ++ stdoutText)+             (") = 1" `isInfixOf` stdoutText)++-- | Check fixed-width integer arithmetic against independently reduced+-- mathematical results. Include signed overflow, Euclidean versus truncating+-- division, negative divisors, and the totalized public zero-divisor cases.+mappedIntegerArithmetic :: Assertion+mappedIntegerArithmetic = mapM_ check [8, 16, 32, 64]+ where check bits = withSystemTempDirectory "sbv-mapped-integer-arithmetic" $ \dir -> do+         let half = 2 ^ (bits - 1)+             low  = negate half+             high = half - 1+             oversized = 2 ^ (137 :: Int) + 3+             wrap value = (value + half) `mod` (2 * half) - half+             operands = [(high, 1), (low, -1), (low, 3), (-7, 3), (-7, -3), (7, -3)+                        , (low, low), (-1, low), (high, low), (low, 0), (0, 0), (high, high), (high, 2)]+             program = do+               cgOverwriteFiles True+               cgIntegerSize bits+               cgSetDriverValues (concatMap (\(a, b) -> [a, b]) operands ++ [oversized])+               checks <- forM (zip [0 :: Int ..] operands) $ \(index, (a, b)) -> do+                 left  <- cgInput ("left"  ++ show index) :: SBVCodeGen SInteger+                 right <- cgInput ("right" ++ show index) :: SBVCodeGen SInteger+                 let agrees actual expected = actual .== literal (wrap expected)+                     (quotient, remainder) = if b == 0 then (0, a) else quotRem a b+                     (division, modulus)   = if b == 0 then (0, a) else divMod a b+                     euclidean+                       | b == 0 = []  -- The internal Euclidean operators leave this case unconstrained.+                       | True   = [ agrees (sEDiv left right) ((a `div` abs b) * signum b)+                                  , agrees (sEMod left right) (a `mod` abs b)+                                  ]+                 pure $ sAnd $ euclidean +++                   [ agrees (left + right) (a + b)+                   , agrees (left - right) (a - b)+                   , agrees (left * right) (a * b)+                   , agrees (negate left)  (negate a)+                   , agrees (abs left)     (abs a)+                   , agrees (left + literal oversized) (a + oversized)+                   , agrees (sQuot left right) quotient+                   , agrees (sRem  left right) remainder+                   , agrees (sDiv  left right) division+                   , agrees (sMod  left right) modulus+                   ]+               oversizedInput <- cgInput "oversized" :: SBVCodeGen SInteger+               cgReturn (sAnd checks .&& oversizedInput .== literal (wrap oversized))+         outputText <- compileProgramAndRunGenerated dir "mappedArithmetic" program+         assertBool ("Incorrect " ++ show bits ++ "-bit arithmetic: " ++ outputText) (") = 1" `isInfixOf` outputText)++-- | Check that transcendental operations over exact rational reals explain+-- how to opt into an approximate native C representation.+exactRealNonLinearDiagnostic :: Assertion+exactRealNonLinearDiagnostic = do+  result <- try (do+    (_, _, bundle) <- compileToC' "exactRealNonLinear" $ do+      value <- cgInput "value" :: SBVCodeGen SReal+      cgReturn (sin value)+    evaluate (length (show bundle))) :: IO (Either ErrorCall Int)+  case result of+    Left exception -> assertBool ("Expected an exact-real non-linear diagnostic, received:\n" ++ displayException exception)+                                 ("cannot represent sin" `isInfixOf` displayException exception+                               && "cgSRealType" `isInfixOf` displayException exception)+    Right _        -> assertBool "Expected C generation to reject non-linear exact real arithmetic" False++-- | Exercise guarded rational declarations and caller-owned rational returns+-- across multiple generated library translation units.+exactRationalLibrary :: Assertion+exactRationalLibrary = withSystemTempDirectory "sbv-exact-rational-library" $ \dir -> do+  let component increment = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        value <- cgInput "value" :: SBVCodeGen SRational+        cgReturn (value + literal increment)++  (_, cfg, bundle) <- compileToCLib' "exactRationalLibrary"+    [ ("addOneRational", component 1)+    , ("addTwoRational", component 2)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "exactRationalLibrary"+  assertBool ("Expected both exact-rational library results, received:\n" ++ stdoutText)+             (") =2" `isInfixOf` stdoutText && ") =3" `isInfixOf` stdoutText)++-- | Check that ABI kinds and scalar operations contribute the exact external+-- runtime dependencies needed by their generated C bundles. The documented+-- RNE precondition must not introduce hardware-mode guards or LibBF fallbacks.+dependencyRequirements :: Assertion+dependencyRequirements = do+  (_, _, wideBundle) <- compileToC' "requirementsWide" $ do+    value <- cgInput "value" :: SBVCodeGen (SWord 673)+    cgReturn value++  (_, _, fpBundle) <- compileToC' "requirementsFP" $ do+    value <- cgInput "value" :: SBVCodeGen (SFloatingPoint 7 19)+    cgReturn value++  (_, _, integerBundle) <- compileToC' "requirementsInteger" $ do+    value <- cgInput "value" :: SBVCodeGen SInteger+    cgReturn value++  (_, _, rationalBundle) <- compileToC' "requirementsRational" $ do+    value <- cgInput "value" :: SBVCodeGen SRational+    cgReturn value++  (_, _, nativeFloatBundle) <- compileToC' "requirementsNativeFloat" $ do+    value <- cgInput "value" :: SBVCodeGen SFloat+    cgReturn (fpSqrt sRoundNearestTiesToEven value)++  (_, _, roundedNativeFloatBundle) <- compileToC' "requirementsRoundedNativeFloat" $ do+    value <- cgInput "value" :: SBVCodeGen SFloat+    cgReturn (fpSqrt sRoundNearestTiesToAway value)++  (_, _, nativeLibraryBundle) <- compileToCLib' "requirementsNativeLibrary"+    [("addOne", do value <- cgInput "value" :: SBVCodeGen SFloat+                   cgReturn (fpAdd sRNE value 1))]++  assertEqual "wide bit-vectors should not add an external library" [[]]              (linkerFlags wideBundle)+  assertEqual "arbitrary floats should request LibBF and libm"       [["-lbf", "-lm"]] (linkerFlags fpBundle)+  assertEqual "exact integers should request GMP"                    [["-lgmp"]]        (linkerFlags integerBundle)+  assertEqual "exact rationals should request GMP"                   [["-lgmp"]]        (linkerFlags rationalBundle)+  assertEqual "native floating-point sqrt should request libm"       [["-lm"]]          (linkerFlags nativeFloatBundle)+  assertEqual "explicit native rounding should request LibBF and libm" [["-lbf", "-lm"]] (linkerFlags roundedNativeFloatBundle)+  assertEqual "native RNE arithmetic should not add an external library" [[]] (linkerFlags nativeLibraryBundle)+  let checkConvention bundle = do+        let rendered = show bundle+        assertBool "Generated header must document the RNE calling convention"+                   ("Enter generated code in FE_TONEAREST" `isInfixOf` rendered)+        assertBool "The RNE precondition must not add runtime mode checks or changes"+                   (not (any (`isInfixOf` rendered) ["fegetround(", "fesetround("]))+  mapM_ checkConvention [nativeFloatBundle, nativeLibraryBundle]++-- | Exercise symbolic constant initialization, immutable writes, reads, and+-- an array-valued conditional without exposing arrays at the public C ABI.+persistentArrays :: Assertion+persistentArrays = withSystemTempDirectory "sbv-persistent-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [11, 22, 7, 99, 1]+        firstKey     <- cgInput "firstKey"     :: SBVCodeGen SWord8+        secondKey    <- cgInput "secondKey"    :: SBVCodeGen SWord8+        defaultValue <- cgInput "defaultValue" :: SBVCodeGen SWord32+        storedValue  <- cgInput "storedValue"  :: SBVCodeGen SWord32+        chooseNewest <- cgInput "chooseNewest" :: SBVCodeGen SBool+        let base       = constArray defaultValue+            firstWrite = writeArray base firstKey storedValue+            newest     = writeArray firstWrite secondKey (storedValue + 1)+            selected   = ite chooseNewest newest firstWrite+            literalMap = listArray [(11, 42), (11, 43)] 44 :: SArray Word8 Word32+        cgOutput "baseStillDefault" (readArray base firstKey)+        cgOutput "oldVersionDefault" (readArray firstWrite secondKey)+        cgOutput "literalMapValue" (readArray literalMap firstKey)+        cgReturn (readArray selected secondKey)++  stdoutText <- compileProgramAndRunGenerated dir "persistentArrays" program+  mapM_ (\fragment -> assertBool ("Expected generated output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000064UL"+    , "baseStillDefault = 0x00000007UL"+    , "oldVersionDefault = 0x00000007UL"+    , "literalMapValue = 0x0000002aUL"+    ]++-- | Exercise array-valued initialization, immutable writes, and reads without+-- exposing a call-scoped inner array through the generated C ABI.+nestedPersistentArrays :: Assertion+nestedPersistentArrays = withSystemTempDirectory "sbv-nested-persistent-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5, 17, 7, 29, 2, 2, 1]+        firstDefault  <- cgInput "firstDefault"  :: SBVCodeGen SWord32+        firstStored   <- cgInput "firstStored"   :: SBVCodeGen SWord32+        secondDefault <- cgInput "secondDefault" :: SBVCodeGen SWord32+        secondStored  <- cgInput "secondStored"  :: SBVCodeGen SWord32+        outerStoreKey <- cgInput "outerStoreKey" :: SBVCodeGen SWord16+        outerReadKey  <- cgInput "outerReadKey"  :: SBVCodeGen SWord16+        innerReadKey  <- cgInput "innerReadKey"  :: SBVCodeGen SWord8+        let firstInner  = writeArray (constArray firstDefault :: SArray Word8 Word32) 1 firstStored+            secondInner = writeArray (constArray secondDefault :: SArray Word8 Word32) 1 secondStored+            outerBase   = constArray firstInner :: SArray Word16 (ArrayModel Word8 Word32)+            outer       = writeArray outerBase outerStoreKey secondInner+            selected    = readArray outer outerReadKey+            original    = readArray outer (outerReadKey + 1)+        cgOutput "selected" (readArray selected innerReadKey)+        cgReturn (readArray original innerReadKey)++  stdoutText <- compileProgramAndRunGenerated dir "nestedPersistentArrays" program+  sourceText <- readFile (dir </> "nestedPersistentArrays.c")+  mapM_ (\fragment -> assertBool ("Expected nested-array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000011UL"+    , "selected = 0x0000001dUL"+    ]+  assertBool ("Expected nested array values to use retained temporary descriptors, received:\n" ++ sourceText)+             (    "sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+              && "sbv_array_ctx_end(&sbv_local_array_ctx)" `isInfixOf` sourceText+              && "sbv_local_array_descriptor_" `isInfixOf` sourceText+             )++-- | Exercise retained array descriptors in tuple construction and projection.+tupleStoredArrays :: Assertion+tupleStoredArrays = withSystemTempDirectory "sbv-tuple-stored-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5, 17, 1]+        defaultValue <- cgInput "defaultValue" :: SBVCodeGen SWord32+        storedValue  <- cgInput "storedValue"  :: SBVCodeGen SWord32+        key          <- cgInput "key"          :: SBVCodeGen SWord8+        let source                  = writeArray (constArray defaultValue :: SArray Word8 Word32) 1 storedValue+            pair                    = tuple (source, key) :: SBV (ArrayModel Word8 Word32, Word8)+            (restored, restoredKey) = untuple pair+        cgOutput "restoredKey" restoredKey+        cgOutput "pair" pair+        cgReturn (readArray restored key)++  stdoutText <- compileProgramAndRunGenerated dir "tupleStoredArrays" program+  sourceText <- readFile (dir </> "tupleStoredArrays.c")+  mapM_ (\fragment -> assertBool ("Expected tuple-stored array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000011UL"+    , "restoredKey = 1"+    , "pair =([0] =0x00000005UL, 1)"+    ]+  assertBool ("Expected tuple construction and projection to bridge retained arrays, received:\n" ++ sourceText)+             (    ".field1 = sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+              && "sbv_local_array_descriptor_" `isInfixOf` sourceText+             )++-- | Exercise retained array descriptors in ADT construction and projection.+adtStoredArrays :: Assertion+adtStoredArrays = withSystemTempDirectory "sbv-adt-stored-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5, 17, 1]+        defaultValue <- cgInput "defaultValue" :: SBVCodeGen SWord32+        storedValue  <- cgInput "storedValue"  :: SBVCodeGen SWord32+        key          <- cgInput "key"          :: SBVCodeGen SWord8+        let source = writeArray (constArray defaultValue :: SArray Word8 Word32) 1 storedValue+            boxed  = sCGArrayBox source key+        cgOutput "boxedKey" (getCGArrayBox_2 boxed)+        cgOutput "boxed" boxed+        cgReturn (readArray (getCGArrayBox_1 boxed) key)++  stdoutText <- compileProgramAndRunGenerated dir "adtStoredArrays" program+  sourceText <- readFile (dir </> "adtStoredArrays.c")+  mapM_ (\fragment -> assertBool ("Expected ADT-stored array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000011UL"+    , "boxedKey = 1"+    , "boxed =CGArrayBox([0] =0x00000005UL, 1)"+    ]+  assertBool ("Expected ADT construction and projection to bridge retained arrays, received:\n" ++ sourceText)+             (    ".field1 = sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+              && "sbv_local_array_descriptor_" `isInfixOf` sourceText+             )++-- | Exercise retained array descriptors in list construction, indexing, and+-- owned list outputs.+listStoredArrays :: Assertion+listStoredArrays = withSystemTempDirectory "sbv-list-stored-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5, 17, 1]+        defaultValue <- cgInput "defaultValue" :: SBVCodeGen SWord32+        storedValue  <- cgInput "storedValue"  :: SBVCodeGen SWord32+        key          <- cgInput "key"          :: SBVCodeGen SWord8+        let source   = writeArray (constArray defaultValue :: SArray Word8 Word32) 1 storedValue+            arrays   = SL.singleton source :: SList (ArrayModel Word8 Word32)+            restored = SL.elemAt arrays 0+        cgOutput "arrays" arrays+        cgReturn (readArray restored key)++  stdoutText <- compileProgramAndRunGenerated dir "listStoredArrays" program+  sourceText <- readFile (dir </> "listStoredArrays.c")+  mapM_ (\fragment -> assertBool ("Expected list-stored array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000011UL"+    , "arrays =[[0] =0x00000005UL]"+    ]+  assertBool ("Expected list construction and indexing to bridge retained arrays, received:\n" ++ sourceText)+             (    "sbv_list_array_" `isInfixOf` sourceText+              && "sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+              && "sbv_local_array_descriptor_" `isInfixOf` sourceText+             )++-- | Exercise generated-driver initialization and cleanup for array fields in+-- tuple, ADT, and list inputs that share a single per-kind callback family.+aggregateArrayInputs :: Assertion+aggregateArrayInputs = withSystemTempDirectory "sbv-aggregate-array-inputs" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 7, 11]+        tupleInput <- cgInput "tupleInput" :: SBVCodeGen (SBV (ArrayModel Word8 (ArrayModel Word8 Word32), Word8))+        adtInput   <- cgInput "adtInput"   :: SBVCodeGen (SBV CodeGenArrayBox)+        listInput  <- cgInput "listInput"  :: SBVCodeGen (SList (ArrayModel Word8 Word32))+        let (tupleOuterArray, tupleKey) = untuple tupleInput+            tupleInnerArray             = readArray tupleOuterArray tupleKey+            adtArray                    = getCGArrayBox_1 adtInput+            adtKey                      = getCGArrayBox_2 adtInput+            listHeadArray               = SL.head listInput+            tupleValue                  = readArray tupleInnerArray 0+            adtValue                    = readArray adtArray adtKey+            listValue                   = readArray listHeadArray 0+        cgOutput "tupleValue" tupleValue+        cgOutput "adtValue" adtValue+        cgOutput "listValue" listValue+        cgReturn (tupleValue + adtValue + listValue)++  stdoutText <- compileProgramAndRunGenerated dir "aggregateArrayInputs" program+  driverText <- readFile (dir </> "aggregateArrayInputs_driver.c")+  mapM_ (\fragment -> assertBool ("Expected aggregate-array driver output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "= 0x00000015UL"+    , "tupleValue = 0x00000003UL"+    , "adtValue = 0x00000007UL"+    , "listValue = 0x0000000bUL"+    ]+  assertBool ("Expected retained descriptors for all aggregate array inputs, received:\n" ++ driverText)+             (length (filter (isInfixOf "sbv_array_output_retain_2_u8_3_u32") (lines driverText)) >= 5)++-- | Exercise transitive ownership when tuples, lists, and ADTs hide retained+-- arrays behind one or more concrete ADT fields.+transitiveAggregateArrayInputs :: Assertion+transitiveAggregateArrayInputs = withSystemTempDirectory "sbv-transitive-array-inputs" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 7, 11]+        tupleInput    <- cgInput "tupleInput"    :: SBVCodeGen (SBV (CodeGenArrayBox, Word8))+        listInput     <- cgInput "listInput"     :: SBVCodeGen (SList (CodeGenArrayBox, Word8))+        envelopeInput <- cgInput "envelopeInput" :: SBVCodeGen (SBV CodeGenArrayEnvelope)+        let (tupleBox, tupleKey) = untuple tupleInput+            (listBox, listKey)   = untuple (SL.head listInput)+            (envelopeBox, _)     = untuple (getCGArrayEnvelope_1 envelopeInput)+            tupleValue           = readArray (getCGArrayBox_1 tupleBox) tupleKey+            listValue            = readArray (getCGArrayBox_1 listBox) listKey+            envelopeValue        = readArray (getCGArrayBox_1 envelopeBox) 0+        cgOutput "tupleValue" tupleValue+        cgOutput "listValue" listValue+        cgOutput "envelopeValue" envelopeValue+        cgReturn (tupleValue + listValue + envelopeValue)++  stdoutText <- compileProgramAndRunGenerated dir "transitiveAggregateArrayInputs" program+  headerText <- readFile (dir </> "transitiveAggregateArrayInputs.h")+  mapM_ (\fragment -> assertBool ("Expected transitive aggregate-array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "= 0x00000015UL"+    , "tupleValue = 0x00000003UL"+    , "listValue = 0x00000007UL"+    , "envelopeValue = 0x0000000bUL"+    ]+  assertBool ("Expected tuple ownership to cross concrete ADT fields, received:\n" ++ headerText)+             (    "sbv_adt_owned_clone_SBVADT_CodeGenArrayBox(source.field1)" `isInfixOf` headerText+              && "sbv_adt_owned_release_SBVADT_CodeGenArrayBox(&value->field1)" `isInfixOf` headerText+             )++-- | Check that native floating-point array keys use SMT object equality:+-- NaNs match, while positive and negative zero remain distinct.+nativeFloatArrayKeys :: Assertion+nativeFloatArrayKeys = withSystemTempDirectory "sbv-native-float-array-keys" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0x7fc00000, 0x00000000, 0x80000000]+        nanBits      <- cgInput "nanBits"      :: SBVCodeGen SWord32+        positiveBits <- cgInput "positiveBits" :: SBVCodeGen SWord32+        negativeBits <- cgInput "negativeBits" :: SBVCodeGen SWord32+        let nanKey       = sWord32AsSFloat nanBits+            positiveZero = sWord32AsSFloat positiveBits+            negativeZero = sWord32AsSFloat negativeBits+            base         = constArray 3+            withNaN      = writeArray base nanKey 11+            withZero     = writeArray withNaN positiveZero 12+            flags        = [ readArray withZero nanKey .== (11 :: SWord8)+                           , readArray withZero positiveZero .== (12 :: SWord8)+                           , readArray withZero negativeZero .== (3 :: SWord8)+                           ]+        cgReturn (sum (zipWith (\flag weight -> ite flag weight 0) flags [1, 2, 4]) :: SWord8)++  stdoutText <- compileProgramAndRunGenerated dir "nativeFloatArrayKeys" program+  assertBool ("Expected all native array-key checks to pass, received:\n" ++ stdoutText) ("= 7" `isInfixOf` stdoutText)++-- | Exercise array-type merging across generated library translation units,+-- including an owned array returned through the public library ABI.+persistentArrayLibrary :: Assertion+persistentArrayLibrary = withSystemTempDirectory "sbv-persistent-array-library" $ \dir -> do+  let component increment = do+        cgOverwriteFiles True+        cgSetDriverValues [40, 9]+        source <- cgInput "source" :: SBVCodeGen (SArray Word16 Word32)+        key    <- cgInput "key"    :: SBVCodeGen SWord16+        let updated = writeArray source key (readArray source key + increment)+        cgReturn (readArray updated key)++      lambdaComponent = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        key <- cgInput "key" :: SBVCodeGen SWord16+        let source = lambdaArray (\index -> select [sFromIntegral index * 3 + 1, sFromIntegral index * 3 + 2] 0 index :: SWord32)+                     :: SArray Word16 Word32+        cgReturn (readArray source key)++      ownedComponent = do+        cgOverwriteFiles True+        let source = lambdaArray (\index -> sFromIntegral index + 5) :: SArray Word16 Word32+        cgReturn (writeArray source 0 55)++  (_, cfg, bundle) <- compileToCLib' "persistentArrayLibrary"+    [ ("increment",   component 1)+    , ("addTwo",      component 2)+    , ("lambdaValue", lambdaComponent)+    , ("ownedArray",  ownedComponent)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "persistentArrayLibrary"+  mapM_ (\fragment -> assertBool ("Expected generated library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000029UL"+    , "0x0000002aUL"+    , "0x00000005UL"+    , "ownedArray()[0] =0x00000037UL"+    ]++-- | Exercise the borrowed callback descriptor used for a public array input,+-- including local writes that shadow the callback only at matching keys.+callbackArrayInput :: Assertion+callbackArrayInput = withSystemTempDirectory "sbv-callback-array-input" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [40, 9]+        source <- cgInput "source" :: SBVCodeGen (SArray Word8 Word32)+        key    <- cgInput "key"    :: SBVCodeGen SWord8+        let updated = writeArray source key 99+        cgOutput "sourceValue" (readArray source key)+        cgOutput "unshadowedValue" (readArray updated (key + 1))+        cgReturn (readArray updated key)++  stdoutText <- compileProgramAndRunGenerated dir "callbackArrayInput" program+  mapM_ (\fragment -> assertBool ("Expected callback-backed output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000063UL"+    , "sourceValue = 0x00000028UL"+    , "unshadowedValue = 0x00000028UL"+    ]++-- | Exercise a retained lambda DAG together with a persistent write that+-- shadows exactly one value produced by the lambda.+structuredLambdaArray :: Assertion+structuredLambdaArray = withSystemTempDirectory "sbv-structured-lambda-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [9]+        key <- cgInput "key" :: SBVCodeGen SWord16+        let source  = lambdaArray (\index -> sFromIntegral index * 3 + 1) :: SArray Word16 Word32+            updated = writeArray source key 99+        cgOutput "nextValue" (readArray updated (key + 1))+        cgReturn (readArray updated key)++  stdoutText <- compileProgramAndRunGenerated dir "structuredLambdaArray" program+  mapM_ (\fragment -> assertBool ("Expected structured-lambda output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000063UL"+    , "nextValue = 0x0000001fUL"+    ]++-- | Exercise text, list, and set allocation inside retained array callbacks,+-- including an exact list element that shares both the GMP and list arenas.+managedStructuredLambdaArrays :: Assertion+managedStructuredLambdaArrays = withSystemTempDirectory "sbv-managed-structured-lambda-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let textSource = lambdaArray (\index ->+                           ite (index .== 2) (literal "hit") (literal "miss") SL.++ literal "!")+                         :: SArray Word8 String+            listSource = lambdaArray (\index ->+                           SL.singleton (sFromIntegral index :: SInteger) SL.++ literal [100])+                         :: SArray Word8 [Integer]+            setSource = lambdaArray (\index ->+                          SS.insert (sFromIntegral index :: SInteger) (SS.singleton 100))+                        :: SArray Word8 (RCSet Integer)+        cgOutput "textValue" (readArray textSource key)+        cgOutput "listValue" (readArray listSource key)+        cgReturn (readArray setSource key)++  stdoutText <- compileProgramAndRunGenerated dir "managedStructuredLambdaArrays" program+  mapM_ (\fragment -> assertBool ("Expected managed structured-lambda output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                  (fragment `isInfixOf` stdoutText))+    [ ") ={100, 2}"+    , "textValue =hit!"+    , "listValue =[2, 100]"+    ]++-- | Return a retained lambda array whose callback constructs a tuple with+-- fresh text and list storage, then read it after the generated call returns.+escapingManagedLambdaArray :: Assertion+escapingManagedLambdaArray = withSystemTempDirectory "sbv-escaping-managed-lambda-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let source = lambdaArray (\index ->+                       tuple ( literal "item" SL.++ literal "!"+                             , SL.singleton (sFromIntegral index :: SWord16) SL.++ literal [99]+                             ))+                     :: SArray Word8 (String, [Word16])+        cgReturn source++  stdoutText <- compileProgramAndRunGenerated dir "escapingManagedLambdaArray" program+  sourceText <- readFile (dir </> "escapingManagedLambdaArray.c")+  assertBool ("Expected an escaping managed lambda array to retain its callback arenas, received:\n" ++ stdoutText)+             ("[0] =(item!, [0x0000U, 0x0063U])" `isInfixOf` stdoutText)+  assertBool ("Expected the escaping callback to clone managed results into retained storage, received:\n" ++ sourceText)+             ("sbv_function_ctx_retain_empty" `isInfixOf` sourceText+           && "sbv_function_result_clone_" `isInfixOf` sourceText)++-- | Call scalar and managed first-order 'smtFunction' definitions from array+-- lambdas, including a scalar signature whose body uses hidden managed arenas+-- and a managed callback that remains callable after its array escapes.+definedFunctionsInsideArrayLambdas :: Assertion+definedFunctionsInsideArrayLambdas = withSystemTempDirectory "sbv-defined-functions-in-array-lambdas" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [12]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let countDigits :: SWord8 -> SWord8+            countDigits = smtFunction "C lambda digit count" $ \value ->+              sFromIntegral (SL.length (SL.natToStr (sFromIntegral value :: SInteger)))++            decorate :: SString -> SString+            decorate = smtFunction "C lambda text decoration" $ \value ->+              literal "<" SL.++ value SL.++ literal ">"++            numericSource = lambdaArray countDigits :: SArray Word8 Word8+            textSource = lambdaArray (\index ->+                           decorate (ite (index .== 0) (literal "zero") (literal "other")))+                         :: SArray Word8 String+        cgOutput "digits" (readArray numericSource key)+        cgReturn textSource++  stdoutText <- compileProgramAndRunGenerated dir "definedFunctionsInsideArrayLambdas" program+  sourceText <- readFile (dir </> "definedFunctionsInsideArrayLambdas.c")+  mapM_ (\fragment -> assertBool ("Expected a defined-function lambda output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                  (fragment `isInfixOf` stdoutText))+    [ "[0] =<zero>"+    , "digits = 2"+    ]+  assertBool ("Expected array callbacks to forward the function ownership context, received:\n" ++ sourceText)+             ("/* Uninterpreted function */ sbv_function_" `isInfixOf` sourceText+           && "sbv_function_ctx sbv_local_function_ctx" `isInfixOf` sourceText)++-- | Exercise retained arrays that call managed 'smtFunction' definitions in+-- separate translation units of one generated static library.+definedFunctionArrayLambdaLibrary :: Assertion+definedFunctionArrayLambdaLibrary = withSystemTempDirectory "sbv-defined-function-array-lambda-library" $ \dir -> do+  let component :: String -> SBVCodeGen ()+      component prefix = do+        cgOverwriteFiles True+        let decorate :: SString -> SString+            decorate = smtFunction ("C library lambda " ++ prefix) $ \value ->+              literal prefix SL.++ value++            source = lambdaArray (\index ->+                       decorate (SL.natToStr (sFromIntegral index :: SInteger)))+                     :: SArray Word8 String+        cgReturn source++  (_, cfg, bundle) <- compileToCLib' "definedFunctionArrayLambdaLibrary"+    [ ("firstLambda", component "first-")+    , ("secondLambda", component "second-")+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "definedFunctionArrayLambdaLibrary"+  mapM_ (\fragment -> assertBool ("Expected a library function-backed lambda output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                  (fragment `isInfixOf` stdoutText))+    [ "firstLambda()[0] =first-0"+    , "secondLambda()[0] =second-0"+    ]++-- | Return direct and tuple-contained persistent arrays from retained+-- callbacks, read them during the generated call, and read the direct result+-- again after its outer array escapes.+arrayValuedLambdaResults :: Assertion+arrayValuedLambdaResults = withSystemTempDirectory "sbv-array-valued-lambda-results" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let inner :: SWord8 -> SArray Word8 Word32+            inner index = writeArray+                            (constArray (sFromIntegral index + 1 :: SWord32) :: SArray Word8 Word32)+                            index+                            99++            makeInner :: SWord8 -> SArray Word8 Word32+            makeInner = smtFunction "C lambda inner array" inner++            directSource   = lambdaArray inner :: SArray Word8 (ArrayModel Word8 Word32)+            functionSource = lambdaArray makeInner :: SArray Word8 (ArrayModel Word8 Word32)+            boxedSource    = lambdaArray (\index -> tuple (inner index, sFromIntegral index + 10 :: SWord16))+                           :: SArray Word8 (ArrayModel Word8 Word32, Word16)+            directInner   = readArray directSource key+            functionInner = readArray functionSource key+            (boxedInner, marker) = untuple (readArray boxedSource key)+        cgOutput "directStored"  (readArray directInner key)+        cgOutput "directDefault" (readArray directInner (key + 1))+        cgOutput "functionStored" (readArray functionInner key)+        cgOutput "boxedStored"   (readArray boxedInner key)+        cgOutput "marker"        marker+        cgReturn directSource++  stdoutText <- compileProgramAndRunGenerated dir "arrayValuedLambdaResults" program+  sourceText <- readFile (dir </> "arrayValuedLambdaResults.c")+  mapM_ (\fragment -> assertBool ("Expected an array-valued lambda output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                  (fragment `isInfixOf` stdoutText))+    [ ")[0] =[0] =0x00000063UL"+    , "directStored = 0x00000063UL"+    , "directDefault = 0x00000006UL"+    , "functionStored = 0x00000063UL"+    , "boxedStored = 0x00000063UL"+    , "marker = 0x000fU"+    ]+  assertBool ("Expected array callback results to cross through retained descriptors, received:\n" ++ sourceText)+             ("sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+           && "SBVArrayOutput_2_u8_3_u32 * sbv_array_lambda_" `isInfixOf` sourceText)++-- | Exercise array-valued callback results in independent translation units+-- of a generated static library.+arrayValuedLambdaLibrary :: Assertion+arrayValuedLambdaLibrary = withSystemTempDirectory "sbv-array-valued-lambda-library" $ \dir -> do+  let component :: Word32 -> SBVCodeGen ()+      component value = do+        cgOverwriteFiles True+        let source = lambdaArray (\index ->+                       writeArray (constArray (literal value) :: SArray Word8 Word32) index (literal value + 1))+                     :: SArray Word8 (ArrayModel Word8 Word32)+        cgReturn source++  (_, cfg, bundle) <- compileToCLib' "arrayValuedLambdaLibrary"+    [ ("firstNestedArray", component 20)+    , ("secondNestedArray", component 30)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "arrayValuedLambdaLibrary"+  mapM_ (\fragment -> assertBool ("Expected a library array-valued lambda output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                  (fragment `isInfixOf` stdoutText))+    [ "firstNestedArray()[0] =[0] =0x00000015UL"+    , "secondNestedArray()[0] =[0] =0x0000001fUL"+    ]++-- | Lambda-lift closed array callbacks from a defined function and from an+-- outer array callback whose result is itself a selected callback array.+nestedStructuredArrayLambdas :: Assertion+nestedStructuredArrayLambdas = withSystemTempDirectory "sbv-nested-structured-array-lambdas" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 5, 1]+        chooseFirst <- cgInput "chooseFirst" :: SBVCodeGen SBool+        key         <- cgInput "key"         :: SBVCodeGen SWord8+        outerKey    <- cgInput "outerKey"    :: SBVCodeGen SWord8+        let choose :: SBool -> SArray Word8 Word16+            choose = smtFunction "C nested lambda choice" $ \condition ->+                       ite condition+                           (lambdaArray (\index -> sFromIntegral index + 10))+                           (lambdaArray (\index -> sFromIntegral index + 20))++            recursiveChoose :: SWord8 -> SArray Word8 Word16+            recursiveChoose = smtFunctionNoTermination "C recursive nested lambda choice" $ \count ->+                                ite (count .== 0)+                                    (lambdaArray (\index -> sFromIntegral index + 60))+                                    (recursiveChoose (count - 1))++            nested = lambdaArray (\outer ->+                       ite (outer .== 0)+                           (lambdaArray (\index -> sFromIntegral index + 30))+                           (lambdaArray (\index -> sFromIntegral index + 40)))+                     :: SArray Word8 (ArrayModel Word8 Word16)++            deep = lambdaArray (\_ ->+                     lambdaArray (\_ ->+                       lambdaArray (\index -> sFromIntegral index + 50)))+                   :: SArray Word8 (ArrayModel Word8 (ArrayModel Word8 Word16))++            chosen      = choose chooseFirst+            selected    = readArray chosen key+            nestedInner = readArray nested outerKey+            deepMiddle  = readArray deep outerKey+            deepInner   = readArray deepMiddle outerKey+            recursive   = recursiveChoose outerKey++        cgOutput "selected"       selected+        cgOutput "nestedSelected" (readArray nestedInner key)+        cgOutput "deepSelected"   (readArray deepInner key)+        cgOutput "recursive"      (readArray recursive key)+        cgReturn chosen++  stdoutText <- compileProgramAndRunGenerated dir "nestedStructuredArrayLambdas" program+  sourceText <- readFile (dir </> "nestedStructuredArrayLambdas.c")+  mapM_ (\fragment -> assertBool ("Expected nested structured-lambda output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ")[0] =0x000aU"+    , "selected = 0x000fU"+    , "nestedSelected = 0x002dU"+    , "deepSelected = 0x0037U"+    , "recursive = 0x0041U"+    ]+  assertBool ("Expected nested callbacks to receive lexical-scope-qualified names, received:\n" ++ sourceText)+             ("_nested_l" `isInfixOf` sourceText)++-- | Exercise lambda-lifted callbacks from private defined functions in+-- independent translation units of a generated static library.+nestedStructuredArrayLambdaLibrary :: Assertion+nestedStructuredArrayLambdaLibrary = withSystemTempDirectory "sbv-nested-structured-array-lambda-library" $ \dir -> do+  let component :: Word16 -> SBVCodeGen ()+      component offset = do+        cgOverwriteFiles True+        let choose :: SBool -> SArray Word8 Word16+            choose = smtFunction "C library nested lambda" $ \condition ->+                       ite condition+                           (lambdaArray (\index -> sFromIntegral index + literal offset))+                           (lambdaArray (\index -> sFromIntegral index + literal offset + 100))+        cgReturn (choose (literal True))++  (_, cfg, bundle) <- compileToCLib' "nestedStructuredArrayLambdaLibrary"+    [ ("firstNestedLambda", component 10)+    , ("secondNestedLambda", component 20)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "nestedStructuredArrayLambdaLibrary"+  mapM_ (\fragment -> assertBool ("Expected nested structured-lambda library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "firstNestedLambda()[0] =0x000aU"+    , "secondNestedLambda()[0] =0x0014U"+    ]++-- | Exercise parameter-dependent tables in two structured lambdas, ensuring+-- their independently numbered local table declarations do not collide.+structuredLambdaTables :: Assertion+structuredLambdaTables = withSystemTempDirectory "sbv-structured-lambda-tables" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        key <- cgInput "key" :: SBVCodeGen SWord8+        let first  = lambdaArray (\index -> select [sFromIntegral index + 10, sFromIntegral index + 20] 99 index :: SWord32)+                     :: SArray Word8 Word32+            second = lambdaArray (\index -> select [sFromIntegral index * 2, sFromIntegral index * 3] 77 index :: SWord32)+                     :: SArray Word8 Word32+        cgOutput "firstValue" (readArray first key)+        cgReturn (readArray second key)++  stdoutText <- compileProgramAndRunGenerated dir "structuredLambdaTables" program+  mapM_ (\fragment -> assertBool ("Expected structured-lambda table output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "0x00000003UL"+    , "firstValue = 0x00000015UL"+    ]++-- | Exercise structured lowering of a multi-argument 'smtFunction', including+-- collision-free C encoding of a quoted SMT identifier.+definedSBVFunction :: Assertion+definedSBVFunction = withSystemTempDirectory "sbv-defined-function" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 4, 5]+        left  <- cgInput "left"  :: SBVCodeGen SWord32+        right <- cgInput "right" :: SBVCodeGen SWord32+        wide  <- cgInput "wide"  :: SBVCodeGen (SWord 673)+        let combine  = smtFunction "defined function/@1" $ \x y -> ite (x .< y) (x + y) (x * y)+            increment = smtFunction "wide defined function" (+ 1)+        cgOutput "wideResult" (increment wide)+        cgReturn (combine left right)++  stdoutText <- compileProgramAndRunGenerated dir "definedSBVFunction" program+  sourceText <- readFile (dir </> "definedSBVFunction.c")+  assertBool ("Expected defined-function output to contain 0x00000007UL, received:\n" ++ stdoutText)+             ("0x00000007UL" `isInfixOf` stdoutText)+  assertBool ("Expected the quoted SMT function name to use a private encoded C identifier, received:\n" ++ sourceText)+             ("static SWord32 sbv_function_" `isInfixOf` sourceText+           && "/* Uninterpreted function */ sbv_function_" `isInfixOf` sourceText)+  assertBool ("Expected a defined function body to contribute its wide-bit-vector runtime, received:\n" ++ sourceText)+             ("static SWord673 sbv_function_" `isInfixOf` sourceText+           && "sbv_bv_u673_add" `isInfixOf` sourceText)++-- | Exercise an acyclic diamond of 'smtFunction' calls whose lexical name+-- ordering requires prototypes for callees emitted after their caller.+composedDefinedSBVFunctions :: Assertion+composedDefinedSBVFunctions = withSystemTempDirectory "sbv-composed-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        input <- cgInput "input" :: SBVCodeGen SWord32+        let base :: SWord32 -> SWord32+            base = smtFunction "C function base" (+ 1)++            twice :: SWord32 -> SWord32+            twice = smtFunction "C function twice" $ \value -> base value * 2++            plusThree :: SWord32 -> SWord32+            plusThree = smtFunction "C function plus three" $ \value -> base value + 3++            diamond :: SWord32 -> SWord32+            diamond = smtFunction "C function diamond" $ \value -> twice value + plusThree value+        cgReturn (diamond input)++  stdoutText <- compileProgramAndRunGenerated dir "composedDefinedSBVFunctions" program+  sourceText <- readFile (dir </> "composedDefinedSBVFunctions.c")+  assertBool ("Expected composed defined-function output to contain 0x00000012UL, received:\n" ++ stdoutText)+             ("0x00000012UL" `isInfixOf` stdoutText)+  assertBool ("Expected private prototypes before the composed defined-function bodies, received:\n" ++ sourceText)+             (length (filter ("static SWord32 sbv_function_" `isInfixOf`) (lines sourceText)) == 8)++-- | Exercise private by-value C signatures for 'smtFunction' definitions over+-- a tuple and a scalar-only ADT, including projection and reconstruction.+structuralDefinedSBVFunctions :: Assertion+structuralDefinedSBVFunctions = withSystemTempDirectory "sbv-structural-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let adjustTuple :: SBV (Word8, Word16) -> SBV (Word8, Word16)+            adjustTuple = smtFunction "C structural tuple" $ \value ->+                            let (first, second) = untuple value+                            in tuple (first + 1, second + 2)++            adjustADT :: SCodeGenADT Word8 -> SCodeGenADT Word8+            adjustADT = smtFunction "C structural ADT" $ \value ->+                          sCGPair (getCGPair_1 value + 1) (getCGPair_2 value + 2)++        cgOutput "tupleResult" (adjustTuple (literal (4, 10)))+        cgReturn (adjustADT (literal (CGPair 7 9)))++  stdoutText <- compileProgramAndRunGenerated dir "structuralDefinedSBVFunctions" program+  mapM_ (\fragment -> assertBool ("Expected structural defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "CGPair(8, 0x000bU)"+    , "tupleResult =(5, 0x000cU)"+    ]++-- | Exercise transitive ownership-arena threading through composed+-- 'smtFunction' definitions producing strings and exact GMP integers.+managedScalarDefinedSBVFunctions :: Assertion+managedScalarDefinedSBVFunctions = withSystemTempDirectory "sbv-managed-scalar-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4, 5]+        inputText    <- cgInput "inputText"    :: SBVCodeGen SString+        inputInteger <- cgInput "inputInteger" :: SBVCodeGen SInteger+        let addSuffix :: SString -> SString+            addSuffix = smtFunction "C managed string suffix" $ \value -> value SL.++ literal "!"++            decorate :: SString -> SString+            decorate = smtFunction "C managed string decorate" $ \value -> literal "<" SL.++ addSuffix value SL.++ literal ">"++            increment :: SInteger -> SInteger+            increment = smtFunction "C managed integer increment" (+ 1)++            squareIncrement :: SInteger -> SInteger+            squareIncrement = smtFunction "C managed integer square" $ \value -> increment value * increment value++        cgOutput "decorated" (decorate inputText)+        cgReturn (squareIncrement inputInteger)++  stdoutText <- compileProgramAndRunGenerated dir "managedScalarDefinedSBVFunctions" program+  sourceText <- readFile (dir </> "managedScalarDefinedSBVFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected managed scalar defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =36"+    , "decorated =<sbv4!>"+    ]+  assertBool "Expected private defined-function calls to thread the shared ownership context"+             ("sbv_function_ctx *const sbv_local_parent_function_ctx" `isInfixOf` sourceText+           && "(&sbv_local_function_ctx," `isInfixOf` sourceText)++-- | Private bodies must request the shared floor helper and math linkage even+-- when their entry point contains only a function call or array lookup.+scopedMappedRealFloor :: Assertion+scopedMappedRealFloor = mapM_ check [(library, useLambda, width) | library <- [False, True], useLambda <- [False, True], width <- [8, 64]]+ where check (library, useLambda, width) = withSystemTempDirectory "sbv-scoped-real-floor" $ \dir -> do+         let functionName = "scopedRealFloor"+             floorHalf :: SReal -> SInteger+             floorHalf value = sRealToSIntegerFloor (value / 2)+             program = do+               cgOverwriteFiles True+               cgSRealType CgLongDouble+               cgIntegerSize width+               cgSetDriverValues [-5]+               value <- cgInput "value"+               let result = if useLambda+                               then readArray (lambdaArray floorHalf) value+                               else smtFunction "C long-double floor" floorHalf value+               cgReturn (result .== -3)+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("floorComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Check overflow-safe statement blocks in conditionals, private functions,+-- and closed array lambdas. Every five-bit input is compared against equivalent+-- unweighted predicates, including sums that exceed the entire unsigned range.+scopedPseudoBoolean :: Assertion+scopedPseudoBoolean = mapM_ check [(library, scope) | library <- [False, True], scope <- [0 :: Int, 1, 2]]+ where check (library, scope) = withSystemTempDirectory "sbv-scoped-pseudo-boolean" $ \dir -> do+         let functionName = "scopedPseudoBoolean"+             evaluateBits :: SWord8 -> SBool+             evaluateBits value =+               let bits     = map (sTestBit value) [0, 1, 2]+                   weighted = zip [maxBound, maxBound, maxBound] bits+               in ite (sTestBit value 3)+                      (pbLe weighted maxBound .== pbAtMost bits 1)+                      (pbEq weighted maxBound .== pbExactly bits 1)+                  .&& (pbGe weighted maxBound .== sOr bits)+             evaluateScoped value = case scope of+               0 -> evaluateBits value+               1 -> smtFunction "C scoped pseudo-Boolean" evaluateBits value+               _ -> readArray (lambdaArray evaluateBits) value+             program = do+               cgOverwriteFiles True+               cgIntegerSize 8+               cgSetDriverValues [0..31]+               inputs <- cgInputArr 32 "inputs"+               cgReturn (sAnd (map evaluateScoped inputs))+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("scopedComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Exercise composed 'smtFunction' definitions over exact-element lists and+-- sets, requiring coordinated list, set, and GMP ownership arenas.+collectionDefinedSBVFunctions :: Assertion+collectionDefinedSBVFunctions = withSystemTempDirectory "sbv-collection-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let addPrefix :: SList Integer -> SList Integer+            addPrefix = smtFunction "C managed list prefix" $ \values -> literal [0] SL.++ values++            finishList :: SList Integer -> SList Integer+            finishList = smtFunction "C managed list finish" $ \values -> addPrefix values SL.++ literal [3]++            addThree :: SSet Integer -> SSet Integer+            addThree = smtFunction "C managed set three" $ SS.insert 3++            finishSet :: SSet Integer -> SSet Integer+            finishSet = smtFunction "C managed set finish" $ \values -> SS.insert 4 (addThree values)++            finishCollections :: SBV ([Integer], RCSet Integer) -> SBV ([Integer], RCSet Integer)+            finishCollections = smtFunction "C managed collection tuple" $ \collections ->+                                  let (values, members) = untuple collections+                                  in tuple (finishList values, finishSet members)++        cgOutput "listResult" (finishList (literal [1, 2]))+        cgReturn (finishCollections (tuple (literal [1, 2], SS.fromList [1, 2])))++  stdoutText <- compileProgramAndRunGenerated dir "collectionDefinedSBVFunctions" program+  mapM_ (\fragment -> assertBool ("Expected collection defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =([0, 1, 2, 3], {1, 2, 3, 4})"+    , "listResult =[0, 1, 2, 3]"+    ]++-- | Exercise persistent array roots passed through composed 'smtFunction'+-- calls and returned inside a tuple containing its eventual lookup key.+persistentArrayDefinedSBVFunctions :: Assertion+persistentArrayDefinedSBVFunctions = withSystemTempDirectory "sbv-persistent-array-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let storeAt :: SArray Word8 Word32 -> SWord8 -> SWord32 -> SArray Word8 Word32+            storeAt = smtFunction "C managed array store" writeArray++            storeTwice :: SArray Word8 Word32 -> SArray Word8 Word32+            storeTwice = smtFunction "C managed array stores" $ \values ->+                           storeAt (storeAt values 1 11) 2 22++            package :: SArray Word8 Word32 -> SBV (ArrayModel Word8 Word32, Word8)+            package = smtFunction "C managed array package" $ \values -> tuple (storeTwice values, literal 2)++            base = constArray 5 :: SArray Word8 Word32+            (updated, selectedKey) = untuple (package base)++        cgOutput "atOne"    (readArray updated 1)+        cgOutput "fallback" (readArray updated 7)+        cgReturn (readArray updated selectedKey)++  stdoutText <- compileProgramAndRunGenerated dir "persistentArrayDefinedSBVFunctions" program+  mapM_ (\fragment -> assertBool ("Expected persistent-array defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") = 0x00000016UL"+    , "atOne = 0x0000000bUL"+    , "fallback = 0x00000005UL"+    ]++-- | Exercise managed and recursive ADTs returned through composed+-- 'smtFunction' calls, including stabilization of recursive stack literals.+ownedADTDefinedSBVFunctions :: Assertion+ownedADTDefinedSBVFunctions = withSystemTempDirectory "sbv-owned-adt-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 1]+        let extendCollections :: SCodeGenCollections -> SCodeGenCollections+            extendCollections = smtFunction "C managed ADT collections" $ \value ->+              let values                   = getCGCollections_1 value+                  members                  = getCGCollections_2 value+                  nested                   = getCGCollections_3 value+                  (nestedValues, nestedSet) = untuple nested+              in sCGCollections+                   (values SL.++ literal [7])+                   (SS.insert 8 members)+                   (tuple (nestedValues SL.++ literal [9], SS.insert 10 nestedSet))++            wrapTree :: SCodeGenTree -> SCodeGenTree+            wrapTree = smtFunction "C managed ADT wrap" $ \tree -> sCGNode tree (sCGLeaf 99)++            wrapTreeTwice :: SCodeGenTree -> SCodeGenTree+            wrapTreeTwice = smtFunction "C managed ADT wrap twice" $ \tree -> wrapTree (wrapTree tree)++        collections <- cgInput "collectionsInput" :: SBVCodeGen SCodeGenCollections+        tree        <- cgInput "treeInput"        :: SBVCodeGen SCodeGenTree+        cgOutput "collections" (extendCollections collections)+        cgReturn (wrapTreeTwice tree)++  stdoutText <- compileProgramAndRunGenerated dir "ownedADTDefinedSBVFunctions" program+  sourceText <- readFile (dir </> "ownedADTDefinedSBVFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected owned-ADT defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =CGNode(CGNode("+    , "CGLeaf(99)), CGLeaf(99))"+    , "collections =CGCollections([1, 2, 3, 7], {2, 3, 4, 8}, ([3, 4, 5, 9], {4, 5, 6, 10}))"+    ]+  assertBool ("Expected private owned ADT results to use stable arena clones, received:\n"+           ++ unlines (filter ("sbv_function" `isInfixOf`) (lines sourceText)))+             ("sbv_function_result_clone_" `isInfixOf` sourceText)+  assertBool "Expected private owned ADT result storage to be released"+             ("sbv_function_result_ctx_end(&sbv_local_function_result_ctx);" `isInfixOf` sourceText)++-- | An inactive branch must not dereference the null child returned by a+-- mismatched recursive-ADT selector. Exercise Ite, Boolean short-circuiting,+-- and a managed result in acyclic functions, standalone and in a library.+guardedAcyclicDefinedFunctions :: Assertion+guardedAcyclicDefinedFunctions = mapM_ check [(library, sample) | library <- [False, True], sample <- [1, 0]]+ where check (library, sample) = withSystemTempDirectory "sbv-guarded-acyclic-functions" $ \dir -> do+         let functionName = "guardedAcyclicFunctions"+             program = do+               cgOverwriteFiles True+               cgSetDriverValues [sample]+               chooseLeaf <- cgInput "chooseLeaf" :: SBVCodeGen SBool+               let guardedLeft :: SCodeGenTree -> SWord8+                   guardedLeft = smtFunction "C guarded acyclic left" $ \tree ->+                     ite (isCGLeaf tree) (getCGLeaf_1 tree) (getCGLeaf_1 (getCGNode_1 tree))++                   guardedAnd :: SCodeGenTree -> SBool+                   guardedAnd = smtFunction "C guarded acyclic and" $ \tree ->+                     isCGNode tree .&& getCGLeaf_1 (getCGNode_1 tree) .== 7++                   guardedOr :: SCodeGenTree -> SBool+                   guardedOr = smtFunction "C guarded acyclic or" $ \tree ->+                     isCGLeaf tree .|| getCGLeaf_1 (getCGNode_1 tree) .== 7++                   guardedImplies :: SCodeGenTree -> SBool+                   guardedImplies = smtFunction "C guarded acyclic implication" $ \tree ->+                     isCGNode tree .=> getCGLeaf_1 (getCGNode_1 tree) .== 7++                   guardedTree :: SCodeGenTree -> SCodeGenTree+                   guardedTree = smtFunction "C guarded acyclic tree" $ \tree ->+                     ite (isCGLeaf tree) (sCGLeaf (getCGLeaf_1 tree)) (sCGLeaf (getCGLeaf_1 (getCGNode_1 tree)))++                   rootTree = ite chooseLeaf (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+               cgOutput "selectedTree" (guardedTree rootTree)+               cgReturn $ sAnd [guardedLeft rootTree .== 7, guardedAnd rootTree .== sNot chooseLeaf, guardedOr rootTree, guardedImplies rootTree]+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("guardedComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText && "selectedTree =CGLeaf(7)" `isInfixOf` outputText)++-- | Demand-driven evaluation must protect partial selectors both in public+-- entry points and in retained array callbacks, including owned branch results.+guardedProgramEvaluation :: Bool -> Assertion+guardedProgramEvaluation useLambda = mapM_ check [(library, sample) | library <- [False, True], sample <- [1, 0]]+ where check (library, sample) = withSystemTempDirectory "sbv-guarded-evaluation" $ \dir -> do+         let functionName = "guardedEvaluation"+             evaluateTree :: SBool -> SBV (CodeGenTree, Bool)+             evaluateTree chooseLeaf =+               let rootTree = ite chooseLeaf (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+                   child    = getCGLeaf_1 (getCGNode_1 rootTree)+                   selected = ite (isCGLeaf rootTree) (sCGLeaf (getCGLeaf_1 rootTree)) (sCGLeaf child)+                   valid    = sAnd [ (isCGNode rootTree .&& child .== 7) .== sNot chooseLeaf+                                   , isCGLeaf rootTree .|| child .== 7+                                   , isCGNode rootTree .=> child .== 7+                                   ]+               in tuple (selected, valid)+             program = do+               cgOverwriteFiles True+               cgSetDriverValues [sample]+               chooseLeaf <- cgInput "chooseLeaf" :: SBVCodeGen SBool+               let (selected, valid) = untuple $ if useLambda+                                                  then readArray (lambdaArray evaluateTree) chooseLeaf+                                                  else evaluateTree chooseLeaf+               cgOutput "selectedTree" selected+               cgReturn valid+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("guardedComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText && "selectedTree =CGLeaf(7)" `isInfixOf` outputText)++-- | Preconditions must run before dependent outputs, and must not disappear+-- when an entry point has no outputs. A rejected leaf must report the named+-- constraint instead of crashing in the node-only output selector.+guardedRuntimeChecks :: Assertion+guardedRuntimeChecks = mapM_ check [(library, noResult, sample) | library <- [False, True], noResult <- [False, True], sample <- [0, 1]]+ where check (library, noResult, sample) = withSystemTempDirectory "sbv-guarded-checks" $ \dir -> do+         let functionName = "guardedChecks"+             program = do+               cgOverwriteFiles True+               cgSetDriverValues [sample]+               chooseLeaf <- cgInput "chooseLeaf" :: SBVCodeGen SBool+               let rootTree = ite chooseLeaf (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+               namedConstraint "node required" (isCGNode rootTree)+               unless noResult $ cgReturn (getCGLeaf_1 (getCGNode_1 rootTree))+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("guardedComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         makeOptions <- generatedMakeOptions dir+         (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+         assertEqual makeError ExitSuccess makeExit+         (runExit, _, runError) <- readProcessWithExitCode (dir </> functionName ++ "_driver") [] ""+         if sample == 0+            then assertEqual runError ExitSuccess runExit+            else do assertBool "Expected a rejected input" (runExit /= ExitSuccess)+                    assertBool runError ("CONSTRAINT FAILED: node required" `isInfixOf` runError)++-- | A shared partial dependency must stay below its guard without being+-- copied exponentially into subsequent conditionals. The generated DAG has+-- only a few dozen nodes even though its expanded expression tree is large.+guardedEvaluationSharing :: Assertion+guardedEvaluationSharing = withSystemTempDirectory "sbv-guarded-sharing" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0]+        flags <- cgInput "flags" :: SBVCodeGen SWord32+        let rootTree = ite (sTestBit flags 31) (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+            initial  = ite (isCGLeaf rootTree) (getCGLeaf_1 rootTree) (getCGLeaf_1 (getCGNode_1 rootTree))+            result   = foldl (\previous bitIndex -> ite (sTestBit flags bitIndex) (previous + 1) (previous + 2)) initial [0 .. 17]+        cgReturn result+  (_, cfg, bundle) <- compileToC' "guardedSharing" program+  assertBool "Guarded evaluation expanded a shared DAG exponentially" (length (show bundle) < 100000)+  renderCgPgmBundle (Just dir) (cfg, bundle)+  outputText <- compileAndRunGenerated dir "guardedSharing"+  assertBool outputText (") = 43" `isInfixOf` outputText)++-- | Finite selection demands only the chosen entry or the out-of-range+-- default. Exercise dynamic owned entries and constant-table defaults at all+-- three lowering sites, with both standalone and library entry points.+guardedTableEvaluation :: Assertion+guardedTableEvaluation = mapM_ check [ (library, scope, checked, sample)+                                   | library <- [False, True]+                                   , scope   <- [0 :: Int, 1, 2]+                                   , checked <- [False, True]+                                   , sample  <- if checked then [0, 1, 2] else [0, 1]+                                   ]+ where check (library, scope, checked, sample) = withSystemTempDirectory "sbv-guarded-tables" $ \dir -> do+         let functionName = "guardedTables"+             evaluateTable :: SWord8 -> SBV (CodeGenTree, Word8)+             evaluateTable index =+               let rootTree = ite (index .== 0) (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+                   child    = getCGLeaf_1 (getCGNode_1 rootTree)+                   selected = select [sCGLeaf (getCGLeaf_1 rootTree), sCGLeaf child] (sCGLeaf (child + 1)) index+                   constant = select [7, 9] (child + 1) index+               in tuple (selected, constant)+             program = do+               cgOverwriteFiles True+               cgPerformRTCs checked+               cgSetDriverValues [sample]+               index <- cgInput "index" :: SBVCodeGen SWord8+               let result = case scope of+                     0 -> evaluateTable index+                     1 -> smtFunction "C guarded table function" evaluateTable index+                     _ -> readArray (lambdaArray evaluateTable) index+                   (selected, constant) = untuple result+                   expected = ite (index .< 2) 7 8+               cgOutput "selectedTree" selected+               cgReturn (getCGLeaf_1 selected .== expected .&& constant .== ite (index .== 1) 9 expected)+         (_, cfg, bundle) <- if library+                               then compileToCLib' functionName [("guardedComponent", program)]+                               else compileToC' functionName ((:[]) <$> program)+         renderCgPgmBundle (Just dir) (cfg, bundle)+         outputText <- compileAndRunGenerated dir functionName+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Check the original index before machine-index narrowing. Large exact,+-- signed-wide, and unsigned-wide indices must select the default, not alias+-- slot zero; unselected partial entries remain protected in all three cases.+guardedTableIndices :: Assertion+guardedTableIndices = mapM_ check [-1, 0, 1, 2, 2 ^ (80 :: Int)]+ where check sample = withSystemTempDirectory "sbv-guarded-table-indices" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgPerformRTCs True+               cgSetDriverValues [sample]+               index <- cgInput "index" :: SBVCodeGen SInteger+               let rootTree = ite (index .== 0) (sCGLeaf 7) (sCGNode (sCGLeaf 7) (sCGLeaf 9))+                   child    = getCGLeaf_1 (getCGNode_1 rootTree)+                   entries  = [sCGLeaf (getCGLeaf_1 rootTree), sCGLeaf child]+                   fallback = sCGLeaf (child + 1)+                   exact    = select entries fallback index+                   signed   = select entries fallback (sFromIntegral index :: SInt 673)+                   unsigned = select entries fallback (sFromIntegral index :: SWord 673)+                   expected = ite (index .>= 0 .&& index .< 2) 7 8+               cgReturn $ sAnd [getCGLeaf_1 selected .== expected | selected <- [exact, signed, unsigned]]+         outputText <- compileProgramAndRunGenerated dir "guardedTableIndices" program+         assertBool outputText (") = 1" `isInfixOf` outputText)++-- | Exercise self-recursion, mutually recursive Boolean short-circuiting, and+-- an owned recursive list result. Each base case must avoid evaluating the+-- recursive branch in the generated C program.+recursiveDefinedSBVFunctions :: Assertion+recursiveDefinedSBVFunctions = withSystemTempDirectory "sbv-recursive-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5]+        input <- cgInput "input" :: SBVCodeGen SWord8+        let countdown :: SWord8 -> SWord8+            countdown = smtFunctionNoTermination "C recursive countdown" $ \value ->+                          ite (value .== 0) 0 (1 + countdown (value - 1))++            isEven :: SWord8 -> SBool+            isEven = smtFunctionNoTermination "C mutually recursive even" $ \value ->+                       value .== 0 .|| isOdd (value - 1)++            isOdd :: SWord8 -> SBool+            isOdd = smtFunctionNoTermination "C mutually recursive odd" $ \value ->+                      value ./= 0 .&& isEven (value - 1)++            implicationChain :: SWord8 -> SBool+            implicationChain = smtFunctionNoTermination "C recursive implication" $ \value ->+                                 value ./= 0 .=> implicationChain (value - 1)++            tableCount :: SWord8 -> SWord8+            tableCount = smtFunctionNoTermination "C recursive local table" $ \value ->+                           ite (value .== 0) 0+                               (select [value, value + 1] 3 (ite (value .== 1) 1 0 :: SWord8) + tableCount (value - 1))++            countdownList :: SWord8 -> SList Word8+            countdownList = smtFunctionNoTermination "C recursive list" $ \value ->+                              ite (value .== 0)+                                  (literal [] :: SList Word8)+                                  (value SL..: countdownList (value - 1))++            factorial :: SInteger -> SInteger+            factorial = smtFunctionNoTermination "C recursive exact factorial" $ \value ->+                          ite (value .<= 1) 1 (value * factorial (value - 1))++            mcCarthy91 :: SInteger -> SInteger+            mcCarthy91 = smtFunctionNoTermination "C nested recursive McCarthy 91" $ \value ->+                           ite (value .> 100) (value - 10) (mcCarthy91 (mcCarthy91 (value + 11)))+        cgOutput "steps"       (countdown input)+        cgOutput "even"        (isEven input)+        cgOutput "odd"         (isOdd input)+        cgOutput "implication" (implicationChain input)+        cgOutput "tableCount"  (tableCount input)+        cgOutput "factorial"   (factorial 5)+        cgOutput "mcCarthy91"  (mcCarthy91 87)+        cgReturn (countdownList input)++  stdoutText <- compileProgramAndRunGenerated dir "recursiveDefinedSBVFunctions" program+  sourceText <- readFile (dir </> "recursiveDefinedSBVFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected recursive defined-function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =[5, 4, 3, 2, 1]"+    , "steps = 5"+    , "even = 0"+    , "odd = 1"+    , "implication = 1"+    , "tableCount = 16"+    , "factorial =120"+    , "mcCarthy91 =91"+    ]+  assertBool ("Expected recursive calls to remain inside generated control flow, received:\n" ++ sourceText)+             ("if(" `isInfixOf` sourceText+           && length (filter ("/* Uninterpreted function */ sbv_function_" `isInfixOf`) (lines sourceText)) >= 4)++-- | Exercise recursive private functions in independent translation units of+-- a generated static library.+recursiveDefinedSBVFunctionLibrary :: Assertion+recursiveDefinedSBVFunctionLibrary = withSystemTempDirectory "sbv-recursive-defined-function-library" $ \dir -> do+  let component :: Word16 -> SBVCodeGen ()+      component offset = do+        cgOverwriteFiles True+        let sumTo :: SWord8 -> SWord16+            sumTo = smtFunctionNoTermination "C library recursive sum" $ \value ->+                      ite (value .== 0) 0 (sFromIntegral value + sumTo (value - 1))+        cgReturn (literal offset + sumTo 4)++  (_, cfg, bundle) <- compileToCLib' "recursiveDefinedSBVFunctionLibrary"+    [ ("firstRecursive",  component 10)+    , ("secondRecursive", component 20)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "recursiveDefinedSBVFunctionLibrary"+  mapM_ (\fragment -> assertBool ("Expected recursive library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "firstRecursive() = 0x0014U"+    , "secondRecursive() = 0x001eU"+    ]++-- | Construct and update persistent arrays recursively, then use the returned+-- arrays after their defining C stack frames have unwound.+recursivePersistentArrayFunctions :: Assertion+recursivePersistentArrayFunctions = withSystemTempDirectory "sbv-recursive-persistent-array-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3]+        input <- cgInput "input" :: SBVCodeGen SWord8+        let build :: SWord8 -> SArray Word8 Word8+            build = smtFunctionNoTermination "C recursive array build" $ \value ->+                      ite (value .== 0)+                          (constArray 7)+                          (writeArray (build (value - 1)) value (value + 10))++            fill :: SWord8 -> SArray Word8 Word8 -> SArray Word8 Word8+            fill = smtFunctionNoTermination "C recursive array fill" $ \value array ->+                     ite (value .== 0)+                         array+                         (fill (value - 1) (writeArray array value (value + 20)))++            built  = build input+            filled = fill input built++        cgOutput "builtAtOne"   (readArray built 1)+        cgOutput "builtAtInput" (readArray built input)+        cgOutput "filledAtOne"  (readArray filled 1)+        cgOutput "fallback"     (readArray filled 9)+        cgReturn filled++  stdoutText <- compileProgramAndRunGenerated dir "recursivePersistentArrayFunctions" program+  sourceText <- readFile (dir </> "recursivePersistentArrayFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected recursive persistent-array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ")[0] =7"+    , "builtAtOne = 11"+    , "builtAtInput = 13"+    , "filledAtOne = 21"+    , "fallback = 7"+    ]+  assertBool ("Expected recursive array nodes to be declared outside guarded branches, received:\n" ++ sourceText)+             ("sbv_array_node_2_u8_2_u8 sbv_local_array_s" `isInfixOf` sourceText+           && "sbv_array_stored_export_2_u8_2_u8(&sbv_local_array_ctx" `isInfixOf` sourceText)++-- | Construct, traverse, and return a recursive ADT through private recursive+-- functions after every child-producing C stack frame has unwound.+recursiveADTDefinedSBVFunctions :: Assertion+recursiveADTDefinedSBVFunctions = withSystemTempDirectory "sbv-recursive-adt-defined-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3]+        input <- cgInput "input" :: SBVCodeGen SWord8+        let build :: SWord8 -> SCodeGenTree+            build = smtFunctionNoTermination "C recursive ADT build" $ \value ->+                      ite (value .== 0)+                          (literal (CGNode (CGLeaf 4) (CGLeaf 5)))+                          (sCGNode (build (value - 1)) (sCGLeaf value))++            leftmost :: SCodeGenTree -> SWord8+            leftmost = smtFunctionNoTermination "C recursive ADT leftmost" $ \tree ->+                         ite (isCGLeaf tree)+                             (getCGLeaf_1 tree)+                             (leftmost (getCGNode_1 tree))++            leafSum :: SCodeGenTree -> SWord16+            leafSum = smtFunctionNoTermination "C recursive ADT leaf sum" $ \tree ->+                        ite (isCGLeaf tree)+                            (sFromIntegral (getCGLeaf_1 tree))+                            (leafSum (getCGNode_1 tree) + leafSum (getCGNode_2 tree))++            buildEven :: SWord8 -> SCodeGenEven+            buildEven = smtFunctionNoTermination "C mutually recursive ADT even" $ \value ->+                          ite (value .== 0)+                              (sCGEvenEnd 0)+                              (sCGEvenStep (buildOdd (value - 1)))++            buildOdd :: SWord8 -> SCodeGenOdd+            buildOdd = smtFunctionNoTermination "C mutually recursive ADT odd" $ sCGOddStep . buildEven++            result = build input++        cgOutput "leftmost" (leftmost result)+        cgOutput "leafSum"  (leafSum result)+        cgOutput "mutual"   (buildEven input)+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "recursiveADTDefinedSBVFunctions" program+  sourceText <- readFile (dir </> "recursiveADTDefinedSBVFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected recursive-ADT function output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =CGNode(CGNode(CGNode(CGNode(CGLeaf(4), CGLeaf(5)), CGLeaf(1)), CGLeaf(2)), CGLeaf(3))"+    , "leftmost = 4"+    , "leafSum = 0x000fU"+    , "mutual =CGEvenStep(CGOddStep(CGEvenStep(CGOddStep(CGEvenStep(CGOddStep(CGEvenEnd(0)))))))"+    ]+  assertBool ("Expected recursive ADT fields to use function-scoped backing values, received:\n" ++ sourceText)+             ("SBVADT_CodeGenTree sbv_local_adt_recursive_" `isInfixOf` sourceText+           && "sbv_function_result_clone_adt_" `isInfixOf` sourceText+           && any (\line -> "const SBVADT_CodeGenTree l1_s" `isInfixOf` line+                          && "= (SBVADT_CodeGenTree)" `isInfixOf` line)+                  (lines sourceText))++-- | Exercise private recursive ADT builders in independent translation units+-- of a generated static library.+recursiveADTDefinedSBVFunctionLibrary :: Assertion+recursiveADTDefinedSBVFunctionLibrary = withSystemTempDirectory "sbv-recursive-adt-defined-function-library" $ \dir -> do+  let component :: Word8 -> SBVCodeGen ()+      component offset = do+        cgOverwriteFiles True+        let build :: SWord8 -> SCodeGenTree+            build = smtFunctionNoTermination "C library recursive ADT build" $ \value ->+                      ite (value .== 0)+                          (sCGLeaf (literal offset))+                          (sCGNode (build (value - 1)) (sCGLeaf (literal offset + value)))+        cgReturn (build 2)++  (_, cfg, bundle) <- compileToCLib' "recursiveADTDefinedSBVFunctionLibrary"+    [ ("firstRecursiveADT", component 10)+    , ("secondRecursiveADT", component 20)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "recursiveADTDefinedSBVFunctionLibrary"+  mapM_ (\fragment -> assertBool ("Expected recursive-ADT library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "firstRecursiveADT() =CGNode(CGNode(CGLeaf(10), CGLeaf(11)), CGLeaf(12))"+    , "secondRecursiveADT() =CGNode(CGNode(CGLeaf(20), CGLeaf(21)), CGLeaf(22))"+    ]++-- | Compile SBV's firstified higher-order list operations, including an+-- explicit symbolic closure environment, into ordinary private C functions.+higherOrderListFunctions :: Assertion+higherOrderListFunctions = withSystemTempDirectory "sbv-higher-order-list-functions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10, 5]+        values <- cgInput "values" :: SBVCodeGen (SList Word8)+        offset <- cgInput "offset" :: SBVCodeGen SWord8+        let mapped   = SL.map (+ (1 :: SWord8)) values+            filtered = SL.filter (\value -> value .> (11 :: SWord8)) mapped+            folded   = SL.foldl ((+) @SWord8) 0 mapped+            paired   = SL.zipWith ((+) @SWord8) values mapped++            closureShift :: Closure SWord8 (SWord8 -> SWord8)+            closureShift = Closure { closureEnv = offset+                                   , closureFun = (+)+                                   }++            shifted = SL.map closureShift values++        cgOutput "mapped"   mapped+        cgOutput "filtered" filtered+        cgOutput "folded"   folded+        cgOutput "paired"   paired+        cgReturn shifted++  stdoutText <- compileProgramAndRunGenerated dir "higherOrderListFunctions" program+  sourceText <- readFile (dir </> "higherOrderListFunctions.c")+  mapM_ (\fragment -> assertBool ("Expected firstified higher-order output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ ") =[15, 16, 17]"+    , "mapped =[11, 12, 13]"+    , "filtered =[12, 13]"+    , "folded = 36"+    , "paired =[21, 23, 25]"+    ]+  assertBool ("Expected higher-order instances to become private first-order C functions, received:\n" ++ sourceText)+             ("/* Uninterpreted function */ sbv_function_" `isInfixOf` sourceText)++-- | Exercise independently specialized higher-order functions in separate+-- translation units of a generated static library.+higherOrderListFunctionLibrary :: Assertion+higherOrderListFunctionLibrary = withSystemTempDirectory "sbv-higher-order-list-function-library" $ \dir -> do+  let component :: Word8 -> SBVCodeGen ()+      component offset = do+        cgOverwriteFiles True+        cgSetDriverValues [10]+        values <- cgInput "values" :: SBVCodeGen (SList Word8)+        cgReturn (SL.map (\(value :: SWord8) -> value + literal offset) values)++  (_, cfg, bundle) <- compileToCLib' "higherOrderListFunctionLibrary"+    [ ("addTen", component 10)+    , ("addTwenty", component 20)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "higherOrderListFunctionLibrary"+  mapM_ (\fragment -> assertBool ("Expected higher-order library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "addTen(((SBVList_u8) {(const SWord8[]) {10, 11, 12}, 3})) =[20, 21, 22]"+    , "addTwenty(((SBVList_u8) {(const SWord8[]) {10, 11, 12}, 3})) =[30, 31, 32]"+    ]++-- | Exercise unnamed and named hard constraints as generated-C precondition+-- checks, including a Boolean input used only by a constraint and an escaped+-- UTF-8 diagnostic name.+explicitHardConstraints :: Assertion+explicitHardConstraints = withSystemTempDirectory "sbv-explicit-hard-constraints" $ \dir -> do+  let constraintName = "value is \"seven\" (100%) \955"+      program driverValues = do+        cgOverwriteFiles True+        cgSetDriverValues driverValues+        enabled <- cgInput "enabled" :: SBVCodeGen SBool+        value   <- cgInput "value"   :: SBVCodeGen SWord8+        constrain enabled+        namedConstraint constraintName (value .== 7)+        cgReturn (value + 1)++      validDir   = dir </> "valid"+      invalidDir = dir </> "invalid"++  validOutput <- compileProgramAndRunGenerated validDir "explicitHardConstraints" (program [1, 7])+  assertBool ("Expected constrained output to contain 8, received:\n" ++ validOutput)+             (") = 8" `isInfixOf` validOutput)++  (_, invalidCfg, invalidBundle) <- compileToC' "explicitHardConstraints" (program [1, 6])+  renderCgPgmBundle (Just invalidDir) (invalidCfg, invalidBundle)+  makeOptions <- generatedMakeOptions invalidDir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", invalidDir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  (runExit, _, runError) <- readProcessWithExitCode (invalidDir </> "explicitHardConstraints_driver") [] ""+  assertBool "Expected a violated hard constraint to terminate the generated driver"+             (case runExit of ExitFailure _ -> True; ExitSuccess -> False)+  assertBool ("Expected the named constraint diagnostic, received:\n" ++ runError)+             (("CONSTRAINT FAILED: " ++ constraintName) `isInfixOf` runError)++-- | Check that constraint forms requiring solver optimization or SMT-only+-- attributes receive focused diagnostics instead of being silently weakened.+unsupportedConstraintFeatures :: Assertion+unsupportedConstraintFeatures = do+  softResult <- try (do+    (_, _, bundle) <- compileToC' "softConstraint" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      softConstrain value+      cgReturn value+    evaluate (length (show bundle))) :: IO (Either ErrorCall Int)+  case softResult of+    Left exception -> assertBool ("Expected a soft-constraint diagnostic, received:\n" ++ displayException exception)+                                 ("Soft constraints" `isInfixOf` displayException exception)+    Right _        -> assertBool "Expected C generation to reject a soft constraint" False++  attributeResult <- try (do+    (_, _, bundle) <- compileToC' "attributedConstraint" $ do+      value <- cgInput "value" :: SBVCodeGen SBool+      constrainWithAttribute [(":weight", "2")] value+      cgReturn value+    evaluate (length (show bundle))) :: IO (Either ErrorCall Int)+  case attributeResult of+    Left exception -> assertBool ("Expected a constraint-attribute diagnostic, received:\n" ++ displayException exception)+                                 ("Constraint attributes: :weight" `isInfixOf` displayException exception)+    Right _        -> assertBool "Expected C generation to reject an SMT-only constraint attribute" False++-- | Exercise a sole 'cgReturnArr' group through the generated output-parameter+-- ABI while preserving the return elements' declaration order.+nonAtomicReturnGroup :: Assertion+nonAtomicReturnGroup = withSystemTempDirectory "sbv-non-atomic-return-group" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        input <- cgInput "input" :: SBVCodeGen SWord16+        cgReturnArr [input + 1, input + 2, input + 3]++  stdoutText <- compileProgramAndRunGenerated dir "nonAtomicReturnGroup" program+  headerText <- readFile (dir </> "nonAtomicReturnGroup.h")+  mapM_ (\fragment -> assertBool ("Expected non-atomic return output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "result_0[0] = 0x0005U"+    , "result_0[1] = 0x0006U"+    , "result_0[2] = 0x0007U"+    ]+  assertBool "Expected a sole array return group to use a void output-parameter ABI"+             ("void nonAtomicReturnGroup(" `isInfixOf` headerText+           && "SWord16 *result_0" `isInfixOf` headerText)++-- | Exercise multiple ordered return groups containing a scalar, an owned+-- symbolic list, and a fixed-size C array.+multipleReturnGroups :: Assertion+multipleReturnGroups = withSystemTempDirectory "sbv-multiple-return-groups" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        input <- cgInput "input" :: SBVCodeGen SWord16+        cgReturn (input + 1)+        cgReturn (literal ([10, 11] :: [Word16]))+        cgReturn (sFromIntegral input + 20 :: SInteger)+        cgReturnArr [input + 2, input + 3]++  stdoutText <- compileProgramAndRunGenerated dir "multipleReturnGroups" program+  headerText <- readFile (dir </> "multipleReturnGroups.h")+  mapM_ (\fragment -> assertBool ("Expected multiple-return output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "result_0 = 0x0005U"+    , "result_1 =[0x000aU, 0x000bU]"+    , "result_2 =24"+    , "result_3[0] = 0x0006U"+    , "result_3[1] = 0x0007U"+    ]+  assertBool "Expected multiple return groups to use ordered output parameters"+             ("void multipleReturnGroups(" `isInfixOf` headerText+           && "SWord16 *result_0" `isInfixOf` headerText+           && "SWord16 *result_3" `isInfixOf` headerText)++-- | Fixed-size symbolic-array inputs use public callback descriptors rather+-- than private array nodes. Distinct seeds must initialize each callback, and+-- managed defaults and returned arrays have independent ownership.+groupedArrayInputs :: Bool -> Assertion+groupedArrayInputs library = withSystemTempDirectory "sbv-grouped-array-inputs" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 7, 11, 15]+        native <- cgInputArr 2 "native" :: SBVCodeGen [SArray Word8 Word16]+        exact  <- cgInputArr 2 "exact"  :: SBVCodeGen [SArray Word8 [Integer]]+        cgOutputArr "nativeValues" [readArray value 0 | value <- native]+        cgOutputArr "exactHeads" [SL.head (readArray value 0) | value <- exact]+        cgReturnArr native+        cgReturnArr exact+  outputText <- runGroupedInputProgram dir "groupedArrayInputs" library program+  headerText <- readFile (dir </> "groupedArrayInputs.h")+  mapM_ (\fragment -> assertBool outputText (fragment `isInfixOf` outputText))+    [ "nativeValues[0] = 0x0003U"+    , "nativeValues[1] = 0x0007U"+    , "exactHeads[0] = 11"+    , "exactHeads[1] = 15"+    , "result_0[1][0] =0x0007U"+    , "result_1[1][0] =[15, 16, 17]"+    ]+  assertBool "Expected public callback descriptors for grouped array inputs"+             ("const SBVArrayInput_2_u8_3_u16 *native" `isInfixOf` headerText)++-- | A hand-written caller can pass callback groups without private runtime+-- nodes. Returned groups retain each context independently across later calls.+groupedArrayInputOwnership :: Assertion+groupedArrayInputOwnership = withSystemTempDirectory "sbv-grouped-array-ownership" $ \dir -> do+  _ <- compileToCLib (Just dir) "arrayGroupLibrary"+    [("copyArrayGroup", do+        cgOverwriteFiles True+        cgGenerateDriver False+        values <- cgInputArr 2 "values" :: SBVCodeGen [SArray Word8 Word16]+        cgReturnArr values)]+  compileAndRunCaller dir "arrayGroupLibrary" $ unlines+    [ "#include \"arrayGroupLibrary.h\""+    , "#include <assert.h>"+    , "static unsigned live_contexts;"+    , "static SWord16 lookup(const void *context, SWord8 key)"+    , "{ return *(const SWord16 *) context + key; }"+    , "static const void *retain(const void *context)"+    , "{ SWord16 *copy = malloc(sizeof(*copy)); assert(copy != NULL); *copy = *(const SWord16 *) context; ++live_contexts; return copy; }"+    , "static void release(const void *context)"+    , "{ --live_contexts; free((void *) context); }"+    , "int main(void)"+    , "{"+    , "  for (unsigned i = 0; i < 32; ++i) {"+    , "    SWord16 data[] = {7, 23};"+    , "    const SBVArrayInput_2_u8_3_u16 inputs[] = {{lookup, &data[0], retain, release}, {lookup, &data[1], retain, release}};"+    , "    SBVArrayOutput_2_u8_3_u16 first[2], second[2];"+    , "    copyArrayGroup(inputs, first);"+    , "    data[0] = 99; data[1] = 101;"+    , "    const SBVArrayInput_2_u8_3_u16 borrowed[] = {sbv_array_output_as_input_2_u8_3_u16(first[1]), sbv_array_output_as_input_2_u8_3_u16(first[0])};"+    , "    copyArrayGroup(borrowed, second);"+    , "    for (unsigned j = 0; j < 2; ++j) sbv_array_output_release_2_u8_3_u16(&first[j]);"+    , "    assert(live_contexts == 2);"+    , "    assert(sbv_array_output_read_2_u8_3_u16(second[0], 1) == 24);"+    , "    assert(sbv_array_output_read_2_u8_3_u16(second[1], 1) == 8);"+    , "    for (unsigned j = 0; j < 2; ++j) sbv_array_output_release_2_u8_3_u16(&second[j]);"+    , "    assert(live_contexts == 0);"+    , "  }"+    , "  return 0;"+    , "}"+    ]++-- | Managed input groups need per-element initialization, including nested+-- exact values and retained arrays, followed by exactly one owner cleanup.+groupedManagedInputs :: Bool -> Assertion+groupedManagedInputs library = withSystemTempDirectory "sbv-grouped-managed-inputs" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 7, 11, 15, 21, 25, 1, 5, 31, 35]+        lists  <- cgInputArr 2 "lists"  :: SBVCodeGen [SList Integer]+        sets   <- cgInputArr 2 "sets"   :: SBVCodeGen [SSet Rational]+        pairs  <- cgInputArr 2 "pairs"  :: SBVCodeGen [SBV (Integer, [Integer])]+        adts   <- cgInputArr 2 "adts"   :: SBVCodeGen [SCodeGenCollections]+        arrays <- cgInputArr 2 "arrays" :: SBVCodeGen [SList (ArrayModel Word8 Word16)]+        cgOutputArr "listHeads" (map SL.head lists)+        cgOutputArr "pairIntegers" (map (fst . untuple) pairs)+        cgOutputArr "arrayHeads" [readArray (SL.head value) 0 | value <- arrays]+        cgReturnArr lists+        cgReturnArr sets+        cgReturnArr pairs+        cgReturnArr adts+        cgReturnArr arrays+  outputText <- runGroupedInputProgram dir "groupedManagedInputs" library program+  mapM_ (\fragment -> assertBool outputText (fragment `isInfixOf` outputText))+    [ "listHeads[0] = 3"+    , "listHeads[1] = 7"+    , "pairIntegers[0] = 21"+    , "pairIntegers[1] = 25"+    , "arrayHeads[0] = 0x001fU"+    , "arrayHeads[1] = 0x0023U"+    , "result_0[1] = [7, 8, 9]"+    ]++-- | Exercise the same grouped-input program through standalone generation+-- and two translation units sharing one library header and combined driver.+runGroupedInputProgram :: FilePath -> String -> Bool -> SBVCodeGen () -> IO String+runGroupedInputProgram dir programName library program+  | library = do+      (_, cfg, bundle) <- compileToCLib' programName [(programName ++ "First", program), (programName ++ "Second", program)]+      renderCgPgmBundle (Just dir) (cfg, bundle)+      compileAndRunGenerated dir programName+  | True = compileProgramAndRunGenerated dir programName program++-- | Exercise deep ownership and element-wise cleanup for non-atomic return+-- groups containing lists, exact integers, and persistent arrays.+managedReturnGroups :: Assertion+managedReturnGroups = withSystemTempDirectory "sbv-managed-return-groups" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        input <- cgInput "input" :: SBVCodeGen SWord16+        let baseArray = constArray 5 :: SArray Word8 Word16+        cgReturnArr [ literal ([1, 2] :: [Word16])+                    , literal ([3, 4] :: [Word16])+                    ]+        cgReturnArr [ sFromIntegral input + 30 :: SInteger+                    , sFromIntegral input + 31+                    ]+        cgReturnArr [baseArray, writeArray baseArray 0 9]++  stdoutText <- compileProgramAndRunGenerated dir "managedReturnGroups" program+  headerText <- readFile (dir </> "managedReturnGroups.h")+  sourceText <- readFile (dir </> "managedReturnGroups.c")+  driverText <- readFile (dir </> "managedReturnGroups_driver.c")+  mapM_ (\fragment -> assertBool ("Expected managed return-group output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "result_0[0] = [0x0001U, 0x0002U]"+    , "result_0[1] = [0x0003U, 0x0004U]"+    , "result_1[0] = 34"+    , "result_1[1] = 35"+    , "result_2[0][0] =0x0005U"+    , "result_2[1][0] =0x0009U"+    ]+  assertBool "Expected exact and persistent-array groups to expose mutable output arrays"+             ("mpz_t *result_1" `isInfixOf` headerText+           && "SBVArrayOutput_2_u8_3_u16 *result_2" `isInfixOf` headerText)+  assertBool ("Expected managed group elements to be cloned and released independently, received:\n"+           ++ unlines (filter ("sbv_" `isInfixOf`) (lines (sourceText ++ driverText))))+             ("sbv_output_0[0] = sbv_list_clone_u16" `isInfixOf` sourceText+           && "sbv_list_release_u16(&sbv_driver_output_0[0]);" `isInfixOf` driverText+           && "sbv_array_output_release_2_u8_3_u16(&sbv_driver_output_2[0]);" `isInfixOf` driverText)++-- | Exercise grouped return ABIs across multiple generated library+-- translation units.+groupedReturnLibrary :: Assertion+groupedReturnLibrary = withSystemTempDirectory "sbv-grouped-return-library" $ \dir -> do+  let component increment seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        input <- cgInput "input" :: SBVCodeGen SWord16+        cgReturnArr [input + literal increment, input + literal increment + 1]+        cgReturn (literal ([increment, increment + 1] :: [Word16]))++  (_, cfg, bundle) <- compileToCLib' "groupedReturnLibrary"+    [ ("firstGroups",  component 1 4)+    , ("secondGroups", component 2 8)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "groupedReturnLibrary"+  headerText <- readFile (dir </> "groupedReturnLibrary.h")+  mapM_ (\fragment -> assertBool ("Expected grouped library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText)+                                 (fragment `isInfixOf` stdoutText))+    [ "result_0[0] = 0x0005U"+    , "result_0[1] = 0x0006U"+    , "result_1 =[0x0001U, 0x0002U]"+    , "result_0[0] = 0x000aU"+    , "result_0[1] = 0x000bU"+    , "result_1 =[0x0002U, 0x0003U]"+    ]+  assertBool "Expected both library components to publish grouped output parameters"+             ("void firstGroups(" `isInfixOf` headerText+           && "void secondGroups(" `isInfixOf` headerText+           && length (filter ("SWord16 *result_0" `isInfixOf`) (lines headerText)) == 2)++-- | Exercise 'freeArray' by supplying the corresponding total C function as+-- a user declaration, preserving the existing uninterpreted-function escape hatch.+definedFreeArray :: Assertion+definedFreeArray = withSystemTempDirectory "sbv-defined-free-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [9]+        cgAddDecl ["static SWord32 free_source(SWord16 key) { return (SWord32) key + UINT32_C(5); }"]+        key <- cgInput "key" :: SBVCodeGen SWord16+        let source = freeArray "free_source" :: SArray Word16 Word32+        cgReturn (readArray source key)++  stdoutText <- compileProgramAndRunGenerated dir "definedFreeArray" program+  assertBool ("Expected defined free-array output to contain 0x0000000eUL, received:\n" ++ stdoutText) ("0x0000000eUL" `isInfixOf` stdoutText)++-- | Exercise independent owned descriptors for an array output parameter and+-- an array return, including persistent stores above a structured callback.+ownedArrayResults :: Assertion+ownedArrayResults = withSystemTempDirectory "sbv-owned-array-results" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let source = lambdaArray (\index -> sFromIntegral index + 5) :: SArray Word8 Word32+        cgOutput "owned" (writeArray source 0 99)+        cgReturn (writeArray source 0 42)++  stdoutText <- compileProgramAndRunGenerated dir "ownedArrayResults" program+  mapM_ (\fragment -> assertBool ("Expected owned-array output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "ownedArrayResults(&owned)[0] =0x0000002aUL"+    , "owned[0] =0x00000063UL"+    ]++-- | Exercise retention of a borrowed input callback when a persistent array+-- derived from it escapes through an owned return descriptor.+escapingCallbackArray :: Assertion+escapingCallbackArray = withSystemTempDirectory "sbv-escaping-callback-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [7]+        source <- cgInput "source" :: SBVCodeGen (SArray Word8 Word32)+        cgReturn (writeArray source 1 99)++  stdoutText <- compileProgramAndRunGenerated dir "escapingCallbackArray" program+  assertBool ("Expected retained callback output to contain 0x00000007UL, received:\n" ++ stdoutText) ("[0] =0x00000007UL" `isInfixOf` stdoutText)++-- | Exercise structural object equality and deep ownership for array keys and+-- values containing lists, sets, strings, tuples, and concrete ADTs.+managedAggregateArrays :: Assertion+managedAggregateArrays = withSystemTempDirectory "sbv-managed-aggregate-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4, 10, 12]+        source      <- cgInput "source"      :: SBVCodeGen (SArray [Word16] CodeGenNativeCollections)+        key         <- cgInput "key"         :: SBVCodeGen (SList Word16)+        exactSource <- cgInput "exactSource" :: SBVCodeGen (SArray Word8 (String, Integer))+        let storedADT    = sCGNativeCollections+                               (literal ([90, 91] :: [Word16]))+                               (SS.fromList [92, 93])+            updatedADT   = writeArray source key storedADT+            stringKey    = literal "stored" :: SString+            defaultTuple = tuple (literal "default" :: SString, literal ([1, 2] :: [Integer]))+            storedTuple  = tuple (literal "stored-value" :: SString, literal ([7, 8] :: [Integer]))+            tupleArray   = writeArray (constArray defaultTuple :: SArray String (String, [Integer])) stringKey storedTuple+            setKey       = SS.fromList [5, 6] :: SSet Word16+            storedList   = literal ([7, 8] :: [Word16])+            setArray     = writeArray (constArray (literal ([1, 2] :: [Word16])) :: SArray (RCSet Word16) [Word16]) setKey storedList+            enumArray    = writeArray (constArray 3 :: SArray CodeGenEnum Word8) sCGBlue 9+        cgOutput "matchedADT" (readArray updatedADT key .=== storedADT)+        cgOutput "matchedSet" (readArray setArray setKey .=== storedList)+        cgOutput "matchedEnum" (readArray enumArray sCGBlue .== (9 :: SWord8))+        cgOutput "storedADT" (readArray updatedADT key)+        cgOutput "tupleArray" tupleArray+        cgOutput "storedTuple" (readArray tupleArray stringKey)+        cgOutput "setArray" setArray+        cgOutput "enumArray" enumArray+        cgOutput "exactSourceCopy" exactSource+        cgReturn updatedADT++  stdoutText <- compileProgramAndRunGenerated dir "managedAggregateArrays" program+  headerText <- readFile (dir </> "managedAggregateArrays.h")+  sourceText <- readFile (dir </> "managedAggregateArrays.c")+  driverText <- readFile (dir </> "managedAggregateArrays_driver.c")+  mapM_ (\fragment -> assertBool ("Expected managed aggregate-array output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "matchedADT = 1"+    , "matchedSet = 1"+    , "matchedEnum = 1"+    , "storedADT =CGNativeCollections([0x005aU, 0x005bU], {0x005cU, 0x005dU})"+    , "storedTuple =(stored-value, [7, 8])"+    , "tupleArray[0] =(default, [1, 2])"+    , "setArray[0] =[0x0001U, 0x0002U]"+    , "enumArray[0] =3"+    , "exactSourceCopy[0] =(sbv12, 13)"+    ]+  assertBool "Expected exported arrays to own aggregate keys and values"+             ("sbv_list_clone_u16(source->key)" `isInfixOf` sourceText+           && "sbv_adt_owned_clone_SBVADT_CodeGenNativeCollections(source->value)" `isInfixOf` sourceText+           && "sbv_string_clone(source->key)" `isInfixOf` sourceText+           && "sbv_tuple_owned_clone_" `isInfixOf` sourceText+           && "sbv_set_clone_u16(source->key)" `isInfixOf` sourceText+           && "sbv_list_clone_u16(source->value)" `isInfixOf` sourceText+           && "sbv_adt_owned_clone_SBVADT_CodeGenEnum(source->key)" `isInfixOf` sourceText+           && "sbv_adt_owned_release_SBVADT_CodeGenNativeCollections" `isInfixOf` sourceText)+  assertBool "Expected managed callback defaults to use deep retain and release helpers"+             ("sbv_adt_owned_clone_SBVADT_CodeGenNativeCollections" `isInfixOf` headerText+           && "sbv_local_array_retain_" `isInfixOf` driverText+           && "sbv_local_array_release_" `isInfixOf` driverText+           && "sbv_tuple_owned_clone_" `isInfixOf` driverText+           && "sbv_tuple_owned_release_" `isInfixOf` driverText)++-- | Exercise guarded aggregate-array declarations and owned return values+-- shared by multiple generated library translation units.+managedAggregateArrayLibrary :: Assertion+managedAggregateArrayLibrary = withSystemTempDirectory "sbv-managed-aggregate-array-library" $ \dir -> do+  let component :: Integer -> Word16 -> SBVCodeGen ()+      component seed keyValue = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen (SArray (RCSet Word16) CodeGenNativeCollections)+        let key   = SS.singleton (literal keyValue)+            value = sCGNativeCollections+                      (literal ([keyValue, keyValue + 1] :: [Word16]))+                      (SS.fromList [keyValue + 2, keyValue + 3])+        cgReturn (writeArray source key value)++  (_, cfg, bundle) <- compileToCLib' "managedAggregateArrayLibrary"+    [ ("firstManagedArray",  component 1 20)+    , ("secondManagedArray", component 4 30)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "managedAggregateArrayLibrary"+  headerText <- readFile (dir </> "managedAggregateArrayLibrary.h")+  mapM_ (\fragment -> assertBool ("Expected managed aggregate-array library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "firstManagedArray(source)[0] =CGNativeCollections([0x0001U, 0x0002U, 0x0003U]"+    , "secondManagedArray(source)[0] =CGNativeCollections([0x0004U, 0x0005U, 0x0006U]"+    ]+  assertBool "Expected one reusable guarded aggregate-array ABI"+             ("SBVArrayOutput_9_set_3_u16_39_adt_SBVADT_x5f_CodeGenNativeCollections" `isInfixOf` headerText+           && "sbv_array_output_release_9_set_3_u16_39_adt_SBVADT_x5f_CodeGenNativeCollections" `isInfixOf` headerText)++-- | Exercise static and runtime-local finite tables containing text, lists,+-- sets, and ADTs with managed collection fields.+managedAggregateTables :: Assertion+managedAggregateTables = withSystemTempDirectory "sbv-managed-aggregate-tables" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 5]+        selector <- cgInput "selector" :: SBVCodeGen SWord8+        source   <- cgInput "source"   :: SBVCodeGen (SList Word16)+        let staticText :: SString+            staticText  = select [literal "zero", literal "one"] (literal "other") selector+            staticList  = select [literal ([1, 2] :: [Word16]), literal ([3, 4] :: [Word16])]+                                 (literal ([9] :: [Word16])) selector+            dynamicList = select [source, source SL.++ SL.singleton 9]+                                 (literal ([10] :: [Word16])) selector+            staticSet :: SSet Word16+            staticSet   = select [SS.fromList [1, 2], SS.fromList [3, 4]]+                                 (SS.singleton 9) selector+            firstADT    = sCGNativeCollections source (SS.singleton 20)+            secondADT   = sCGNativeCollections (source SL.++ SL.singleton 21) (SS.fromList [22, 23])+            selectedADT = select [firstADT, secondADT] (sCGNativeCollections SL.nil SS.empty) selector+        cgOutput "staticText" staticText+        cgOutput "staticList" staticList+        cgOutput "dynamicList" dynamicList+        cgOutput "staticSet" staticSet+        cgOutput "selectedADT" selectedADT+        cgReturn selectedADT++  stdoutText <- compileProgramAndRunGenerated dir "managedAggregateTables" program+  sourceText <- readFile (dir </> "managedAggregateTables.c")+  mapM_ (\fragment -> assertBool ("Expected managed aggregate-table output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =CGNativeCollections([0x0005U, 0x0006U, 0x0007U, 0x0015U], {0x0016U, 0x0017U})"+    , "staticText =one"+    , "staticList =[0x0003U, 0x0004U]"+    , "dynamicList =[0x0005U, 0x0006U, 0x0007U, 0x0009U]"+    , "staticSet ={0x0003U, 0x0004U}"+    , "selectedADT =CGNativeCollections([0x0005U, 0x0006U, 0x0007U, 0x0015U], {0x0016U, 0x0017U})"+    ]+  assertBool "Expected ready aggregates to use automatic tables and dynamic entries to remain guarded"+             (    "const SString table" `isInfixOf` sourceText+              && "const SBVList_u16 table" `isInfixOf` sourceText+              && "const SBVSet_u16 table" `isInfixOf` sourceText+              && "switch((uint64_t)" `isInfixOf` sourceText+              && not ("static const SString table" `isInfixOf` sourceText)+              && not ("static const SBVList_u16 table" `isInfixOf` sourceText)+              && not ("static const SBVSet_u16 table" `isInfixOf` sourceText)+              && not ("static const SBVADT_CodeGenNativeCollections table" `isInfixOf` sourceText)+             )++-- | Exercise finite tables whose cells and default are retained arrays, both+-- when entries are already demanded by earlier outputs and when the lookup+-- must initialize only the selected entry.+arrayValuedTables :: Bool -> Assertion+arrayValuedTables readyEntries = withSystemTempDirectory "sbv-array-valued-tables" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgPerformRTCs True+        cgSetDriverValues [1, 3]+        selector <- cgInput "selector" :: SBVCodeGen SWord8+        key      <- cgInput "key"      :: SBVCodeGen SWord8+        let first     = writeArray (constArray 10) key 11 :: SArray Word8 Word32+            second    = writeArray (constArray 20) key 21 :: SArray Word8 Word32+            fallback  = constArray 30                  :: SArray Word8 Word32+            selected  = select [first, second] fallback selector+            defaulted = select [first, second] fallback (selector + 2)+        when readyEntries $ do cgOutput "first" first+                               cgOutput "second" second+        cgOutput "selected" selected+        cgOutput "defaultValue" (readArray defaulted key)+        cgReturn (readArray selected key)++  stdoutText <- compileProgramAndRunGenerated dir "arrayValuedTables" program+  sourceText <- readFile (dir </> "arrayValuedTables.c")+  assertBool ("Expected the selected array value, received:\n" ++ stdoutText) ("0x00000015UL" `isInfixOf` stdoutText)+  assertBool ("Expected the out-of-range default array value, received:\n" ++ stdoutText) ("defaultValue = 0x0000001eUL" `isInfixOf` stdoutText)+  if readyEntries+     then assertBool ("Expected retained array-valued table storage, received:\n" ++ sourceText)+                     (    "SBVArrayOutput_2_u8_3_u32 * const table" `isInfixOf` sourceText+                      && "sbv_array_stored_export_2_u8_3_u32(&sbv_local_array_ctx" `isInfixOf` sourceText+                      && "sbv_local_array_descriptor_" `isInfixOf` sourceText+                     )+     else assertBool "Expected guarded array initialization followed by an owned output export"+                     (    "switch((uint64_t)" `isInfixOf` sourceText+                      && "sbv_array_export_2_u8_3_u32(" `isInfixOf` sourceText+                      && "sbv_local_array_s" `isInfixOf` sourceText+                     )++-- | Exercise managed finite-table results returned independently from+-- multiple generated library translation units.+managedAggregateTableLibrary :: Assertion+managedAggregateTableLibrary = withSystemTempDirectory "sbv-managed-aggregate-table-library" $ \dir -> do+  let component :: Integer -> Word16 -> SBVCodeGen ()+      component driverSeed base = do+        cgOverwriteFiles True+        cgSetDriverValues [driverSeed]+        selector <- cgInput "selector" :: SBVCodeGen SWord8+        cgReturn (select [ literal ([base, base + 1] :: [Word16])+                         , literal ([base + 2, base + 3] :: [Word16])+                         ] (literal ([] :: [Word16])) selector)++  (_, cfg, bundle) <- compileToCLib' "managedAggregateTableLibrary"+    [ ("firstManagedTable",  component 0 10)+    , ("secondManagedTable", component 1 20)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "managedAggregateTableLibrary"+  mapM_ (\fragment -> assertBool ("Expected managed aggregate-table library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "[0x000aU, 0x000bU]"+    , "[0x0016U, 0x0017U]"+    ]++-- | Exercise nested tuple inputs, construction, projection, conditionals,+-- tuple constants in finite tables, public outputs, and returns.+structuralTuples :: Assertion+structuralTuples = withSystemTempDirectory "sbv-structural-tuples" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [3, 0]+        source   <- cgInput "source"   :: SBVCodeGen (SBV (Word8, (Word16, Word32)))+        selector <- cgInput "selector" :: SBVCodeGen SWord8+        let (first, nested)   = untuple source+            (second, third)  = untuple nested+            rebuilt          = tuple (first + 1, tuple (second + 2, third + 3))+            alternate        = tuple (9, tuple (10, 11))+            selected         = select [rebuilt, alternate] alternate selector+            conditional      = ite (selector .== 0) rebuilt alternate+        cgOutput "selected" selected+        cgOutput "rounding" (tuple (sRTN, first))+        cgOutput "unit" (literal () :: SBV ())+        cgReturn conditional++  stdoutText <- compileProgramAndRunGenerated dir "structuralTuples" program+  mapM_ (\fragment -> assertBool ("Expected tuple output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "(4, (0x0006U, 0x00000008UL))"+    , "selected =(4, (0x0006U, 0x00000008UL))"+    , "rounding =(3, 3)"+    , "unit =()"+    ]++-- | Exercise guarded tuple declarations shared by multiple generated library+-- translation units and returned through the public by-value ABI.+structuralTupleLibrary :: Assertion+structuralTupleLibrary = withSystemTempDirectory "sbv-structural-tuple-library" $ \dir -> do+  let component :: Integer -> SBVCodeGen ()+      component increment = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        source <- cgInput "source" :: SBVCodeGen (SBV (Word8, Word16))+        let (first, second) = untuple source+        cgReturn (tuple (first + fromInteger increment, second + fromInteger increment))++  (_, cfg, bundle) <- compileToCLib' "structuralTupleLibrary"+    [ ("incrementTuple", component 1)+    , ("addTwoTuple",    component 2)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "structuralTupleLibrary"+  mapM_ (\fragment -> assertBool ("Expected tuple library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "(5, 0x0006U)"+    , "(6, 0x0007U)"+    ]++-- | Exercise borrowed nested tuple strings and independently owned tuple+-- outputs and returns.+ownedTextTuples :: Assertion+ownedTextTuples = withSystemTempDirectory "sbv-owned-text-tuples" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [4]+        source <- cgInput "source" :: SBVCodeGen (SBV (String, (String, Word8)))+        let (first, nested)  = untuple source+            (second, count) = untuple nested+            result          = tuple (first SL.++ literal ":" SL.++ second, tuple (second SL.++ literal "!", count + 1))+        cgOutput "sourceCopy" source+        cgOutput "result" result+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "ownedTextTuples" program+  headerText <- readFile (dir </> "ownedTextTuples.h")+  mapM_ (\fragment -> assertBool ("Expected owned text-tuple output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =(sbv4:sbv5, (sbv5!, 7))"+    , "sourceCopy =(sbv4, (sbv5, 6))"+    , "result =(sbv4:sbv5, (sbv5!, 7))"+    ]+  assertBool "Expected recursive string ownership in generated tuple helpers"+             ("sbv_string_clone(source.field1)" `isInfixOf` headerText+           && "sbv_string_release(&value->field1)" `isInfixOf` headerText)++-- | Exercise guarded string-tuple ownership helpers shared by multiple+-- generated library translation units.+ownedTextTupleLibrary :: Assertion+ownedTextTupleLibrary = withSystemTempDirectory "sbv-owned-text-tuple-library" $ \dir -> do+  let component suffix resultValue seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen SString+        cgReturn (tuple (source SL.++ suffix, literal resultValue :: SWord8))++  (_, cfg, bundle) <- compileToCLib' "ownedTextTupleLibrary"+    [ ("firstTextTuple",  component (literal "!") 9 4)+    , ("secondTextTuple", component (literal "?") 8 5)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "ownedTextTupleLibrary"+  mapM_ (\fragment -> assertBool ("Expected text-tuple library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "(sbv4!, 9)"+    , "(sbv5?, 8)"+    ]++-- | Exercise recursively nested tuple ownership across strings, exact-element+-- lists, and exact-element finite sets.+ownedCollectionTuples :: Assertion+ownedCollectionTuples = withSystemTempDirectory "sbv-owned-collection-tuples" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [10]+        source <- cgInput "source" :: SBVCodeGen (SBV (String, ([Integer], RCSet Rational)))+        let (prefix, nested)  = untuple source+            (values, members) = untuple nested+            result            = tuple (prefix SL.++ literal "!", tuple (values SL.++ literal ([14] :: [Integer]), SS.insert 15 members))+        cgOutput "sourceCopy" source+        cgOutput "result" result+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "ownedCollectionTuples" program+  headerText <- readFile (dir </> "ownedCollectionTuples.h")+  mapM_ (\fragment -> assertBool ("Expected owned collection-tuple output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =(sbv10!, ([11, 12, 13, 14], {12, 13, 14, 15}))"+    , "sourceCopy =(sbv10, ([11, 12, 13], {12, 13, 14}))"+    , "result =(sbv10!, ([11, 12, 13, 14], {12, 13, 14, 15}))"+    ]+  assertBool "Expected recursive collection ownership in generated tuple helpers"+             ("sbv_list_clone_integer(source.field1)" `isInfixOf` headerText+           && "sbv_list_release_integer(&value->field1)" `isInfixOf` headerText+           && "sbv_set_clone_rational(source.field2)" `isInfixOf` headerText+           && "sbv_set_release_rational(&value->field2)" `isInfixOf` headerText)++-- | Exercise guarded collection-tuple declarations and exact-element+-- ownership helpers shared by multiple generated library translation units.+ownedCollectionTupleLibrary :: Assertion+ownedCollectionTupleLibrary = withSystemTempDirectory "sbv-owned-collection-tuple-library" $ \dir -> do+  let component :: Integer -> Integer -> SBVCodeGen ()+      component seed extra = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen (SBV ([Integer], RCSet Rational))+        let (values, members) = untuple source+        cgReturn (tuple (values SL.++ literal [extra], SS.insert (fromInteger extra) members))++  (_, cfg, bundle) <- compileToCLib' "ownedCollectionTupleLibrary"+    [ ("firstCollectionTuple",  component 3 9)+    , ("secondCollectionTuple", component 5 10)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "ownedCollectionTupleLibrary"+  mapM_ (\fragment -> assertBool ("Expected collection-tuple library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "([3, 4, 5, 9], {4, 5, 6, 9})"+    , "([5, 6, 7, 10], {6, 7, 8, 10})"+    ]++-- | Exercise sequence and finite-set operations over recursively nested,+-- by-value tuple elements and return both descriptors through an owned tuple.+tupleValuedCollections :: Assertion+tupleValuedCollections = withSystemTempDirectory "sbv-tuple-valued-collections" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 4]+        values  <- cgInput "values"  :: SBVCodeGen (SList (Word16, Word8))+        members <- cgInput "members" :: SBVCodeGen (SSet (Word16, Word8))+        let extra    = tuple (literal 9 :: SWord16, literal 10 :: SWord8)+            joined   = values SL.++ SL.singleton extra+            inserted = SS.insert extra members+        cgOutput "listSameObject" (values .=== values)+        cgOutput "containsExtra" (extra `SS.member` inserted)+        cgOutput "joined" joined+        cgOutput "inserted" inserted+        cgReturn (tuple (joined, inserted))++  stdoutText <- compileProgramAndRunGenerated dir "tupleValuedCollections" program+  headerText <- readFile (dir </> "tupleValuedCollections.h")+  mapM_ (\fragment -> assertBool ("Expected tuple-valued collection output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "listSameObject = 1"+    , "containsExtra = 1"+    , "joined =[(0x0001U, 2), (0x0002U, 3), (0x0003U, 4), (0x0009U, 10)]"+    , "inserted ={(0x0004U, 5), (0x0005U, 6), (0x0006U, 7), (0x0009U, 10)}"+    ]+  assertBool "Expected tuple forward declarations before collection descriptors"+             ("typedef struct SBVTuple_" `isInfixOf` headerText+           && "const SBVTuple_" `isInfixOf` headerText)++-- | Exercise guarded tuple-element list and set descriptors shared by+-- multiple generated library translation units.+tupleValuedCollectionLibrary :: Assertion+tupleValuedCollectionLibrary = withSystemTempDirectory "sbv-tuple-valued-collection-library" $ \dir -> do+  let component :: Integer -> Word16 -> Word8 -> SBVCodeGen ()+      component seed first second = do+        cgOverwriteFiles True+        cgSetDriverValues [seed, seed + 3]+        values  <- cgInput "values"  :: SBVCodeGen (SList (Word16, Word8))+        members <- cgInput "members" :: SBVCodeGen (SSet (Word16, Word8))+        let extra = tuple (literal first, literal second)+        cgReturn (tuple (values SL.++ SL.singleton extra, SS.insert extra members))++  (_, cfg, bundle) <- compileToCLib' "tupleValuedCollectionLibrary"+    [ ("firstTupleCollections",  component 1 9 10)+    , ("secondTupleCollections", component 2 10 11)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "tupleValuedCollectionLibrary"+  mapM_ (\fragment -> assertBool ("Expected tuple-valued collection library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "[(0x0001U, 2), (0x0002U, 3), (0x0003U, 4), (0x0009U, 10)]"+    , "[(0x0002U, 3), (0x0003U, 4), (0x0004U, 5), (0x000aU, 11)]"+    ]++-- | Exercise deep ownership and structural equality for collection elements+-- that are tuples containing strings, exact values, and nested collections.+managedTupleValuedCollections :: Assertion+managedTupleValuedCollections = withSystemTempDirectory "sbv-managed-tuple-valued-collections" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 4, 7]+        values  <- cgInput "values"  :: SBVCodeGen (SList (String, Integer))+        members <- cgInput "members" :: SBVCodeGen (SSet (String, Integer))+        nested  <- cgInput "nested"  :: SBVCodeGen (SList ([Integer], RCSet Rational))+        let extra       = tuple (literal "extra" :: SString, literal 9 :: SInteger)+            nestedExtra = tuple (literal ([9, 10] :: [Integer]), SS.singleton (literal 11 :: SRational))+            joined      = values SL.++ SL.singleton extra+            inserted    = SS.insert extra members+            nestedJoin  = nested SL.++ SL.singleton nestedExtra+        cgOutput "listSameObject" (values .=== values)+        cgOutput "nestedSameObject" (nested .=== nested)+        cgOutput "containsExtra" (extra `SS.member` inserted)+        cgOutput "joined" joined+        cgOutput "inserted" inserted+        cgOutput "nestedJoin" nestedJoin+        cgReturn (tuple (joined, tuple (inserted, nestedJoin)))++  stdoutText <- compileProgramAndRunGenerated dir "managedTupleValuedCollections" program+  headerText <- readFile (dir </> "managedTupleValuedCollections.h")+  mapM_ (\fragment -> assertBool ("Expected managed tuple-valued collection output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "listSameObject = 1"+    , "nestedSameObject = 1"+    , "containsExtra = 1"+    , "joined =[(sbv1, 2), (sbv2, 3), (sbv3, 4), (extra, 9)]"+    , "inserted ={(sbv4, 5), (sbv5, 6), (sbv6, 7), (extra, 9)}"+    , "([9, 10], {11})"+    ]+  assertBool "Expected collection ownership to recurse through managed tuple elements"+             ("sbv_tuple_owned_clone_" `isInfixOf` headerText+           && "sbv_tuple_owned_release_" `isInfixOf` headerText+           && "sbv_string_clone(source.field1)" `isInfixOf` headerText+           && "sbv_list_clone_integer(source.field1)" `isInfixOf` headerText+           && "sbv_set_clone_rational(source.field2)" `isInfixOf` headerText)++-- | Exercise guarded ownership helpers for managed tuple-valued collections+-- shared by multiple generated library translation units.+managedTupleValuedCollectionLibrary :: Assertion+managedTupleValuedCollectionLibrary = withSystemTempDirectory "sbv-managed-tuple-valued-collection-library" $ \dir -> do+  let component :: Integer -> String -> Integer -> SBVCodeGen ()+      component seed textValue extraValue = do+        cgOverwriteFiles True+        cgSetDriverValues [seed, seed + 3]+        values  <- cgInput "values"  :: SBVCodeGen (SList (String, Integer))+        members <- cgInput "members" :: SBVCodeGen (SSet (String, Integer))+        let extra = tuple (literal textValue :: SString, literal extraValue :: SInteger)+        cgReturn (tuple (values SL.++ SL.singleton extra, SS.insert extra members))++  (_, cfg, bundle) <- compileToCLib' "managedTupleValuedCollectionLibrary"+    [ ("firstManagedTupleCollections",  component 1 "first" 9)+    , ("secondManagedTupleCollections", component 2 "second" 10)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "managedTupleValuedCollectionLibrary"+  mapM_ (\fragment -> assertBool ("Expected managed tuple-valued collection library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "[(sbv1, 2), (sbv2, 3), (sbv3, 4), (first, 9)]"+    , "[(sbv2, 3), (sbv3, 4), (sbv4, 5), (second, 10)]"+    ]++-- | Exercise string-valued symbolic collections and ADTs with direct string,+-- list-of-string, and set-of-string fields through operations and owned ABI+-- results.+textAggregateCollections :: Assertion+textAggregateCollections = withSystemTempDirectory "sbv-text-aggregate-collections" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 4, 6]+        values  <- cgInput "values"  :: SBVCodeGen (SList String)+        members <- cgInput "members" :: SBVCodeGen (SSet String)+        source  <- cgInput "source"  :: SBVCodeGen SCodeGenText+        let extra         = literal "extra" :: SString+            sourceName    = getCGText_1 source+            sourceValues  = getCGText_2 source+            sourceMembers = getCGText_3 source+            joined        = values SL.++ SL.singleton extra+            inserted      = SS.insert extra members+            result        = sCGText+                              (sourceName SL.++ literal "!")+                              (sourceValues SL.++ SL.singleton extra)+                              (SS.insert extra sourceMembers)+        cgOutput "sameValues" (values .=== values)+        cgOutput "sameMembers" (members .=== members)+        cgOutput "sameSource" (source .== source)+        cgOutput "containsExtra" (extra `SS.member` inserted)+        cgOutput "joined" joined+        cgOutput "inserted" inserted+        cgOutput "result" result+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "textAggregateCollections" program+  headerText <- readFile (dir </> "textAggregateCollections.h")+  mapM_ (\fragment -> assertBool ("Expected text-aggregate output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "sameValues = 1"+    , "sameMembers = 1"+    , "sameSource = 1"+    , "containsExtra = 1"+    , "joined =[sbv1, sbv2, sbv3, extra]"+    , "inserted ={sbv4, sbv5, sbv6, extra}"+    , "CGText(sbv6!, [sbv7, sbv8, sbv9, extra], {sbv8, sbv9, sbv10, extra})"+    ]+  assertBool "Expected ownership to recurse through direct and collection text fields"+             (    "struct SBVList_string { const SString *data; size_t length; };" `isInfixOf` headerText+              && "struct SBVSet_string { const SString *data; size_t length; bool is_complement; };" `isInfixOf` headerText+              && "sbv_string_clone(source.payload.constructor1.field1)" `isInfixOf` headerText+              && "sbv_string_release(&value->payload.constructor1.field1)" `isInfixOf` headerText+              && "sbv_list_clone_string(source.payload.constructor1.field2)" `isInfixOf` headerText+              && "sbv_set_clone_string(source.payload.constructor1.field3)" `isInfixOf` headerText+             )++-- | Exercise independently owned text-containing ADT results emitted by+-- multiple generated library translation units.+textAggregateLibrary :: Assertion+textAggregateLibrary = withSystemTempDirectory "sbv-text-aggregate-library" $ \dir -> do+  let component :: Integer -> SBVCodeGen ()+      component seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen SCodeGenText+        cgReturn source++  (_, cfg, bundle) <- compileToCLib' "textAggregateLibrary"+    [ ("firstTextAggregate",  component 2)+    , ("secondTextAggregate", component 4)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "textAggregateLibrary"+  mapM_ (\fragment -> assertBool ("Expected text-aggregate library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "CGText(sbv2, [sbv3, sbv4, sbv5], {sbv4, sbv5, sbv6})"+    , "CGText(sbv4, [sbv5, sbv6, sbv7], {sbv6, sbv7, sbv8})"+    ]++-- | Exercise every direct list/set nesting pair admitted by SBV through+-- symbolic operations, printing, and recursively owned tuple outputs and+-- returns. Sets of sets are not SBV values because 'RCSet' has no 'Ord'+-- instance.+directlyNestedCollections :: Assertion+directlyNestedCollections = withSystemTempDirectory "sbv-directly-nested-collections" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 2, 4]+        nestedLists <- cgInput "nestedLists" :: SBVCodeGen (SList [Word16])+        listOfSets  <- cgInput "listOfSets"  :: SBVCodeGen (SList (RCSet Word16))+        setOfLists  <- cgInput "setOfLists"  :: SBVCodeGen (SSet [Word16])+        let extraList     = literal ([90, 91] :: [Word16])+            extraSet      = SS.fromList [92, 93] :: SSet Word16+            joinedLists   = nestedLists SL.++ SL.singleton extraList+            joinedSets    = listOfSets SL.++ SL.singleton extraSet+            insertedLists = SS.insert extraList setOfLists+            result        = tuple (joinedLists, tuple (joinedSets, insertedLists))+        cgOutput "sameNestedLists" (nestedLists .=== nestedLists)+        cgOutput "sameListOfSets" (listOfSets .=== listOfSets)+        cgOutput "sameSetOfLists" (setOfLists .=== setOfLists)+        cgOutput "joinedLists" joinedLists+        cgOutput "joinedSets" joinedSets+        cgOutput "insertedLists" insertedLists+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "directlyNestedCollections" program+  headerText <- readFile (dir </> "directlyNestedCollections.h")+  mapM_ (\fragment -> assertBool ("Expected directly nested collection output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "sameNestedLists = 1"+    , "sameListOfSets = 1"+    , "sameSetOfLists = 1"+    , "[0x005aU, 0x005bU]"+    , "{0x005cU, 0x005dU}"+    ]+  assertBool "Expected mutually forward-declared descriptors and recursive ownership helpers"+             (    "typedef struct SBVList_u16 SBVList_u16;" `isInfixOf` headerText+              && "typedef struct SBVSet_u16 SBVSet_u16;" `isInfixOf` headerText+              && "struct SBVList_set_3_u16 { const SBVSet_u16 *data; size_t length; };" `isInfixOf` headerText+              && "struct SBVSet_list_3_u16 { const SBVList_u16 *data; size_t length; bool is_complement; };" `isInfixOf` headerText+              && "sbv_list_clone_list_3_u16" `isInfixOf` headerText+              && "sbv_list_clone_set_3_u16" `isInfixOf` headerText+              && "sbv_set_clone_list_3_u16" `isInfixOf` headerText+             )++-- | Exercise independently owned list-of-set results emitted by multiple+-- generated library translation units.+directlyNestedCollectionLibrary :: Assertion+directlyNestedCollectionLibrary = withSystemTempDirectory "sbv-directly-nested-collection-library" $ \dir -> do+  let component :: Integer -> Word16 -> SBVCodeGen ()+      component seed extra = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        values <- cgInput "values" :: SBVCodeGen (SList (RCSet Word16))+        cgReturn (values SL.++ SL.singleton (SS.fromList [extra, extra + 1]))++  (_, cfg, bundle) <- compileToCLib' "directlyNestedCollectionLibrary"+    [ ("firstNestedCollection",  component 2 90)+    , ("secondNestedCollection", component 4 92)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "directlyNestedCollectionLibrary"+  mapM_ (\fragment -> assertBool ("Expected nested-collection library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "{0x005aU, 0x005bU}"+    , "{0x005cU, 0x005dU}"+    ]++-- | Exercise lists and sets whose elements are managed or recursive ADTs,+-- including deep ownership and both symbolic equality modes.+adtValuedCollections :: Assertion+adtValuedCollections = withSystemTempDirectory "sbv-adt-valued-collections" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 2, 4]+        values <- cgInput "values" :: SBVCodeGen (SList CodeGenCollections)+        trees  <- cgInput "trees"  :: SBVCodeGen (SSet CodeGenTree)+        colors <- cgInput "colors" :: SBVCodeGen (SSet CodeGenEnum)+        let extraValue = sCGCollections+                           (literal ([9, 10] :: [Integer]))+                           (SS.singleton (literal 11 :: SRational))+                           (tuple (literal ([12] :: [Integer]), SS.singleton (literal 13 :: SRational)))+            extraTree  = sCGLeaf 99+            joined     = values SL.++ SL.singleton extraValue+            inserted   = SS.insert extraTree trees+            colored    = SS.insert sCGBlue colors+            allColors  = SS.fromList [CGRed, CGGreen, CGBlue]+        cgOutput "sameValues" (values .=== values)+        cgOutput "containsExtraTree" (extraTree `SS.member` inserted)+        cgOutput "containsBlue" (sCGBlue `SS.member` colored)+        cgOutput "sameColorUniverse" (allColors .== (SS.full :: SSet CodeGenEnum))+        cgOutput "joined" joined+        cgOutput "inserted" inserted+        cgOutput "colored" colored+        cgReturn (tuple (joined, inserted))++  stdoutText <- compileProgramAndRunGenerated dir "adtValuedCollections" program+  headerText <- readFile (dir </> "adtValuedCollections.h")+  sourceText <- readFile (dir </> "adtValuedCollections.c")+  mapM_ (\fragment -> assertBool ("Expected ADT-valued collection output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "sameValues = 1"+    , "containsExtraTree = 1"+    , "containsBlue = 1"+    , "sameColorUniverse = 1"+    , "CGCollections([9, 10], {11}, ([12], {13}))"+    , "CGLeaf(99)"+    , "CGBlue"+    ]+  assertBool "Expected ADT forward declarations before collection descriptors"+             ("typedef struct SBVADT_CodeGenCollections SBVADT_CodeGenCollections;" `isInfixOf` headerText+           && "const SBVADT_CodeGenCollections *data" `isInfixOf` headerText)+  assertBool "Expected collection ownership and equality to dispatch through ADT helpers"+             ("sbv_adt_owned_clone_SBVADT_CodeGenCollections" `isInfixOf` headerText+           && "sbv_adt_owned_release_SBVADT_CodeGenTree" `isInfixOf` headerText+           && "sbv_adt_object_equal_SBVADT_CodeGenCollections" `isInfixOf` sourceText+           && "sbv_adt_equal_SBVADT_CodeGenTree" `isInfixOf` sourceText)++-- | Exercise guarded recursive-ADT collection helpers shared by multiple+-- generated library translation units.+adtValuedCollectionLibrary :: Assertion+adtValuedCollectionLibrary = withSystemTempDirectory "sbv-adt-valued-collection-library" $ \dir -> do+  let component :: Integer -> Word8 -> SBVCodeGen ()+      component seed extraValue = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        values <- cgInput "values" :: SBVCodeGen (SList CodeGenTree)+        cgReturn (values SL.++ SL.singleton (sCGLeaf (literal extraValue)))++  (_, cfg, bundle) <- compileToCLib' "adtValuedCollectionLibrary"+    [ ("firstADTCollections",  component 1 98)+    , ("secondADTCollections", component 2 99)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "adtValuedCollectionLibrary"+  mapM_ (\fragment -> assertBool ("Expected ADT-valued collection library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "CGLeaf(98)"+    , "CGLeaf(99)"+    ]++-- | Exercise parameter substitution, constructors, tests, accessors,+-- structural equality, constants, tables, public outputs, and returns.+nonRecursiveADTs :: Assertion+nonRecursiveADTs = withSystemTempDirectory "sbv-non-recursive-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2, 1, 0, 1]+        source   <- cgInput "source"   :: SBVCodeGen (SCodeGenADT Word8)+        choose   <- cgInput "choose"   :: SBVCodeGen SBool+        selector <- cgInput "selector" :: SBVCodeGen SWord8+        color    <- cgInput "color"    :: SBVCodeGen SCodeGenEnum+        let first       = getCGPair_1 source+            second      = getCGPair_2 source+            constructed = ite choose (sCGPair (first + 1) (second + 1)) (sCGOne first)+            constant    = literal (CGPair 9 10)+            selected    = select [source, constructed, constant] sCGEmpty selector+        cgOutput "sourceCopy" source+        cgOutput "constructed" constructed+        cgOutput "constant" constant+        cgOutput "isPair" (isCGPair source)+        cgOutput "sameValue" (source .== literal (CGPair 2 3))+        cgOutput "colorBeforeBlue" (color .< sCGBlue)+        cgReturn selected++  stdoutText <- compileProgramAndRunGenerated dir "nonRecursiveADTs" program+  mapM_ (\fragment -> assertBool ("Expected ADT output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "CGPair(2, 0x0003U)"+    , "constructed =CGPair(3, 0x0004U)"+    , "constant =CGPair(9, 0x000aU)"+    , "isPair = 1"+    , "sameValue = 1"+    , "colorBeforeBlue = 1"+    ]++-- | Exercise an acyclic parameterized 'KApp' reference through construction,+-- access, structural equality against a literal, and the public return ABI.+nestedADTs :: Assertion+nestedADTs = withSystemTempDirectory "sbv-nested-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        source <- cgInput "source" :: SBVCodeGen (SCodeGenEnvelope Word8)+        let inner  = getCGEnvelope_1 source+            result = sCGEnvelope (sCGOne (getCGOne_1 inner + 3))+        cgOutput "sameValue" (source .== literal (CGEnvelope (CGOne 1)))+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "nestedADTs" program+  headerText <- readFile (dir </> "nestedADTs.h")+  mapM_ (\fragment -> assertBool ("Expected nested ADT output to contain " ++ fragment+                               ++ ", received:\n" ++ stdoutText)+                               (fragment `isInfixOf` stdoutText))+    [ "CGEnvelope(CGOne(4))"+    , "sameValue = 1"+    ]+  assertBool "Expected the concrete Word8 inner ADT declaration"+             ("SBVADT_CodeGenADT_2_u8" `isInfixOf` headerText)+  assertBool "Unexpected placeholder Integer ADT declaration"+             (not ("SBVADT_CodeGenADT_7_integer" `isInfixOf` headerText))++-- | Exercise guarded ADT declarations shared by multiple generated library+-- translation units and returned through the public by-value ABI.+nonRecursiveADTLibrary :: Assertion+nonRecursiveADTLibrary = withSystemTempDirectory "sbv-non-recursive-adt-library" $ \dir -> do+  let component :: Word8 -> SBVCodeGen ()+      component increment = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        source <- cgInput "source" :: SBVCodeGen (SCodeGenADT Word8)+        cgReturn (ite (isCGOne source) (sCGOne (getCGOne_1 source + literal increment)) sCGEmpty)++  (_, cfg, bundle) <- compileToCLib' "nonRecursiveADTLibrary"+    [ ("incrementADT", component 1)+    , ("addTwoADT",    component 2)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "nonRecursiveADTLibrary"+  mapM_ (\fragment -> assertBool ("Expected ADT library output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "CGOne(2)"+    , "CGOne(3)"+    ]++-- | Exercise direct and tuple-nested exact-element collections through ADT+-- construction, access, equality, outputs, and an independently owned return.+collectionADTs :: Assertion+collectionADTs = withSystemTempDirectory "sbv-collection-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        source <- cgInput "source" :: SBVCodeGen SCodeGenCollections+        let values                   = getCGCollections_1 source+            members                  = getCGCollections_2 source+            nested                   = getCGCollections_3 source+            (nestedValues, nestedSet) = untuple nested+            result                   = sCGCollections+                                         (values SL.++ literal ([4] :: [Integer]))+                                         (SS.insert 5 members)+                                         (tuple (nestedValues SL.++ literal ([6] :: [Integer]), SS.insert 7 nestedSet))+        cgOutput "sourceCopy" source+        cgOutput "sameValue" (source .== source)+        cgOutput "result" result+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "collectionADTs" program+  headerText <- readFile (dir </> "collectionADTs.h")+  mapM_ (\fragment -> assertBool ("Expected collection ADT output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ ") =CGCollections([1, 2, 3, 4], {2, 3, 4, 5}, ([3, 4, 5, 6], {4, 5, 6, 7}))"+    , "sourceCopy =CGCollections([1, 2, 3], {2, 3, 4}, ([3, 4, 5], {4, 5, 6}))"+    , "sameValue = 1"+    , "result =CGCollections([1, 2, 3, 4], {2, 3, 4, 5}, ([3, 4, 5, 6], {4, 5, 6, 7}))"+    ]+  assertBool "Expected direct and tuple-nested collection ownership in ADT helpers"+             ("sbv_list_clone_integer(source.payload.constructor2.field1)" `isInfixOf` headerText+           && "sbv_set_release_rational(&value->payload.constructor2.field2)" `isInfixOf` headerText+           && "sbv_tuple_owned_set_" `isInfixOf` headerText)++-- | Exercise recursive pointer ownership whose terminal constructor contains+-- exact-element list and set fields, including recursive structural equality.+recursiveCollectionADTs :: Assertion+recursiveCollectionADTs = withSystemTempDirectory "sbv-recursive-collection-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        source <- cgInput "source" :: SBVCodeGen SCodeGenCollectionTree+        cgOutput "sameTree" (source .== source)+        cgOutput "treeCopy" source+        cgReturn source++  stdoutText <- compileProgramAndRunGenerated dir "recursiveCollectionADTs" program+  sourceText <- readFile (dir </> "recursiveCollectionADTs.c")+  mapM_ (\fragment -> assertBool ("Expected recursive collection ADT output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "CGCollectionBranch(CGCollectionBranch("+    , "CGCollectionLeaf([1, 2, 3], {2, 3, 4})"+    , "sameTree = 1"+    ]+  assertBool "Expected private recursive equality to use collection semantics after their runtimes"+             ("sbv_list_integer_equal" `isInfixOf` sourceText+           && "sbv_set_rational_equal" `isInfixOf` sourceText)++-- | Exercise guarded collection-owning ADT helpers shared by multiple+-- generated library translation units.+collectionADTLibrary :: Assertion+collectionADTLibrary = withSystemTempDirectory "sbv-collection-adt-library" $ \dir -> do+  let component :: Integer -> SBVCodeGen ()+      component seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen SCodeGenNativeCollections+        cgReturn source++  (_, cfg, bundle) <- compileToCLib' "collectionADTLibrary"+    [ ("firstCollectionADT",  component 1)+    , ("secondCollectionADT", component 3)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "collectionADTLibrary"+  mapM_ (\fragment -> assertBool ("Expected collection ADT library output to contain " ++ show fragment ++ ", received:\n" ++ stdoutText)+                                (fragment `isInfixOf` stdoutText))+    [ "CGNativeCollections([0x0001U, 0x0002U, 0x0003U], {0x0002U, 0x0003U, 0x0004U})"+    , "CGNativeCollections([0x0003U, 0x0004U, 0x0005U], {0x0004U, 0x0005U, 0x0006U})"+    ]++-- | Exercise structural equality for ADTs instantiated with wide bit-vectors,+-- arbitrary floating-point formats, and native floating-point values.+adtAggregateEquality :: Assertion+adtAggregateEquality = withSystemTempDirectory "sbv-adt-aggregate-equality" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1, 1, 1, 1, 9, 9]+        wideLeft     <- cgInput "wideLeft"     :: SBVCodeGen (SCodeGenADT (WordN 673))+        wideRight    <- cgInput "wideRight"    :: SBVCodeGen (SCodeGenADT (WordN 673))+        floatLeft    <- cgInput "floatLeft"    :: SBVCodeGen (SCodeGenADT Float)+        floatRight   <- cgInput "floatRight"   :: SBVCodeGen (SCodeGenADT Float)+        integerLeft  <- cgInput "integerLeft"  :: SBVCodeGen SInteger+        integerRight <- cgInput "integerRight" :: SBVCodeGen SInteger+        cgOutput "wideEqual" (wideLeft .== wideRight)+        cgOutput "exactEqual" (sCGOne integerLeft .== sCGOne integerRight)+        cgReturn (floatLeft .=== floatRight)++  stdoutText <- compileProgramAndRunGenerated dir "adtAggregateEquality" program+  mapM_ (\fragment -> assertBool ("Expected aggregate equality output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText))+    [ "= 1"+    , "wideEqual = 1"+    , "exactEqual = 1"+    ]++  (_, _, arbitraryFPBundle) <- compileToC' "adtArbitraryFPEquality" $ do+    left  <- cgInput "left"  :: SBVCodeGen (SCodeGenADT (FloatingPoint 7 19))+    right <- cgInput "right" :: SBVCodeGen (SCodeGenADT (FloatingPoint 7 19))+    cgReturn (left .=== right)+  let generated = show arbitraryFPBundle+  assertBool "Expected a concrete arbitrary-float ADT declaration" ("SBVADT_CodeGenADT_9_fp_e7_s19" `isInfixOf` generated)+  assertBool "Expected arbitrary-float object equality in the ADT comparison" ("sbv_fp_e7_s19_obj_eq" `isInfixOf` generated)++-- | Exercise a recursive input layout, including a pointer-backed accessor and+-- a bounded generated-driver value.+recursiveADTs :: Assertion+recursiveADTs = withSystemTempDirectory "sbv-recursive-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        value <- cgInput "value" :: SBVCodeGen SCodeGenTree+        let left   = getCGNode_1 value+            result = sCGNode left (sCGLeaf 99)+        cgOutput "isNode" (isCGNode value)+        cgOutput "sameTree" (value .== value)+        cgOutput "sameTreeObject" (value .=== value)+        cgOutput "treeCopy" value+        cgReturn result++  stdoutText <- compileProgramAndRunGenerated dir "recursiveADTs" program+  headerText <- readFile (dir </> "recursiveADTs.h")+  sourceText <- readFile (dir </> "recursiveADTs.c")+  assertBool ("Expected the recursive driver to select a node, received:\n" ++ stdoutText)+             ("isNode = 1" `isInfixOf` stdoutText)+  assertBool ("Expected recursive structural equality, received:\n" ++ stdoutText)+             ("sameTree = 1" `isInfixOf` stdoutText)+  assertBool ("Expected recursive strong equality, received:\n" ++ stdoutText)+             ("sameTreeObject = 1" `isInfixOf` stdoutText)+  assertBool ("Expected a deeply owned recursive result, received:\n" ++ stdoutText)+             ("CGLeaf(99)" `isInfixOf` stdoutText)+  assertBool "Expected a forward-declared recursive ADT"+             ("typedef struct SBVADT_CodeGenTree SBVADT_CodeGenTree;" `isInfixOf` headerText)+  assertBool "Expected recursive fields to use pointers"+             ("SBVADT_CodeGenTree * field1;" `isInfixOf` headerText)+  assertBool "Expected recursive equality to reject null child pointers"+             ("== NULL) abort();" `isInfixOf` sourceText)++-- | Exercise transitive ownership when an acyclic ADT embeds a recursive ADT+-- by value.+wrappedRecursiveADTs :: Assertion+wrappedRecursiveADTs = withSystemTempDirectory "sbv-wrapped-recursive-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        value <- cgInput "value" :: SBVCodeGen SCodeGenForest+        cgOutput "sameForest" (value .== value)+        cgReturn value++  stdoutText <- compileProgramAndRunGenerated dir "wrappedRecursiveADTs" program+  headerText <- readFile (dir </> "wrappedRecursiveADTs.h")+  assertBool ("Expected the wrapped recursive value to survive an owned return, received:\n" ++ stdoutText)+             ("CGForest(CGNode" `isInfixOf` stdoutText)+  assertBool ("Expected wrapped recursive structural equality, received:\n" ++ stdoutText)+             ("sameForest = 1" `isInfixOf` stdoutText)+  assertBool "Expected an acyclic wrapper field to remain embedded by value"+             ("SBVADT_CodeGenTree field1;" `isInfixOf` headerText)++-- | Exercise mutually recursive layouts, bounded samples, equality, printing,+-- accessors, and deep-owned outputs and returns.+mutuallyRecursiveADTs :: Assertion+mutuallyRecursiveADTs = withSystemTempDirectory "sbv-mutually-recursive-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        value <- cgInput "value" :: SBVCodeGen SCodeGenOdd+        cgOutput "sameValue" (value .== value)+        cgOutput "valueCopy" value+        cgReturn (getCGOddStep_1 value)++  stdoutText <- compileProgramAndRunGenerated dir "mutuallyRecursiveADTs" program+  headerText <- readFile (dir </> "mutuallyRecursiveADTs.h")+  assertBool ("Expected mutually recursive structural equality, received:\n" ++ stdoutText)+             ("sameValue = 1" `isInfixOf` stdoutText)+  assertBool ("Expected mutually recursive values to print, received:\n" ++ stdoutText)+             ("CGOddStep(CGEven" `isInfixOf` stdoutText)+  assertBool "Expected the odd-to-even edge to use a pointer"+             ("SBVADT_CodeGenEven * field1;" `isInfixOf` headerText)+  assertBool "Expected the even-to-odd edge to use a pointer"+             ("SBVADT_CodeGenOdd * field1;" `isInfixOf` headerText)++-- | Exercise guarded recursive declarations and ownership helpers shared by+-- multiple generated library components.+recursiveADTLibrary :: Assertion+recursiveADTLibrary = withSystemTempDirectory "sbv-recursive-adt-library" $ \dir -> do+  let component :: Integer -> SBVCodeGen ()+      component seed = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        value <- cgInput "value" :: SBVCodeGen SCodeGenTree+        cgReturn value++  (_, cfg, bundle) <- compileToCLib' "recursiveADTLibrary"+    [ ("copyRecursiveLeaf", component 0)+    , ("copyRecursiveTree", component 1)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  stdoutText <- compileAndRunGenerated dir "recursiveADTLibrary"+  assertBool ("Expected recursive library results, received:\n" ++ stdoutText)+             ("CGLeaf" `isInfixOf` stdoutText && "CGNode" `isInfixOf` stdoutText)++-- | Check that bounded driver generation rejects recursive ADTs without any+-- finite constructor path.+uninhabitedRecursiveADT :: Assertion+uninhabitedRecursiveADT = do+  recursiveResult <- try (do+    (_, _, bundle) <- compileToC' "uninhabitedRecursiveADT" $ do+      value <- cgInput "value" :: SBVCodeGen SCodeGenLoop+      cgReturn (isCGLoop value)+    evaluate (length (show bundle))) :: IO (Either ErrorCall Int)+  case recursiveResult of+    Left exception -> assertBool ("Expected a finite-constructor diagnostic, received:\n" ++ displayException exception)+                                 ("has no finite constructor" `isInfixOf` displayException exception)+    Right _        -> assertBool "Expected driver generation to reject an uninhabited recursive ADT" False++-- | Generate, compile, and execute one standalone C program quietly in its+-- temporary directory.+compileProgramAndRunGenerated :: FilePath -> String -> SBVCodeGen () -> IO String+compileProgramAndRunGenerated dir executableName program = do+  (_, cfg, bundle) <- compileToC' executableName (program >> cgOverwriteFiles True)+  renderCgPgmBundle (Just dir) (cfg, bundle)+  compileAndRunGenerated dir executableName++-- | Extract linker-option lists from the Makefile entries in a generated C+-- bundle.+linkerFlags :: CgPgmBundle -> [[String]]+linkerFlags (CgPgmBundle _ files) = [flags | (_, (CgMakefile flags, _)) <- files]
+ SBVTestSuite/TestSuite/CodeGeneration/ExactNumbers.hs view
@@ -0,0 +1,667 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.ExactNumbers+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Compile-and-run tests for GMP-backed exact integer and real C lowering.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds         #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TemplateHaskell   #-}+{-# LANGUAGE TypeApplications  #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.ExactNumbers (tests) where++import Data.List                 (isInfixOf)+import Numeric                   (showHex)+import System.Environment        (lookupEnv)+import System.Exit               (ExitCode(..))+import System.FilePath           ((</>))+import System.IO.Temp            (withSystemTempDirectory)+import System.Process            (readProcessWithExitCode)+import Test.Tasty.HUnit          (assertBool, assertEqual)++import Data.SBV.Internals+import Data.SBV.Tuple (tuple, untuple)+import qualified Data.SBV.List as SL++import Utils.SBVTestFramework+import Utils.CCodeGen (generatedMakeOptions)++-- | An exact-number ADT nested inside 'ExactAggregate'.+data ExactLeaf = ExactLeaf Integer AlgReal deriving Show++-- | A sum type combining nested ADT and tuple ownership.+data ExactAggregate = ExactAbsent+                    | ExactAggregate ExactLeaf (Integer, AlgReal)+                    deriving Show++-- | A recursive exact-number ADT used to exercise combined heap and GMP+-- ownership.+data ExactChain = ExactEnd Integer | ExactNext Integer ExactChain deriving Show++-- | Generate symbolic interfaces for the exact-number ADTs.+mkSymbolic [''ExactLeaf, ''ExactAggregate, ''ExactChain]++-- | GMP-backed exact-number C backend tests.+tests :: TestTree+tests = testGroup "CodeGeneration.ExactNumbers"+  [ testCase "compile and execute unbounded arithmetic" exactIntegerArithmetic+  , testCase "compile and execute Euclidean division" exactIntegerDivision+  , testCase "preserve zero-divisor semantics across integer representations" integerZeroDivision+  , testCase "count exact decimal text without its terminator" exactDecimalText+  , testCase "compile and execute exact divisibility" exactIntegerDivisibility+  , testCase "compile and execute exact integer exponentiation" exactIntegerExponentiation+  , testCase "compile and execute native conversions" exactNativeConversions+  , testCase "reduce exact integers into native bit patterns" exactNativeBitPatterns+  , testCase "floor exact reals into mapped integers" exactRealMappedIntegers+  , testCase "compile and execute wide conversions" exactWideConversions+  , testCase "compile and execute wide real conversions" exactWideRealConversions+  , testCase "compile and execute rational arithmetic" exactRealArithmetic+  , testCase "compile and execute exact table lookup" exactTableLookup+  , testCase "do not alias narrowed unchecked exact table indices" uncheckedExactTableIndices+  , testCase "compile and execute exact array keys and values" exactArray+  , testCase "compile and execute an exact callback-backed array" exactArrayInput+  , testCase "compile and execute fixed exact input arrays" exactFixedInputArrays+  , testCase "compile and execute an exact structured lambda array" exactLambdaArray+  , testCase "compile and execute an exact structured lambda table" exactLambdaTable+  , testCase "return and output owned exact arrays" ownedExactArrays+  , testCase "use exact fields inside tuples" exactTupleFields+  , testCase "use owned exact tuples across the public ABI" ownedExactTuples+  , testCase "use owned exact ADTs across the public ABI" ownedExactADTs+  , testCase "use owned recursive exact ADTs across the public ABI" ownedRecursiveExactADTs+  , testCase "compile and execute an exact-number library" exactNumberLibrary+  ]++-- | Exercise arithmetic well beyond any native or wide fixed-width integer.+exactIntegerArithmetic :: Assertion+exactIntegerArithmetic = withSystemTempDirectory "sbv-exact-integer" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [x, y]+        a <- cgInput "a" :: SBVCodeGen SInteger+        b <- cgInput "b" :: SBVCodeGen SInteger+        let added     = a + b+            result    = abs (added * (a - b))+            bitResult = (added `xor` a) .&. complement b+            selected  = ite (a .> b) result (negate result)+        cgOutput "added" added+        cgOutput "bitResult" bitResult+        cgReturn selected+      x           = 2 ^ (700 :: Int) + 123456789+      y           = negate (2 ^ (511 :: Int)) + 987654321+      expected    = abs ((x + y) * (x - y))+      expectedBit = ((x + y) `xor` x) .&. complement y+  compileAndRunGMP dir "exactIntegerArithmetic" program [show expected, show (x + y), show expectedBit]++-- | Huge and negative integers cannot alias valid entries during conversion+-- to a machine index, even with optional runtime checks disabled.+uncheckedExactTableIndices :: Assertion+uncheckedExactTableIndices = mapM_ check [-1, 2 ^ (128 :: Int) + 1]+ where check index = withSystemTempDirectory "sbv-unchecked-exact-index" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgPerformRTCs False+               cgSetDriverValues [index]+               input <- cgInput "input" :: SBVCodeGen SInteger+               cgReturn (select [10, 11, 12] 99 input :: SWord8)+         compileAndRunGMP dir "uncheckedExactIndex" program ["= 99"]++-- | Exercise SMT-Lib Euclidean quotient and nonnegative remainder semantics.+exactIntegerDivision :: Assertion+exactIntegerDivision = withSystemTempDirectory "sbv-exact-integer-division" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [-20, -6]+        a <- cgInput "a" :: SBVCodeGen SInteger+        b <- cgInput "b" :: SBVCodeGen SInteger+        let quotient  = a `sEDiv` b+            remainder = a `sEMod` b+        cgOutput "quotient" quotient+        cgOutput "remainder" remainder+        cgReturn (quotient .== 4 .&& remainder .== 4)+  compileAndRunGMP dir "exactIntegerDivision" program ["= 1", "quotient =4", "remainder =4"]++-- | Raw Euclidean division uses SBV's concrete zero-divisor choice, whereas+-- public truncated quotient explicitly totalizes the same input to zero.+integerZeroDivision :: Assertion+integerZeroDivision = mapM_ check [Nothing, Just 8, Just 16, Just 32, Just 64]+ where check mapping = withSystemTempDirectory "sbv-integer-zero-division" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               maybe (pure ()) cgIntegerSize mapping+               cgSetDriverValues [7, 0]+               a <- cgInput "a" :: SBVCodeGen SInteger+               b <- cgInput "b" :: SBVCodeGen SInteger+               cgReturn $ a `sEDiv` b .== a .&& a `sEMod` b .== a .&& a `sQuot` b .== 0+         (_, generatedConfig, bundle) <- compileToC' "integerZeroDivision" program+         renderCgPgmBundle (Just dir) (generatedConfig, bundle)+         makeOptions <- generatedMakeOptions dir+         (buildExit, _, buildError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+         assertEqual buildError ExitSuccess buildExit+         (runExit, outputText, runError) <- readProcessWithExitCode (dir </> "integerZeroDivision_driver") [] ""+         assertEqual runError ExitSuccess runExit+         assertBool outputText ("= 1" `isInfixOf` outputText)++-- | GMP's decimal allocation bound can exceed the actual digit count by one.+exactDecimalText :: Assertion+exactDecimalText = mapM_ check [0, 1, 7, 8, 9, 10, 99, 100, 999, 1000, 2 ^ (257 :: Int)]+ where check value = withSystemTempDirectory "sbv-exact-decimal-text" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSetDriverValues [value]+               input <- cgInput "input" :: SBVCodeGen SInteger+               let rendered = SL.natToStr input+               cgReturn $ rendered .== literal (show value) .&& SL.length rendered .== literal (toInteger (length (show value)))+         compileAndRunGMP dir "exactDecimalText" program ["= 1"]++-- | Exercise exact divisibility with a divisor too large for any native C+-- integer, positive and negative multiples, and a neighboring non-multiple.+exactIntegerDivisibility :: Assertion+exactIntegerDivisibility = withSystemTempDirectory "sbv-exact-integer-divisibility" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [divisor * 7, negate (divisor * 3), divisor * 5 + 1]+        positive    <- cgInput "positive"    :: SBVCodeGen SInteger+        negative    <- cgInput "negative"    :: SBVCodeGen SInteger+        nonMultiple <- cgInput "nonMultiple" :: SBVCodeGen SInteger+        cgReturn $ sDivides divisor positive+               .&& sDivides divisor negative+               .&& sNot (sDivides divisor nonMultiple)+      divisor = 2 ^ (257 :: Int) + 93+  compileAndRunGMP dir "exactIntegerDivisibility" program ["= 1"]++-- | Exercise symbolic exact integer exponentiation, including zero and+-- negative exponents with the SMT-LIB integer-power semantics.+exactIntegerExponentiation :: Assertion+exactIntegerExponentiation = withSystemTempDirectory "sbv-exact-integer-exponentiation" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2, 200, -1, -3, 0, 0]+        base             <- cgInput "base"             :: SBVCodeGen SInteger+        exponentValue    <- cgInput "exponent"         :: SBVCodeGen SInteger+        negativeUnit     <- cgInput "negativeUnit"     :: SBVCodeGen SInteger+        negativeExponent <- cgInput "negativeExponent" :: SBVCodeGen SInteger+        zeroBase         <- cgInput "zeroBase"         :: SBVCodeGen SInteger+        zeroExponent     <- cgInput "zeroExponent"     :: SBVCodeGen SInteger+        cgReturn $ base         .** exponentValue            .== 2 ^ (200 :: Int)+               .&& negativeUnit .** negativeExponent       .== -1+               .&& negativeUnit .** (negativeExponent + 1) .== 1+               .&& base         .** negativeExponent       .== 0+               .&& zeroBase     .** negativeExponent       .== 0+               .&& zeroBase     .** zeroExponent           .== 1+  compileAndRunGMP dir "exactIntegerExponentiation" program ["= 1"]++-- | Exercise exact conversions to and from native signed and unsigned words.+exactNativeConversions :: Assertion+exactNativeConversions = withSystemTempDirectory "sbv-exact-native-conversions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [maxWord, minInt]+        unsignedValue <- cgInput "unsignedValue" :: SBVCodeGen SWord64+        signedValue   <- cgInput "signedValue"   :: SBVCodeGen SInt64+        let exactUnsigned = sFromIntegral unsignedValue :: SInteger+            exactSigned   = sFromIntegral signedValue :: SInteger+            wrapped       = sFromIntegral (exactUnsigned + 1) :: SWord64+            asReal        = sFromIntegral signedValue :: SReal+        cgOutput "wrapped" wrapped+        cgOutput "asReal" asReal+        cgReturn (exactUnsigned + exactSigned)+      maxWord  = 2 ^ (64 :: Int) - 1+      minInt   = negate (2 ^ (63 :: Int))+      expected = 2 ^ (63 :: Int) - 1 :: Integer+  compileAndRunGMP dir "exactNativeConversions" program [show expected, "wrapped = 0x0000000000000000ULL", "asReal =-9223372036854775808"]++-- | Narrowing an exact integer preserves low bits, including the one-bit+-- representation. Signed results interpret those bits as two's complement.+exactNativeBitPatterns :: Assertion+exactNativeBitPatterns = mapM_ check [2, 3, -2, -129, 2 ^ (180 :: Int) + 32768]+ where check sample = withSystemTempDirectory "sbv-exact-native-bits" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgSetDriverValues [sample]+               value <- cgInput "value" :: SBVCodeGen SInteger+               cgReturn $ sAnd+                 [ (sFromIntegral value :: SWord 1) .== fromInteger sample+                 , (sFromIntegral value :: SInt8)   .== fromInteger sample+                 , (sFromIntegral value :: SInt16)  .== fromInteger sample+                 , (sFromIntegral value :: SInt32)  .== fromInteger sample+                 , (sFromIntegral value :: SInt64)  .== fromInteger sample+                 ]+         compileAndRunGMP dir "exactNativeBits" program ["= 1"]++-- | Flooring a GMP real into a mapped integer first rounds exactly, then+-- reduces modulo the requested width, even far outside the native range.+exactRealMappedIntegers :: Assertion+exactRealMappedIntegers = mapM_ check [(width, sample) | width <- [8, 16, 32, 64], sample <- [-huge, huge]]+ where huge = 2 ^ (180 :: Int) + 5++       check (width, sample) = withSystemTempDirectory "sbv-exact-real-mapped-integer" $ \dir -> do+         let program = do+               cgOverwriteFiles True+               cgIntegerSize width+               cgSetDriverValues [sample]+               value <- cgInput "value" :: SBVCodeGen SReal+               cgReturn (sRealToSIntegerFloor (value / 3) .== fromInteger (sample `div` 3))+         compileAndRunGMP dir "exactRealMappedInteger" program ["= 1"]++-- | Exercise signed and unsigned conversions between GMP integers and+-- limb-backed bit-vectors in both directions.+exactWideConversions :: Assertion+exactWideConversions = withSystemTempDirectory "sbv-exact-wide-conversions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [unsignedSample, signedSample, exactSample]+        unsignedValue <- cgInput "unsignedValue" :: SBVCodeGen (SWord 673)+        signedValue   <- cgInput "signedValue"   :: SBVCodeGen (SInt 673)+        exactValue    <- cgInput "exactValue"    :: SBVCodeGen SInteger+        let exactUnsigned     = sFromIntegral unsignedValue :: SInteger+            exactSigned       = sFromIntegral signedValue :: SInteger+            unsignedRoundTrip = (sFromIntegral exactUnsigned :: SWord 673) .== unsignedValue+            signedRoundTrip   = (sFromIntegral exactSigned :: SInt 673) .== signedValue+            wrappedUnsigned   = sFromIntegral exactValue :: SWord 673+            wrappedSigned     = sFromIntegral exactValue :: SInt 673+        cgOutput "unsignedRoundTrip" unsignedRoundTrip+        cgOutput "signedRoundTrip" signedRoundTrip+        cgOutput "wrappedUnsigned" wrappedUnsigned+        cgOutput "wrappedSigned" wrappedSigned+        cgReturn (exactUnsigned + exactSigned)+      unsignedSample = 2 ^ (672 :: Int) + 0x123456789abcdef+      signedSample   = negate (2 ^ (671 :: Int)) + 0xfedcba987654321+      exactSample    = negate (2 ^ (700 :: Int)) + 0x112233445566778899+      expected       = unsignedSample + signedSample+      wrapped        = exactSample `mod` 2 ^ (673 :: Int)+  compileAndRunGMP dir "exactWideConversions" program+    [ show expected+    , "unsignedRoundTrip = 1"+    , "signedRoundTrip = 1"+    , "wrappedUnsigned =" ++ asHex 11 wrapped+    , "wrappedSigned =" ++ asHex 11 wrapped+    ]++-- | Exercise exact conversion of signed and unsigned limb-backed values to+-- rational reals, followed by explicit floor and truncation back to wide+-- bit-vectors through 'SInteger'.+exactWideRealConversions :: Assertion+exactWideRealConversions = withSystemTempDirectory "sbv-exact-wide-real-conversions" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [unsignedSample, signedSample]+        unsignedValue <- cgInput "unsignedValue" :: SBVCodeGen (SWord 673)+        signedValue   <- cgInput "signedValue"   :: SBVCodeGen (SInt 673)+        let unsignedReal = sFromIntegral unsignedValue :: SReal+            signedReal   = sFromIntegral signedValue :: SReal+            fraction     = signedReal / 3+            floorWide    = sFromIntegral (sRealToSIntegerFloor fraction) :: SInt 673+            truncateWide = sFromIntegral (sRealToSIntegerTruncate fraction) :: SInt 673+        cgOutput "unsignedReal" unsignedReal+        cgOutput "signedReal" signedReal+        cgOutput "fraction" fraction+        cgOutput "floorWide" floorWide+        cgOutput "truncateWide" truncateWide+        cgReturn (unsignedReal + signedReal)+      unsignedSample = 2 ^ (672 :: Int) + 0x123456789abcdef+      signedSample   = negate (2 ^ (671 :: Int)) + 0xfedcba987654321+      floorResult    = signedSample `div` 3+      truncateResult = signedSample `quot` 3+      modulus        = 2 ^ (673 :: Int)+  compileAndRunGMP dir "exactWideRealConversions" program+    [ show (unsignedSample + signedSample)+    , "unsignedReal =" ++ show unsignedSample+    , "signedReal =" ++ show signedSample+    , "fraction =" ++ show signedSample ++ "/3"+    , "floorWide =" ++ asHex 11 (floorResult `mod` modulus)+    , "truncateWide =" ++ asHex 11 (truncateResult `mod` modulus)+    ]++-- | Exercise exact rational arithmetic and integer-to-real conversion.+exactRealArithmetic :: Assertion+exactRealArithmetic = withSystemTempDirectory "sbv-exact-real" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [5, 2, 2]+        a <- cgInput "a" :: SBVCodeGen SReal+        b <- cgInput "b" :: SBVCodeGen SReal+        integer <- cgInput "integer" :: SBVCodeGen SInteger+        let converted = sFromIntegral integer :: SReal+            base      = a / 3 + b / 7 + converted+            result    = ite (a .> b) (abs (base * (-3))) 0+        cgOutput "converted" converted+        cgOutput "base" base+        cgReturn result+  compileAndRunGMP dir "exactRealArithmetic" program ["83/7", "converted =2", "base =83/21"]++-- | Exercise finite tables with an unbounded index and GMP-backed integer and+-- rational results, including negative and oversized default cases.+exactTableLookup :: Assertion+exactTableLookup = withSystemTempDirectory "sbv-exact-table" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgPerformRTCs True+        cgSetDriverValues [1, -1, 500, 2 ^ (200 :: Int)]+        inRangeIndex   <- cgInput "inRangeIndex"   :: SBVCodeGen SInteger+        negativeIndex  <- cgInput "negativeIndex"  :: SBVCodeGen SInteger+        oversizedIndex <- cgInput "oversizedIndex" :: SBVCodeGen SInteger+        tableValue     <- cgInput "tableValue"     :: SBVCodeGen SInteger+        let integerResult   = select [2 ^ (130 :: Int), tableValue + 7] (-11) inRangeIndex :: SInteger+            negativeResult  = select [3 / 2, 5 / 3] (7 / 4) negativeIndex :: SReal+            oversizedResult = select [13, 17] 19 oversizedIndex :: SInteger+        cgOutput "negativeResult" negativeResult+        cgOutput "oversizedResult" oversizedResult+        cgReturn integerResult+  compileAndRunGMP dir "exactTableLookup" program [show (2 ^ (200 :: Int) + 7 :: Integer), "negativeResult =7/4", "oversizedResult =19"]++-- | Exercise a persistent array with GMP-backed integer keys and rational+-- values, including a read from the unchanged base version.+exactArray :: Assertion+exactArray = withSystemTempDirectory "sbv-exact-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [2 ^ (300 :: Int) + 9, 20]+        key   <- cgInput "key"   :: SBVCodeGen SInteger+        value <- cgInput "value" :: SBVCodeGen SInteger+        let stored  = sFromIntegral value / 3 :: SReal+            base    = constArray (1 / 3 :: SReal)+            updated = writeArray base key stored+        cgOutput "baseValue" (readArray base key)+        cgReturn (readArray updated key)+  compileAndRunGMP dir "exactArray" program ["20/3", "baseValue =1/3"]++-- | Exercise borrowed callback input and overlay semantics with GMP-backed+-- integer keys and rational values.+exactArrayInput :: Assertion+exactArrayInput = withSystemTempDirectory "sbv-exact-array-input" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [7, 2 ^ (300 :: Int) + 9, 20]+        source <- cgInput "source" :: SBVCodeGen (SArray Integer AlgReal)+        key    <- cgInput "key"    :: SBVCodeGen SInteger+        value  <- cgInput "value"  :: SBVCodeGen SInteger+        let updated = writeArray source key (sFromIntegral value / 3)+        cgOutput "sourceValue" (readArray source key)+        cgReturn (readArray updated key)+  compileAndRunGMP dir "exactArrayInput" program ["20/3", "sourceValue =7"]++-- | Exercise borrowed fixed-size GMP input arrays for integers, reals, and+-- rationals, including caller initialization and cleanup in the driver.+exactFixedInputArrays :: Assertion+exactFixedInputArrays = withSystemTempDirectory "sbv-exact-fixed-input-arrays" $ \dir -> do+  let integerSeed = 2 ^ (300 :: Int) + 11+      program = do+        cgOverwriteFiles True+        cgSetDriverValues [integerSeed, -7, 5, 2, 9, 4]+        [integerA, integerB]   <- cgInputArr 2 "integers"  :: SBVCodeGen [SInteger]+        [realA, realB]         <- cgInputArr 2 "reals"     :: SBVCodeGen [SReal]+        [rationalA, rationalB] <- cgInputArr 2 "rationals" :: SBVCodeGen [SRational]+        cgOutput "integerResult"  (integerA + integerB)+        cgOutput "realResult"     (realA / realB)+        cgOutput "rationalResult" (rationalA / rationalB)+        cgReturn (integerA .> integerB .&& realA .> realB .&& rationalA .> rationalB)++  compileAndRunGMP dir "exactFixedInputArrays" program+    [ show (integerSeed - 7)+    , "realResult =5/2"+    , "rationalResult =9/4"+    , ") = 1"+    ]+  headerText <- readFile (dir </> "exactFixedInputArrays.h")+  driverText <- readFile (dir </> "exactFixedInputArrays_driver.c")+  assertBool "Expected fixed exact inputs to use borrowed GMP array parameters"+             ("const mpz_t *integers" `isInfixOf` headerText+           && "const mpq_t *reals" `isInfixOf` headerText+           && "const mpq_t *rationals" `isInfixOf` headerText)+  assertBool "Expected the generated driver to release every GMP input-array element"+             ("mpz_clear(sbv_driver_input_0[0]);" `isInfixOf` driverText+           && "mpz_clear(sbv_driver_input_0[1]);" `isInfixOf` driverText+           && "mpq_clear(sbv_driver_input_1[0]);" `isInfixOf` driverText+           && "mpq_clear(sbv_driver_input_2[1]);" `isInfixOf` driverText)++-- | Exercise repeated reads from a structured array lambda whose arithmetic+-- allocates exact rational results in the enclosing generated-call arena.+exactLambdaArray :: Assertion+exactLambdaArray = withSystemTempDirectory "sbv-exact-lambda-array" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [20]+        key <- cgInput "key" :: SBVCodeGen SInteger+        let source = lambdaArray (\index -> sFromIntegral index / 3) :: SArray Integer AlgReal+        cgOutput "value" (readArray source key)+        cgReturn (readArray source (key + 1))+  compileAndRunGMP dir "exactLambdaArray" program ["7", "value =20/3"]++-- | Exercise a parameter-dependent exact table whose entries allocate in the+-- structured lambda's enclosing GMP arena.+exactLambdaTable :: Assertion+exactLambdaTable = withSystemTempDirectory "sbv-exact-lambda-table" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        key <- cgInput "key" :: SBVCodeGen SInteger+        let source = lambdaArray (\index -> select [sFromIntegral index / 3, sFromIntegral index / 5] 7 index)+                     :: SArray Integer AlgReal+        cgReturn (readArray source key)+  compileAndRunGMP dir "exactLambdaTable" program ["1/5"]++-- | Exercise exact store cloning and a structured callback that allocates+-- after the generated function's original GMP arena has been released.+ownedExactArrays :: Assertion+ownedExactArrays = withSystemTempDirectory "sbv-owned-exact-arrays" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        let source = lambdaArray (\index -> sFromIntegral index / 3) :: SArray Integer AlgReal+        cgOutput "stored" (writeArray source 0 (5 / 3))+        cgReturn source++  compileAndRunGMP dir "ownedExactArrays" program ["ownedExactArrays(&stored)[0] =0", "stored[0] =5/3"]++-- | Exercise exact tuple construction, constants in a finite table,+-- projection, and copying into scalar caller-owned results.+exactTupleFields :: Assertion+exactTupleFields = withSystemTempDirectory "sbv-exact-tuple-fields" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [0]+        index <- cgInput "index" :: SBVCodeGen SWord8+        let first, second             :: SBV (AlgReal, Integer)+            first                     = tuple (1 / 3, 2 ^ (130 :: Int))+            second                    = tuple (5 / 7, 9)+            selected                  = select [first] second index+            (realValue, integerValue) = untuple selected+        cgOutput "integerValue" integerValue+        cgReturn realValue++  compileAndRunGMP dir "exactTupleFields" program ["1/3", show (2 ^ (130 :: Int) :: Integer)]++-- | Exercise borrowed exact-tuple inputs and independently owned outputs and+-- returns whose GMP fields survive the generated call's temporary arena.+ownedExactTuples :: Assertion+ownedExactTuples = withSystemTempDirectory "sbv-owned-exact-tuples" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen (SBV (Integer, (AlgReal, Integer)))+        let (integerValue, nested)      = untuple source+            (realValue, secondInteger) = untuple nested+            outputTuple                = tuple (integerValue + 1, tuple (realValue / 3, secondInteger + 2))+            result                     = tuple (integerValue * 2, tuple (realValue + 1, secondInteger * 3))+        cgOutput "output" outputTuple+        cgReturn result+      seed           = 2 ^ (130 :: Int)+      expectedOutput = "output =(" ++ show (seed + 1) ++ ", (" ++ show (seed + 1) ++ "/3, " ++ show (seed + 4) ++ "))"+      expectedReturn = "(" ++ show (seed * 2) ++ ", (" ++ show (seed + 2) ++ ", " ++ show ((seed + 2) * 3) ++ "))"++  compileAndRunGMP dir "ownedExactTuples" program [expectedReturn, expectedOutput]++-- | Exercise borrowed exact-field ADT inputs and independently owned outputs+-- and returns, including exact fields nested through another ADT and a tuple.+ownedExactADTs :: Assertion+ownedExactADTs = withSystemTempDirectory "sbv-owned-exact-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [seed]+        source <- cgInput "source" :: SBVCodeGen SExactAggregate+        let leaf                      = getExactAggregate_1 source+            values                    = getExactAggregate_2 source+            integerValue              = getExactLeaf_1 leaf+            realValue                 = getExactLeaf_2 leaf+            (tupleInteger, tupleReal) = untuple values+            outputValues              = tuple (tupleInteger + 2, tupleReal + 3)+            outputLeaf                = sExactLeaf (integerValue + 1) (realValue / 7)+            outputAggregate           = sExactAggregate outputLeaf outputValues+            resultValues              = tuple (tupleInteger * 3, tupleReal / 5)+            resultLeaf                = sExactLeaf (integerValue * 2) (realValue + 1)+            resultAggregate           = sExactAggregate resultLeaf resultValues+        cgOutput "output" outputAggregate+        cgOutput "sameAsResult" (source .== resultAggregate)+        cgReturn resultAggregate+      seed           = 2 ^ (130 :: Int) + 1+      expectedOutput = "output =ExactAggregate(ExactLeaf(" ++ show (seed + 1)+                    ++ ", " ++ show (seed + 1) ++ "/7), (" ++ show (seed + 3)+                    ++ ", " ++ show (seed + 5) ++ "))"+      expectedReturn = "ExactAggregate(ExactLeaf(" ++ show (seed * 2)+                    ++ ", " ++ show (seed + 2) ++ "), (" ++ show (3 * (seed + 1))+                    ++ ", " ++ show (seed + 2) ++ "/5))"++  compileAndRunGMP dir "ownedExactADTs" program [expectedReturn, expectedOutput, "sameAsResult = 0"]++-- | Exercise deep cloning and release for an ADT that combines recursive+-- pointer nodes with GMP-backed fields.+ownedRecursiveExactADTs :: Assertion+ownedRecursiveExactADTs = withSystemTempDirectory "sbv-owned-recursive-exact-adts" $ \dir -> do+  let program = do+        cgOverwriteFiles True+        cgSetDriverValues [1]+        source <- cgInput "source" :: SBVCodeGen SExactChain+        cgOutput "sameChain" (source .== source)+        cgOutput "chainCopy" source+        cgReturn source++  compileAndRunGMP dir "ownedRecursiveExactADTs" program+    [ "sameChain = 1"+    , "ExactNext(1, ExactEnd(2))"+    ]++-- | Exercise merged headers, archives, and drivers for exact-number libraries.+exactNumberLibrary :: Assertion+exactNumberLibrary = withSystemTempDirectory "sbv-exact-library" $ \dir -> do+  let integerProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [2 ^ (130 :: Int)]+        value <- cgInput "value" :: SBVCodeGen SInteger+        cgReturn (value + 7)+      realProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [5]+        value <- cgInput "value" :: SBVCodeGen SReal+        cgReturn (value / 3)+      wideProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [wideSample]+        value <- cgInput "value" :: SBVCodeGen (SInt 673)+        cgReturn (sFromIntegral value :: SInteger)+      arrayProgram = do+        cgOverwriteFiles True+        cgSetDriverValues [arraySeed, 3]+        [first, second] <- cgInputArr 2 "values" :: SBVCodeGen [SInteger]+        cgReturn (first - second)+      tupleProgram increment = do+        cgOverwriteFiles True+        cgSetDriverValues [tupleSeed]+        source <- cgInput "source" :: SBVCodeGen (SBV (Integer, AlgReal))+        let (integerValue, realValue) = untuple source+        cgReturn (tuple (integerValue + fromInteger increment, realValue + fromInteger increment))+      adtProgram increment = do+        cgOverwriteFiles True+        cgSetDriverValues [adtSeed]+        source <- cgInput "source" :: SBVCodeGen SExactAggregate+        let leaf                      = getExactAggregate_1 source+            integerValue              = getExactLeaf_1 leaf+            realValue                 = getExactLeaf_2 leaf+            (tupleInteger, tupleReal) = untuple (getExactAggregate_2 source)+            integerAmount             = fromInteger increment :: SInteger+            realAmount                = fromInteger increment :: SReal+            resultLeaf                = sExactLeaf (integerValue + integerAmount) (realValue + realAmount)+            resultValues              = tuple (tupleInteger + integerAmount, tupleReal + realAmount)+        cgReturn (sExactAggregate resultLeaf resultValues)+      wideSample = negate (2 ^ (670 :: Int)) + 12345+      arraySeed  = 2 ^ (180 :: Int) + 9+      tupleSeed  = 2 ^ (140 :: Int)+      adtSeed    = 2 ^ (150 :: Int) + 1++  (_, cfg, bundle) <- compileToCLib' "exactNumberLibrary"+    [ ("integerPart", integerProgram)+    , ("realPart", realProgram)+    , ("widePart", wideProgram)+    , ("arrayPart", arrayProgram)+    , ("incrementTuple", tupleProgram 1)+    , ("addTwoTuple", tupleProgram 2)+    , ("incrementADT", adtProgram 1)+    , ("addTwoADT", adtProgram 2)+    ]+  renderCgPgmBundle (Just dir) (cfg, bundle)++  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit++  let driverExecutable = dir </> "exactNumberLibrary_driver"+  (runExit, stdoutText, runError) <- readProcessWithExitCode driverExecutable [] ""+  assertEqual runError ExitSuccess runExit+  assertOutput stdoutText (show (2 ^ (130 :: Int) + 7 :: Integer))+  assertOutput stdoutText "5/3"+  assertOutput stdoutText (show wideSample)+  assertOutput stdoutText (show (arraySeed - 3))+  assertOutput stdoutText ("(" ++ show (tupleSeed + 1) ++ ", " ++ show (tupleSeed + 2) ++ ")")+  assertOutput stdoutText ("(" ++ show (tupleSeed + 2) ++ ", " ++ show (tupleSeed + 3) ++ ")")+  assertOutput stdoutText ("ExactAggregate(ExactLeaf(" ++ show (adtSeed + 1) ++ ", " ++ show (adtSeed + 2)+                         ++ "), (" ++ show (adtSeed + 2) ++ ", " ++ show (adtSeed + 3) ++ "))")+  assertOutput stdoutText ("ExactAggregate(ExactLeaf(" ++ show (adtSeed + 2) ++ ", " ++ show (adtSeed + 3)+                         ++ "), (" ++ show (adtSeed + 3) ++ ", " ++ show (adtSeed + 4) ++ "))")++-- | Generate, compile, and execute a program against the system GMP package.+-- Exercise both a direct compiler invocation and the generated Makefile, honoring+-- @SBV_C_TEST_FLAGS@ in both paths so rebuilding cannot hide sanitizer failures.+compileAndRunGMP :: FilePath -> String -> SBVCodeGen () -> [String] -> Assertion+compileAndRunGMP dir functionName program expected = do+  (_, cfg, bundle) <- compileToC' functionName program+  renderCgPgmBundle (Just dir) (cfg, bundle)++  (pkgExit, pkgOutput, pkgError) <- readProcessWithExitCode "pkg-config" ["--cflags", "--libs", "gmp"] ""+  assertEqual pkgError ExitSuccess pkgExit++  extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+  let source = dir </> functionName ++ ".c"+      driver = dir </> functionName ++ "_driver.c"+      exe    = dir </> functionName ++ "_driver"+      args   = ["-std=c11", "-Wall", "-Werror", "-ffp-contract=off", source, driver, "-o", exe] ++ extraFlags ++ words pkgOutput+      checkRun = do (runExit, stdoutText, runError) <- readProcessWithExitCode exe [] ""+                    assertEqual runError ExitSuccess runExit+                    mapM_ (assertOutput stdoutText) expected+  (ccExit, _, ccError) <- readProcessWithExitCode "cc" args ""+  assertEqual ccError ExitSuccess ccExit+  checkRun++  makeOptions <- generatedMakeOptions dir+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit+  checkRun++  makefile <- readFile (dir </> "Makefile")+  assertBool "Generated Makefile does not request GMP compiler flags" ("pkg-config --cflags gmp" `isInfixOf` makefile)+  assertBool "Generated Makefile does not request GMP linker flags" ("pkg-config --libs gmp" `isInfixOf` makefile)++-- | Assert that generated driver output contains an expected fragment.+assertOutput :: String -> String -> Assertion+assertOutput stdoutText fragment =+  assertBool ("Expected generated output to contain " ++ fragment ++ ", received:\n" ++ stdoutText) (fragment `isInfixOf` stdoutText)++-- | Render the fixed-limb hexadecimal form printed by generated drivers.+asHex :: Int -> Integer -> String+asHex limbCount value = "0x" ++ replicate (16 * limbCount - length rendered) '0' ++ rendered+ where rendered = showHex value ""
+ SBVTestSuite/TestSuite/CodeGeneration/LibraryBuild.hs view
@@ -0,0 +1,125 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.LibraryBuild+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Incremental build regressions for generated C static libraries.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.LibraryBuild (tests, testsWith) where++import Control.Monad (void)+import qualified Data.ByteString as BS+import System.Directory (doesFileExist)+import System.Environment (lookupEnv)+import System.Exit (ExitCode(..))+import System.FilePath ((</>), takeExtension)+import System.IO.Temp (withSystemTempDirectory)+import System.Process (readProcessWithExitCode)+import Test.Tasty.HUnit (assertBool, assertEqual)++import Data.SBV.Tools.CodeGen+import qualified Data.SBV.Tools.CodeGen.Legacy as Legacy+import Utils.SBVTestFramework++-- | Generate a library named @buildLibrary@ with the supplied components.+type LibraryGenerator = FilePath -> [(String, SBVCodeGen ())] -> IO ()++-- | Exercise both the current and legacy public library generators.+tests :: TestTree+tests = testGroup "CodeGeneration.LibraryBuild"+  [ testsWith "current" $ \dir components -> void $        compileToCLib (Just dir) "buildLibrary" components+  , testsWith "legacy"  $ \dir components -> void $ Legacy.compileToCLib (Just dir) "buildLibrary" components+  ]++-- | Apply the same archive and driver checks to either public C backend.+testsWith :: String -> LibraryGenerator -> TestTree+testsWith groupName generate = testGroup groupName+  [ testCase "driver archive dependency" (driverDependencies generate)+  , testCase "remove retired components with a driver" (archiveRegeneration generate True)+  , testCase "remove retired components without a driver" (archiveRegeneration generate False)+  , testCase "preserve archive after a failed rebuild" (failedArchiveRebuild generate)+  ]++-- | Generate a trivial scalar component with predictable driver output.+component :: Bool -> Word8 -> SBVCodeGen ()+component driver value = do+  cgOverwriteFiles True+  cgGenerateDriver driver+  cgSetDriverValues []+  cgReturn (literal value)++-- | Building the driver directly must first build its archive, including in+-- parallel builds. Both archive and component changes must invalidate it.+driverDependencies :: LibraryGenerator -> Assertion+driverDependencies generate = withSystemTempDirectory "sbv-c-library-driver" $ \dir -> do+  generate dir [("component", component True 7)]+  build dir ["-j2", "buildLibrary_driver"]+  (runExit, _, runError) <- readProcessWithExitCode (dir </> "buildLibrary_driver") [] ""+  assertEqual runError ExitSuccess runExit+  (freshExit, _, freshError) <- readProcessWithExitCode "make" ["-C", dir, "-q", "buildLibrary_driver"] ""+  assertEqual freshError ExitSuccess freshExit+  mapM_ (checkDependency dir) ["component.c", "buildLibrary.a", "buildLibrary.h"]+ where checkDependency dir prerequisite = do+         (staleExit, _, staleError) <- readProcessWithExitCode "make"+           ["-C", dir, "-q", "-W", prerequisite, "buildLibrary_driver"] ""+         assertEqual (prerequisite ++ ": " ++ staleError) (ExitFailure 1) staleExit++-- | Regeneration must replace the archive's membership, not merely update+-- members still present. Old component files outside the archive are retained.+archiveRegeneration :: LibraryGenerator -> Bool -> Assertion+archiveRegeneration generate driver = withSystemTempDirectory "sbv-c-library-regeneration" $ \dir -> do+  let retained = ("retained", component driver 11)+      retired  = ("retired",  component driver 22)+  generate dir [retained, retired]+  build dir ["buildLibrary.a"]+  checkMembers dir ["retained.o", "retired.o"]+  generate dir [retained]+  build dir ["-B", "buildLibrary.a"]+  checkMembers dir ["retained.o"]+  assertBool "Unselected component objects must not be deleted" =<< doesFileExist (dir </> "retired.o")+  generate dir [retired, retained]+  build dir ["-B", "buildLibrary.a"]+  checkMembers dir ["retired.o", "retained.o"]++-- | An unsuccessful archiver must leave the previous valid archive intact.+-- A subsequent successful rebuild must recover without manual cleanup.+failedArchiveRebuild :: LibraryGenerator -> Assertion+failedArchiveRebuild generate = withSystemTempDirectory "sbv-c-library-failed-rebuild" $ \dir -> do+  generate dir [("component", component False 7)]+  build dir ["buildLibrary.a"]+  original <- BS.readFile (dir </> "buildLibrary.a")+  makeOptions <- buildOptions+  (failedExit, _, _) <- readProcessWithExitCode "make"+    (["-C", dir, "-B", "buildLibrary.a", "AR=false"] ++ makeOptions) ""+  assertBool "The failed archiver must fail the build" (failedExit /= ExitSuccess)+  assertBool "The previous archive must still exist" =<< doesFileExist (dir </> "buildLibrary.a")+  assertEqual "The previous archive must remain unchanged" original =<< BS.readFile (dir </> "buildLibrary.a")+  build dir ["-B", "buildLibrary.a"]+  checkMembers dir ["component.o"]++-- | Build with strict C warnings and optional local sanitizer flags.+build :: FilePath -> [String] -> Assertion+build dir targets = do+  makeOptions <- buildOptions+  (makeExit, _, makeError) <- readProcessWithExitCode "make" (["-C", dir] ++ targets ++ makeOptions) ""+  assertEqual makeError ExitSuccess makeExit++-- | Preserve caller-selected instrumentation during compilation and linking.+buildOptions :: IO [String]+buildOptions = do+  extraFlags <- maybe "" (" " ++) <$> lookupEnv "SBV_C_TEST_FLAGS"+  pure ["CCFLAGS=-std=c11 -Wall -Wextra -Werror -O2" ++ extraFlags]++-- | Compare object membership and order, ignoring platform-specific symbol+-- index members such as the BSD archiver's @__.SYMDEF@ entry.+checkMembers :: FilePath -> [String] -> Assertion+checkMembers dir expected = do+  (arExit, members, arError) <- readProcessWithExitCode "ar" ["t", dir </> "buildLibrary.a"] ""+  assertEqual arError ExitSuccess arExit+  assertEqual "Archive components" expected (filter ((== ".o") . takeExtension) (lines members))
+ SBVTestSuite/TestSuite/CodeGeneration/PseudoBoolean.hs view
@@ -0,0 +1,130 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.PseudoBoolean+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Executed pseudo-Boolean comparisons at native overflow boundaries.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.PseudoBoolean (tests, testsWith) where++import Control.Monad (replicateM, void)+import Data.List (intercalate)+import System.Environment (lookupEnv)+import System.Exit (ExitCode(..))+import System.FilePath ((</>))+import System.IO.Temp (withSystemTempDirectory)+import System.Process (readProcessWithExitCode)+import Test.Tasty.HUnit (assertEqual)++import Data.SBV.Tools.CodeGen+import qualified Data.SBV.Tools.CodeGen.Legacy as Legacy+import Utils.SBVTestFramework++-- | Exercise both backends through their public standalone and library APIs.+tests :: TestTree+tests = testGroup "CodeGeneration.PseudoBoolean"+  [ testsWith "current" $ \dir library functionName program ->+      if library+         then void $ compileToCLib (Just dir) "pbLibrary" [(functionName, program)]+         else compileToC (Just dir) functionName program+  , testsWith "legacy" $ \dir library functionName program ->+      if library+         then void $ Legacy.compileToCLib (Just dir) "pbLibrary" [(functionName, program)]+         else Legacy.compileToC (Just dir) functionName program+  ]++-- | Reuse the execution matrix for a compatibility backend without changing its+-- import facade. Every truth assignment is checked against unbounded Haskell+-- arithmetic, at both optimization levels and with undefined-behavior checking.+testsWith :: String -> (FilePath -> Bool -> String -> SBVCodeGen () -> IO ()) -> TestTree+testsWith groupName generate = testGroup groupName+  [ testCase (form ++ " mapped" ++ show integerWidth ++ " " ++ optimization) $ withSystemTempDirectory "sbv-c-pseudo-boolean" $ \dir -> do+      let functionName = "pbChecks"+          artifact = if library then "pbLibrary.a" else functionName ++ ".o"+          header   = if library then "pbLibrary.h" else functionName ++ ".h"+      generate dir library functionName $ do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgIntegerSize integerWidth+        inputs <- cgInputArr 5 "inputs"+        cgOutputArr "checks" (comparisons inputs)+      extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+      let flags = ["-std=c11", "-Wall", "-Wextra", "-Werror"] ++ words optimization ++ extraFlags+      (makeExit, _, makeError) <- readProcessWithExitCode "make"+        ["-C", dir, artifact, "CCFLAGS=" ++ unwords flags] ""+      assertEqual makeError ExitSuccess makeExit+      writeFile (dir </> "caller.c") (caller header functionName)+      let executablePath = dir </> "caller"+      (ccExit, _, ccError) <- readProcessWithExitCode "cc"+        (flags ++ [dir </> "caller.c", dir </> artifact, "-o", executablePath]) ""+      assertEqual ccError ExitSuccess ccExit+      (runExit, _, runError) <- readProcessWithExitCode executablePath [] ""+      assertEqual runError ExitSuccess runExit+      mapM_ (\values -> assertEqual "Concrete SBV comparisons must agree with mathematical sums"+                                    (map Just (expected values)) (map unliteral (comparisons (map literal values)))) assignments+  | (form, library) <- [("standalone", False), ("library", True)]+  , integerWidth <- [8, 64]+  , optimization <- ["-O0", "-O2", "-O1 -fsanitize=undefined -fno-sanitize-recover=all"]+  ]++-- | Coefficients and bounds covering signed 32-bit overflow, signed and unsigned+-- 64-bit overflow, zero weights, exact ties, and crossing a bound late in a sum.+scenarios :: [([Int], Int)]+scenarios = [ ([2000000000, 2000000000, 0, 0, 0], 2100000000)+            , ([maxBound, maxBound, 0, 0, 0], maxBound)+            , (replicate 5 maxBound, maxBound)+            , ([maxBound, 1, maxBound, 1, 0], maxBound)+            , ([0, 0, 0, 0, 0], 0)+            , ([0, 1, 0, 1, 0], 0)+            , ([1, 2, 3, 4, 5], 7)+            , ([1, 2, 3, 4, 5], maxBound)+            , ([maxBound, maxBound, maxBound, 0, 0], 0)+            , ([maxBound - 1, 1, 1, maxBound - 1, 1], maxBound)+            ]++-- | All assignments to the five independent input Booleans.+assignments :: [[Bool]]+assignments = replicateM 5 [False, True]++-- | Exercise all six pseudo-Boolean operators, plus their empty-list semantics.+comparisons :: [SBool] -> [SBool]+comparisons inputs = concat [let weighted = zip coefficients inputs+                            in [pbLe weighted bound, pbGe weighted bound, pbEq weighted bound]+                            | (coefficients, bound) <- scenarios]+                  ++ [pbAtMost inputs 2, pbAtLeast inputs 2, pbExactly inputs 2]+                  ++ [pbAtMost [] 0, pbAtLeast [] 1, pbExactly [] 0]++-- | Compute expected answers with mathematical integers, never machine sums.+expected :: [Bool] -> [Bool]+expected inputs = concat [compareSum (sum [toInteger coefficient | (coefficient, True) <- zip coefficients inputs]) (toInteger bound)+                         | (coefficients, bound) <- scenarios]+               ++ compareSum (toInteger (length (filter id inputs))) 2+               ++ [True, False, True]+ where compareSum total bound = [total <= bound, total >= bound, total == bound]++-- | An independent C caller supplies all input combinations and exact expected+-- outputs. Its arrays are shared across calls to check that temporary sums reset.+caller :: String -> String -> String+caller header functionName = unlines+  [ "#include <assert.h>"+  , "#include \"" ++ header ++ "\""+  , "int main(void)"+  , "{"+  , "  static const SBool inputs[][5] = {" ++ intercalate ", " (map row assignments) ++ "};"+  , "  static const SBool expected[][" ++ show count ++ "] = {" ++ intercalate ", " (map (row . expected) assignments) ++ "};"+  , "  SBool output[" ++ show count ++ "];"+  , "  for (size_t i = 0; i < sizeof inputs / sizeof inputs[0]; ++i) {"+  , "    " ++ functionName ++ "(inputs[i], output);"+  , "    for (size_t j = 0; j < " ++ show count ++ "; ++j) assert(output[j] == expected[i][j]);"+  , "  }"+  , "  return 0;"+  , "}"+  ]+ where count = length (expected (replicate 5 False))+       row values = "{" ++ intercalate ", " [if value then "true" else "false" | value <- values] ++ "}"
+ SBVTestSuite/TestSuite/CodeGeneration/RegExp.hs view
@@ -0,0 +1,351 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.RegExp+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Execute bounded, dependency-free C regex automata against solver results.+-----------------------------------------------------------------------------++{-# LANGUAGE OverloadedStrings #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.RegExp (tests) where++import Control.Exception (ErrorCall, displayException, evaluate, try)+import Control.Monad (forM, forM_, replicateM, void)+import Data.Char (ord)+import Data.List (intercalate, isInfixOf, nub)+import System.Directory (listDirectory)+import System.Environment (lookupEnv)+import System.Exit (ExitCode(..))+import System.FilePath ((</>))+import System.IO.Temp (withSystemTempDirectory)+import System.Process (readProcessWithExitCode)+import Test.Tasty.HUnit (assertBool, assertEqual)++import Data.SBV.Control+import Data.SBV.Internals (compileToC', compileToCLib', renderCgPgmBundle)+import Data.SBV.Tools.CodeGen+import qualified Data.SBV.List as SL+import qualified Data.SBV.RegExp as R+import Utils.SBVTestFramework++-- | Full-operator matching, language comparisons, scope integration, and+-- generation budgets, including absence of overhead for non-regex code.+tests :: TestTree+tests = testGroup "CodeGeneration.RegExp"+  [ testCase "regex membership agrees with Z3 and literal folding" membershipAgreement+  , testCase "regex language equality and inequality" languageAgreement+  , testCase "regex definitions and escaping array lambdas in a library" regexLibrary+  , testCase "regex generation limits fail before writing" regexLimits+  , testCase "default regex budgets accommodate ordinary bounded repetitions" calibratedRegexLimits+  , testCase "regex limits apply to comparisons, definitions, and library components" regexLimitScopes+  , testCase "regex character matching and dynamic tables" regexCharacterTable+  , testCase "regex state limits do not bound input length" longRegexInput+  , testCase "non-regex and dead-regex code require no regex support" noRegexOverhead+  ]++-- | Shared syntax and balanced-map lookup must not be charged as repeated+-- whole-tree copies and linear scans of the entire state set.+calibratedRegexLimits :: Assertion+calibratedRegexLimits = do+  mapM_ generate [R.Loop 0 30 "a", R.Power 510 "a"]+  result <- try (generate (R.Power 1023 "a")) :: IO (Either ErrorCall ())+  case result of+    Left err -> assertBool (displayException err) ("state limit (1024)" `isInfixOf` displayException err)+    Right () -> assertFailure "Expected the default state cap to reject 1025 states"+ where generate regex = do+         (_, _, bundle) <- compileToC' "calibratedRegex" $ do+           cgGenerateDriver False+           input <- cgInput "input" :: SBVCodeGen SString+           cgReturn (input `R.match` regex)+         void $ evaluate (length (show bundle))+         assertBool "Default-sized automata use compact transition entries"+           (any (\line -> "static const uint16_t sbv_regex_" `isInfixOf` line && "_step" `isInfixOf` line) (lines (show bundle)))++-- | Ordinary and Boolean operators, empty languages/concatenations, and+-- nullable repetitions; include boundaries of every supported encoding width.+regexes :: [R.RegExp]+regexes = nub $ atoms+            ++ [op r | op <- [R.Comp, R.KStar, R.KPlus, R.Opt, R.Loop 0 2, R.Power 2], r <- atoms]+            ++ [op a b | op <- [R.Inter, R.Diff, \a b -> R.Union [a, b], \a b -> R.Conc [a, b]], a <- atoms, b <- atoms]+            ++ [ R.Conc [R.Inter "a" "ab", R.All]+               , R.Conc [R.Diff "ab" "a", R.Opt "b"]+               , R.Conc [R.Comp "a", "b"]+               , R.KStar (R.Inter (R.Opt "a") (R.Comp "b"))+               , R.KStar (R.Comp "a")+               , R.Loop 2 3 (R.Opt "a")+               , R.Conc [R.All, "b"]+               , R.Range '\0' '\x2ffff'+               , R.Range '\xd800' '\xdfff'+               , R.Range '\x7f' '\x800'+               , R.Literal "\0\955\xd800\x2ffff"+               ]+ where atoms = [R.All, R.AllChar, R.None, R.Conc [], "a", "ab", R.Range 'a' 'b', R.Range 'b' 'a']++-- | Query a genuinely symbolic string for each sample, then feed the same+-- code points to compiled C. Literal folding is checked as a third evaluator.+membershipAgreement :: Assertion+membershipAgreement = withSystemTempDirectory "sbv-c-regex-agreement" $ \dir -> do+  expected <- runSMT $ do+    input <- sString "input"+    query $ forM samples $ \sample -> inNewAssertionStack $ do+      constrain (input .== literal sample)+      status <- checkSat+      case status of+        Sat -> getValue (SL.implode [input `R.match` r | r <- regexes])+        _   -> error $ "Unexpected regex reference status: " ++ show status+  forM_ (zip samples expected) $ \(sample, values) ->+    assertEqual ("Literal regex agreement: " ++ show sample) (map Just values)+                [unliteral (literal sample `R.match` r) | r <- regexes]+  let program = do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgAddDecl (membershipHarness "regexMembership" samples (length regexes))+        input <- cgInput "input" :: SBVCodeGen SString+        cgOutputArr "matches" [input `R.match` r | r <- regexes]+  (_, cfg, bundle) <- compileToC' "regexMembership" program+  renderCgPgmBundle (Just dir) (cfg, bundle)+  actual <- runC dir ["regexMembership"]+  assertEqual "C automata agree with Z3 for every regex/sample" (map (map bitChar) expected) (lines actual)+ where samples = nub $ concatMap (`replicateM` "ab") [0 .. 3]+                    ++ ["\0", "\955", "\x7f", "\x80", "\x7ff", "\x800", "\xd800", "\xdfff", "\xffff", "\x10000", "\x2ffff"+                       , "\0\955\xd800\x2ffff", "\955b", "a\0"]+       bitChar True  = '1'+       bitChar False = '0'++-- | Build strings from numeric code points instead of relying on C source+-- encoding or NUL termination. Every sample shares one generated matcher.+membershipHarness :: String -> [String] -> Int -> [String]+membershipHarness function samples count =+  [ "int main(void) {"+  , "  uint8_t bytes[" ++ show (max 1 (4 * maximum (map length samples))) ++ "];"+  , "  SBool matches[" ++ show count ++ "];"+  ] ++ concatMap sampleBlock samples ++ ["  return 0;", "}"]+ where sampleBlock sample =+         [ "  {"+         , "    const SChar points[] = {" ++ intercalate ", " (map (show . ord) sample ++ ["0"]) ++ "};"+         , "    size_t size = 0;"+         , "    for (size_t i = 1; i < sizeof(points) / sizeof(points[0]); ++i) size += sbv_char_encode(points[i - 1], bytes + size);"+         , "    " ++ function ++ "(sbv_string_borrow(bytes, size, sizeof(points) / sizeof(points[0]) - 1), matches);"+         , "    for (size_t i = 0; i < " ++ show count ++ "; ++i) putchar(matches[i] ? '1' : '0');"+         , "    putchar('\\n');"+         , "  }"+         ]++-- | Decide language equality at generation time, including equality expressed+-- by structurally different regexes and languages distinguished only by epsilon.+languageAgreement :: Assertion+languageAgreement = withSystemTempDirectory "sbv-c-regex-languages" $ \dir -> do+  expected <- runSMT $ query $ do+    status <- checkSat+    case status of+      Sat -> mapM (\(a, b) -> getValue (a .== b)) pairs+      _   -> error $ "Unexpected regex reference status: " ++ show status+  let program = do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgAddDecl ["int main(void) { SBool values[" ++ show (2 * length pairs) ++ "]; regexLanguages(values);"+                  , "for (size_t i = 0; i < " ++ show (2 * length pairs) ++ "; ++i) putchar(values[i] ? '1' : '0'); return 0; }"]+        cgOutputArr "values" (concat [[a .== b, a ./= b] | (a, b) <- pairs])+  (_, cfg, bundle) <- compileToC' "regexLanguages" program+  renderCgPgmBundle (Just dir) (cfg, bundle)+  actual <- runC dir ["regexLanguages"]+  assertEqual "Exact language comparisons" (concatMap (\equal -> if equal then "10" else "01") expected) actual+  source <- readFile (dir </> "regexLanguages.c")+  assertBool "Language comparisons need no runtime regex tables" (not ("sbv_regex_" `isInfixOf` source))+ where pairs = [ (R.Conc [], "")+               , (R.Union [], R.None)+               , (R.Comp R.None, R.All)+               , (R.Inter (R.Comp "a") (R.Comp "b"), R.Comp (R.Union ["a", "b"]))+               , (R.Diff R.All "a", R.Comp "a")+               , (R.KPlus "a", R.Conc ["a", R.KStar "a"])+               , (R.KStar (R.Opt "a"), R.KStar "a")+               , (R.Loop 0 0 "a", R.Conc [])+               , (R.Range '\0' '\x2ffff', R.AllChar)+               , (R.All, R.AllChar)+               , (R.KStar "a", R.KPlus "a")+               , (R.Power 3 "a", R.Loop 2 3 "a")+               , (R.Range 'a' 'b', R.Range 'a' 'c')+               ]++-- | Library components may use independent budgets, and regex tables remain+-- private even when definitions and escaping closed lambdas reuse node IDs.+regexLibrary :: Assertion+regexLibrary = withSystemTempDirectory "sbv-c-regex-library" $ \dir -> do+  let matcher = smtFunction "regex in a defined function" (\value -> value `R.match` R.Conc [R.All, "b"])+      component = do+        cgOverwriteFiles True+        cgGenerateDriver False+        let array = lambdaArray matcher :: SArray String Bool+        cgReturn array+      direct = do+        cgOverwriteFiles True+        cgGenerateDriver False+        input <- cgInput "input" :: SBVCodeGen SString+        cgReturn (matcher input)+      plain = do+        cgOverwriteFiles True+        cgGenerateDriver False+        cgRegexLimits 0 0 0+        cgAddDecl ["int main(void) {"+                  , "  SBVArrayOutput_6_string_2_u1 array = regexClosure();"+                  , "  const SString ab = sbv_string_borrow_utf8(\"ab\"), a = sbv_string_borrow_utf8(\"a\");"+                  , "  const int ok = array.lookup(array.context, ab) && !array.lookup(array.context, a) && regexDirect(ab) && !regexDirect(a) && plainComponent();"+                  , "  sbv_array_output_release_6_string_2_u1(&array);"+                  , "  return ok ? 0 : 1;"+                  , "}"]+        cgReturn sTrue+  (_, cfg, bundle) <- compileToCLib' "regexLibrary" [("regexClosure", component), ("regexDirect", direct), ("plainComponent", plain)]+  renderCgPgmBundle (Just dir) (cfg, bundle)+  void $ runC dir ["regexClosure", "regexDirect", "plainComponent"]+  source <- readFile (dir </> "plainComponent.c")+  assertBool "Non-regex library component has no regex implementation" (not ("sbv_regex_" `isInfixOf` source))++-- | Exercise each independent budget and verify rejection precedes file+-- creation. Large repetition counts must fail without expanding them first.+regexLimits :: Assertion+regexLimits = do+  rejects "state" (cgRegexLimits 2 100 10000) "a"+  rejects "expression-node" (cgRegexLimits 100 4 10000) "abcdef"+  rejects "work" (cgRegexLimits 100 100 1) "a"+  rejects "disabled" (cgRegexLimits 0 100 10000) "a"+  rejects "expression-node" (pure ()) (R.Power maxBound "a")+  rejects "expression-node" (pure ()) (R.Loop 0 maxBound "a")+  rejects "state" (cgRegexLimits 8 4096 1000000) (R.Conc [R.All, "a", R.Power 8 R.AllChar])+  withSystemTempDirectory "sbv-c-regex-raised-limit" $ \dir -> do+    (_, cfg, bundle) <- compileToC' "raisedRegex" $ do+      cgRegexLimits 3 100 10000+      cgOverwriteFiles True+      cgGenerateDriver False+      cgAddDecl ["int main(void) { return raisedRegex(sbv_string_borrow_utf8(\"a\")) ? 0 : 1; }"]+      input <- cgInput "input" :: SBVCodeGen SString+      cgReturn (input `R.match` R.Literal "a")+    renderCgPgmBundle (Just dir) (cfg, bundle)+    void $ runC dir ["raisedRegex"]+ where rejects :: String -> SBVCodeGen () -> R.RegExp -> Assertion+       rejects diagnostic limits regex = withSystemTempDirectory "sbv-c-regex-limit" $ \dir -> do+         result <- try (compileToC (Just dir) "limitedRegex" $ do+                     limits+                     input <- cgInput "input" :: SBVCodeGen SString+                     cgReturn (input `R.match` regex)) :: IO (Either ErrorCall ())+         case result of+           Left err -> assertBool (displayException err) (diagnostic `isInfixOf` displayException err && "cgRegexLimits" `isInfixOf` displayException err)+           Right () -> assertFailure "Expected regex budget rejection"+         assertEqual "Rejected regex must not create files" [] =<< listDirectory dir++-- | Successful bounded generation accepts strings far longer than any budget+-- dimension. The runtime matcher uses neither recursion nor heap allocation.+longRegexInput :: Assertion+longRegexInput = withSystemTempDirectory "sbv-c-regex-long-input" $ \dir -> do+  (_, cfg, bundle) <- compileToC' "longRegex" $ do+    cgRegexLimits 2 16 1000+    cgOverwriteFiles True+    cgGenerateDriver False+    cgAddDecl ["int main(void) { uint8_t bytes[100000]; memset(bytes, 'a', sizeof bytes);"+              , "return longRegex(sbv_string_borrow(bytes, sizeof bytes, sizeof bytes)) ? 0 : 1; }"]+    input <- cgInput "input" :: SBVCodeGen SString+    cgReturn (input `R.match` R.KStar "a")+  renderCgPgmBundle (Just dir) (cfg, bundle)+  void $ runC dir ["longRegex"]++-- | Apply budgets to every lowering scope, not just entry-point membership.+-- Library preflight must not leave files from an earlier successful component.+regexLimitScopes :: Assertion+regexLimitScopes = do+  forM_ [(-1, 100, 10000), (100, -1, 10000), (100, 100, -1)] $ \(states, nodes, work) ->+    rejects "nonnegative" (cgRegexLimits states nodes work >> cgReturn sTrue)+  rejects "state" $ do+    cgRegexLimits 2 100 10000+    cgReturn (R.Literal "a" .== R.Literal "a")+  rejects "state" $ do+    cgRegexLimits 2 100 10000+    input <- cgInput "input" :: SBVCodeGen SString+    cgReturn (smtFunction "limited regex definition" (\s -> s `R.match` R.Literal "a") input)+  rejects "state" $ do+    cgRegexLimits 2 100 10000+    cgReturn (lambdaArray (\s -> s `R.match` R.Literal "a") :: SArray String Bool)+  rejects "domain" $ do+    input <- cgInput "input" :: SBVCodeGen SString+    cgReturn (input `R.match` R.Literal "\x30000")+  withSystemTempDirectory "sbv-c-regex-library-limit" $ \dir -> do+    let plain = cgGenerateDriver False >> cgRegexLimits 0 0 0 >> cgReturn sTrue+        limited = do cgGenerateDriver False+                     cgRegexLimits 2 100 10000+                     input <- cgInput "input" :: SBVCodeGen SString+                     cgReturn (input `R.match` R.Literal "a")+    result <- try (compileToCLib (Just dir) "limitedLibrary" [("plain", plain), ("limited", limited)]) :: IO (Either ErrorCall [()])+    case result of+      Left err -> assertBool (displayException err) ("state" `isInfixOf` displayException err)+      Right _  -> assertFailure "Expected library regex budget rejection"+    assertEqual "Library budget failure must not write any component" [] =<< listDirectory dir+ where rejects :: String -> SBVCodeGen () -> Assertion+       rejects diagnostic program = withSystemTempDirectory "sbv-c-regex-scoped-limit" $ \dir -> do+         result <- try (compileToC (Just dir) "scopedLimit" program) :: IO (Either ErrorCall ())+         case result of+           Left err -> assertBool (displayException err) (diagnostic `isInfixOf` displayException err)+           Right () -> assertFailure "Expected scoped regex budget rejection"+         assertEqual "Scoped budget failure must not write files" [] =<< listDirectory dir++-- | Character membership uses the existing singleton-string lowering. Regex+-- computations in a dynamic lookup table keep their function-local tables and+-- setup statements correctly scoped under demand-driven selection.+regexCharacterTable :: Assertion+regexCharacterTable = withSystemTempDirectory "sbv-c-regex-character-table" $ \dir -> do+  (_, cfg, bundle) <- compileToC' "regexCharacterTable" $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    cgPerformRTCs True+    cgAddDecl ["int main(void) {"+              , "  return regexCharacterTable(0xd800, 0) && !regexCharacterTable('a', 0)"+              , "      && regexCharacterTable('a', 1) && !regexCharacterTable('b', 1)"+              , "      && regexCharacterTable('b', 2) && !regexCharacterTable('a', 2)"+              , "      && !regexCharacterTable('a', 255) ? 0 : 1;"+              , "}"]+    input <- cgInput "input" :: SBVCodeGen SChar+    index <- cgInput "index" :: SBVCodeGen SWord8+    cgReturn $ select [input `R.match` r | r <- [R.Range '\xd800' '\xdfff', "a", R.Comp "a"]] sFalse index+  renderCgPgmBundle (Just dir) (cfg, bundle)+  void $ runC dir ["regexCharacterTable"]++-- | Disabled regex compilation leaves non-regex generation unchanged and+-- never examines a dead regex operation, including when regex compilation is disabled.+noRegexOverhead :: Assertion+noRegexOverhead = do+  baseline <- generated (pure ()) False+  disabled <- generated (cgRegexLimits 0 0 0) False+  assertEqual "Regex budgets do not alter non-regex C" baseline disabled+  dead <- generated (cgRegexLimits 0 0 0) True+  assertBool "Dead regex has no runtime code" (not ("sbv_regex_" `isInfixOf` dead))+ where generated :: SBVCodeGen () -> Bool -> IO String+       generated limits useDead = do+         (_, _, bundle) <- compileToC' "noRegex" $ do+           limits+           cgGenerateDriver False+           cgSetDriverValues [1]+           input <- cgInput "input" :: SBVCodeGen SBool+           if useDead+             then do string <- cgInput "string" :: SBVCodeGen SString+                     cgReturn (ite sTrue input (string `R.match` R.Power 100 "a"))+             else cgReturn input+         let source = show bundle+         void $ evaluate (length source)+         pure source++-- | Compile generated translation units with strict C warnings and optional+-- sanitizer flags. Regex support must need no nonstandard library or header.+runC :: FilePath -> [String] -> IO String+runC dir components = do+  flags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+  let executablePath = dir </> "regex-test"+  (status, _, errors) <- readProcessWithExitCode "cc" (["-std=c11", "-Wall", "-Wextra", "-Werror", "-O2"] ++ flags+                                                 ++ [dir </> component ++ ".c" | component <- components]+                                                 ++ ["-o", executablePath]) ""+  assertEqual errors ExitSuccess status+  (runStatus, outputText, runError) <- readProcessWithExitCode executablePath [] ""+  assertEqual runError ExitSuccess runStatus+  pure outputText
+ SBVTestSuite/TestSuite/CodeGeneration/ScalarSafety.hs view
@@ -0,0 +1,215 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.CodeGeneration.ScalarSafety+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Executed regressions for diagnostic escaping, mapped real flooring, and+-- incremental C builds.+-----------------------------------------------------------------------------++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.CodeGeneration.ScalarSafety (tests, testsWith) where++import Control.Monad (void)+import Data.List (isInfixOf)+import System.Environment (lookupEnv)+import System.Exit (ExitCode(..))+import System.FilePath ((</>))+import System.IO.Temp (withSystemTempDirectory)+import System.Process (readProcessWithExitCode)+import Test.Tasty.HUnit (assertBool, assertEqual)++import Data.SBV.Tools.CodeGen+import qualified Data.SBV.Tools.CodeGen.Legacy as Legacy+import Utils.SBVTestFramework++-- | Generate a standalone function or a single-component static library.+type Generator = FilePath -> Bool -> SBVCodeGen () -> IO ()++-- | Exercise both public backends with the same scalar safety matrix.+tests :: TestTree+tests = testGroup "CodeGeneration.ScalarSafety"+  [ testsWith "current" $ \dir library program ->+      if library+         then void $ compileToCLib (Just dir) "scalarLibrary" [("scalarChecks", program)]+         else compileToC (Just dir) "scalarChecks" program+  , testsWith "legacy" $ \dir library program ->+      if library+         then void $ Legacy.compileToCLib (Just dir) "scalarLibrary" [("scalarChecks", program)]+         else Legacy.compileToC (Just dir) "scalarChecks" program+  ]++-- | Reuse the same strict-warning, optimization, and sanitizer matrix for a+-- compatibility backend. Independent C callers supply fractional inputs and+-- check against mathematical integer results rather than C casts.+testsWith :: String -> Generator -> TestTree+testsWith groupName generate = testGroup groupName $+  [ testGroup (form ++ "/" ++ optimization)+      [ testGroup "floor"+          [ testCase (show realType ++ "/" ++ show width) $ withSystemTempDirectory "sbv-c-real-floor" $ \dir -> do+              executablePath <- compileCaller generate dir library optimization (floorCaller realType width) $ do+                cgSRealType realType+                cgIntegerSize width+                value <- cgInput "value" :: SBVCodeGen SReal+                cgReturn (sRealToSIntegerFloor value)+              makefile <- readFile (dir </> "Makefile")+              assertBool "Flooring must link the standard math library" ("-lm" `isInfixOf` makefile)+              runSuccessfully executablePath+              mapM_ (checkNonFinite executablePath) ["nan", "inf", "negative-inf"]+          | realType <- [CgFloat, CgDouble, CgLongDouble]+          , width <- [8, 16, 32, 64]+          ]+      , testGroup "labels"+          [ testCase sampleName $ withSystemTempDirectory "sbv-c-scalar-label" $ \dir -> do+              executablePath <- compileCaller generate dir library optimization labelCaller $ do+                value <- cgInput "value" :: SBVCodeGen SWord8+                cgReturn (label message value)+              runSuccessfully executablePath+          | (sampleName, message) <- labelSamples+          ]+      , testCase "assertion message" $ withSystemTempDirectory "sbv-c-assertion-text" $ \dir -> do+          let message = "must be \"small\"; %n %s 100% */\n/* \\\n??/ \955"+          executablePath <- compileCaller generate dir library optimization labelCaller $ do+            value <- cgInput "value" :: SBVCodeGen SWord8+            cgReturn (sAssert Nothing message (value .< 5) value)+          (runExit, _, runError) <- readProcessWithExitCode executablePath [] ""+          assertBool "The failed assertion must terminate the caller" (runExit /= ExitSuccess)+          assertBool runError (("ASSERTION FAILED: " ++ message) `isInfixOf` runError)+      ]+  | (form, library) <- [("program", False), ("library", True)]+  , optimization <- ["-O0", "-O2 -fsanitize=undefined,float-cast-overflow -fno-sanitize-recover=all"]+  ]+  ++ [testCase "driver header dependency" (driverHeaderDependency generate)]++-- | Header changes must invalidate the separately compiled standalone driver.+-- Make's hypothetical-newer prerequisite avoids sleeps and timestamp races.+driverHeaderDependency :: Generator -> Assertion+driverHeaderDependency generate = withSystemTempDirectory "sbv-c-driver-header" $ \dir -> do+  generate dir False $ do+    cgOverwriteFiles True+    cgSetDriverValues [41]+    value <- cgInput "value" :: SBVCodeGen SWord8+    cgReturn value+  extraFlags <- maybe "" (" " ++) <$> lookupEnv "SBV_C_TEST_FLAGS"+  let target = "scalarChecks_driver.o"+  (makeExit, _, makeError) <- readProcessWithExitCode "make"+    ["-C", dir, target, "CCFLAGS=-std=c11 -Wall -Wextra -Werror -O2" ++ extraFlags] ""+  assertEqual makeError ExitSuccess makeExit+  (freshExit, _, freshError) <- readProcessWithExitCode "make" ["-C", dir, "-q", target] ""+  assertEqual freshError ExitSuccess freshExit+  (staleExit, _, staleError) <- readProcessWithExitCode "make" ["-C", dir, "-q", "-W", "scalarChecks.h", target] ""+  assertEqual ("Changing the header must invalidate the driver object: " ++ staleError) (ExitFailure 1) staleExit++-- | Text must remain a semantic no-op even when it resembles C statements or+-- affects preprocessing. Embedded NUL/control bytes must also compile cleanly.+labelSamples :: [(String, String)]+labelSamples = [ ("statements", "*/; abort(); /*")+               , ("preprocessing", "nested /* comment; \\\n??/\n*/")+               , ("control characters", "Unicode \955, NUL \0, CR \r, tab \t and control \SOH")+               ]++-- | Generate and build the selected artifact, then link an independent caller.+-- Additional local sanitizer flags apply to both the generated C and caller.+compileCaller :: Generator -> FilePath -> Bool -> String -> String -> SBVCodeGen () -> IO FilePath+compileCaller generate dir library optimization source program = do+  generate dir library $ do+    cgOverwriteFiles True+    cgGenerateDriver False+    program+  extraFlags <- maybe [] words <$> lookupEnv "SBV_C_TEST_FLAGS"+  let flags = ["-std=c11", "-Wall", "-Wextra", "-Werror", "-trigraphs"] ++ words optimization ++ extraFlags+      artifact = if library then "scalarLibrary.a" else "scalarChecks.o"+      header   = if library then "scalarLibrary.h" else "scalarChecks.h"+      executablePath = dir </> "caller"+  (makeExit, _, makeError) <- readProcessWithExitCode "make" ["-C", dir, artifact, "CCFLAGS=" ++ unwords flags] ""+  assertEqual makeError ExitSuccess makeExit+  writeFile (dir </> "caller.c") ("#include \"" ++ header ++ "\"\n" ++ source)+  (ccExit, _, ccError) <- readProcessWithExitCode "cc" (flags ++ [dir </> "caller.c", dir </> artifact, "-lm", "-o", executablePath]) ""+  assertEqual ccError ExitSuccess ccExit+  pure executablePath++-- | Require successful execution, reporting captured diagnostics on failure.+runSuccessfully :: FilePath -> Assertion+runSuccessfully executablePath = do+  (runExit, _, runError) <- readProcessWithExitCode executablePath [] ""+  assertEqual runError ExitSuccess runExit++-- | Non-finite mapped real inputs must fail explicitly before an integer cast.+checkNonFinite :: FilePath -> String -> Assertion+checkNonFinite executablePath sample = do+  (runExit, _, runError) <- readProcessWithExitCode executablePath [sample] ""+  assertBool "Non-finite real flooring must terminate the caller" (runExit /= ExitSuccess)+  assertBool runError ("Cannot floor a non-finite mapped SReal" `isInfixOf` runError)+  assertBool runError (not ("runtime error:" `isInfixOf` runError))++-- | A successful label is observationally identical to its scalar argument.+labelCaller :: String+labelCaller = unlines ["#include <assert.h>", "int main(void) { assert(scalarChecks(7) == 7); return 0; }"]++-- | Supply exact binary fractions, signed boundaries, large finite values,+-- and subnormals. Precision-dependent boundary cases run only when the actual+-- C real representation can distinguish the adjacent integers.+floorCaller :: CgSRealType -> Int -> String+floorCaller realType width = unlines $+  [ "#include <assert.h>"+  , "#include <float.h>"+  , "#define REAL_MANT_DIG " ++ floatMacro "MANT_DIG"+  , "int main(int argc, char **argv)"+  , "{"+  , "  if (argc > 1) {"+  , "    SReal value = argv[1][0] == 'n' ? (argv[1][1] == 'a' ? (SReal) NAN : (SReal) -INFINITY) : (SReal) INFINITY;"+  , "    (void) scalarChecks(value); return 0;"+  , "  }"+  ]+  ++ [check input (floor value) | (input, value) <- samples]+  ++ [ "#if REAL_MANT_DIG >= 32"+     , check "0x7fffffffp0L" (2 ^ (31 :: Int) - 1)+     , "#endif"+     , "#if REAL_MANT_DIG >= 64"+     , check "0xffffffffffffffffp0L" (2 ^ (64 :: Int) - 1)+     , check "-0x8000000000000001p0L" (negate (2 ^ (63 :: Int) + 1))+     , "#endif"+     , check (floatMacro "TRUE_MIN") 0+     , check ("-" ++ floatMacro "TRUE_MIN") (-1)+     , "#if " ++ floatMacro "MAX_EXP" ++ " - REAL_MANT_DIG >= 64"+     , check (floatMacro "MAX") 0+     , check ("-" ++ floatMacro "MAX") 0+     , "#endif"+     , "  return 0;"+     , "}"+     ]+ where floatMacro suffix = case realType of+                             CgFloat      -> "FLT_"  ++ suffix+                             CgDouble     -> "DBL_"  ++ suffix+                             CgLongDouble -> "LDBL_" ++ suffix++       check :: String -> Integer -> String+       check input expected = "  assert(scalarChecks((SReal) (" ++ input ++ ")) == (SInteger) " ++ signedLiteral (wrap expected) ++ ");"+       wrap value = let modulus = 2 ^ width+                        bits    = value `mod` modulus+                    in if bits >= modulus `div` 2 then bits - modulus else bits+       signedLiteral value+         | value == negate (2 ^ (63 :: Int)) = "(-INT64_C(9223372036854775807) - INT64_C(1))"+         | True                             = "INT64_C(" ++ show value ++ ")"++-- | Values exactly representable even by binary32. Integer expectations use+-- arbitrary-precision Haskell arithmetic, independently of the C helper.+samples :: [(String, Rational)]+samples = [ ("0.0L", 0), ("-0.0L", 0)+          , ("2.5L", 5 % 2), ("-2.5L", -(5 % 2))+          , ("0.5L", 1 % 2), ("-0.5L", -(1 % 2))+          , ("127.75L", 511 % 4), ("-128.25L", -(513 % 4))+          , ("255.75L", 1023 % 4), ("-256.25L", -(1025 % 4))+          , ("65535.75L", 262143 % 4), ("-65536.25L", -(262145 % 4))+          , ("0x1p31L", 2 ^ (31 :: Int)), ("-0x1p31L", negate (2 ^ (31 :: Int)))+          , ("0x1p63L", 2 ^ (63 :: Int)), ("-0x1p63L", negate (2 ^ (63 :: Int)))+          , ("0x1p64L", 2 ^ (64 :: Int)), ("-0x1p64L", negate (2 ^ (64 :: Int)))+          , ("0x1p100L", 2 ^ (100 :: Int)), ("-0x1p100L", negate (2 ^ (100 :: Int)))+          , ("(0x1p63L + 0x1p40L)", 2 ^ (63 :: Int) + 2 ^ (40 :: Int))+          , ("(0x1p64L - 0x1p40L)", 2 ^ (64 :: Int) - 2 ^ (40 :: Int))+          , ("(0x1p40L + 0x1p20L)", 2 ^ (40 :: Int) + 2 ^ (20 :: Int))+          ]
SBVTestSuite/TestSuite/CompileTests/PCase/PCase17.stderr view
@@ -15,8 +15,8 @@        (isLet e ==> (e .== e =: qed))] PCase17.hs:18:14: error: [GHC-83865]     " Couldn't match expected type: Proof SBool-                  with actual type: sbv-14.7:Data.SBV.TP.TP.TPProofGen-                                      (SBV Bool) [sbv-14.7:Data.SBV.TP.TP.Helper] ()+                  with actual type: sbv-14.8:Data.SBV.TP.TP.TPProofGen+                                      (SBV Bool) [sbv-14.8:Data.SBV.TP.TP.Helper] ()     " In the expression:         cases           [(isZero e ==> (e .== e =: qed)), (isNum e ==> (e .== e =: qed)),
SBVTestSuite/TestSuite/CompileTests/PCase/PCase38.stderr view
@@ -15,8 +15,8 @@        (isLet e ==> undefined)] PCase38.hs:12:14: error: [GHC-83865]     " Couldn't match expected type: Proof SBool-                  with actual type: sbv-14.7:Data.SBV.TP.TP.TPProofGen-                                      a0 [sbv-14.7:Data.SBV.TP.TP.Helper] ()+                  with actual type: sbv-14.8:Data.SBV.TP.TP.TPProofGen+                                      a0 [sbv-14.8:Data.SBV.TP.TP.Helper] ()     " In the expression:         cases           [(isZero e ==> undefined), (isNum e ==> undefined),
SBVTestSuite/TestSuite/CompileTests/SCase/SCase101.stderr view
@@ -28,4 +28,4 @@          ((\ _ -> 1) (Data.SBV.Maybe.getJust_1 m))          (ite             (Data.SBV.Maybe.isNothing m) 0-            (symWithKind "unmatched_sCase_Maybe_6989586621679035057")))+            (symWithKind "unmatched_sCase_Maybe_6989586621679035188")))
SBVTestSuite/TestSuite/CompileTests/SCase/SCase59.stderr view
@@ -24,4 +24,4 @@                ((\ _ -> Data.SBV.Either.isRight (Data.SBV.Maybe.getJust_1 m))                   (Data.SBV.Maybe.getJust_1 m)))             ((\ _ -> 1) (Data.SBV.Maybe.getJust_1 m))-            (symWithKind "unmatched_sCase_Maybe_6989586621679035057")))+            (symWithKind "unmatched_sCase_Maybe_6989586621679035188")))
SBVTestSuite/TestSuite/CompileTests/SCase/SCase66.stderr view
@@ -30,4 +30,4 @@          (ite             (Data.SBV.Either.isRight e)             ((\ _ -> 1) (Data.SBV.Either.getRight_1 e))-            (symWithKind "unmatched_sCase_Either_6989586621679035019")))+            (symWithKind "unmatched_sCase_Either_6989586621679035150")))
SBVTestSuite/TestSuite/CompileTests/SCase/SCase89.stderr view
@@ -40,4 +40,4 @@                   (isVar e) ((\ _ -> 1) (getVar_1 e))                   (ite                      (isLet e) ((\ _ _ _ -> 3) (getLet_1 e) (getLet_2 e) (getLet_3 e))-                     (symWithKind "unmatched_sCase_Expr_6989586621679080602"))))))+                     (symWithKind "unmatched_sCase_Expr_6989586621679080842"))))))
SBVTestSuite/TestSuite/Crypto/AES.hs view
@@ -11,11 +11,22 @@  {-# OPTIONS_GHC -Wall -Werror #-} +{-# LANGUAGE DataKinds #-}+ module TestSuite.Crypto.AES(tests) where +import Data.List (intercalate)+import System.Exit (ExitCode(..))+import System.FilePath ((</>))+import System.IO.Temp (withSystemTempDirectory)+import System.Process (readProcessWithExitCode)+import Test.Tasty.HUnit (assertEqual)+ import Data.SBV.Internals+import Data.SBV.Tools.CodeGen (compileToC, compileToCLib) import Documentation.SBV.Examples.Crypto.AES +import Utils.CCodeGen (generatedMakeOptions) import Utils.SBVTestFramework  -- Test suite@@ -24,6 +35,10 @@    goldenVsStringShow "aes128Enc" $ thd <$> compileToC'    "aes128Enc" (aes128EncDec True)  , goldenVsStringShow "aes128Dec" $ thd <$> compileToC'    "aes128Dec" (aes128EncDec False)  , goldenVsStringShow "aes128Lib" $ thd <$> compileToCLib' "aes128Lib" aes128Comps+ , testCase "generated standalone encryption" standaloneEncryption+ , testCase "generated AES128 library" $ libraryVector 128 aes128Key aes128CT+ , testCase "generated AES192 library" $ libraryVector 192 aes192Key aes192CT+ , testCase "generated AES256 library" $ libraryVector 256 aes256Key aes256CT  ]  where aes128EncDec d = do pt  <- cgInputArr 4 "pt"                            key <- cgInputArr 4 "key"@@ -35,3 +50,73 @@        aes128Comps = [(f, setVals c) | (f, _, c) <- aesLibComponents 128]        setVals c = cgSetDriverValues (repeat 0) >> c        thd (_, _, r) = r++-- | Exercise the exact code-generation action shown in the documentation.+standaloneEncryption :: Assertion+standaloneEncryption = withSystemTempDirectory "sbv-aes-block" $ \dir -> do+  compileToC (Just dir) "aes128BlockEncrypt" (aes128BlockEncrypt >> cgOverwriteFiles True)+  runCaller dir "aes128BlockEncrypt" "aes128BlockEncrypt.o"+    [ cArray "pt" commonPT+    , cArray "key" aes128Key+    , cArray "expected" aes128CT+    , "SWord32 ct[4];"+    , "aes128BlockEncrypt(pt, key, ct);"+    , "assert(memcmp(ct, expected, sizeof expected) == 0);"+    ]++-- | Compose the generated key-schedule and block functions in C, checking+-- encryption and both decryption paths against the standard's test vectors.+-- Using an independent caller ensures that the key schedules are computed+-- by generated C, rather than supplied as precomputed Haskell driver values.+libraryVector :: Int -> Key -> [SWord 32] -> Assertion+libraryVector size key ciphertext = withSystemTempDirectory "sbv-aes-library" $ \dir -> do+  _ <- compileToCLib (Just dir) libraryName+         [(functionName, cgSetDriverValues values >> program >> cgOverwriteFiles True)+         | (functionName, values, program) <- aesLibComponents size]+  runCaller dir libraryName (libraryName ++ ".a")+    [ cArray "pt" commonPT+    , cArray "key" key+    , cArray "expected" ciphertext+    -- The public inverse-schedule wrapper reverses each group of key words.+    , cArray "invKey" (concatMap reverse (chop4 (extractFinalKey key)))+    , "SWord32 encKS[" ++ show expandedWords ++ "], decKS[" ++ show expandedWords ++ "], invKS[" ++ show expandedWords ++ "];"+    , "SWord32 ct[4], recovered[4];"+    , prefix ++ "KeySchedule(key, encKS, decKS);"+    , prefix ++ "BlockEncrypt(pt, encKS, ct);"+    , "assert(memcmp(ct, expected, sizeof expected) == 0);"+    , prefix ++ "BlockDecrypt(expected, decKS, recovered);"+    , "assert(memcmp(recovered, pt, sizeof pt) == 0);"+    , prefix ++ "InvKeySchedule(invKey, invKS);"+    , prefix ++ "OTFDecrypt(expected, invKS, recovered);"+    , "assert(memcmp(recovered, pt, sizeof pt) == 0);"+    ]+ where prefix = "aes" ++ show size+       libraryName = prefix ++ "Lib"+       expandedWords = 4 * (size `div` 32 + 7)++-- | Render the existing concrete test vectors as C arrays.+cArray :: String -> [SWord 32] -> String+cArray arrayName values = "const SWord32 " ++ arrayName ++ "[] = {"+                       ++ intercalate ", " ["0x" ++ hex8 value ++ "UL" | value <- values] ++ "};"++-- | Build and run a caller using the generated Makefile's compiler and flags.+-- Keep assertions enabled, and preserve optional sanitizer instrumentation.+runCaller :: FilePath -> String -> FilePath -> [String] -> Assertion+runCaller dir header dependency body = do+  writeFile (dir </> "caller.c") $ unlines $+    [ "#undef NDEBUG"+    , "#include <assert.h>"+    , "#include <string.h>"+    , "#include \"" ++ header ++ ".h\""+    , "int main(void) {"+    ] ++ map ("  " ++) body ++ ["  return 0;", "}"]+  writeFile (dir </> "caller.mk") $ unlines+    [ "caller: caller.c " ++ header ++ ".h " ++ dependency+    , "\t${CC} ${CCFLAGS} caller.c " ++ dependency ++ " ${LDFLAGS} ${SBV_LIBS} -o $@"+    ]+  makeOptions <- generatedMakeOptions dir+  (buildExit, buildOutput, buildError) <- readProcessWithExitCode "make"+    (["-C", dir, "caller"] ++ makeOptions) ""+  assertEqual (buildOutput ++ buildError) ExitSuccess buildExit+  (runExit, runOutput, runError) <- readProcessWithExitCode (dir </> "caller") [] ""+  assertEqual (runOutput ++ runError) ExitSuccess runExit
SBVTestSuite/TestSuite/Crypto/SHA.hs view
@@ -20,7 +20,7 @@  -- Test suite tests :: TestTree-tests = testGroup "Crypto.AES" [+tests = testGroup "Crypto.SHA" [    goldenVsStringShow "sha256HashBlock" $ (\(_, _, r) -> r) <$> compileToC' "sha256HashBlock" c  ]  where c = do let algorithm = sha256P
SBVTestSuite/TestSuite/Queries/Lists.hs view
@@ -12,6 +12,7 @@ {-# LANGUAGE OverloadedLists     #-} {-# LANGUAGE QuasiQuotes         #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications    #-}  {-# OPTIONS_GHC -Wall -Werror #-} @@ -19,20 +20,45 @@  import Data.SBV import Data.SBV.Control+import qualified Data.SBV.List as L+import qualified Data.SBV.Tuple as T +import Data.List (isInfixOf)++import qualified Control.Exception as C+ import Utils.SBVTestFramework --- Test suite+-- | Test suite. tests :: TestTree tests =   testGroup "Basics.QueryLists"     [ goldenCapturedIO "query_Lists1" $ testQuery queryLists1+    , testCase "query_Lists2"              $ do result <- runSMT queryLists2+                                                result == 3 @? "Expected the filtered value 3, received: " ++ show result+    , testCase "query_function_dependency" $ do result <- runSMT queryFunctionDependency+                                                result == 11 @? "Expected the dependent function value 11, received: " ++ show result+    , testCase "query_function_reuse"      $ do result <- runSMT queryFunctionReuse+                                                result == (6, 7) @? "Expected the reused function values (6, 7), received: " ++ show result+    , testCase "query_function_body_kind"  $ do result <- runSMT queryFunctionBodyKind+                                                result == 11 @? "Expected the tuple-backed function value 11, received: " ++ show result+    , testCase "query_function_ui"         $ do result <- runSMT queryFunctionUI+                                                result == 11 @? "Expected the helper-backed function value 11, received: " ++ show result+    , testCase "query_mutual_functions"    $ do result <- runSMT queryMutualFunctions+                                                result @? "Expected the mutually recursive function to return true"+    , testCase "query_bad_termination"     $ do result <- C.try (runSMT queryBadTermination)+                                                case result of+                                                  Left (e :: C.SomeException) -> "does not strictly decrease" `isInfixOf` show e+                                                                                 @? "Expected a termination-check failure, received: " ++ show e+                                                  Right value                 -> assertFailure $ "Expected a termination-check failure, received: " ++ show value     ] +-- | Run a query with its verbose transcript redirected to the given file. testQuery :: Show a => Symbolic a -> FilePath -> IO () testQuery t rf = do r <- runSMTWith defaultSMTCfg{verbose=True, redirectVerbose=Just rf} t                     appendFile rf ("\nFINAL OUTPUT:\n" ++ show r ++ "\n") +-- | Retrieve a concrete list from a solver query. queryLists1 :: Symbolic [Integer] queryLists1 = do a :: SList Integer <- sList "a" @@ -45,3 +71,85 @@                             if av == [1..5]                                then return av                                else error $ "Didn't expect this: " ++ show av++-- | Exercise an SMT function first encountered after entering query mode.+queryLists2 :: Symbolic Integer+queryLists2 = query $ do x <- freshVar @Integer "x"+                         y <- freshVar @[Integer] "y"+                         constrain $ y .== literal [1 .. 20]+                         constrain $ x .== L.head (L.filter (.== literal 3) y)+                         getValue x++-- | Exercise dependency ordering between SMT functions first encountered in query mode.+queryFunctionDependency :: Symbolic Integer+queryFunctionDependency = query $ do n <- freshVar @Integer "n"+                                     x <- freshVar @Integer "x"+                                     constrain $ n .== 5+                                     constrain $ x .== outer n+                                     getValue x+  where inner :: SInteger -> SInteger+        inner = smtFunction "query.inner" (* 2)++        outer :: SInteger -> SInteger+        outer = smtFunction "query.outer" ((+ 1) . inner)++-- | Exercise repeated use of an SMT function after its query-mode definition has been sent.+queryFunctionReuse :: Symbolic (Integer, Integer)+queryFunctionReuse = query $ do n <- freshVar @Integer "n"+                                x <- freshVar @Integer "x"+                                y <- freshVar @Integer "y"+                                constrain $ n .== 5+                                constrain $ x .== increment n+                                constrain $ y .== increment x+                                (,) <$> getValue x <*> getValue y+  where increment :: SInteger -> SInteger+        increment = smtFunction "query.increment" (+ 1)++-- | Exercise a datatype used only inside an SMT function first encountered in query mode.+queryFunctionBodyKind :: Symbolic Integer+queryFunctionBodyKind = query $ do n <- freshVar @Integer "n"+                                   x <- freshVar @Integer "x"+                                   constrain $ n .== 5+                                   constrain $ x .== pairSum n+                                   getValue x+  where pairSum :: SInteger -> SInteger+        pairSum = smtFunction "query.pairSum" $ \n -> let p :: STuple Integer Integer+                                                          p = T.tuple (n, n + 1)+                                                      in T.fst p + T.snd p++-- | Exercise an uninterpreted helper used by an SMT function first encountered in query mode.+queryFunctionUI :: Symbolic Integer+queryFunctionUI = query $ do n <- freshVar @Integer "n"+                             x <- freshVar @Integer "x"+                             constrain $ n .== 5+                             constrain $ x .== applyHelper n+                             constrain $ helper n .== 10+                             getValue x+  where helper :: SInteger -> SInteger+        helper = uninterpret "query.helper"++        applyHelper :: SInteger -> SInteger+        applyHelper = smtFunction "query.applyHelper" ((+ 1) . helper)++-- | Exercise mutually recursive SMT functions first encountered in query mode.+queryMutualFunctions :: Symbolic Bool+queryMutualFunctions = query $ do n <- freshVar @Bool "n"+                                  x <- freshVar @Bool "x"+                                  constrain n+                                  constrain $ x .== isEven n+                                  getValue x+  where isEven :: SBool -> SBool+        isEven = smtFunctionNoTermination "query.even" $ \b -> ite b (isOdd sFalse) sFalse++        isOdd :: SBool -> SBool+        isOdd  = smtFunctionNoTermination "query.odd" $ \b -> ite b (isEven sFalse) sTrue++-- | Ensure query-mode definitions still undergo termination checking before reaching the solver.+queryBadTermination :: Symbolic Integer+queryBadTermination = query $ do n <- freshVar @Integer "n"+                                 x <- freshVar @Integer "x"+                                 constrain $ n .== 5+                                 constrain $ x .== diverges n+                                 getValue x+  where diverges :: SInteger -> SInteger+        diverges = smtFunctionWithMeasure "query.diverges" (abs, []) $ \n -> ite (n .<= 0) 0 (diverges (n + 1))
+ SBVTestSuite/TestSuite/Queries/Registration.hs view
@@ -0,0 +1,291 @@+-----------------------------------------------------------------------------+-- |+-- Module    : TestSuite.Queries.Registration+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Registration and function discovery during incremental solver interaction.+-----------------------------------------------------------------------------++{-# LANGUAGE DataKinds           #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell     #-}+{-# LANGUAGE TypeApplications    #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module TestSuite.Queries.Registration (tests) where++import Control.Monad (when)+import Control.Monad.Reader (ReaderT(..), runReaderT)+import qualified Control.Exception as C+import Data.List (isInfixOf, isPrefixOf)+import Data.Maybe (fromMaybe)+import Data.Proxy+import System.FilePath ((</>))+import System.IO.Temp (withSystemTempDirectory)++import Data.SBV.Control+import Data.SBV.Internals (QueryT(..), SMTModel(..), SExpr(..), parseSExpr, formatFunctionResponse)+import Utils.SBVTestFramework++-- | A rational field must be declared before the containing datatype.+newtype RationalBox = RationalBox Rational deriving (Eq, Show)++-- | An empty datatype represents an uninterpreted solver sort.+data RegistrationSort++mkSymbolic [''RationalBox, ''RegistrationSort]++tests :: TestTree+tests = testGroup "Queries.Registration"+  [ testGroup "rationals"+      [ rationalTest "automatic"                 False False+      , rationalTest "registered before query"   True  False+      , rationalTest "registered inside query"   False True+      , rationalTest "registered in both phases" True  True+      ]+  , testCase "rational function first used in query" $ do+      let half :: SInteger -> SRational+          half = smtFunction "registration.half" $ \n -> ite (n .== 1) (1/2) (2/3)+      result <- runSMT $ query $ do+        n <- freshVar @Integer "n"+        constrain $ n .== 1+        getValue (half n)+      result == 1 % 2 @? "Expected a rational result from a query-mode definition"+  , testCase "nested rational types first used in query" $ do+      result <- runSMT $ query $ do+        x <- freshVar @(RationalBox, [Rational]) "x"+        let expected = (RationalBox (1 % 2), [2 % 3])+        constrain $ x .== literal expected+        getValue x+      result == (RationalBox (1 % 2), [2 % 3]) @? "Expected nested rational values"+  , testCase "explicit nested type registration inside query" $ do+      result <- runSMT $ query $ do+        registerType (Proxy @(RationalBox, [Rational]))+        registerType (Proxy @(RationalBox, [Rational]))+        ensureSat+        x <- freshVar @(RationalBox, [Rational]) "x"+        constrain $ x .== literal (RationalBox (1 % 2), [2 % 3])+        getValue x+      result == (RationalBox (1 % 2), [2 % 3]) @? "Explicit registration must reach the solver"+  , testCase "explicit uninterpreted sort registration inside query" $ do+      result <- runSMT $ query $ do+        registerType (Proxy @RegistrationSort)+        registerType (Proxy @RegistrationSort)+        ensureSat+        x <- freshVar @RegistrationSort "x"+        y <- freshVar_ @RegistrationSort+        constrain $ x ./= y+        checkSat+      result == Sat @? "Explicit registration must declare an uninterpreted sort exactly once"+  , testCase "quantified function first used in query" $ do+      result <- runSMT $ query $ do+        let f = uninterpret "registration.quantified" :: SInteger -> SInteger+        constrain $ \(Forall (x :: SInteger)) -> f x .== f x+        checkSat+      result == Sat @? "Quantified uses must register their functions automatically"+  , testGroup "function discovery" $ map discoveryTests [("z3", z3), ("cvc5", cvc5)]+  , fallbackTests+  ]++-- | Discovery must support sorts without concrete defaults and preserve the+-- model produced by checkSatAssuming, including when discovery fails.+discoveryTests :: (String, SMTConfig) -> TestTree+discoveryTests (solverName, cfg) = testGroup solverName+  [ testCase "quoted function expression formatting" $ do+      let f = uninterpret "|quotedPretty|" :: SInteger -> SInteger+      result <- runSMTWith cfg $ do+        setupFunctionModels solverName+        constrain $ \(Forall x) -> f x .== 3 * x+        query $ ensureSat >> getFunction f+      case result of+        Left (rendered, _) -> do+          "quotedPretty " `isPrefixOf` rendered @? "Expected the function name in the formatted interpretation"+          not ("fromSMTLib" `isInfixOf` rendered) @? "Expected the lambda to be formatted despite optional name quoting"+        Right{} -> assertFailure "Expected an expression for the nonconstant integer function"+  , testGroup "registered calling convention"+      [ testCase (if registeredCurried then "curried" else "uncurried") $ do+          let curried   = uninterpret "registeredShape" :: SInteger -> SInteger -> SInteger+              uncurried = uninterpret "registeredShape" :: (SInteger, SInteger) -> SInteger+              f x y | registeredCurried = curried x y+                    | True             = uncurried (x, y)+          result <- runSMTWith cfg $ do+            setupFunctionModels solverName+            constrain $ \(Forall x) (Forall y) -> f x y .== 3 * x + y+            query $ do+              ensureSat+              if registeredCurried then getFunction uncurried else getFunction curried+          case result of+            Left (_, (isCurried, _, _)) -> isCurried == registeredCurried @? "Reading through an alias must preserve the registered display convention"+            Right{} -> assertFailure "Expected an expression for the nonconstant integer function"+      | registeredCurried <- [True, False]+      ]+  , testCase "uninterpreted argument sort" $ do+      let f = uninterpret "discovery.sort" :: SBV RegistrationSort -> SInteger+      result <- runSMTWith cfg $ do+        registerFunction f+        query $ ensureSat >> getFunction f+      case result of+        Right{} -> pure ()+        Left{}  -> assertFailure "Expected an interpretation of the unused function"+  , testCase "uncurried function with an uninterpreted argument sort" $ do+      let f = uninterpret "discovery.uncurried" :: (SBV RegistrationSort, SBool) -> SInteger+      result <- runSMTWith cfg $ do+        registerFunction f+        query $ ensureSat >> getFunction f+      case result of+        Right{} -> pure ()+        Left{}  -> assertFailure "Expected an interpretation of the unused uncurried function"+  , testCase "function first used in a query" $ do+      let f = uninterpret "discovery.used" :: SInteger -> SInteger+      result <- runSMTWith cfg $ query $ do+        constrain $ f 5 .== 17+        ensureSat+        getFunction f+      case result of+        Right (table, def) -> fromMaybe def (lookup 5 table) == 17 @? "The interpretation must satisfy the constraint"+        Left{}            -> assertFailure "Expected a value association for the constrained function"+  , testGroup "quoted names"+      [ testCase nm $ withSystemTempDirectory "sbv-quoted-function" $ \dir -> do+          let logFile = dir </> "solver.smt2"+              f = uninterpret nm :: SInteger -> SInteger+          result <- runSMTWith cfg{transcript = Just logFile} $ do+            constrain $ f 5 .== 17+            query $ ensureSat >> getFunction f+          case result of+            Right (table, def) -> fromMaybe def (lookup 5 table) == 17 @? "The quoted function must satisfy its constraint"+            Left{}            -> assertFailure "Expected a value association for the quoted function"+          logText <- readFile logFile+          ("(get-value (" ++ nm ++ "))") `isInfixOf` logText @? "Expected an explicitly quoted function lookup"+      | nm <- ["|quotedFunction|", "|function with spaces|"]+      ]+  , testGroup "quoted names in models"+      [ testCase (nm ++ if constrained then " constrained" else " unused") $ do+          let f = uninterpret nm :: SInteger -> SInteger+          model <- runSMTWith cfg $ do+            if constrained then constrain $ f 5 .== 17 else registerFunction f+            query $ ensureSat >> getModel+          case modelUIFuns model of+            [(modelName, (_, _, Right (table, def)))] -> do+              modelName == filter (/= '|') nm @? "Expected the quoted function in the model"+              when constrained $ do+                let values = [(map (fromCV @Integer) args, fromCV @Integer value) | (args, value) <- table]+                fromMaybe (fromCV @Integer def) (lookup [5] values) == 17 @? "The model interpretation must satisfy the constraint"+            other -> assertFailure $ "Expected a function interpretation in the model, received: " ++ show other+      | nm <- ["|quotedFunction|", "|function with spaces|"], constrained <- [False, True]+      ]+  , testCase "discovery preserves the current model" $+      withSystemTempDirectory "sbv-discovery" $ \dir -> do+        let logFile = dir </> "solver.smt2"+            f = uninterpret "discovery.binary" :: SBool -> SBool -> SBool+        runSMTWith cfg{transcript = Just logFile} $ do+          x <- sBool "x"+          registerFunction f+          query $ do+            cs <- checkSatAssuming [x]+            io $ cs == Sat @? "Expected satisfiable assumptions"+            before <- getValue x+            _ <- getFunction f+            _ <- getFunction f+            after <- getValue x+            io $ before && after @? "Function discovery must preserve the assumed model"+        logText <- readFile logFile+        let commands = filter ("(" `isPrefixOf`) $ lines logText+            afterCheck = drop 1 $ dropWhile (not . ("(check-sat" `isPrefixOf`)) commands+        length (filter ("(check-sat-assuming" `isPrefixOf`) commands) == 1+          @? "Expected exactly one check with assumptions in the transcript"+        all (\cmd -> not $ any (`isPrefixOf` cmd) ["(declare-", "(define-", "(assert", "(check-sat"]) afterCheck+          @? "Model inspection must not emit declarations, assertions, or another satisfiability check"+  , testCase "failed discovery leaves the query usable" $ do+      let f = uninterpret "discovery.missing" :: SInteger -> SInteger+          wrongType = uninterpret "discovery.existing" :: SBool -> SBool+          existing  = uninterpret "discovery.existing" :: SInteger -> SInteger+      runSMTWith cfg $ do+        x <- sBool "x"+        registerFunction existing+        query $ do+          cs <- checkSatAssuming [x]+          io $ cs == Sat @? "Expected satisfiable assumptions"+          expectQueryError "is not registered in this context" $ getFunction f+          expectQueryError "used at incompatible SMT signatures" $ getFunction wrongType+          expectQueryError "Must be called on an uninterpreted function" $ getFunction ((+1) :: SInteger -> SInteger)+          value <- getValue x+          io $ value @? "Failed discovery must preserve the assumed model"+          -- A failed lookup must not poison the registry and prevent a later+          -- ordinary use from declaring the function to the solver.+          constrain $ f 0 .== 42+          ensureSat+          result <- getValue (f 0)+          io $ result == 42 @? "The function must remain usable after failed discovery"+  ]++-- | CVC5 needs first-order ALL (rather than SBV's default HO_ALL) and macro+-- expansion to produce models of these quantified function definitions.+setupFunctionModels :: String -> Symbolic ()+setupFunctionModels solverName = when (solverName == "cvc5") $ do+  setLogic $ CustomLogic "ALL"+  setOption $ OptionKeyword ":macros-quant" ["true"]+  setOption $ OptionKeyword ":macros-quant-mode" ["all"]++-- | Assert the positive raw fallback exactly, including whitespace and literal+-- spelling. Let-wrapped lambdas and as-array values bypass lambda formatting.+fallbackTests :: TestTree+fallbackTests = testGroup "raw function rendering"+  [ testGroup quotingCase+      [ testCase bodyName $ do+          let response = " \n ( ( " ++ actual ++ " ; before value )\n " ++ body ++ " ) ; after value\n ) \n"+          case parseSExpr response of+            Right (EApp [EApp [ECon _, value]]) -> do+              let rendered = formatFunctionResponse value response wanted True Nothing+              rendered == wanted ++ " = fromSMTLib " ++ body @? "Raw fallback changed the function value: " ++ show rendered+            other -> assertFailure $ "Expected a function response, received: " ++ show other+      | (bodyName, body) <-+          [ ("as-array", "(_ as-array helper)")+          , ("let-wrapped lambda", "(let ((offset 3))\n  (lambda ((x!1 Int)) (+ offset (* 2 x!1))))")+          , ("comments and spacing", "(let  ((offset 3)) ; keep this ) comment\n\t(lambda ((x!1 Int))  (+ offset x!1)))")+          , ("quoted literals", "(let ((|text )| \"he said \"\"hi\"\"; )))\")) (lambda ((x String)) |text )|))")+          , ("bit-vector spelling", "(let ((mask #x0f) (wide (_ bv7 16))) (lambda ((x (_ BitVec 8))) (bvand x mask)))")+          ]+      ]+  | (quotingCase, wanted, actual) <-+      [ ("unquoted",        "f",                  "f")+      , ("solver unquotes", "|f|",                "f")+      , ("solver quotes",   "f",                  "|f|")+      , ("quoted",          "|f|",                "|f|")+      , ("spaces in name",  "|name with spaces|", "|name with spaces|")+      ]+  ]++-- | Catch an error inside the same query so subsequent solver interactions+-- verify that discovery has not corrupted either side of the connection.+expectQueryError :: String -> Query a -> Query ()+expectQueryError expected (QueryT action) = QueryT $ ReaderT $ \st -> do+  result <- C.try $ runReaderT action st+  case result of+    Left (err :: C.ErrorCall) -> expected `isInfixOf` C.displayException err @? "Unexpected diagnostic: " ++ C.displayException err+    Right _                  -> assertFailure $ "Expected diagnostic containing: " ++ expected++-- | Exercise both rational equality helpers, repeated declarations, named and+-- unnamed fresh variables, and declarations surviving assertion-stack changes.+rationalTest :: String -> Bool -> Bool -> TestTree+rationalTest testName before inside = testCase testName $ do+  result <- runSMT $ do+    when before $ registerType (Proxy @Rational)+    query $ do+      when inside $ do registerType (Proxy @Rational)+                       registerType (Proxy @Rational)+      push 1+      x <- freshVar @Rational "x"+      constrain $ x .== 1/2+      first <- getValue x+      pop 1+      y <- freshVar_ @Rational+      constrain $ y .== 1/3+      constrain $ y ./= 0+      later <- getValue y+      pure (first, later)+  result == (1 % 2, 1 % 3) @? "Expected rational values across incremental contexts, received: " ++ show result
SBVTestSuite/TestSuite/Queries/UISatEx.hs view
@@ -76,7 +76,6 @@           constrain $ q1 (-3) .== 9           constrain $ q1 x    .== x+1 -          registerFunction q2 -- Not really necessary, but testing it doesn't break anything           constrain $ q2 sTrue 3   .== 5           constrain $ q2 sFalse 7  .== 6           constrain $ q2 sFalse 12 .== 3
SBVTestSuite/TestSuite/Uninterpreted/Axioms.hs view
@@ -59,7 +59,6 @@ p1 :: Symbolic SBool p1 = do constrain $ \(Forall x) -> thingCompare x x         constrain $ \(Forall k1) (Forall k2) -> k1 ./= thingMerge k1 k2-        registerFunction thingMerge         k1 <- free_         k2 <- free_         return $ k1 .== k2 .=> thingCompare k1 k2
+ SBVTestSuite/Utils/CCodeGen.hs view
@@ -0,0 +1,114 @@+-----------------------------------------------------------------------------+-- |+-- Module    : Utils.CCodeGen+-- Copyright : (c) Levent Erkok+-- License   : BSD3+-- Maintainer: erkokl@gmail.com+-- Stability : experimental+--+-- Shared dependency discovery for generated-C integration tests.+-----------------------------------------------------------------------------++{-# LANGUAGE ScopedTypeVariables #-}++{-# OPTIONS_GHC -Wall -Werror #-}++module Utils.CCodeGen (locateLibBF, generatedMakeOptions) where++import Control.Exception (IOException, catch)+import Control.Concurrent.MVar (MVar, modifyMVar, newMVar)+import Data.List (isInfixOf, isPrefixOf, isSuffixOf, sort)+import System.Directory (doesDirectoryExist, doesFileExist, listDirectory)+import System.Environment (lookupEnv)+import System.FilePath ((</>), takeDirectory)+import System.Process (readProcessWithExitCode)+import System.Exit (ExitCode(..))+import System.IO.Unsafe (unsafePerformIO)++-- | Locate the header and static archive installed for the Haskell @libBF@+-- dependency so integration tests exercise the same C implementation.+locateLibBF :: IO (FilePath, FilePath)+locateLibBF = modifyMVar libBFLocation $ \cached -> do+  result <- maybe discoverLibBF pure cached+  pure (Just result, result)++-- | Share immutable dependency discovery across parallel integration tests.+{-# NOINLINE libBFLocation #-}+libBFLocation :: MVar (Maybe (FilePath, FilePath))+libBFLocation = unsafePerformIO (newMVar Nothing)++-- | Allow explicit installations; otherwise find a matching header/archive+-- pair from one Cabal package, never from different package versions.+discoverLibBF :: IO (FilePath, FilePath)+discoverLibBF = do+  includeOverride <- lookupEnv "SBV_C_LIBBF_INCLUDE"+  libraryOverride <- lookupEnv "SBV_C_LIBBF_LIBRARY"+  case (includeOverride, libraryOverride) of+    (Just includeDir, Just archive) -> do+      headerExists <- doesFileExist (includeDir </> "libbf.h")+      archiveExists <- doesFileExist archive+      if headerExists && archiveExists then pure (includeDir, archive)+        else fail "SBV_C_LIBBF_INCLUDE/SBV_C_LIBBF_LIBRARY must name an installed libbf.h and library."+    (Nothing, Nothing) -> discoverStoredLibBF+    _ -> fail "Set both SBV_C_LIBBF_INCLUDE and SBV_C_LIBBF_LIBRARY, or neither."++-- | Discover the installed Haskell dependency's bundled C library.+discoverStoredLibBF :: IO (FilePath, FilePath)+discoverStoredLibBF = do+  (pathExit, pathOutput, pathError) <- readProcessWithExitCode "cabal" ["path"] ""+  case pathExit of+    ExitSuccess -> pure ()+    _ -> fail $ "Unable to query Cabal store: " ++ pathError+  let storePrefix = "compiler-store-path: "+      stores      = [drop (length storePrefix) line | line <- lines pathOutput, storePrefix `isInfixOf` line]+  store <- case stores of+             path:_ -> pure path+             []     -> fail $ "Unable to find Cabal store: " ++ pathError+  packages <- listDirectory store+  let libBFDirs = [store </> entry | entry <- sort packages, "lbBF-" `isPrefixOf` entry]+  firstSuccessful [do header <- findInstalledFile path "libbf.h"+                      archive <- findInstalledFile path "libHSlbBF"+                      pure (takeDirectory header, archive)+                  | path <- libBFDirs]++-- | Recursively find an installed file by exact name or filename prefix.+findInstalledFile :: FilePath -> String -> IO FilePath+findInstalledFile root sought = do+  entries <- listDirectory root+  search entries+ where search []           = fail $ "Unable to find " ++ sought ++ " below " ++ root+       search (entry:rest) = do+         let path = root </> entry+         isDir  <- doesDirectoryExist path+         isFile <- doesFileExist path+         if isFile && matches entry+           then pure path+           else if isDir+                  then findInstalledFile path sought `catchIO` search rest+                  else search rest++       matches entry+         | sought == "libHSlbBF" = sought `isPrefixOf` entry && ".a" `isSuffixOf` entry+         | True                  = entry == sought++-- | Return the first successful filesystem search result.+firstSuccessful :: [IO a] -> IO a+firstSuccessful = foldr catchIO (fail "Unable to locate the installed libBF package")++-- | Recover from an expected filesystem-search failure with another search.+catchIO :: IO a -> IO a -> IO a+catchIO action fallback = action `catch` \(_ :: IOException) -> fallback++-- | Build generated Makefiles with strict warnings, resolving LibBF from the+-- Cabal store when needed. Keep compiler overrides and GMP discovery intact.+-- Append @SBV_C_TEST_FLAGS@ to both compilation and linking commands, allowing+-- optimization and sanitizer runs to cover generated programs and library callers.+generatedMakeOptions :: FilePath -> IO [String]+generatedMakeOptions dir = do+  makefile <- readFile (dir </> "Makefile")+  extraFlags <- maybe "" (" " ++) <$> lookupEnv "SBV_C_TEST_FLAGS"+  let flags = "CCFLAGS=-std=c11 -Wall -Werror -O2" ++ extraFlags+  if "-lbf" `isInfixOf` makefile+    then do (includeDir, archive) <- locateLibBF+            pure [flags ++ " -I\"" ++ includeDir ++ "\"", "SBV_LIBS=\"" ++ archive ++ "\" -lm ${GMP_LIBS}"]+    else pure [flags]
sbv.cabal view
@@ -1,7 +1,7 @@ Cabal-Version: 2.2  Name        : sbv-Version     : 14.7+Version     : 14.8 Category    : Formal Methods, Theorem Provers, Bit vectors, Symbolic Computation, Math, SMT Synopsis    : SMT Based Verification: Symbolic Haskell theorem prover using SMT solving. Description : Express properties about Haskell programs and automatically prove them using SMT@@ -54,6 +54,7 @@                      DeriveLift                      DeriveTraversable                      DerivingStrategies+                     EmptyDataDecls                      ExistentialQuantification                      FlexibleContexts                      FlexibleInstances@@ -73,6 +74,7 @@                      OverloadedStrings                      PackageImports                      ParallelListComp+                     PatternSynonyms                      QuantifiedConstraints                      QuasiQuotes                      RankNTypes@@ -142,6 +144,7 @@                   , Data.SBV.Tools.BVOptimize                   , Data.SBV.Tools.Induction                   , Data.SBV.Tools.CodeGen+                  , Data.SBV.Tools.CodeGen.Legacy                   , Data.SBV.Tools.GenTest                   , Data.SBV.Tools.Overflow                   , Data.SBV.Tools.Polynomial@@ -154,6 +157,7 @@   if flag(compile_examples)     Exposed-modules : Documentation.SBV.Examples.ADT.Expr                     , Documentation.SBV.Examples.ADT.Param+                    , Documentation.SBV.Examples.ADT.Shapes                     , Documentation.SBV.Examples.ADT.Types                     , Documentation.SBV.Examples.BitPrecise.Adders                     , Documentation.SBV.Examples.BitPrecise.BitTricks@@ -314,6 +318,29 @@                   , Data.SBV.Control.Types                   , Data.SBV.Control.Utils                   , Data.SBV.Compilers.C+                  , Data.SBV.Compilers.C.ADT+                  , Data.SBV.Compilers.C.Arena+                  , Data.SBV.Compilers.C.Array+                  , Data.SBV.Compilers.C.BV+                  , Data.SBV.Compilers.C.FP+                  , Data.SBV.Compilers.C.Finite+                  , Data.SBV.Compilers.C.GMP+                  , Data.SBV.Compilers.C.Legacy+                  , Data.SBV.Compilers.C.Legacy.Internal+                  , Data.SBV.Compilers.C.List+                  , Data.SBV.Compilers.C.Lowering+                  , Data.SBV.Compilers.C.NonLinear+                  , Data.SBV.Compilers.C.Backend+                  , Data.SBV.Compilers.C.PseudoBoolean+                  , Data.SBV.Compilers.C.Real+                  , Data.SBV.Compilers.C.RegExp+                  , Data.SBV.Compilers.C.Set+                  , Data.SBV.Compilers.C.Syntax+                  , Data.SBV.Compilers.C.Table+                  , Data.SBV.Compilers.C.Text+                  , Data.SBV.Compilers.C.Types+                  , Data.SBV.Compilers.C.Tuple+                  , Data.SBV.Compilers.C.Value                   , Data.SBV.Compilers.CodeGen                   , Data.SBV.Lambda                   , Data.SBV.SCase@@ -369,10 +396,12 @@   hs-source-dirs  : SBVTestSuite   main-is         : SBVTest.hs   other-modules   : Utils.SBVTestFramework+                  , Utils.CCodeGen                   , TestSuite.ADT.ADT                   , TestSuite.ADT.Expr                   , TestSuite.ADT.MutRec                   , TestSuite.ADT.PExpr+                  , TestSuite.ADT.Registration                   , TestSuite.Arrays.InitVals                   , TestSuite.Arrays.Memory                   , TestSuite.Arrays.Query@@ -422,12 +451,21 @@                   , TestSuite.BitPrecise.MergeSort                   , TestSuite.BitPrecise.PrefixSum                   , TestSuite.CodeGeneration.AddSub+                  , TestSuite.CodeGeneration.ArbitraryBits+                  , TestSuite.CodeGeneration.ArbitraryFloats+                  , TestSuite.CodeGeneration.ArrayCaptures+                  , TestSuite.CodeGeneration.Boundaries                   , TestSuite.CodeGeneration.CgTests                   , TestSuite.CodeGeneration.CRC_USB5+                  , TestSuite.CodeGeneration.ExactNumbers                   , TestSuite.CodeGeneration.Fibonacci                   , TestSuite.CodeGeneration.Floats                   , TestSuite.CodeGeneration.GCD                   , TestSuite.CodeGeneration.PopulationCount+                  , TestSuite.CodeGeneration.LibraryBuild+                  , TestSuite.CodeGeneration.PseudoBoolean+                  , TestSuite.CodeGeneration.RegExp+                  , TestSuite.CodeGeneration.ScalarSafety                   , TestSuite.CodeGeneration.Uninterpreted                   , TestSuite.CompileTests.SCase                   , TestSuite.CompileTests.PCase@@ -471,6 +509,7 @@                   , TestSuite.Queries.Int_Z3                   , TestSuite.Queries.Interpolants                   , TestSuite.Queries.Lists+                  , TestSuite.Queries.Registration                   , TestSuite.Queries.Strings                   , TestSuite.Queries.Sums                   , TestSuite.Queries.Tables