Added kquick's SCargotPrintParse test suite with extra unconstrained tests
Getty Ritter
6 years ago
73 | 73 | parsec >=3.1 && <4, |
74 | 74 | QuickCheck >=2.8 && <3, |
75 | 75 | text >=1.2 && <2 |
76 | ||
77 | test-suite s-cargot-printparse | |
78 | default-language: Haskell2010 | |
79 | type: exitcode-stdio-1.0 | |
80 | hs-source-dirs: test | |
81 | main-is: SCargotPrintParse.hs | |
82 | build-depends: s-cargot, | |
83 | base >=4.7 && <5, | |
84 | parsec >=3.1 && <4, | |
85 | HUnit >=1.6 && <1.7, | |
86 | text >=1.2 && <2 |
1 | {-# LANGUAGE OverloadedStrings #-} | |
2 | {-# LANGUAGE LambdaCase #-} | |
3 | ||
4 | module Main where | |
5 | ||
6 | import Data.Either | |
7 | import Data.SCargot | |
8 | import Data.SCargot.Comments | |
9 | import Data.SCargot.Repr | |
10 | import Data.Semigroup | |
11 | import qualified Data.Text as T | |
12 | import qualified Data.Text.IO as TIO | |
13 | import System.Exit | |
14 | import Test.HUnit | |
15 | import Text.Parsec as P | |
16 | import Text.Parsec.Text (Parser) | |
17 | import Text.Printf ( printf ) | |
18 | ||
19 | ||
20 | main = do | |
21 | putStrLn "Parsing a large S-expression" | |
22 | srcs <- mapM (\n -> (,) n <$> TIO.readFile n) [ "test/small-sample.sexp" | |
23 | , "test/med-sample.sexp" | |
24 | , "test/med2-sample.sexp" | |
25 | , "test/big-sample.sexp" | |
26 | ] | |
27 | counts <- runTestTT $ TestList | |
28 | [ TestLabel "basic checks" $ TestList | |
29 | [ TestLabel "flat print" $ TestList | |
30 | [ TestLabel "flatprint SNil" $ "()" ~=? printSExpr SNil | |
31 | , TestLabel "flatprint SAtom" $ "hi" ~=? printSExpr (SAtom (AIdent "hi")) | |
32 | , TestLabel "flatprint pair" $ "(hi . world)" ~=? | |
33 | printSExpr (SCons (SAtom (AIdent "hi")) (SAtom (AIdent "world"))) | |
34 | , TestLabel "flatprint list of 1" $ "(hi)" ~=? | |
35 | printSExpr (SCons (SAtom (AIdent "hi")) SNil) | |
36 | , TestLabel "flatprint list of 2" $ "(hi world)" ~=? | |
37 | printSExpr (SCons (SAtom (AIdent "hi")) | |
38 | (SCons (SAtom (AIdent "world")) | |
39 | SNil)) | |
40 | , TestLabel "flatprint list of 2 pairs" $ "((hi . hallo) world . welt)" ~=? | |
41 | printSExpr (SCons (SCons (SAtom (AIdent "hi")) | |
42 | (SAtom (AIdent "hallo"))) | |
43 | (SCons (SAtom (AIdent "world")) | |
44 | (SAtom (AIdent "welt")))) | |
45 | , TestLabel "flatprint list of 3 ending in a pair" $ "(hi world hallo . welt)" ~=? | |
46 | printSExpr (SCons (SAtom (AIdent "hi")) | |
47 | (SCons (SAtom (AIdent "world")) | |
48 | (SCons (SAtom (AIdent "hallo")) | |
49 | (SAtom (AIdent "welt"))))) | |
50 | , TestLabel "flatprint list of 3" $ "(hi world hallo)" ~=? | |
51 | printSExpr (SCons (SAtom (AIdent "hi")) | |
52 | (SCons (SAtom (AIdent "world")) | |
53 | (SCons (SAtom (AIdent "hallo")) | |
54 | SNil))) | |
55 | ] | |
56 | ||
57 | , TestLabel "pretty print" $ | |
58 | let pprintIt = pprintSExpr 40 Swing in TestList | |
59 | [ TestLabel "pretty print SNil" $ "()" ~=? pprintIt SNil | |
60 | , TestLabel "pretty print SAtom" $ "hi" ~=? pprintIt (SAtom (AIdent "hi")) | |
61 | , TestLabel "pretty print pair" $ "(hi . world)" ~=? | |
62 | pprintIt (SCons (SAtom (AIdent "hi")) (SAtom (AIdent "world"))) | |
63 | , TestLabel "pretty print list of 1" $ "(hi)" ~=? | |
64 | pprintIt (SCons (SAtom (AIdent "hi")) SNil) | |
65 | , TestLabel "pretty print list of 2" $ "(hi world)" ~=? | |
66 | pprintIt (SCons (SAtom (AIdent "hi")) | |
67 | (SCons (SAtom (AIdent "world")) | |
68 | SNil)) | |
69 | , TestLabel "pretty print list of 2 pairs" $ | |
70 | "((hi . hallo) world . welt)" ~=? | |
71 | pprintIt (SCons (SCons (SAtom (AIdent "hi")) | |
72 | (SAtom (AIdent "hallo"))) | |
73 | (SCons (SAtom (AIdent "world")) | |
74 | (SAtom (AIdent "welt")))) | |
75 | , TestLabel "pretty print list of 3 ending in a pair" $ | |
76 | "(hi world hallo . welt)" ~=? | |
77 | pprintIt (SCons (SAtom (AIdent "hi")) | |
78 | (SCons (SAtom (AIdent "world")) | |
79 | (SCons (SAtom (AIdent "hallo")) | |
80 | (SAtom (AIdent "welt"))))) | |
81 | , TestLabel "pretty print list of 3" $ "(hi world hallo)" ~=? | |
82 | pprintIt (SCons (SAtom (AIdent "hi")) | |
83 | (SCons (SAtom (AIdent "world")) | |
84 | (SCons (SAtom (AIdent "hallo")) | |
85 | SNil))) | |
86 | ] | |
87 | ||
88 | , TestLabel "unconstrained print" $ | |
89 | let pprintIt = ucPrintSExpr Swing in TestList | |
90 | [ TestLabel "pretty print SNil" $ "()" ~=? pprintIt SNil | |
91 | , TestLabel "pretty print SAtom" $ "hi" ~=? pprintIt (SAtom (AIdent "hi")) | |
92 | , TestLabel "pretty print pair" $ "(hi . world)" ~=? | |
93 | pprintIt (SCons (SAtom (AIdent "hi")) (SAtom (AIdent "world"))) | |
94 | , TestLabel "pretty print list of 1" $ "(hi)" ~=? | |
95 | pprintIt (SCons (SAtom (AIdent "hi")) SNil) | |
96 | , TestLabel "pretty print list of 2" $ "(hi world)" ~=? | |
97 | pprintIt (SCons (SAtom (AIdent "hi")) | |
98 | (SCons (SAtom (AIdent "world")) | |
99 | SNil)) | |
100 | , TestLabel "pretty print list of 2 pairs" $ | |
101 | "((hi . hallo)\n world\n . welt)" ~=? | |
102 | pprintIt (SCons (SCons (SAtom (AIdent "hi")) | |
103 | (SAtom (AIdent "hallo"))) | |
104 | (SCons (SAtom (AIdent "world")) | |
105 | (SAtom (AIdent "welt")))) | |
106 | , TestLabel "pretty print list of 3 ending in a pair" $ | |
107 | "(hi world hallo . welt)" ~=? | |
108 | pprintIt (SCons (SAtom (AIdent "hi")) | |
109 | (SCons (SAtom (AIdent "world")) | |
110 | (SCons (SAtom (AIdent "hallo")) | |
111 | (SAtom (AIdent "welt"))))) | |
112 | , TestLabel "pretty print list of 3" $ "(hi world hallo)" ~=? | |
113 | pprintIt (SCons (SAtom (AIdent "hi")) | |
114 | (SCons (SAtom (AIdent "world")) | |
115 | (SCons (SAtom (AIdent "hallo")) | |
116 | SNil))) | |
117 | ] | |
118 | ||
119 | ] | |
120 | , TestLabel "round-trip" $ TestList $ | |
121 | concatMap (\t -> map t srcs) $ | |
122 | [ testParsePrint | |
123 | ] | |
124 | ] | |
125 | if errors counts + failures counts > 0 | |
126 | then exitFailure | |
127 | else exitSuccess | |
128 | ||
129 | ||
130 | testParsePrint :: (String, T.Text) -> Test | |
131 | testParsePrint (n,s) = TestList | |
132 | [ testParseFlatPrint n s | |
133 | ||
134 | , testParseUnconstrainedPrint Swing n s | |
135 | , testParseUnconstrainedPrint Align n s | |
136 | ||
137 | , testParsePPrint 80 Swing n s | |
138 | , testParsePPrint 60 Swing n s | |
139 | , testParsePPrint 40 Swing n s | |
140 | , testParsePPrint 20 Swing n s | |
141 | , testParsePPrint 15 Swing n s | |
142 | , testParsePPrint 10 Swing n s | |
143 | ||
144 | , testParsePPrint 80 Align n s | |
145 | , testParsePPrint 40 Align n s | |
146 | , testParsePPrint 10 Align n s | |
147 | ] | |
148 | ||
149 | ||
150 | testParseFlatPrint testName src = | |
151 | testRoundTrip (testName <> " flat print") | |
152 | (fromRight (error "Failed parse") . parseSExpr) | |
153 | printSExpr | |
154 | stripAllText | |
155 | src | |
156 | ||
157 | testParseUnconstrainedPrint indentStyle testName src = | |
158 | testRoundTrip (testName <> " unconstrained print") | |
159 | (fromRight (error "Failed parse") . parseSExpr) | |
160 | (ucPrintSExpr indentStyle) | |
161 | stripAllText | |
162 | src | |
163 | ||
164 | testParsePPrint width indentStyle testName src = | |
165 | testRoundTrip (testName <> " pretty print") | |
166 | (fromRight (error "Failed parse") . parseSExpr) | |
167 | (pprintSExpr width indentStyle) | |
168 | stripAllText | |
169 | src | |
170 | ||
171 | stripAllText = T.unwords . concatMap T.words . T.lines | |
172 | ||
173 | testRoundTrip nm there back prep src = TestList | |
174 | [ TestLabel (nm <> " round trip") $ | |
175 | TestCase $ (prep src) @=? (prep $ back $ there src) | |
176 | ||
177 | , TestLabel (nm <> " round trip twice") $ | |
178 | TestCase $ (prep src) @=? (prep $ back $ there $ back $ there src) | |
179 | ] | |
180 | ||
181 | ||
182 | ------------------------------------------------------------------------ | |
183 | ||
184 | data FAtom = AIdent String | |
185 | | AQuoted String | |
186 | | AString String | |
187 | | AInt Integer | |
188 | | ABV Int Integer | |
189 | deriving (Eq, Show) | |
190 | ||
191 | ||
192 | string :: String -> SExpr FAtom | |
193 | string = SAtom . AString | |
194 | ||
195 | -- | Lift an unquoted identifier. | |
196 | ident :: String -> SExpr FAtom | |
197 | ident = SAtom . AIdent | |
198 | ||
199 | -- | Lift a quoted identifier. | |
200 | quoted :: String -> SExpr FAtom | |
201 | quoted = SAtom . AQuoted | |
202 | ||
203 | -- | Lift an integer. | |
204 | int :: Integer -> SExpr FAtom | |
205 | int = SAtom . AInt | |
206 | ||
207 | ||
208 | printAtom :: FAtom -> T.Text | |
209 | printAtom a = | |
210 | case a of | |
211 | AIdent s -> T.pack s | |
212 | AQuoted s -> T.pack ('\'' : s) | |
213 | AString s -> T.pack (show s) | |
214 | AInt i -> T.pack (show i) | |
215 | ABV w val -> formatBV w val | |
216 | ||
217 | ||
218 | printSExpr :: SExpr FAtom -> T.Text | |
219 | printSExpr = encodeOne (flatPrint printAtom) | |
220 | ||
221 | pprintSExpr :: Int -> Indent -> SExpr FAtom -> T.Text | |
222 | pprintSExpr w i = encodeOne (setIndentStrategy (const i) $ | |
223 | setMaxWidth w $ | |
224 | setIndentAmount 1 $ | |
225 | basicPrint printAtom) | |
226 | ||
227 | ucPrintSExpr :: Indent -> SExpr FAtom -> T.Text | |
228 | ucPrintSExpr i = encodeOne (setIndentStrategy (const i) $ | |
229 | setIndentAmount 1 $ | |
230 | unconstrainedPrint printAtom) | |
231 | ||
232 | getIdent :: FAtom -> Maybe String | |
233 | getIdent (AIdent s) = Just s | |
234 | getIdent _ = Nothing | |
235 | ||
236 | formatBV :: Int -> Integer -> T.Text | |
237 | formatBV w val = T.pack (prefix ++ printf fmt val) | |
238 | where | |
239 | (prefix, fmt) | |
240 | | w `rem` 4 == 0 = ("#x", "%0" ++ show (w `div` 4) ++ "x") | |
241 | | otherwise = ("#b", "%0" ++ show w ++ "b") | |
242 | ||
243 | parseIdent :: Parser String | |
244 | parseIdent = (:) <$> first <*> P.many rest | |
245 | where first = P.letter P.<|> P.oneOf "+-=<>_" | |
246 | rest = P.letter P.<|> P.digit P.<|> P.oneOf "+-=<>_" | |
247 | ||
248 | parseString :: Parser String | |
249 | parseString = do | |
250 | _ <- P.char '"' | |
251 | s <- P.many (P.noneOf ['"']) | |
252 | _ <- P.char '"' | |
253 | return s | |
254 | ||
255 | parseBV :: Parser (Int, Integer) | |
256 | parseBV = P.char '#' >> ((P.char 'b' >> parseBin) P.<|> (P.char 'x' >> parseHex)) | |
257 | where parseBin = P.oneOf "10" >>= \d -> parseBin' (1, if d == '1' then 1 else 0) | |
258 | ||
259 | parseBin' :: (Int, Integer) -> Parser (Int, Integer) | |
260 | parseBin' (bits, x) = do | |
261 | P.optionMaybe (P.oneOf "10") >>= \case | |
262 | Just d -> parseBin' (bits + 1, x * 2 + (if d == '1' then 1 else 0)) | |
263 | Nothing -> return (bits, x) | |
264 | ||
265 | parseHex = (\s -> (length s * 4, read ("0x" ++ s))) <$> P.many1 P.hexDigit | |
266 | ||
267 | parseAtom :: Parser FAtom | |
268 | parseAtom | |
269 | = AIdent <$> parseIdent | |
270 | P.<|> AQuoted <$> (P.char '\'' >> parseIdent) | |
271 | P.<|> AString <$> parseString | |
272 | P.<|> AInt . read <$> P.many1 P.digit | |
273 | P.<|> uncurry ABV <$> parseBV | |
274 | ||
275 | parserLL :: SExprParser FAtom (SExpr FAtom) | |
276 | parserLL = withLispComments (mkParser parseAtom) | |
277 | ||
278 | parseSExpr :: T.Text -> Either String (SExpr FAtom) | |
279 | parseSExpr = decodeOne parserLL |
1 | ((operands ((rD . 'GPR) (setcc . 'Cc_out) (predBits . 'Pred) (mimm . 'Mod_imm) (rN . 'GPR))) (in (mimm setcc rN 'CPSR 'PC)) (defs (('PC (ite ((_ call "arm.is_r15") rD) (ite (bveq #b0 ((_ extract 0 0) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))) (bvand #xfffffffe ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000)))) (ite (bveq #b0 ((_ extract 1 1) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))) (bvand #xfffffffd ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000)))) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))) (bvadd 'PC #x00000004))) ('CPSR (ite (ite (andp (bveq #b1 ((_ extract 0 0) predBits)) (bvne predBits #xf)) (notp (ite (bveq ((_ extract 3 1) predBits) #b000) (bveq #b1 ((_ extract 30 30) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b001) (bveq #b1 ((_ extract 29 29) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b010) (bveq #b1 ((_ extract 31 31) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b011) (bveq #b1 ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b100) (andp (bveq #b1 ((_ extract 29 29) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (ite (bveq ((_ extract 3 1) predBits) #b101) (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b110) (andp (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (bveq #b0 #b0))))))))) (ite (bveq ((_ extract 3 1) predBits) #b000) (bveq #b1 ((_ extract 30 30) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b001) (bveq #b1 ((_ extract 29 29) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b010) (bveq #b1 ((_ extract 31 31) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b011) (bveq #b1 ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b100) (andp (bveq #b1 ((_ extract 29 29) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (ite (bveq ((_ extract 3 1) predBits) #b101) (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b110) (andp (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (bveq #b0 #b0))))))))) (ite (andp (bveq setcc #b1) (notp ((_ call "arm.is_r15") rD))) (concat (concat ((_ extract 31 31) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000)))) (concat (ite (bveq ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))) #x00000000) #b1 #b0) (concat ((_ extract 32 32) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))) (bvand ((_ extract 31 31) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000)))) ((_ extract 32 32) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))))) ((_ extract 27 0) (ite ((_ call "arm.is_r15") rD) (ite (bveq #b0 ((_ extract 0 0) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))) (bvand #xfeffffff (bvor #x00000020 'CPSR)) 'CPSR) 'CPSR))) (ite ((_ call "arm.is_r15") rD) (ite (bveq #b0 ((_ extract 0 0) ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000))))) (bvand #xfeffffff (bvor #x00000020 'CPSR)) 'CPSR) 'CPSR)) 'CPSR)) (rD (ite (ite (andp (bveq #b1 ((_ extract 0 0) predBits)) (bvne predBits #xf)) (notp (ite (bveq ((_ extract 3 1) predBits) #b000) (bveq #b1 ((_ extract 30 30) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b001) (bveq #b1 ((_ extract 29 29) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b010) (bveq #b1 ((_ extract 31 31) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b011) (bveq #b1 ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b100) (andp (bveq #b1 ((_ extract 29 29) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (ite (bveq ((_ extract 3 1) predBits) #b101) (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b110) (andp (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (bveq #b0 #b0))))))))) (ite (bveq ((_ extract 3 1) predBits) #b000) (bveq #b1 ((_ extract 30 30) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b001) (bveq #b1 ((_ extract 29 29) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b010) (bveq #b1 ((_ extract 31 31) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b011) (bveq #b1 ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b100) (andp (bveq #b1 ((_ extract 29 29) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (ite (bveq ((_ extract 3 1) predBits) #b101) (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (ite (bveq ((_ extract 3 1) predBits) #b110) (andp (bveq ((_ extract 31 31) 'CPSR) ((_ extract 28 28) 'CPSR)) (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) (bveq #b0 #b0))))))))) (ite ((_ call "arm.is_r15") rD) rD ((_ extract 31 0) (bvadd (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (ite (bveq (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) #x00000000) ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) (bvor (bvshl (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvsub #x00000020 (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020))) (bvlshr (bvshl #x00000001 ((_ zero_extend 28) ((_ call "a32.modimm_rot") mimm))) (bvurem ((_ zero_extend 24) ((_ call "a32.modimm_imm") mimm)) #x00000020)))))) ((_ zero_extend 1) #x00000000)))) rD)))))⏎ |
1 | ((operands ((rA . 'Gprc) (rS . 'Gprc) (rB . 'Gprc))) | |
2 | (in ('XER 'CR rB rS 'IP)) | |
3 | (defs | |
4 | (('CR | |
5 | (bvor | |
6 | (bvand | |
7 | 'CR | |
8 | (bvnot (bvshl #x0000000f (bvmul ((_ zero_extend 29) #b000) #x00000004)))) | |
9 | (bvshl | |
10 | ((_ zero_extend 28) | |
11 | (concat | |
12 | (ite | |
13 | (bvslt (bvxor rS rB) #x00000000) | |
14 | #b100 | |
15 | (ite (bvsgt (bvxor rS rB) #x00000000) #b010 #b001)) | |
16 | ((_ extract 0 0) 'XER))) | |
17 | (bvmul ((_ zero_extend 29) #b000) #x00000004)))) (rA (bvxor rS rB)) ('IP (bvadd 'IP #x00000004)))))⏎ |
1 | ((operands | |
2 | ((rD . 'GPR) | |
3 | (setcc . 'Cc_out) | |
4 | (predBits . 'Pred) | |
5 | (rM . 'GPR) | |
6 | (rN . 'GPR))) | |
7 | (in (setcc rN rM 'CPSR 'PC)) | |
8 | (defs | |
9 | (('PC | |
10 | (ite | |
11 | ((_ call "arm.is_r15") rD) | |
12 | (ite | |
13 | (bveq | |
14 | #b0 | |
15 | ((_ extract 0 0) | |
16 | ((_ extract 31 0) | |
17 | (bvadd | |
18 | (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (bvnot rM))) | |
19 | ((_ zero_extend 1) #x00000001))))) | |
20 | (bvand | |
21 | #xfffffffe | |
22 | ((_ extract 31 0) | |
23 | (bvadd | |
24 | (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (bvnot rM))) | |
25 | ((_ zero_extend 1) #x00000001)))) | |
26 | (ite | |
27 | (bveq | |
28 | #b0 | |
29 | ((_ extract 1 1) | |
30 | ((_ extract 31 0) | |
31 | (bvadd | |
32 | (bvadd | |
33 | ((_ zero_extend 1) rN) | |
34 | ((_ zero_extend 1) (bvnot rM))) | |
35 | ((_ zero_extend 1) #x00000001))))) | |
36 | (bvand | |
37 | #xfffffffd | |
38 | ((_ extract 31 0) | |
39 | (bvadd | |
40 | (bvadd | |
41 | ((_ zero_extend 1) rN) | |
42 | ((_ zero_extend 1) (bvnot rM))) | |
43 | ((_ zero_extend 1) #x00000001)))) | |
44 | ((_ extract 31 0) | |
45 | (bvadd | |
46 | (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (bvnot rM))) | |
47 | ((_ zero_extend 1) #x00000001))))) | |
48 | (bvadd 'PC #x00000004))) | |
49 | ('CPSR | |
50 | (ite | |
51 | (ite | |
52 | (andp (bveq #b1 ((_ extract 0 0) predBits)) (bvne predBits #xf)) | |
53 | (notp | |
54 | (ite | |
55 | (bveq ((_ extract 3 1) predBits) #b000) | |
56 | (bveq #b1 ((_ extract 30 30) 'CPSR)) | |
57 | (ite | |
58 | (bveq ((_ extract 3 1) predBits) #b001) | |
59 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
60 | (ite | |
61 | (bveq ((_ extract 3 1) predBits) #b010) | |
62 | (bveq #b1 ((_ extract 31 31) 'CPSR)) | |
63 | (ite | |
64 | (bveq ((_ extract 3 1) predBits) #b011) | |
65 | (bveq #b1 ((_ extract 28 28) 'CPSR)) | |
66 | (ite | |
67 | (bveq ((_ extract 3 1) predBits) #b100) | |
68 | (andp | |
69 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
70 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
71 | (ite | |
72 | (bveq ((_ extract 3 1) predBits) #b101) | |
73 | (bveq | |
74 | ((_ extract 31 31) 'CPSR) | |
75 | ((_ extract 28 28) 'CPSR)) | |
76 | (ite | |
77 | (bveq ((_ extract 3 1) predBits) #b110) | |
78 | (andp | |
79 | (bveq | |
80 | ((_ extract 31 31) 'CPSR) | |
81 | ((_ extract 28 28) 'CPSR)) | |
82 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
83 | (bveq #b0 #b0))))))))) | |
84 | (ite | |
85 | (bveq ((_ extract 3 1) predBits) #b000) | |
86 | (bveq #b1 ((_ extract 30 30) 'CPSR)) | |
87 | (ite | |
88 | (bveq ((_ extract 3 1) predBits) #b001) | |
89 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
90 | (ite | |
91 | (bveq ((_ extract 3 1) predBits) #b010) | |
92 | (bveq #b1 ((_ extract 31 31) 'CPSR)) | |
93 | (ite | |
94 | (bveq ((_ extract 3 1) predBits) #b011) | |
95 | (bveq #b1 ((_ extract 28 28) 'CPSR)) | |
96 | (ite | |
97 | (bveq ((_ extract 3 1) predBits) #b100) | |
98 | (andp | |
99 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
100 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
101 | (ite | |
102 | (bveq ((_ extract 3 1) predBits) #b101) | |
103 | (bveq | |
104 | ((_ extract 31 31) 'CPSR) | |
105 | ((_ extract 28 28) 'CPSR)) | |
106 | (ite | |
107 | (bveq ((_ extract 3 1) predBits) #b110) | |
108 | (andp | |
109 | (bveq | |
110 | ((_ extract 31 31) 'CPSR) | |
111 | ((_ extract 28 28) 'CPSR)) | |
112 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
113 | (bveq #b0 #b0))))))))) | |
114 | (ite | |
115 | (andp (bveq setcc #b1) (notp ((_ call "arm.is_r15") rD))) | |
116 | (concat | |
117 | (concat | |
118 | ((_ extract 31 31) | |
119 | ((_ extract 31 0) | |
120 | (bvadd | |
121 | (bvadd | |
122 | ((_ zero_extend 1) rN) | |
123 | ((_ zero_extend 1) (bvnot rM))) | |
124 | ((_ zero_extend 1) #x00000001)))) | |
125 | (concat | |
126 | (ite | |
127 | (bveq | |
128 | ((_ extract 31 0) | |
129 | (bvadd | |
130 | (bvadd | |
131 | ((_ zero_extend 1) rN) | |
132 | ((_ zero_extend 1) (bvnot rM))) | |
133 | ((_ zero_extend 1) #x00000001))) | |
134 | #x00000000) | |
135 | #b1 | |
136 | #b0) | |
137 | (concat | |
138 | ((_ extract 32 32) | |
139 | (bvadd | |
140 | (bvadd | |
141 | ((_ zero_extend 1) rN) | |
142 | ((_ zero_extend 1) (bvnot rM))) | |
143 | ((_ zero_extend 1) #x00000001))) | |
144 | (bvand | |
145 | ((_ extract 31 31) | |
146 | ((_ extract 31 0) | |
147 | (bvadd | |
148 | (bvadd | |
149 | ((_ zero_extend 1) rN) | |
150 | ((_ zero_extend 1) (bvnot rM))) | |
151 | ((_ zero_extend 1) #x00000001)))) | |
152 | ((_ extract 32 32) | |
153 | (bvadd | |
154 | (bvadd | |
155 | ((_ zero_extend 1) rN) | |
156 | ((_ zero_extend 1) (bvnot rM))) | |
157 | ((_ zero_extend 1) #x00000001))))))) | |
158 | ((_ extract 27 0) | |
159 | (ite | |
160 | ((_ call "arm.is_r15") rD) | |
161 | (ite | |
162 | (bveq | |
163 | #b0 | |
164 | ((_ extract 0 0) | |
165 | ((_ extract 31 0) | |
166 | (bvadd | |
167 | (bvadd | |
168 | ((_ zero_extend 1) rN) | |
169 | ((_ zero_extend 1) (bvnot rM))) | |
170 | ((_ zero_extend 1) #x00000001))))) | |
171 | (bvand #xfeffffff (bvor #x00000020 'CPSR)) | |
172 | 'CPSR) | |
173 | 'CPSR))) | |
174 | (ite | |
175 | ((_ call "arm.is_r15") rD) | |
176 | (ite | |
177 | (bveq | |
178 | #b0 | |
179 | ((_ extract 0 0) | |
180 | ((_ extract 31 0) | |
181 | (bvadd | |
182 | (bvadd | |
183 | ((_ zero_extend 1) rN) | |
184 | ((_ zero_extend 1) (bvnot rM))) | |
185 | ((_ zero_extend 1) #x00000001))))) | |
186 | (bvand #xfeffffff (bvor #x00000020 'CPSR)) | |
187 | 'CPSR) | |
188 | 'CPSR)) | |
189 | 'CPSR)) | |
190 | (rD | |
191 | (ite | |
192 | (ite | |
193 | (andp (bveq #b1 ((_ extract 0 0) predBits)) (bvne predBits #xf)) | |
194 | (notp | |
195 | (ite | |
196 | (bveq ((_ extract 3 1) predBits) #b000) | |
197 | (bveq #b1 ((_ extract 30 30) 'CPSR)) | |
198 | (ite | |
199 | (bveq ((_ extract 3 1) predBits) #b001) | |
200 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
201 | (ite | |
202 | (bveq ((_ extract 3 1) predBits) #b010) | |
203 | (bveq #b1 ((_ extract 31 31) 'CPSR)) | |
204 | (ite | |
205 | (bveq ((_ extract 3 1) predBits) #b011) | |
206 | (bveq #b1 ((_ extract 28 28) 'CPSR)) | |
207 | (ite | |
208 | (bveq ((_ extract 3 1) predBits) #b100) | |
209 | (andp | |
210 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
211 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
212 | (ite | |
213 | (bveq ((_ extract 3 1) predBits) #b101) | |
214 | (bveq | |
215 | ((_ extract 31 31) 'CPSR) | |
216 | ((_ extract 28 28) 'CPSR)) | |
217 | (ite | |
218 | (bveq ((_ extract 3 1) predBits) #b110) | |
219 | (andp | |
220 | (bveq | |
221 | ((_ extract 31 31) 'CPSR) | |
222 | ((_ extract 28 28) 'CPSR)) | |
223 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
224 | (bveq #b0 #b0))))))))) | |
225 | (ite | |
226 | (bveq ((_ extract 3 1) predBits) #b000) | |
227 | (bveq #b1 ((_ extract 30 30) 'CPSR)) | |
228 | (ite | |
229 | (bveq ((_ extract 3 1) predBits) #b001) | |
230 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
231 | (ite | |
232 | (bveq ((_ extract 3 1) predBits) #b010) | |
233 | (bveq #b1 ((_ extract 31 31) 'CPSR)) | |
234 | (ite | |
235 | (bveq ((_ extract 3 1) predBits) #b011) | |
236 | (bveq #b1 ((_ extract 28 28) 'CPSR)) | |
237 | (ite | |
238 | (bveq ((_ extract 3 1) predBits) #b100) | |
239 | (andp | |
240 | (bveq #b1 ((_ extract 29 29) 'CPSR)) | |
241 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
242 | (ite | |
243 | (bveq ((_ extract 3 1) predBits) #b101) | |
244 | (bveq | |
245 | ((_ extract 31 31) 'CPSR) | |
246 | ((_ extract 28 28) 'CPSR)) | |
247 | (ite | |
248 | (bveq ((_ extract 3 1) predBits) #b110) | |
249 | (andp | |
250 | (bveq | |
251 | ((_ extract 31 31) 'CPSR) | |
252 | ((_ extract 28 28) 'CPSR)) | |
253 | (notp (bveq #b1 ((_ extract 30 30) 'CPSR)))) | |
254 | (bveq #b0 #b0))))))))) | |
255 | (ite | |
256 | ((_ call "arm.is_r15") rD) | |
257 | rD | |
258 | ((_ extract 31 0) | |
259 | (bvadd | |
260 | (bvadd ((_ zero_extend 1) rN) ((_ zero_extend 1) (bvnot rM))) | |
261 | ((_ zero_extend 1) #x00000001)))) | |
262 | rD))))) |
1 | ((operands ((rT . 'Gprc) (rA . 'Gprc))) (in (rA 'IP)) (defs ((rT rA) ('IP (bvadd 'IP #x00000004)))))⏎ |