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 +90/−0
- Data/SBV.hs +3/−0
- Data/SBV/Client.hs +49/−21
- Data/SBV/Compilers/C.hs +61/−1076
- Data/SBV/Compilers/C/ADT.hs +1083/−0
- Data/SBV/Compilers/C/Arena.hs +76/−0
- Data/SBV/Compilers/C/Array.hs +855/−0
- Data/SBV/Compilers/C/BV.hs +1031/−0
- Data/SBV/Compilers/C/Backend.hs +3143/−0
- Data/SBV/Compilers/C/FP.hs +1261/−0
- Data/SBV/Compilers/C/Finite.hs +40/−0
- Data/SBV/Compilers/C/GMP.hs +801/−0
- Data/SBV/Compilers/C/Legacy.hs +21/−0
- Data/SBV/Compilers/C/Legacy/Internal.hs +1095/−0
- Data/SBV/Compilers/C/List.hs +605/−0
- Data/SBV/Compilers/C/Lowering.hs +63/−0
- Data/SBV/Compilers/C/NonLinear.hs +119/−0
- Data/SBV/Compilers/C/PseudoBoolean.hs +58/−0
- Data/SBV/Compilers/C/Real.hs +67/−0
- Data/SBV/Compilers/C/RegExp.hs +371/−0
- Data/SBV/Compilers/C/Set.hs +584/−0
- Data/SBV/Compilers/C/Syntax.hs +63/−0
- Data/SBV/Compilers/C/Table.hs +135/−0
- Data/SBV/Compilers/C/Text.hs +580/−0
- Data/SBV/Compilers/C/Tuple.hs +311/−0
- Data/SBV/Compilers/C/Types.hs +274/−0
- Data/SBV/Compilers/C/Value.hs +233/−0
- Data/SBV/Compilers/CodeGen.hs +160/−27
- Data/SBV/Control/BaseIO.hs +6/−0
- Data/SBV/Control/Utils.hs +99/−82
- Data/SBV/Core/Data.hs +12/−5
- Data/SBV/Core/Floating.hs +41/−9
- Data/SBV/Core/Kind.hs +67/−4
- Data/SBV/Core/Model.hs +25/−52
- Data/SBV/Core/Symbolic.hs +168/−73
- Data/SBV/Dynamic.hs +2/−2
- Data/SBV/Internals.hs +8/−1
- Data/SBV/Lambda.hs +63/−49
- Data/SBV/RegExp.hs +32/−6
- Data/SBV/SMT/SMTLib2.hs +15/−10
- Data/SBV/SMT/Utils.hs +1/−0
- Data/SBV/Tools/CodeGen.hs +429/−15
- Data/SBV/Tools/CodeGen/Legacy.hs +36/−0
- Data/SBV/Utils/SExpr.hs +45/−24
- Documentation/SBV/Examples/ADT/Shapes.hs +110/−0
- Documentation/SBV/Examples/CodeGeneration/AddSub.hs +50/−20
- Documentation/SBV/Examples/CodeGeneration/PopulationCount.hs +92/−40
- Documentation/SBV/Examples/Crypto/AES.hs +40/−50
- Documentation/SBV/Examples/Puzzles/HexPuzzle.hs +1/−4
- Documentation/SBV/Examples/TP/Reverse.hs +7/−9
- README.md +1/−1
- SBVTestSuite/GoldFiles/addSub.gold +48/−18
- SBVTestSuite/GoldFiles/aes128Dec.gold +4421/−2421
- SBVTestSuite/GoldFiles/aes128Enc.gold +1771/−1051
- SBVTestSuite/GoldFiles/aes128Lib.gold +8666/−5073
- SBVTestSuite/GoldFiles/cgUninterpret.gold +48/−20
- SBVTestSuite/GoldFiles/codeGen1.gold +164/−124
- SBVTestSuite/GoldFiles/crcUSB5_1.gold +126/−20
- SBVTestSuite/GoldFiles/crcUSB5_2.gold +185/−26
- SBVTestSuite/GoldFiles/doctest_sanity.gold +2/−2
- SBVTestSuite/GoldFiles/fib1.gold +17/−9
- SBVTestSuite/GoldFiles/fib2.gold +19/−10
- SBVTestSuite/GoldFiles/floats_cgen.gold +5191/−2783
- SBVTestSuite/GoldFiles/gcd.gold +45/−21
- SBVTestSuite/GoldFiles/legato_c.gold +6455/−6409
- SBVTestSuite/GoldFiles/merge.gold +39/−25
- SBVTestSuite/GoldFiles/popCount1.gold +91/−39
- SBVTestSuite/GoldFiles/popCount2.gold +91/−39
- SBVTestSuite/GoldFiles/queryTables.gold +3/−3
- SBVTestSuite/GoldFiles/query_uisatex1.gold +61/−68
- SBVTestSuite/GoldFiles/query_uisatex2.gold +63/−66
- SBVTestSuite/GoldFiles/selChecked.gold +36/−11
- SBVTestSuite/GoldFiles/selUnchecked.gold +36/−11
- SBVTestSuite/GoldFiles/sha256HashBlock.gold +2682/−2573
- SBVTestSuite/GoldFiles/unint-axioms-empty.gold +6/−9
- SBVTestSuite/SBVTest.hs +22/−0
- SBVTestSuite/TestSuite/ADT/Registration.hs +124/−0
- SBVTestSuite/TestSuite/Basics/ArbFloats.hs +136/−2
- SBVTestSuite/TestSuite/Basics/String.hs +106/−2
- SBVTestSuite/TestSuite/Basics/UISat.hs +35/−0
- SBVTestSuite/TestSuite/CodeGeneration/ArbitraryBits.hs +450/−0
- SBVTestSuite/TestSuite/CodeGeneration/ArbitraryFloats.hs +1073/−0
- SBVTestSuite/TestSuite/CodeGeneration/ArrayCaptures.hs +119/−0
- SBVTestSuite/TestSuite/CodeGeneration/Boundaries.hs +142/−0
- SBVTestSuite/TestSuite/CodeGeneration/CgTests.hs +5071/−34
- SBVTestSuite/TestSuite/CodeGeneration/ExactNumbers.hs +667/−0
- SBVTestSuite/TestSuite/CodeGeneration/LibraryBuild.hs +125/−0
- SBVTestSuite/TestSuite/CodeGeneration/PseudoBoolean.hs +130/−0
- SBVTestSuite/TestSuite/CodeGeneration/RegExp.hs +351/−0
- SBVTestSuite/TestSuite/CodeGeneration/ScalarSafety.hs +215/−0
- SBVTestSuite/TestSuite/CompileTests/PCase/PCase17.stderr +2/−2
- SBVTestSuite/TestSuite/CompileTests/PCase/PCase38.stderr +2/−2
- SBVTestSuite/TestSuite/CompileTests/SCase/SCase101.stderr +1/−1
- SBVTestSuite/TestSuite/CompileTests/SCase/SCase59.stderr +1/−1
- SBVTestSuite/TestSuite/CompileTests/SCase/SCase66.stderr +1/−1
- SBVTestSuite/TestSuite/CompileTests/SCase/SCase89.stderr +1/−1
- SBVTestSuite/TestSuite/Crypto/AES.hs +85/−0
- SBVTestSuite/TestSuite/Crypto/SHA.hs +1/−1
- SBVTestSuite/TestSuite/Queries/Lists.hs +109/−1
- SBVTestSuite/TestSuite/Queries/Registration.hs +291/−0
- SBVTestSuite/TestSuite/Queries/UISatEx.hs +0/−1
- SBVTestSuite/TestSuite/Uninterpreted/Axioms.hs +0/−1
- SBVTestSuite/Utils/CCodeGen.hs +114/−0
- sbv.cabal +40/−1
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, ©);"+ , " data[0] = 99;"+ , " assert(copy.data[0] == 7 && result.data[0] == 7);"+ , " sbv_list_release_u16(©);"+ , " 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(©);"+ , " 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