vestigia

Detect where execution depends on secrets.
git clone git://git.ppad.tech/vestigia.git
Log | Files | Refs | README | LICENSE

commit 628e38440d5b27024c7bfaa7720117f8be29d69d
parent 80b530d9bc9977e9f8e14174ef86a9fefbe64bf0
Author: Jared Tobin <jared@jtobin.io>
Date:   Tue, 27 Oct 2026 11:19:14 +0400

merge impl/contract: data-independent-timing contracts

record --contract arm-dit or intel-doitm has the plugin fingerprint
the operands of every instruction outside the ISA's contract in the
objects --object names, as it does a division's. The tables are
generated from the vendors' statements: Arm's A64 ISA XML (2022-12),
every encoding with its source registers, and Intel's list 768547
(2026-02-23). diff reports such an instruction run on other operands
under outside, apart from the origins: the contract says nothing of
its time either way, so it qualifies a report rather than failing
it. A division stays an operand origin. The report (vestigia/diff-v4)
names the ISA and the contract and counts what ran outside it; runs
recorded under other contracts are refused. The probe divides its
secret in floating point and checks each ISA's contract finds it.

Diffstat:
MCHANGELOG | 17+++++++++++++++++
MREADME.md | 54+++++++++++++++++++++++++++++++++++++++++++-----------
Mapp/Main.hs | 145++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Metc/probe/harness.c | 19++++++++++++++-----
Alib/Vestigia/Contract.hs | 395+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/Vestigia/Contract/Arm.hs | 2184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/Vestigia/Contract/Intel.hs | 282+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/Vestigia/Contract/Types.hs | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/Vestigia/Diff.hs | 188++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Mnix/lib.nix | 24++++++++++++++++++------
Mnix/probe.nix | 36+++++++++++++++++++++++++++++++-----
Mplugin/vestigia-qemu.c | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mtest/Main.hs | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mvestigia.cabal | 6+++++-
14 files changed, 3665 insertions(+), 83 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG @@ -1,5 +1,22 @@ # Changelog +- 0.2.0 (unreleased) + * Data-independent-timing contracts: `record --contract arm-dit` + or `intel-doitm`, with `--object` and `--objdump`, has the plugin + fingerprint the operands of every instruction outside the ISA's + contract in the objects named, as it does a division's. The + tables are transcribed from the vendors' statements: Arm's A64 + ISA XML (2022-12), every encoding with its source registers, and + Intel's list 768547 (2026-02-23). + * `diff` reports such an instruction on other operands under + `outside`, apart from the origins, with its text, and how many + ran (vestigia/diff-v4, which also names the ISA and contract, and + gives an operand origin its text where the watch list named it). + Runs recorded under other contracts are refused. + * `record` appends the guest's ISA to its dump. + * `diffOf` takes a `contract`; the command finds LLVM's + `llvm-objdump` through `$VESTIGIA_OBJDUMP`. + - 0.1.0 (2026-10-22) * Initial version, with two instruments over a harness that marks its secret (`vestigia.h`, defined by `vestigia.c`, which serves diff --git a/README.md b/README.md @@ -108,19 +108,46 @@ loaded an object at different addresses. A guest reading `/dev/urandom` still reads the host's. `record` appends to its dump how the run was made: the program and -its arguments, the size of the guest's environment, and the exit -status, which the report gives for each run. `diff` refuses a run of -another program, or with arguments of another number or length, or an -environment of another size, than the first run's, each of which lays -the guest's stack out apart; and a control that does not repeat the -first run's arguments. +its arguments, the size of the guest's environment, the exit status, +and the guest's ISA, which the report gives for each run. `diff` +refuses a run of another program, or with arguments of another +number or length, or an environment of another size, than the first +run's, each of which lays the guest's stack out apart; and a control +that does not repeat the first run's arguments. + +### Under a contract: `record --contract` + +An ISA's data-independent-timing contract lists the instructions +whose time does not depend on their data: Arm's `PSTATE.DIT` +(`arm-dit`) and Intel's DOITM (`intel-doitm`), transcribed from the +vendors' own statements (`lib/Vestigia/Contract/Arm.hs`, generated +from Arm's A64 ISA XML, and `lib/Vestigia/Contract/Intel.hs`, from +Intel's list, each citing its release). Under one, `record` +disassembles the objects the program loads whose path contains an +`--object` text (with LLVM's `llvm-objdump`: `--objdump`, else +`$VESTIGIA_OBJDUMP`), and the plugin fingerprints the operands of +every instruction outside the contract, as it does a division's: + +``` +$ vestigia record --contract intel-doitm --object /bin/probe \ +> --dump run-1 -- ./probe 00000005 +``` + +One run equally often on other operands in some run is reported by +`diff` apart from the origins, under `outside`, with its text: the +contract says nothing of its time either way, so it qualifies a +clean report rather than failing it. The report names the contract +and the ISA, and how many instructions outside the contract ran. +Runs compared must have been recorded under the same contract. A +division is an operand origin, as without a contract. ### As derivations The flake's `lib.<system>` holds `traceOf` and `diffOf`, which run either instrument as a derivation over a list of runs; an `x86_64-linux` run executes on any builder for that system, and its -report is cached. `diffOf` repeats the first run as its control. +report is cached. `diffOf` repeats the first run as its control, and takes a +`contract` to record under. `nix/lib.nix` holds the same for a consumer's own nixpkgs, beside `version`. @@ -134,7 +161,7 @@ vestigia.lib.x86_64-linux.diffOf { ``` The output holds `trace.json` (`vestigia/trace-v2`) or `diff.json` -(`vestigia/diff-v3`), the runs kept or the plugin's dumps, what the +(`vestigia/diff-v4`), the runs kept or the plugin's dumps, what the harness printed, and the wall time. ## Two instruments @@ -165,9 +192,14 @@ ppad-poly1305, and ppad-secp256k1. * An address origin can be an address that an earlier secret branch moved, a heap block or stack frame laid out apart, rather than one computed from the secret. -* Divisions alone are read for their operands. Floating-point - division and square root, and multiplication on cores that time it - by its operands, are left to a timing instrument. +* Without a contract, divisions alone are read for their operands. + Under one, an instruction's source registers are read off its + encoding (AArch64) or its operands (x86_64, with the registers some + instructions read without naming); flags are not read, and a + 256- or 512-bit vector is read by its low 128 bits, all of it QEMU + names. A contract covers the ISA's statement, not a core's: a core + that does not honour it (or a deployment that does not enable it) + is for a timing instrument. * A GHC harness wants `-with-rtsopts=-xr1G -V0`, against the runtime's terabyte reservation and its interval timer. GHC calls and returns by jumping, so its origins have no callers, and a diff --git a/app/Main.hs b/app/Main.hs @@ -15,6 +15,7 @@ module Main ( import Control.Exception (IOException, try) import Control.Monad (unless, when) +import qualified Data.List as L import qualified Data.ByteString as BS import Data.Char (toUpper) import qualified Data.Map.Strict as M @@ -28,22 +29,26 @@ import qualified Data.Text.Encoding as TE import qualified Data.Text.Encoding.Error as TEE import qualified Data.Text.IO as TIO import System.Directory - (createDirectoryIfMissing, doesDirectoryExist, doesFileExist, - getTemporaryDirectory, removeFile) + (canonicalizePath, createDirectoryIfMissing, doesDirectoryExist, + doesFileExist, getTemporaryDirectory, removeFile) import System.Environment (getArgs, getEnvironment, lookupEnv) import System.Exit (ExitCode(..), exitWith) import System.FilePath (takeFileName, (</>)) import Text.Read (readMaybe) import System.IO (IOMode(..), hClose, hPutStrLn, openTempFile, stderr, withBinaryFile) -import System.Process (proc, waitForProcess, withCreateProcess) +import System.Process + (proc, readCreateProcessWithExitCode, waitForProcess, withCreateProcess) import qualified System.Process as P import Paths_vestigia (version) +import Vestigia.Contract + (Contract(..), Line, contractIsa, contractName, readContract, + readDisassembly, watchSection) import Vestigia.Diff (Dump(..), Kind(..), Named(..), Run(..), diffDesigned, divergenceJson, - divergenceSummary, dvCallers, dvOrigins, inObject, inOffset, inPc, - layoutApart, readDump, restrictTo, runApart) + divergenceSummary, dvCallers, dvOrigins, dvOutside, inObject, inOffset, + inPc, layoutApart, readDump, restrictTo, runApart) import Vestigia.Json (encode) import Vestigia.Layout (fixLayout) import Vestigia.Memcheck (Memcheck, readMemcheck) @@ -62,6 +67,8 @@ data Opts = Opts { , oObjects :: ![T.Text] , oControls :: ![FilePath] , oDesigned :: ![FilePath] + , oContract :: !(Maybe T.Text) + , oObjdump :: !(Maybe FilePath) } main :: IO () @@ -96,6 +103,7 @@ usage e = do \[--object TEXT]... -- PROGRAM [ARG...]" , " vestigia read [--out FILE] [--object TEXT]... RUN..." , " vestigia record [--qemu PATH] [--plugin PATH] --dump FILE \ + \[--contract NAME [--objdump PATH] [--object TEXT]...] \ \-- PROGRAM [ARG...]" , " vestigia diff [--out FILE] [--addr2line PATH] \ \[--object TEXT]... [--control DUMP]... [--designed DUMP]... \ @@ -112,8 +120,15 @@ usage e = do , "record executes PROGRAM under QEMU with vestigia's plugin and" , "dumps its leakage trace per instruction, with how it was run;" , "diff compares dumps of runs that differ only in a secret and" - , "reports where they diverge (vestigia/diff-v3), naming sources" + , "reports where they diverge (vestigia/diff-v4), naming sources" , "with addr2line." + , "--contract (arm-dit or intel-doitm, the program's ISA's) has" + , "record also fingerprint the operands of every instruction" + , "outside that data-independent-timing contract, in the objects" + , "the program loads whose path contains an --object TEXT (all," + , "with none), read with objdump (--objdump, else" + , "$VESTIGIA_OBJDUMP, else llvm-objdump); diff reports those whose" + , "operands differed beside the origins." , "--object keeps origins in objects whose path contains TEXT;" , "--control names a run repeating the first run's secret, and" , "what differs in it is unsteady, not an origin." @@ -127,7 +142,7 @@ usage e = do -- options before the program; "--" ends them options :: [String] -> Either String (Opts, [String]) options = go (Opts Nothing Nothing Nothing Nothing Nothing Nothing - Nothing [] [] []) + Nothing [] [] [] Nothing Nothing) where go o xs = case xs of ("--" : rest) -> Right (o, rest) @@ -144,6 +159,8 @@ options = go (Opts Nothing Nothing Nothing Nothing Nothing Nothing go o { oControls = oControls o <> [ p ] } rest ("--designed" : p : rest) -> go o { oDesigned = oDesigned o <> [ p ] } rest + ("--contract" : c : rest) -> go o { oContract = Just (T.pack c) } rest + ("--objdump" : p : rest) -> go o { oObjdump = Just p } rest (x : _) | take 2 x == "--" -> Left ("unknown option: " <> x) _ -> Right (o, xs) @@ -303,6 +320,16 @@ record o prog progArgs = do qemu <- tool (oQemu o) ("VESTIGIA_QEMU_" <> fmap toUpper isa) ("qemu-" <> isa) plugin <- tool (oPlugin o) "VESTIGIA_PLUGIN" "libvestigia-qemu.so" + -- under a contract, the instructions outside it in the objects + -- under audit, for the plugin to watch + contract <- traverse (\name -> case readContract name of + Just c | contractIsa c == isa -> pure c + | otherwise -> refuseRecord (T.unpack name <> " speaks to " + <> contractIsa c <> ", and " <> prog <> " is " <> isa) + Nothing -> refuseRecord ("no contract named " <> T.unpack name + <> "; arm-dit and intel-doitm are known")) + (oContract o) + watch <- traverse (\c -> watchList o qemu c prog progArgs) contract -- QEMU maps the guest's libraries and heap in its own address -- space, wherever its own allocations leave room, and those vary -- with how its threads run: a second malloc arena, or a large block @@ -322,10 +349,13 @@ record o prog progArgs = do r <- try (withCreateProcess ((proc qemu (guest <> [ "-seed", "0" - , "-plugin", plugin <> ",out=" <> dump, prog ] + , "-plugin", plugin <> ",out=" <> dump + <> maybe "" (",watch=" <>) watch + , prog ] <> progArgs)) { P.env = Just ((tunables, host) : others) }) (\_ _ _ ph -> waitForProcess ph)) + for_ watch removeFile case r of Left e -> do hPutStrLn stderr ("vestigia: cannot run " <> qemu <> ": " @@ -336,9 +366,80 @@ record o prog progArgs = do -- in the secret alone from runs laid out apart: the guest's -- environment is QEMU's, with its own tunables restored appendRun dump (prog : progArgs) - (others <> [ (tunables, v) | Just v <- [ own ] ]) c + (others <> [ (tunables, v) | Just v <- [ own ] ]) c isa contract exitWith c +refuseRecord :: String -> IO a +refuseRecord e = do + hPutStrLn stderr ("vestigia: " <> e) + exitWith (ExitFailure 2) + +-- the plugin's watch list under a contract, written to a temporary +-- file: every instruction outside it in the objects the program loads +-- (and the program's own) whose path contains an --object text, all +-- of them with none +watchList :: Opts -> FilePath -> Contract -> FilePath -> [String] + -> IO FilePath +watchList o qemu c prog progArgs = do + objdump <- tool (oObjdump o) "VESTIGIA_OBJDUMP" "llvm-objdump" + loaded <- loadedObjects qemu prog progArgs + objects <- fmap L.nub (traverse canonicalizePath (prog : loaded)) + let kept = [ p | p <- objects + , null (oObjects o) + || any (`T.isInfixOf` T.pack p) (oObjects o) ] + sections <- traverse (\p -> do + ls <- disassemble objdump c p + pure (watchSection c p ls)) + kept + tmp <- getTemporaryDirectory + (path, h) <- openTempFile tmp "vestigia.watch" + hClose h + TIO.writeFile path (T.concat sections) + pure path + +-- the shared objects a program loads, as its dynamic loader resolves +-- them, run under QEMU so that any ISA's are found +loadedObjects :: FilePath -> FilePath -> [String] -> IO [FilePath] +loadedObjects qemu prog progArgs = do + r <- try (readCreateProcessWithExitCode + (proc qemu ([ "-E", "LD_TRACE_LOADED_OBJECTS=1", prog ] + <> progArgs)) "") + case r of + Left e -> refuseRecord ("cannot run " <> qemu <> ": " + <> show (e :: IOException)) + Right (ExitSuccess, out, _) -> pure (concatMap object (lines out)) + Right (ExitFailure n, _, err) -> refuseRecord ("the loader could not \ + \list what " <> prog <> " loads (exit " <> show n <> "): " <> err) + where + -- "\tNAME => PATH (0x...)" or "\tPATH (0x...)" + object l = case words l of + (_ : "=>" : p@('/' : _) : _) -> [ p ] + (p@('/' : _) : _) -> [ p ] + _ -> [] + +-- an object's instructions, its executable sections disassembled +-- whole: GHC's LLVM backend gives its code the type of data, which a +-- disassembly by symbol would print as bytes +disassemble :: FilePath -> Contract -> FilePath -> IO [Line] +disassemble objdump c obj = do + headers <- objdumped [ "--section-headers", obj ] + let sections = [ name | l <- lines headers + , (_ : name : _ : _ : kinds) <- [ words l ] + , "TEXT" `elem` kinds ] + out <- objdumped ([ "-D" ] <> fmap ("--section=" <>) sections + <> [ "-M" | c == IntelDoitm ] <> [ "intel" | c == IntelDoitm ] + <> [ obj ]) + pure (readDisassembly (T.pack out)) + where + objdumped args = do + r <- try (readCreateProcessWithExitCode (proc objdump args) "") + case r of + Right (ExitSuccess, out, _) -> pure out + Right (ExitFailure n, _, err) -> refuseRecord (objdump <> " " + <> unwords args <> " failed (exit " <> show n <> "): " <> err) + Left e -> refuseRecord ("cannot run " <> objdump <> ": " + <> show (e :: IOException)) + -- the architecture an ELF program is built for, as QEMU names its -- user-mode emulators: the header's machine, at byte 18 machineOf :: FilePath -> IO String @@ -358,10 +459,11 @@ machineOf prog = do -- append a run's record to its dump (Vestigia.Diff.readDump): its -- arguments' bytes, its environment's variables and the bytes they --- take, and its exit status +-- take, its exit status, the guest's ISA, and any contract it was +-- recorded under appendRun :: FilePath -> [String] -> [(String, String)] -> ExitCode - -> IO () -appendRun dump args env code = do + -> String -> Maybe Contract -> IO () +appendRun dump args env code isa contract = do enc <- getFileSystemEncoding let bytes s = GF.withCStringLen enc s BS.packCStringLen as <- traverse bytes args @@ -371,7 +473,9 @@ appendRun dump args env code = do | a <- as ] <> [ "N " <> showHex (length es) "" <> " " <> showHex (sum (fmap ((+ 1) . BS.length) es)) "" - , "X " <> show (exitStatus code) ] + , "X " <> show (exitStatus code) + , "M " <> isa ] + <> [ "G " <> T.unpack (contractName c) | Just c <- [ contract ] ] where byte w = case showHex w "" of [ d ] -> [ '0', d ] @@ -405,6 +509,15 @@ diff o paths = do refuse (p <> " is a control, but does not repeat the \ \arguments of " <> p0 <> ", the run it controls") [] -> pure () + -- runs recorded under other contracts watched other instructions + case zip (paths <> oDesigned o <> oControls o) + (dumps <> designed <> controls) of + ((p0, first) : rest) -> for_ rest $ \(p, d) -> + when (dpContract d /= dpContract first || dpIsa d /= dpIsa first) $ + refuse (p <> " was recorded for another ISA or under another \ + \contract than " <> p0 <> "; runs compared must watch the \ + \same instructions") + [] -> pure () -- runs laid out apart differ wherever they touch memory, not by -- the secret: such runs are refused, not compared case zip paths dumps of @@ -424,11 +537,11 @@ diff o paths = do [] -> pure () let dv = restrictTo (oObjects o) (diffDesigned controls dumps designed) + let sites = fmap snd (dvOrigins dv) <> dvOutside dv places <- symbolize addr2line $ - [ (obj, inOffset i) | (_, i) <- dvOrigins dv - , Just obj <- [ inObject i ] ] + [ (obj, inOffset i) | i <- sites, Just obj <- [ inObject i ] ] -- the calls that reached each origin - <> [ (obj, a) | (_, i) <- dvOrigins dv + <> [ (obj, a) | i <- sites , Just (stacks, _) <- [ M.lookup (inPc i) (dvCallers dv) ] , calls <- stacks, (Just obj, a) <- calls ] let doc = encode (divergenceJson (T.pack (showVersion version)) diff --git a/etc/probe/harness.c b/etc/probe/harness.c @@ -8,8 +8,10 @@ * Its secret, the first argument in hex (of one width for every * secret, so that runs lay out alike), reaches a loop's bound, a * table index, which of two calls a helper returns to, a dividend, - * a divisor, and, on a path the third secret alone takes, another - * table index; a constant-time select reaches none of them. + * a divisor, a floating-point division (outside either ISA's + * data-independent-timing contract), and, on a path the third secret + * alone takes, another table index; a constant-time select reaches + * none of them. */ #include <stdio.h> #include <stdlib.h> @@ -72,6 +74,12 @@ __attribute__((noinline)) unsigned divide_memory(unsigned s) { #endif } +/* a secret divided in floating point, which neither Arm's DIT nor + Intel's DOITM covers */ +__attribute__((noinline)) unsigned fpdivide(unsigned s) { + return (unsigned)((double)s / 7.0); +} + /* a table index on a path one secret takes */ __attribute__((noinline)) unsigned rare(unsigned s) { if ((s & 0xffu) == 0xc3u) return table[(s >> 1) & 0xffu]; @@ -85,7 +93,7 @@ __attribute__((noinline)) unsigned ct(unsigned s, unsigned p) { int main(int argc, char **argv) { unsigned s = (unsigned)strtoul(argc > 1 ? argv[1] : "0", NULL, 16); - unsigned out[7]; + unsigned out[8]; for (int i = 0; i < 256; i++) table[i] = (unsigned char)i; vestigia_secret(&s, sizeof s); out[0] = branchy(s); @@ -95,8 +103,9 @@ int main(int argc, char **argv) { out[4] = divide_memory(s); out[5] = rare(s); out[6] = ct(s, 1); + out[7] = fpdivide(s); vestigia_public(out, sizeof out); - printf("%u %u %u %u %u %u %u\n", out[0], out[1], out[2], out[3], - out[4], out[5], out[6]); + printf("%u %u %u %u %u %u %u %u\n", out[0], out[1], out[2], out[3], + out[4], out[5], out[6], out[7]); return 0; } diff --git a/lib/Vestigia/Contract.hs b/lib/Vestigia/Contract.hs @@ -0,0 +1,395 @@ +{-# OPTIONS_HADDOCK prune #-} +{-# LANGUAGE OverloadedStrings #-} + +-- | +-- Module: Vestigia.Contract +-- Copyright: (c) 2026 Jared Tobin +-- License: MIT +-- Maintainer: Jared Tobin <jared@ppad.tech> +-- +-- An ISA's data-independent-timing contract, and what it makes of +-- each instruction of an object: one it covers takes a time +-- independent of its data; one it does not, run on operands that +-- depend on the secret, is outside the contract; and a division is +-- variable-time on either ISA. Control flow and system instructions +-- are left to the comparison of what ran. +-- +-- An object is read through LLVM's disassembler (@llvm-objdump@), in +-- Intel syntax on x86_64. On AArch64 an instruction is matched by its +-- encoding against Arm's own ('Vestigia.Contract.Arm'), its source +-- registers read off the fields the encoding names. On x86_64 it is +-- matched by its mnemonic and opcode byte against Intel's list +-- ('Vestigia.Contract.Intel'), its source registers read off its +-- operands: every register operand outside a memory reference, but +-- the first where the instruction only writes it, and the registers +-- some instructions read without naming. +-- +-- What is outside the contract and reads data becomes the watch +-- list the QEMU plugin is given: each such instruction, by its +-- address in its object, with the registers to fingerprint before it +-- runs, as the plugin fingerprints a division's operands. + +module Vestigia.Contract ( + Contract(..) + , contractName + , contractSource + , contractIsa + , readContract + , Line(..) + , readDisassembly + , Register(..) + , Verdict(..) + , classify + , watchSection + ) where + +import Data.Bits (popCount, shiftR, testBit, (.&.)) +import Data.Char (isHexDigit) +import qualified Data.List as L +import qualified Data.Map.Strict as M +import qualified Data.Set as S +import qualified Data.Text as T +import Data.Word (Word32, Word8) +import Numeric (readHex, showHex) + +import qualified Vestigia.Contract.Arm as Arm +import qualified Vestigia.Contract.Intel as Intel +import Vestigia.Contract.Types + +-- | A data-independent-timing contract: Arm's @PSTATE.DIT@, or +-- Intel's DOITM. +data Contract = + ArmDit + | IntelDoitm + deriving (Eq, Show) + +contractName :: Contract -> T.Text +contractName c = case c of + ArmDit -> "arm-dit" + IntelDoitm -> "intel-doitm" + +-- | The release of the vendor's own statement the table transcribes. +contractSource :: Contract -> T.Text +contractSource c = case c of + ArmDit -> "Arm A64 ISA XML, 2022-12" + IntelDoitm -> "Intel 768547, Table 1, 2026-02-23" + +-- | The ISA a contract speaks to, as QEMU names it. +contractIsa :: Contract -> String +contractIsa c = case c of + ArmDit -> "aarch64" + IntelDoitm -> "x86_64" + +readContract :: T.Text -> Maybe Contract +readContract t = case t of + "arm-dit" -> Just ArmDit + "intel-doitm" -> Just IntelDoitm + _ -> Nothing + +-- | One instruction as the disassembler prints it: its address in +-- the object, its raw form (an AArch64 word, or x86_64's bytes), +-- any prefixes, its mnemonic, and its operands. +data Line = Line { + lnAddress :: !Integer + , lnRaw :: ![Integer] + , lnPrefixes :: ![T.Text] + , lnMnemonic :: !T.Text + , lnOperands :: !T.Text + } deriving (Eq, Show) + +-- | The instructions of @llvm-objdump@'s disassembly; everything +-- else it prints (headers, symbols, elided runs) is passed over. +readDisassembly :: T.Text -> [Line] +readDisassembly = concatMap line . T.lines + where + line l = case T.breakOn ":" (T.stripStart l) of + (a, rest) + | not (T.null a), T.all isHexDigit a + , Just body <- T.stripPrefix ":" rest + , [ (addr, "") ] <- readHex (T.unpack a) + , (raw, text) <- T.breakOn "\t" body + , Just ws <- traverse hexToken (T.words raw) + , not (null ws) -> + case filter (not . T.null) + (fmap T.strip (T.splitOn "\t" text)) of + [] -> [] + fs -> let (ps, rest') = L.span (`S.member` prefixes) fs + in case rest' of + (m : ops) -> [ Line addr ws ps m + (uncomment (T.unwords ops)) ] + [] -> [] + _ -> [] + hexToken w + | T.all isHexDigit w, [ (v, "") ] <- readHex (T.unpack w) = Just v + | otherwise = Nothing + -- the disassembler's annotations, x86_64's after " # " and + -- AArch64's after " //": a target or a literal, never an operand + -- (an AArch64 immediate is "#" with no space after it) + uncomment t = + T.stripEnd (fst (T.breakOn " //" (fst (T.breakOn " # " t)))) + +-- prefixes the disassembler prints as fields of their own +prefixes :: S.Set T.Text +prefixes = S.fromList + [ "lock", "rep", "repe", "repz", "repne", "repnz", "data16", "data32" + , "addr32", "notrack", "bnd", "xacquire", "xrelease", "cs", "ds" + , "es", "fs", "gs", "ss" ] + +-- | A register to fingerprint, as QEMU names it, by the bits read: +-- from its low bit, so many of them. +data Register = Register { + rgName :: !T.Text + , rgLow :: !Int + , rgWidth :: !Int + } deriving (Eq, Ord, Show) + +-- | What a contract makes of an instruction: covered by it; control +-- flow or system, or reading no data; an integer division, which +-- the plugin reads for itself; or outside the contract, with the +-- registers it reads and whether it names memory. +data Verdict = + Inside + | Excluded + | Division + | Watched ![Register] !Bool + deriving (Eq, Show) + +-- | Classify one instruction under a contract. +classify :: Contract -> Line -> Verdict +classify c l = case c of + ArmDit -> case lnRaw l of + [ w ] | w >= 0, w < 2 ^ (32 :: Int) -> arm (fromInteger w) l + _ -> Excluded + IntelDoitm -> intel l + +-- AArch64 --------------------------------------------------------- + +arm :: Word32 -> Line -> Verdict +arm w l = case best of + Nothing -> Excluded + Just e + | any (`T.isPrefixOf` enName e) [ "UDIV_", "SDIV_" ] -> Division + | otherwise -> case enStatus e of + Covered -> Inside + Control -> Excluded + Outside ops -> case concatMap (register w) ops of + [] | not memory -> Excluded + rs -> Watched (L.nub rs) memory + where + memory = "[" `T.isInfixOf` lnOperands l + candidates = M.findWithDefault [] (bucket w) armIndex + best = case [ e | e <- candidates, w .&. enMask e == enValue e ] of + [] -> Nothing + es -> Just (L.maximumBy (\a b -> compare (fixed a) (fixed b)) es) + fixed e = popCount (enMask e) + +-- an encoding's group, bits 28 to 25 +bucket :: Word32 -> Word32 +bucket w = (w `shiftR` 25) .&. 0xf + +-- the encodings by every group their fixed bits allow +armIndex :: M.Map Word32 [Encoding] +armIndex = M.fromListWith (flip (<>)) + [ (b, [ e ]) + | e <- Arm.encodings + , b <- [ 0 .. 15 ] + , b .&. bucket (enMask e) == bucket (enValue e) ] + +register :: Word32 -> (Int, Operand) -> [Register] +register w (lsb, op) = + let n = fromIntegral ((w `shiftR` lsb) .&. 31) :: Int + x = "x" <> T.pack (show n) + v = "v" <> T.pack (show n) + in case op of + OpX | n == 31 -> [] + | otherwise -> [ Register x 0 64 ] + OpXSp | n == 31 -> [ Register "sp" 0 64 ] + | otherwise -> [ Register x 0 64 ] + OpW | n == 31 -> [] + | otherwise -> [ Register x 0 32 ] + OpWSp | n == 31 -> [ Register "sp" 0 32 ] + | otherwise -> [ Register x 0 32 ] + OpQ -> [ Register v 0 128 ] + OpD -> [ Register v 0 64 ] + OpS -> [ Register v 0 32 ] + OpH -> [ Register v 0 16 ] + OpB -> [ Register v 0 8 ] + OpV -> [ Register v 0 (if testBit w 30 then 128 else 64) ] + OpVWhole -> [ Register v 0 128 ] + +-- x86_64 ---------------------------------------------------------- + +intel :: Line -> Verdict +intel l + | m `S.member` control || "J" `T.isPrefixOf` m = Excluded + | m == "DIV" || m == "IDIV" = Division + | Just op <- opcode (lnRaw l) + , (name, op) `S.member` intelRows = Inside + | null sources && not memory = Excluded + | otherwise = Watched (L.nub sources) memory + where + m = mnemonic l + -- a repeat prefix names a string instruction's row; on any other + -- it does nothing + name + | any (`elem` [ "rep", "repe", "repz", "repne", "repnz" ]) + (lnPrefixes l) + , any (`T.isPrefixOf` m) + [ "MOVS", "STOS", "LODS", "CMPS", "SCAS", "INS", "OUTS" ] = + "REP_" <> m + | otherwise = m + operands = splitOperands (lnOperands l) + memory = any ("[" `T.isInfixOf`) operands + named = [ r | o <- operands, not ("[" `T.isInfixOf` o) + , Just r <- [ M.lookup (bare o) intelRegisters ] ] + explicit = case operands of + (o : _) | writesOnly m, not ("[" `T.isInfixOf` o) -> drop 1 named + _ -> named + sources = explicit <> M.findWithDefault [] m implicit + +intelRows :: S.Set (T.Text, Word8) +intelRows = S.fromList Intel.instructions + +-- the mnemonic as Intel's list spells it: upper case, a condition by +-- its list name, a 64-bit immediate move as a move +mnemonic :: Line -> T.Text +mnemonic l = + let m = T.toUpper (lnMnemonic l) + in case m of + "MOVABS" -> "MOV" + _ -> case [ p <> c' | p <- [ "CMOV", "SET" ] + , Just c <- [ T.stripPrefix p m ] + , Just c' <- [ M.lookup c conditions ] ] of + (n : _) -> n + [] -> m + +conditions :: M.Map T.Text T.Text +conditions = M.fromList + [ ("O", "O"), ("NO", "NO"), ("B", "B"), ("C", "B"), ("NAE", "B") + , ("NB", "NB"), ("AE", "NB"), ("NC", "NB"), ("Z", "Z"), ("E", "Z") + , ("NZ", "NZ"), ("NE", "NZ"), ("BE", "BE"), ("NA", "BE") + , ("NBE", "NBE"), ("A", "NBE"), ("S", "S"), ("NS", "NS"), ("P", "P") + , ("PE", "P"), ("NP", "NP"), ("PO", "NP"), ("L", "L"), ("NGE", "L") + , ("NL", "NL"), ("GE", "NL"), ("LE", "LE"), ("NG", "LE") + , ("NLE", "NLE"), ("G", "NLE") ] + +-- control flow, system, and instructions that read no data +control :: S.Set T.Text +control = S.fromList + [ "CALL", "RET", "LOOP", "LOOPE", "LOOPNE", "SYSCALL", "SYSENTER" + , "INT", "INT3", "INTO", "UD1", "UD2", "HLT", "NOP", "PAUSE" + , "ENDBR32", "ENDBR64", "LFENCE", "MFENCE", "SFENCE", "CPUID" + , "RDTSC", "RDTSCP", "XGETBV", "RDRAND", "RDSEED", "ENTER", "LEAVE" + , "PREFETCHT0", "PREFETCHT1", "PREFETCHT2", "PREFETCHNTA" + , "PREFETCHW", "CLFLUSH", "CLFLUSHOPT" ] + +-- instructions that write their first operand without reading it +writesOnly :: T.Text -> Bool +writesOnly m = + ("V" `T.isPrefixOf` m && m /= "VZEROUPPER" && m /= "VZEROALL") + || "MOV" `T.isPrefixOf` m + || "CVT" `T.isPrefixOf` m + || any (`T.isPrefixOf` m) [ "SQRT", "RSQRT", "RCP" ] + || m `elem` [ "POPCNT", "LZCNT", "TZCNT", "PDEP", "PEXT", "BZHI" + , "BEXTR", "BLSI", "BLSR", "BLSMSK", "SARX", "LEA" ] + +-- registers read without being named +implicit :: M.Map T.Text [Register] +implicit = M.fromList + [ ("CBW", [ Register "rax" 0 8 ]), ("CWDE", [ Register "rax" 0 16 ]) + , ("CDQE", [ Register "rax" 0 32 ]), ("CWD", [ Register "rax" 0 16 ]) + , ("CDQ", [ Register "rax" 0 32 ]), ("CQO", [ Register "rax" 0 64 ]) + , ("SAHF", [ Register "rax" 8 8 ]) + , ("CMPXCHG", [ Register "rax" 0 64 ]) + , ("CMPXCHG8B", fmap (\r -> Register r 0 32) + [ "rax", "rdx", "rbx", "rcx" ]) + , ("CMPXCHG16B", fmap (\r -> Register r 0 64) + [ "rax", "rdx", "rbx", "rcx" ]) ] + +-- an operand less its masking and broadcast decorations +bare :: T.Text -> T.Text +bare = T.strip . T.takeWhile (/= '{') + +-- operands, split at the commas between them +splitOperands :: T.Text -> [T.Text] +splitOperands t + | T.null (T.strip t) = [] + | otherwise = fmap T.strip (go 0 "" (T.unpack t)) + where + go :: Int -> String -> String -> [T.Text] + go _ acc [] = [ T.pack (reverse acc) ] + go d acc (ch : rest) = case ch of + '[' -> go (d + 1) (ch : acc) rest + ']' -> go (d - 1) (ch : acc) rest + ',' | d == 0 -> T.pack (reverse acc) : go d "" rest + _ -> go d (ch : acc) rest + +-- the general and vector registers QEMU exposes, by their names in +-- Intel syntax: a wide vector by its low 128 bits, which is all of +-- it QEMU names +intelRegisters :: M.Map T.Text Register +intelRegisters = M.fromList $ + concat + [ [ (r64, Register r64 0 64), (r32, Register r64 0 32) + , (r16, Register r64 0 16), (r8, Register r64 0 8) ] + | (r64, r32, r16, r8) <- + [ ("rax", "eax", "ax", "al"), ("rbx", "ebx", "bx", "bl") + , ("rcx", "ecx", "cx", "cl"), ("rdx", "edx", "dx", "dl") + , ("rsi", "esi", "si", "sil"), ("rdi", "edi", "di", "dil") + , ("rbp", "ebp", "bp", "bpl"), ("rsp", "esp", "sp", "spl") ] + <> [ (n, n <> "d", n <> "w", n <> "b") + | k <- [ 8 .. 15 :: Int ], let n = "r" <> T.pack (show k) ] ] + <> [ (h, Register r 8 8) + | (h, r) <- [ ("ah", "rax"), ("bh", "rbx"), ("ch", "rcx") + , ("dh", "rdx") ] ] + <> [ (p <> T.pack (show k), Register ("xmm" <> T.pack (show k)) 0 128) + | p <- [ "xmm", "ymm", "zmm" ], k <- [ 0 .. 15 :: Int ] ] + +-- the last opcode byte, past the prefixes, a REX, any VEX or EVEX +-- payload, and the escape bytes +opcode :: [Integer] -> Maybe Word8 +opcode bs = fmap fromInteger (go (dropWhile legacy bs)) + where + legacy b = b `elem` [ 0x66, 0x67, 0xf0, 0xf2, 0xf3, 0x2e, 0x36 + , 0x3e, 0x26, 0x64, 0x65 ] + go xs = case xs of + (b : rest) | b >= 0x40 && b <= 0x4f -> escaped rest + (0xd5 : _ : rest) -> at 0 rest + _ -> escaped xs + escaped xs = case xs of + (0xc5 : rest) -> at 1 rest + (0xc4 : rest) -> at 2 rest + (0x62 : rest) -> at 3 rest + (0x0f : 0x38 : rest) -> at 0 rest + (0x0f : 0x3a : rest) -> at 0 rest + (0x0f : rest) -> at 0 rest + _ -> at 0 xs + at k xs = case drop k xs of + (b : _) -> Just b + [] -> Nothing + +-- the watch list ---------------------------------------------------- + +-- | The plugin's watch list for one object, at its path: an @O@ line +-- naming it, then a @D@ line per division and a @U@ line per +-- instruction outside the contract, each with its address and its +-- text (a @U@ line with whether it names memory and the registers +-- it reads, each as name:low:width, before the text). +watchSection :: Contract -> FilePath -> [Line] -> T.Text +watchSection c path ls = T.unlines $ + ("O " <> T.pack path) + : concatMap entry ls + where + entry l = case classify c l of + Division -> [ "D " <> hex (lnAddress l) <> " " <> text l ] + Watched rs memory -> + [ T.unwords $ + [ "U", hex (lnAddress l), if memory then "1" else "0" + , T.pack (show (length rs)) ] + <> [ rgName r <> ":" <> T.pack (show (rgLow r)) <> ":" + <> T.pack (show (rgWidth r)) | r <- rs ] + <> [ text l ] ] + _ -> [] + text l = T.unwords (filter (not . T.null) + (lnPrefixes l <> [ lnMnemonic l, lnOperands l ])) + hex n = T.pack (showHex n "") diff --git a/lib/Vestigia/Contract/Arm.hs b/lib/Vestigia/Contract/Arm.hs @@ -0,0 +1,2184 @@ +{-# OPTIONS_HADDOCK prune #-} +{-# LANGUAGE OverloadedStrings #-} + +-- | +-- Module: Vestigia.Contract.Arm +-- Copyright: (c) 2026 Jared Tobin +-- License: MIT +-- Maintainer: Jared Tobin <jared@ppad.tech> +-- +-- Arm's data-independent-timing contract (@PSTATE.DIT@), encoding by +-- encoding, generated from Arm's machine-readable specification. +-- +-- == Source +-- +-- /A64 ISA XML for A-profile Architecture/, version @2022-12@ +-- (package @ISA_A64_xml_A_profile-2022-12@, sha256 +-- @1839a9722eab26aa3bdcd91adeeaf2e6c5c6df085f0e096f949c55cbee7d1a5a@), +-- retrieved 2026-10-27 from the Internet Archive mirror of Arm's +-- exploration-tools release, +-- @archive.org\/details\/arm-xml-a-profile-2022-12@, its md5 +-- matching the mirror's record. +-- +-- == Rule +-- +-- Every encoding of every A64 instruction section (type +-- @instruction@, one per file) of the general, Advanced SIMD, +-- floating-point, SIMD&FP load/store, and system classes; SVE and SME +-- are left out. An instruction is covered exactly when its section's +-- @\<operationalnotes\>@ name @PSTATE.DIT@, whose data-processing +-- note reads: +-- +-- > If PSTATE.DIT is 1: The execution time of this instruction is +-- > independent of: The values of the data supplied in any of its +-- > registers. The values of the NZCV flags. +-- +-- An encoding's fixed bits are its class's register diagram with the +-- encoding's own boxes over it. One not covered is control flow or +-- system ('Control') where its pseudocode lies under +-- @aarch64\/instrs\/branch\/@ or @aarch64\/instrs\/system\/@, or +-- its section is of the system class; otherwise it is 'Outside', with +-- its source registers: the five-bit register fields its assembler +-- template names whose explanation is neither destination-only nor +-- an address (a base register, or one holding an address). + +module Vestigia.Contract.Arm ( + encodings + ) where + +import Vestigia.Contract.Types + +-- | Every encoding, in the specification's file order. +encodings :: [Encoding] +encodings = + [ Encoding "ABS_32_dp_1src" 0xfffffc00 0x5ac02000 Covered + , Encoding "ABS_64_dp_1src" 0xfffffc00 0xdac02000 Covered + , Encoding "ABS_asisdmisc_R" 0xff3ffc00 0x5e20b800 Covered + , Encoding "ABS_asimdmisc_R" 0xbf3ffc00 0x0e20b800 Covered + , Encoding "ADC_32_addsub_carry" 0xffe0fc00 0x1a000000 Covered + , Encoding "ADC_64_addsub_carry" 0xffe0fc00 0x9a000000 Covered + , Encoding "ADCS_32_addsub_carry" 0xffe0fc00 0x3a000000 Covered + , Encoding "ADCS_64_addsub_carry" 0xffe0fc00 0xba000000 Covered + , Encoding "ADD_32_addsub_ext" 0xffe00000 0x0b200000 Covered + , Encoding "ADD_64_addsub_ext" 0xffe00000 0x8b200000 Covered + , Encoding "ADD_32_addsub_imm" 0xff800000 0x11000000 Covered + , Encoding "ADD_64_addsub_imm" 0xff800000 0x91000000 Covered + , Encoding "ADD_32_addsub_shift" 0xff200000 0x0b000000 Covered + , Encoding "ADD_64_addsub_shift" 0xff200000 0x8b000000 Covered + , Encoding "ADD_asisdsame_only" 0xff20fc00 0x5e208400 Covered + , Encoding "ADD_asimdsame_only" 0xbf20fc00 0x0e208400 Covered + , Encoding "ADDG_64_addsub_immtags" 0xffc00000 0x91800000 + (Outside [(5, OpXSp)]) + , Encoding "ADDHN_asimddiff_N" 0xbf20fc00 0x0e204000 Covered + , Encoding "ADDP_asisdpair_only" 0xff3ffc00 0x5e31b800 Covered + , Encoding "ADDP_asimdsame_only" 0xbf20fc00 0x0e20bc00 Covered + , Encoding "ADDS_32S_addsub_ext" 0xffe00000 0x2b200000 Covered + , Encoding "ADDS_64S_addsub_ext" 0xffe00000 0xab200000 Covered + , Encoding "ADDS_32S_addsub_imm" 0xff800000 0x31000000 Covered + , Encoding "ADDS_64S_addsub_imm" 0xff800000 0xb1000000 Covered + , Encoding "ADDS_32_addsub_shift" 0xff200000 0x2b000000 Covered + , Encoding "ADDS_64_addsub_shift" 0xff200000 0xab000000 Covered + , Encoding "ADDV_asimdall_only" 0xbf3ffc00 0x0e31b800 Covered + , Encoding "ADR_only_pcreladdr" 0x9f000000 0x10000000 (Outside []) + , Encoding "ADRP_only_pcreladdr" 0x9f000000 0x90000000 (Outside []) + , Encoding "AESD_B_cryptoaes" 0xfffffc00 0x4e285800 Covered + , Encoding "AESE_B_cryptoaes" 0xfffffc00 0x4e284800 Covered + , Encoding "AESIMC_B_cryptoaes" 0xfffffc00 0x4e287800 Covered + , Encoding "AESMC_B_cryptoaes" 0xfffffc00 0x4e286800 Covered + , Encoding "AND_asimdsame_only" 0xbfe0fc00 0x0e201c00 Covered + , Encoding "AND_32_log_imm" 0xffc00000 0x12000000 Covered + , Encoding "AND_64_log_imm" 0xff800000 0x92000000 Covered + , Encoding "AND_32_log_shift" 0xff200000 0x0a000000 Covered + , Encoding "AND_64_log_shift" 0xff200000 0x8a000000 Covered + , Encoding "ANDS_32S_log_imm" 0xffc00000 0x72000000 Covered + , Encoding "ANDS_64S_log_imm" 0xff800000 0xf2000000 Covered + , Encoding "ANDS_32_log_shift" 0xff200000 0x6a000000 Covered + , Encoding "ANDS_64_log_shift" 0xff200000 0xea000000 Covered + , Encoding "ASRV_32_dp_2src" 0xffe0fc00 0x1ac02800 Covered + , Encoding "ASRV_64_dp_2src" 0xffe0fc00 0x9ac02800 Covered + , Encoding "AUTDA_64P_dp_1src" 0xfffffc00 0xdac11800 (Outside [(5, OpXSp)]) + , Encoding "AUTDZA_64Z_dp_1src" 0xffffffe0 0xdac13be0 (Outside []) + , Encoding "AUTDB_64P_dp_1src" 0xfffffc00 0xdac11c00 (Outside [(5, OpXSp)]) + , Encoding "AUTDZB_64Z_dp_1src" 0xffffffe0 0xdac13fe0 (Outside []) + , Encoding "AUTIA_64P_dp_1src" 0xfffffc00 0xdac11000 (Outside [(5, OpXSp)]) + , Encoding "AUTIZA_64Z_dp_1src" 0xffffffe0 0xdac133e0 (Outside []) + , Encoding "AUTIA1716_HI_hints" 0xfffff23f 0xd503201f (Outside []) + , Encoding "AUTIASP_HI_hints" 0xfffff23f 0xd503223f (Outside []) + , Encoding "AUTIAZ_HI_hints" 0xfffff23f 0xd503221f (Outside []) + , Encoding "AUTIB_64P_dp_1src" 0xfffffc00 0xdac11400 (Outside [(5, OpXSp)]) + , Encoding "AUTIZB_64Z_dp_1src" 0xffffffe0 0xdac137e0 (Outside []) + , Encoding "AUTIB1716_HI_hints" 0xfffff23f 0xd503201f (Outside []) + , Encoding "AUTIBSP_HI_hints" 0xfffff23f 0xd503223f (Outside []) + , Encoding "AUTIBZ_HI_hints" 0xfffff23f 0xd503221f (Outside []) + , Encoding "AXFLAG_M_pstate" 0xfffff0ff 0xd500405f Control + , Encoding "B_only_condbranch" 0xff000010 0x54000000 Control + , Encoding "B_only_branch_imm" 0xfc000000 0x14000000 Control + , Encoding "BC_only_condbranch" 0xff000010 0x54000010 Control + , Encoding "BCAX_VVV16_crypto4" 0xffe08000 0xce200000 Covered + , Encoding "BFCVT_BS_floatdp1" 0xfffffc00 0x1e634000 (Outside [(5, OpS)]) + , Encoding "BFCVTN_asimdmisc_4S" 0xbffffc00 0x0ea16800 (Outside [(5, OpV)]) + , Encoding "BFDOT_asimdelem_E" 0xbfc0f400 0x0f40f000 (Outside [(5, OpV)]) + , Encoding "BFDOT_asimdsame2_D" 0xbfe0fc00 0x2e40fc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "BFM_32M_bitfield" 0xffc00000 0x33000000 Covered + , Encoding "BFM_64M_bitfield" 0xffc00000 0xb3400000 Covered + , Encoding "BFMLAL_asimdelem_F" 0xbfc0f400 0x0fc0f000 (Outside [(5, OpV)]) + , Encoding "BFMLAL_asimdsame2_F_" 0xbfe0fc00 0x2ec0fc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "BFMMLA_asimdsame2_E" 0xffe0fc00 0x6e40ec00 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "BIC_asimdimm_L_hl" 0xbff8cc00 0x2f008400 Covered + , Encoding "BIC_asimdimm_L_sl" 0xbff88c00 0x2f000400 Covered + , Encoding "BIC_asimdsame_only" 0xbfe0fc00 0x0e601c00 Covered + , Encoding "BIC_32_log_shift" 0xff200000 0x0a200000 Covered + , Encoding "BIC_64_log_shift" 0xff200000 0x8a200000 Covered + , Encoding "BICS_32_log_shift" 0xff200000 0x6a200000 Covered + , Encoding "BICS_64_log_shift" 0xff200000 0xea200000 Covered + , Encoding "BIF_asimdsame_only" 0xbfe0fc00 0x2ee01c00 Covered + , Encoding "BIT_asimdsame_only" 0xbfe0fc00 0x2ea01c00 Covered + , Encoding "BL_only_branch_imm" 0xfc000000 0x94000000 Control + , Encoding "BLR_64_branch_reg" 0xfffffc1f 0xd63f0000 Control + , Encoding "BLRAAZ_64_branch_reg" 0xfffffc1f 0xd63f081f Control + , Encoding "BLRAA_64P_branch_reg" 0xfffffc00 0xd73f0800 Control + , Encoding "BLRABZ_64_branch_reg" 0xfffffc1f 0xd63f0c1f Control + , Encoding "BLRAB_64P_branch_reg" 0xfffffc00 0xd73f0c00 Control + , Encoding "BR_64_branch_reg" 0xfffffc1f 0xd61f0000 Control + , Encoding "BRAAZ_64_branch_reg" 0xfffffc1f 0xd61f081f Control + , Encoding "BRAA_64P_branch_reg" 0xfffffc00 0xd71f0800 Control + , Encoding "BRABZ_64_branch_reg" 0xfffffc1f 0xd61f0c1f Control + , Encoding "BRAB_64P_branch_reg" 0xfffffc00 0xd71f0c00 Control + , Encoding "BRK_EX_exception" 0xffe0001f 0xd4200000 Control + , Encoding "BSL_asimdsame_only" 0xbfe0fc00 0x2e601c00 Covered + , Encoding "BTI_HB_hints" 0xffffff3f 0xd503241f Control + , Encoding "CAS_C32_comswap" 0x7fe0fc00 0x08a07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASA_C32_comswap" 0x7fe0fc00 0x08e07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASAL_C32_comswap" 0x7fe0fc00 0x08e0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASL_C32_comswap" 0x7fe0fc00 0x08a0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CAS_C64_comswap" 0x7fe0fc00 0x48a07c00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASA_C64_comswap" 0x7fe0fc00 0x48e07c00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASAL_C64_comswap" 0x7fe0fc00 0x48e0fc00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASL_C64_comswap" 0x7fe0fc00 0x48a0fc00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASAB_C32_comswap" 0xffe0fc00 0x08e07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASALB_C32_comswap" 0xffe0fc00 0x08e0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASB_C32_comswap" 0xffe0fc00 0x08a07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASLB_C32_comswap" 0xffe0fc00 0x08a0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASAH_C32_comswap" 0xffe0fc00 0x48e07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASALH_C32_comswap" 0xffe0fc00 0x48e0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASH_C32_comswap" 0xffe0fc00 0x48a07c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASLH_C32_comswap" 0xffe0fc00 0x48a0fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASP_CP32_comswappr" 0xffe0fc00 0x08207c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASPA_CP32_comswappr" 0xffe0fc00 0x08607c00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASPAL_CP32_comswappr" 0xffe0fc00 0x0860fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASPL_CP32_comswappr" 0xffe0fc00 0x0820fc00 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "CASP_CP64_comswappr" 0xffe0fc00 0x48207c00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASPA_CP64_comswappr" 0xffe0fc00 0x48607c00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASPAL_CP64_comswappr" 0xffe0fc00 0x4860fc00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CASPL_CP64_comswappr" 0xffe0fc00 0x4820fc00 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "CBNZ_32_compbranch" 0xff000000 0x35000000 Control + , Encoding "CBNZ_64_compbranch" 0xff000000 0xb5000000 Control + , Encoding "CBZ_32_compbranch" 0xff000000 0x34000000 Control + , Encoding "CBZ_64_compbranch" 0xff000000 0xb4000000 Control + , Encoding "CCMN_32_condcmp_imm" 0xffe00c10 0x3a400800 Covered + , Encoding "CCMN_64_condcmp_imm" 0xffe00c10 0xba400800 Covered + , Encoding "CCMN_32_condcmp_reg" 0xffe00c10 0x3a400000 Covered + , Encoding "CCMN_64_condcmp_reg" 0xffe00c10 0xba400000 Covered + , Encoding "CCMP_32_condcmp_imm" 0xffe00c10 0x7a400800 Covered + , Encoding "CCMP_64_condcmp_imm" 0xffe00c10 0xfa400800 Covered + , Encoding "CCMP_32_condcmp_reg" 0xffe00c10 0x7a400000 Covered + , Encoding "CCMP_64_condcmp_reg" 0xffe00c10 0xfa400000 Covered + , Encoding "CFINV_M_pstate" 0xfffff0ff 0xd500401f Covered + , Encoding "CHKFEAT_HI_hints" 0xffffffff 0xd503251f Control + , Encoding "CLRBHB_HI_hints" 0xffffffff 0xd50322df Control + , Encoding "CLREX_BN_barriers" 0xfffff0ff 0xd503305f Control + , Encoding "CLS_asimdmisc_R" 0xbf3ffc00 0x0e204800 Covered + , Encoding "CLS_32_dp_1src" 0xfffffc00 0x5ac01400 Covered + , Encoding "CLS_64_dp_1src" 0xfffffc00 0xdac01400 Covered + , Encoding "CLZ_asimdmisc_R" 0xbf3ffc00 0x2e204800 Covered + , Encoding "CLZ_32_dp_1src" 0xfffffc00 0x5ac01000 Covered + , Encoding "CLZ_64_dp_1src" 0xfffffc00 0xdac01000 Covered + , Encoding "CMEQ_asisdsame_only" 0xff20fc00 0x7e208c00 Covered + , Encoding "CMEQ_asimdsame_only" 0xbf20fc00 0x2e208c00 Covered + , Encoding "CMEQ_asisdmisc_Z" 0xff3ffc00 0x5e209800 Covered + , Encoding "CMEQ_asimdmisc_Z" 0xbf3ffc00 0x0e209800 Covered + , Encoding "CMGE_asisdsame_only" 0xff20fc00 0x5e203c00 Covered + , Encoding "CMGE_asimdsame_only" 0xbf20fc00 0x0e203c00 Covered + , Encoding "CMGE_asisdmisc_Z" 0xff3ffc00 0x7e208800 Covered + , Encoding "CMGE_asimdmisc_Z" 0xbf3ffc00 0x2e208800 Covered + , Encoding "CMGT_asisdsame_only" 0xff20fc00 0x5e203400 Covered + , Encoding "CMGT_asimdsame_only" 0xbf20fc00 0x0e203400 Covered + , Encoding "CMGT_asisdmisc_Z" 0xff3ffc00 0x5e208800 Covered + , Encoding "CMGT_asimdmisc_Z" 0xbf3ffc00 0x0e208800 Covered + , Encoding "CMHI_asisdsame_only" 0xff20fc00 0x7e203400 Covered + , Encoding "CMHI_asimdsame_only" 0xbf20fc00 0x2e203400 Covered + , Encoding "CMHS_asisdsame_only" 0xff20fc00 0x7e203c00 Covered + , Encoding "CMHS_asimdsame_only" 0xbf20fc00 0x2e203c00 Covered + , Encoding "CMLE_asisdmisc_Z" 0xff3ffc00 0x7e209800 Covered + , Encoding "CMLE_asimdmisc_Z" 0xbf3ffc00 0x2e209800 Covered + , Encoding "CMLT_asisdmisc_Z" 0xff3ffc00 0x5e20a800 Covered + , Encoding "CMLT_asimdmisc_Z" 0xbf3ffc00 0x0e20a800 Covered + , Encoding "CMTST_asisdsame_only" 0xff20fc00 0x5e208c00 Covered + , Encoding "CMTST_asimdsame_only" 0xbf20fc00 0x0e208c00 Covered + , Encoding "CNT_32_dp_1src" 0xfffffc00 0x5ac01c00 Covered + , Encoding "CNT_64_dp_1src" 0xfffffc00 0xdac01c00 Covered + , Encoding "CNT_asimdmisc_R" 0xbf3ffc00 0x0e205800 Covered + , Encoding "CPYFE_CPY_memcms" 0x3fe0fc00 0x19800400 (Outside [(5, OpX)]) + , Encoding "CPYFM_CPY_memcms" 0x3fe0fc00 0x19400400 (Outside [(5, OpX)]) + , Encoding "CPYFP_CPY_memcms" 0x3fe0fc00 0x19000400 (Outside []) + , Encoding "CPYFEN_CPY_memcms" 0x3fe0fc00 0x1980c400 (Outside [(5, OpX)]) + , Encoding "CPYFMN_CPY_memcms" 0x3fe0fc00 0x1940c400 (Outside [(5, OpX)]) + , Encoding "CPYFPN_CPY_memcms" 0x3fe0fc00 0x1900c400 (Outside []) + , Encoding "CPYFERN_CPY_memcms" 0x3fe0fc00 0x19808400 (Outside [(5, OpX)]) + , Encoding "CPYFMRN_CPY_memcms" 0x3fe0fc00 0x19408400 (Outside [(5, OpX)]) + , Encoding "CPYFPRN_CPY_memcms" 0x3fe0fc00 0x19008400 (Outside []) + , Encoding "CPYFERT_CPY_memcms" 0x3fe0fc00 0x19802400 (Outside [(5, OpX)]) + , Encoding "CPYFMRT_CPY_memcms" 0x3fe0fc00 0x19402400 (Outside [(5, OpX)]) + , Encoding "CPYFPRT_CPY_memcms" 0x3fe0fc00 0x19002400 (Outside []) + , Encoding "CPYFERTN_CPY_memcms" 0x3fe0fc00 0x1980e400 (Outside [(5, OpX)]) + , Encoding "CPYFMRTN_CPY_memcms" 0x3fe0fc00 0x1940e400 (Outside [(5, OpX)]) + , Encoding "CPYFPRTN_CPY_memcms" 0x3fe0fc00 0x1900e400 (Outside []) + , Encoding "CPYFERTRN_CPY_memcms" 0x3fe0fc00 0x1980a400 (Outside [(5, OpX)]) + , Encoding "CPYFMRTRN_CPY_memcms" 0x3fe0fc00 0x1940a400 (Outside [(5, OpX)]) + , Encoding "CPYFPRTRN_CPY_memcms" 0x3fe0fc00 0x1900a400 (Outside []) + , Encoding "CPYFERTWN_CPY_memcms" 0x3fe0fc00 0x19806400 (Outside [(5, OpX)]) + , Encoding "CPYFMRTWN_CPY_memcms" 0x3fe0fc00 0x19406400 (Outside [(5, OpX)]) + , Encoding "CPYFPRTWN_CPY_memcms" 0x3fe0fc00 0x19006400 (Outside []) + , Encoding "CPYFET_CPY_memcms" 0x3fe0fc00 0x19803400 (Outside [(5, OpX)]) + , Encoding "CPYFMT_CPY_memcms" 0x3fe0fc00 0x19403400 (Outside [(5, OpX)]) + , Encoding "CPYFPT_CPY_memcms" 0x3fe0fc00 0x19003400 (Outside []) + , Encoding "CPYFETN_CPY_memcms" 0x3fe0fc00 0x1980f400 (Outside [(5, OpX)]) + , Encoding "CPYFMTN_CPY_memcms" 0x3fe0fc00 0x1940f400 (Outside [(5, OpX)]) + , Encoding "CPYFPTN_CPY_memcms" 0x3fe0fc00 0x1900f400 (Outside []) + , Encoding "CPYFETRN_CPY_memcms" 0x3fe0fc00 0x1980b400 (Outside [(5, OpX)]) + , Encoding "CPYFMTRN_CPY_memcms" 0x3fe0fc00 0x1940b400 (Outside [(5, OpX)]) + , Encoding "CPYFPTRN_CPY_memcms" 0x3fe0fc00 0x1900b400 (Outside []) + , Encoding "CPYFETWN_CPY_memcms" 0x3fe0fc00 0x19807400 (Outside [(5, OpX)]) + , Encoding "CPYFMTWN_CPY_memcms" 0x3fe0fc00 0x19407400 (Outside [(5, OpX)]) + , Encoding "CPYFPTWN_CPY_memcms" 0x3fe0fc00 0x19007400 (Outside []) + , Encoding "CPYFEWN_CPY_memcms" 0x3fe0fc00 0x19804400 (Outside [(5, OpX)]) + , Encoding "CPYFMWN_CPY_memcms" 0x3fe0fc00 0x19404400 (Outside [(5, OpX)]) + , Encoding "CPYFPWN_CPY_memcms" 0x3fe0fc00 0x19004400 (Outside []) + , Encoding "CPYFEWT_CPY_memcms" 0x3fe0fc00 0x19801400 (Outside [(5, OpX)]) + , Encoding "CPYFMWT_CPY_memcms" 0x3fe0fc00 0x19401400 (Outside [(5, OpX)]) + , Encoding "CPYFPWT_CPY_memcms" 0x3fe0fc00 0x19001400 (Outside []) + , Encoding "CPYFEWTN_CPY_memcms" 0x3fe0fc00 0x1980d400 (Outside [(5, OpX)]) + , Encoding "CPYFMWTN_CPY_memcms" 0x3fe0fc00 0x1940d400 (Outside [(5, OpX)]) + , Encoding "CPYFPWTN_CPY_memcms" 0x3fe0fc00 0x1900d400 (Outside []) + , Encoding "CPYFEWTRN_CPY_memcms" 0x3fe0fc00 0x19809400 (Outside [(5, OpX)]) + , Encoding "CPYFMWTRN_CPY_memcms" 0x3fe0fc00 0x19409400 (Outside [(5, OpX)]) + , Encoding "CPYFPWTRN_CPY_memcms" 0x3fe0fc00 0x19009400 (Outside []) + , Encoding "CPYFEWTWN_CPY_memcms" 0x3fe0fc00 0x19805400 (Outside [(5, OpX)]) + , Encoding "CPYFMWTWN_CPY_memcms" 0x3fe0fc00 0x19405400 (Outside [(5, OpX)]) + , Encoding "CPYFPWTWN_CPY_memcms" 0x3fe0fc00 0x19005400 (Outside []) + , Encoding "CPYE_CPY_memcms" 0x3fe0fc00 0x1d800400 (Outside [(5, OpX)]) + , Encoding "CPYM_CPY_memcms" 0x3fe0fc00 0x1d400400 (Outside [(5, OpX)]) + , Encoding "CPYP_CPY_memcms" 0x3fe0fc00 0x1d000400 (Outside []) + , Encoding "CPYEN_CPY_memcms" 0x3fe0fc00 0x1d80c400 (Outside [(5, OpX)]) + , Encoding "CPYMN_CPY_memcms" 0x3fe0fc00 0x1d40c400 (Outside [(5, OpX)]) + , Encoding "CPYPN_CPY_memcms" 0x3fe0fc00 0x1d00c400 (Outside []) + , Encoding "CPYERN_CPY_memcms" 0x3fe0fc00 0x1d808400 (Outside [(5, OpX)]) + , Encoding "CPYMRN_CPY_memcms" 0x3fe0fc00 0x1d408400 (Outside [(5, OpX)]) + , Encoding "CPYPRN_CPY_memcms" 0x3fe0fc00 0x1d008400 (Outside []) + , Encoding "CPYERT_CPY_memcms" 0x3fe0fc00 0x1d802400 (Outside [(5, OpX)]) + , Encoding "CPYMRT_CPY_memcms" 0x3fe0fc00 0x1d402400 (Outside [(5, OpX)]) + , Encoding "CPYPRT_CPY_memcms" 0x3fe0fc00 0x1d002400 (Outside []) + , Encoding "CPYERTN_CPY_memcms" 0x3fe0fc00 0x1d80e400 (Outside [(5, OpX)]) + , Encoding "CPYMRTN_CPY_memcms" 0x3fe0fc00 0x1d40e400 (Outside [(5, OpX)]) + , Encoding "CPYPRTN_CPY_memcms" 0x3fe0fc00 0x1d00e400 (Outside []) + , Encoding "CPYERTRN_CPY_memcms" 0x3fe0fc00 0x1d80a400 (Outside [(5, OpX)]) + , Encoding "CPYMRTRN_CPY_memcms" 0x3fe0fc00 0x1d40a400 (Outside [(5, OpX)]) + , Encoding "CPYPRTRN_CPY_memcms" 0x3fe0fc00 0x1d00a400 (Outside []) + , Encoding "CPYERTWN_CPY_memcms" 0x3fe0fc00 0x1d806400 (Outside [(5, OpX)]) + , Encoding "CPYMRTWN_CPY_memcms" 0x3fe0fc00 0x1d406400 (Outside [(5, OpX)]) + , Encoding "CPYPRTWN_CPY_memcms" 0x3fe0fc00 0x1d006400 (Outside []) + , Encoding "CPYET_CPY_memcms" 0x3fe0fc00 0x1d803400 (Outside [(5, OpX)]) + , Encoding "CPYMT_CPY_memcms" 0x3fe0fc00 0x1d403400 (Outside [(5, OpX)]) + , Encoding "CPYPT_CPY_memcms" 0x3fe0fc00 0x1d003400 (Outside []) + , Encoding "CPYETN_CPY_memcms" 0x3fe0fc00 0x1d80f400 (Outside [(5, OpX)]) + , Encoding "CPYMTN_CPY_memcms" 0x3fe0fc00 0x1d40f400 (Outside [(5, OpX)]) + , Encoding "CPYPTN_CPY_memcms" 0x3fe0fc00 0x1d00f400 (Outside []) + , Encoding "CPYETRN_CPY_memcms" 0x3fe0fc00 0x1d80b400 (Outside [(5, OpX)]) + , Encoding "CPYMTRN_CPY_memcms" 0x3fe0fc00 0x1d40b400 (Outside [(5, OpX)]) + , Encoding "CPYPTRN_CPY_memcms" 0x3fe0fc00 0x1d00b400 (Outside []) + , Encoding "CPYETWN_CPY_memcms" 0x3fe0fc00 0x1d807400 (Outside [(5, OpX)]) + , Encoding "CPYMTWN_CPY_memcms" 0x3fe0fc00 0x1d407400 (Outside [(5, OpX)]) + , Encoding "CPYPTWN_CPY_memcms" 0x3fe0fc00 0x1d007400 (Outside []) + , Encoding "CPYEWN_CPY_memcms" 0x3fe0fc00 0x1d804400 (Outside [(5, OpX)]) + , Encoding "CPYMWN_CPY_memcms" 0x3fe0fc00 0x1d404400 (Outside [(5, OpX)]) + , Encoding "CPYPWN_CPY_memcms" 0x3fe0fc00 0x1d004400 (Outside []) + , Encoding "CPYEWT_CPY_memcms" 0x3fe0fc00 0x1d801400 (Outside [(5, OpX)]) + , Encoding "CPYMWT_CPY_memcms" 0x3fe0fc00 0x1d401400 (Outside [(5, OpX)]) + , Encoding "CPYPWT_CPY_memcms" 0x3fe0fc00 0x1d001400 (Outside []) + , Encoding "CPYEWTN_CPY_memcms" 0x3fe0fc00 0x1d80d400 (Outside [(5, OpX)]) + , Encoding "CPYMWTN_CPY_memcms" 0x3fe0fc00 0x1d40d400 (Outside [(5, OpX)]) + , Encoding "CPYPWTN_CPY_memcms" 0x3fe0fc00 0x1d00d400 (Outside []) + , Encoding "CPYEWTRN_CPY_memcms" 0x3fe0fc00 0x1d809400 (Outside [(5, OpX)]) + , Encoding "CPYMWTRN_CPY_memcms" 0x3fe0fc00 0x1d409400 (Outside [(5, OpX)]) + , Encoding "CPYPWTRN_CPY_memcms" 0x3fe0fc00 0x1d009400 (Outside []) + , Encoding "CPYEWTWN_CPY_memcms" 0x3fe0fc00 0x1d805400 (Outside [(5, OpX)]) + , Encoding "CPYMWTWN_CPY_memcms" 0x3fe0fc00 0x1d405400 (Outside [(5, OpX)]) + , Encoding "CPYPWTWN_CPY_memcms" 0x3fe0fc00 0x1d005400 (Outside []) + , Encoding "CRC32B_32C_dp_2src" 0xffe0fc00 0x1ac04000 Covered + , Encoding "CRC32H_32C_dp_2src" 0xffe0fc00 0x1ac04400 Covered + , Encoding "CRC32W_32C_dp_2src" 0xffe0fc00 0x1ac04800 Covered + , Encoding "CRC32X_64C_dp_2src" 0xffe0fc00 0x9ac04c00 Covered + , Encoding "CRC32CB_32C_dp_2src" 0xffe0fc00 0x1ac05000 Covered + , Encoding "CRC32CH_32C_dp_2src" 0xffe0fc00 0x1ac05400 Covered + , Encoding "CRC32CW_32C_dp_2src" 0xffe0fc00 0x1ac05800 Covered + , Encoding "CRC32CX_64C_dp_2src" 0xffe0fc00 0x9ac05c00 Covered + , Encoding "CSDB_HI_hints" 0xffffffff 0xd503229f Control + , Encoding "CSEL_32_condsel" 0xffe00c00 0x1a800000 Covered + , Encoding "CSEL_64_condsel" 0xffe00c00 0x9a800000 Covered + , Encoding "CSINC_32_condsel" 0xffe00c00 0x1a800400 Covered + , Encoding "CSINC_64_condsel" 0xffe00c00 0x9a800400 Covered + , Encoding "CSINV_32_condsel" 0xffe00c00 0x5a800000 Covered + , Encoding "CSINV_64_condsel" 0xffe00c00 0xda800000 Covered + , Encoding "CSNEG_32_condsel" 0xffe00c00 0x5a800400 Covered + , Encoding "CSNEG_64_condsel" 0xffe00c00 0xda800400 Covered + , Encoding "CTZ_32_dp_1src" 0xfffffc00 0x5ac01800 Covered + , Encoding "CTZ_64_dp_1src" 0xfffffc00 0xdac01800 Covered + , Encoding "DCPS1_DC_exception" 0xffe0001f 0xd4a00001 Control + , Encoding "DCPS2_DC_exception" 0xffe0001f 0xd4a00002 Control + , Encoding "DCPS3_DC_exception" 0xffe0001f 0xd4a00003 Control + , Encoding "DGH_HI_hints" 0xffffffff 0xd50320df Control + , Encoding "DMB_BO_barriers" 0xfffff0ff 0xd50330bf Control + , Encoding "DRPS_64E_branch_reg" 0xffffffff 0xd6bf03e0 Control + , Encoding "DSB_BO_barriers" 0xfffff0ff 0xd503309f Control + , Encoding "DSB_BOn_barriers" 0xfffff3ff 0xd503323f Control + , Encoding "DUP_asisdone_only" 0xffe0fc00 0x5e000400 Covered + , Encoding "DUP_asimdins_DV_v" 0xbfe0fc00 0x0e000400 Covered + , Encoding "DUP_asimdins_DR_r" 0xbfe0fc00 0x0e000c00 Covered + , Encoding "EON_32_log_shift" 0xff200000 0x4a200000 Covered + , Encoding "EON_64_log_shift" 0xff200000 0xca200000 Covered + , Encoding "EOR3_VVV16_crypto4" 0xffe08000 0xce000000 Covered + , Encoding "EOR_asimdsame_only" 0xbfe0fc00 0x2e201c00 Covered + , Encoding "EOR_32_log_imm" 0xffc00000 0x52000000 Covered + , Encoding "EOR_64_log_imm" 0xff800000 0xd2000000 Covered + , Encoding "EOR_32_log_shift" 0xff200000 0x4a000000 Covered + , Encoding "EOR_64_log_shift" 0xff200000 0xca000000 Covered + , Encoding "ERET_64E_branch_reg" 0xffffffff 0xd69f03e0 Control + , Encoding "ERETAA_64E_branch_reg" 0xffffffff 0xd69f0bff Control + , Encoding "ERETAB_64E_branch_reg" 0xffffffff 0xd69f0fff Control + , Encoding "ESB_HI_hints" 0xffffffff 0xd503221f Control + , Encoding "EXT_asimdext_only" 0xbfe08400 0x2e000000 Covered + , Encoding "EXTR_32_extract" 0xffe08000 0x13800000 Covered + , Encoding "EXTR_64_extract" 0xffe00000 0x93c00000 Covered + , Encoding "FABD_asisdsamefp16_only" 0xffe0fc00 0x7ec01400 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FABD_asisdsame_only" 0xffa0fc00 0x7ea0d400 (Outside []) + , Encoding "FABD_asimdsamefp16_only" 0xbfe0fc00 0x2ec01400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FABD_asimdsame_only" 0xbfa0fc00 0x2ea0d400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FABS_asimdmiscfp16_R" 0xbffffc00 0x0ef8f800 (Outside [(5, OpV)]) + , Encoding "FABS_asimdmisc_R" 0xbfbffc00 0x0ea0f800 (Outside [(5, OpV)]) + , Encoding "FABS_H_floatdp1" 0xfffffc00 0x1ee0c000 (Outside [(5, OpH)]) + , Encoding "FABS_S_floatdp1" 0xfffffc00 0x1e20c000 (Outside [(5, OpS)]) + , Encoding "FABS_D_floatdp1" 0xfffffc00 0x1e60c000 (Outside [(5, OpD)]) + , Encoding "FACGE_asisdsamefp16_only" 0xffe0fc00 0x7e402c00 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FACGE_asisdsame_only" 0xffa0fc00 0x7e20ec00 (Outside []) + , Encoding "FACGE_asimdsamefp16_only" 0xbfe0fc00 0x2e402c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FACGE_asimdsame_only" 0xbfa0fc00 0x2e20ec00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FACGT_asisdsamefp16_only" 0xffe0fc00 0x7ec02c00 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FACGT_asisdsame_only" 0xffa0fc00 0x7ea0ec00 (Outside []) + , Encoding "FACGT_asimdsamefp16_only" 0xbfe0fc00 0x2ec02c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FACGT_asimdsame_only" 0xbfa0fc00 0x2ea0ec00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FADD_asimdsamefp16_only" 0xbfe0fc00 0x0e401400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FADD_asimdsame_only" 0xbfa0fc00 0x0e20d400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FADD_H_floatdp2" 0xffe0fc00 0x1ee02800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FADD_S_floatdp2" 0xffe0fc00 0x1e202800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FADD_D_floatdp2" 0xffe0fc00 0x1e602800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FADDP_asisdpair_only_H" 0xffbffc00 0x5e30d800 + (Outside [(5, OpVWhole)]) + , Encoding "FADDP_asisdpair_only_SD" 0xffbffc00 0x7e30d800 + (Outside [(5, OpVWhole)]) + , Encoding "FADDP_asimdsamefp16_only" 0xbfe0fc00 0x2e401400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FADDP_asimdsame_only" 0xbfa0fc00 0x2e20d400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCADD_asimdsame2_C" 0xbf20ec00 0x2e00e400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCCMP_H_floatccmp" 0xffe00c10 0x1ee00400 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCCMP_S_floatccmp" 0xffe00c10 0x1e200400 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FCCMP_D_floatccmp" 0xffe00c10 0x1e600400 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FCCMPE_H_floatccmp" 0xffe00c10 0x1ee00410 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCCMPE_S_floatccmp" 0xffe00c10 0x1e200410 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FCCMPE_D_floatccmp" 0xffe00c10 0x1e600410 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FCMEQ_asisdsamefp16_only" 0xffe0fc00 0x5e402400 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCMEQ_asisdsame_only" 0xffa0fc00 0x5e20e400 (Outside []) + , Encoding "FCMEQ_asimdsamefp16_only" 0xbfe0fc00 0x0e402400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMEQ_asimdsame_only" 0xbfa0fc00 0x0e20e400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMEQ_asisdmiscfp16_FZ" 0xfffffc00 0x5ef8d800 + (Outside [(5, OpH)]) + , Encoding "FCMEQ_asisdmisc_FZ" 0xffbffc00 0x5ea0d800 (Outside []) + , Encoding "FCMEQ_asimdmiscfp16_FZ" 0xbffffc00 0x0ef8d800 + (Outside [(5, OpV)]) + , Encoding "FCMEQ_asimdmisc_FZ" 0xbfbffc00 0x0ea0d800 (Outside [(5, OpV)]) + , Encoding "FCMGE_asisdsamefp16_only" 0xffe0fc00 0x7e402400 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCMGE_asisdsame_only" 0xffa0fc00 0x7e20e400 (Outside []) + , Encoding "FCMGE_asimdsamefp16_only" 0xbfe0fc00 0x2e402400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMGE_asimdsame_only" 0xbfa0fc00 0x2e20e400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMGE_asisdmiscfp16_FZ" 0xfffffc00 0x7ef8c800 + (Outside [(5, OpH)]) + , Encoding "FCMGE_asisdmisc_FZ" 0xffbffc00 0x7ea0c800 (Outside []) + , Encoding "FCMGE_asimdmiscfp16_FZ" 0xbffffc00 0x2ef8c800 + (Outside [(5, OpV)]) + , Encoding "FCMGE_asimdmisc_FZ" 0xbfbffc00 0x2ea0c800 (Outside [(5, OpV)]) + , Encoding "FCMGT_asisdsamefp16_only" 0xffe0fc00 0x7ec02400 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCMGT_asisdsame_only" 0xffa0fc00 0x7ea0e400 (Outside []) + , Encoding "FCMGT_asimdsamefp16_only" 0xbfe0fc00 0x2ec02400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMGT_asimdsame_only" 0xbfa0fc00 0x2ea0e400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMGT_asisdmiscfp16_FZ" 0xfffffc00 0x5ef8c800 + (Outside [(5, OpH)]) + , Encoding "FCMGT_asisdmisc_FZ" 0xffbffc00 0x5ea0c800 (Outside []) + , Encoding "FCMGT_asimdmiscfp16_FZ" 0xbffffc00 0x0ef8c800 + (Outside [(5, OpV)]) + , Encoding "FCMGT_asimdmisc_FZ" 0xbfbffc00 0x0ea0c800 (Outside [(5, OpV)]) + , Encoding "FCMLA_asimdelem_C_H" 0xbfc09400 0x2f401000 (Outside [(5, OpV)]) + , Encoding "FCMLA_asimdelem_C_S" 0xbfc09400 0x2f801000 (Outside [(5, OpV)]) + , Encoding "FCMLA_asimdsame2_C" 0xbf20e400 0x2e00c400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FCMLE_asisdmiscfp16_FZ" 0xfffffc00 0x7ef8d800 + (Outside [(5, OpH)]) + , Encoding "FCMLE_asisdmisc_FZ" 0xffbffc00 0x7ea0d800 (Outside []) + , Encoding "FCMLE_asimdmiscfp16_FZ" 0xbffffc00 0x2ef8d800 + (Outside [(5, OpV)]) + , Encoding "FCMLE_asimdmisc_FZ" 0xbfbffc00 0x2ea0d800 (Outside [(5, OpV)]) + , Encoding "FCMLT_asisdmiscfp16_FZ" 0xfffffc00 0x5ef8e800 + (Outside [(5, OpH)]) + , Encoding "FCMLT_asisdmisc_FZ" 0xffbffc00 0x5ea0e800 (Outside []) + , Encoding "FCMLT_asimdmiscfp16_FZ" 0xbffffc00 0x0ef8e800 + (Outside [(5, OpV)]) + , Encoding "FCMLT_asimdmisc_FZ" 0xbfbffc00 0x0ea0e800 (Outside [(5, OpV)]) + , Encoding "FCMP_H_floatcmp" 0xffe0fc0f 0x1ee02000 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCMP_HZ_floatcmp" 0xffe0fc0f 0x1ee02008 (Outside [(5, OpH)]) + , Encoding "FCMP_S_floatcmp" 0xffe0fc0f 0x1e202000 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FCMP_SZ_floatcmp" 0xffe0fc0f 0x1e202008 (Outside [(5, OpS)]) + , Encoding "FCMP_D_floatcmp" 0xffe0fc0f 0x1e602000 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FCMP_DZ_floatcmp" 0xffe0fc0f 0x1e602008 (Outside [(5, OpD)]) + , Encoding "FCMPE_H_floatcmp" 0xffe0fc0f 0x1ee02000 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FCMPE_HZ_floatcmp" 0xffe0fc0f 0x1ee02008 (Outside [(5, OpH)]) + , Encoding "FCMPE_S_floatcmp" 0xffe0fc0f 0x1e202000 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FCMPE_SZ_floatcmp" 0xffe0fc0f 0x1e202008 (Outside [(5, OpS)]) + , Encoding "FCMPE_D_floatcmp" 0xffe0fc0f 0x1e602000 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FCMPE_DZ_floatcmp" 0xffe0fc0f 0x1e602008 (Outside [(5, OpD)]) + , Encoding "FCSEL_H_floatsel" 0xffe00c00 0x1ee00c00 Covered + , Encoding "FCSEL_S_floatsel" 0xffe00c00 0x1e200c00 Covered + , Encoding "FCSEL_D_floatsel" 0xffe00c00 0x1e600c00 Covered + , Encoding "FCVT_SH_floatdp1" 0xfffffc00 0x1ee24000 (Outside [(5, OpH)]) + , Encoding "FCVT_DH_floatdp1" 0xfffffc00 0x1ee2c000 (Outside [(5, OpH)]) + , Encoding "FCVT_HS_floatdp1" 0xfffffc00 0x1e23c000 (Outside [(5, OpS)]) + , Encoding "FCVT_DS_floatdp1" 0xfffffc00 0x1e22c000 (Outside [(5, OpS)]) + , Encoding "FCVT_HD_floatdp1" 0xfffffc00 0x1e63c000 (Outside [(5, OpD)]) + , Encoding "FCVT_SD_floatdp1" 0xfffffc00 0x1e624000 (Outside [(5, OpD)]) + , Encoding "FCVTAS_asisdmiscfp16_R" 0xfffffc00 0x5e79c800 + (Outside [(5, OpH)]) + , Encoding "FCVTAS_asisdmisc_R" 0xffbffc00 0x5e21c800 (Outside []) + , Encoding "FCVTAS_asimdmiscfp16_R" 0xbffffc00 0x0e79c800 + (Outside [(5, OpV)]) + , Encoding "FCVTAS_asimdmisc_R" 0xbfbffc00 0x0e21c800 (Outside [(5, OpV)]) + , Encoding "FCVTAS_32H_float2int" 0xfffffc00 0x1ee40000 (Outside [(5, OpH)]) + , Encoding "FCVTAS_64H_float2int" 0xfffffc00 0x9ee40000 (Outside [(5, OpH)]) + , Encoding "FCVTAS_32S_float2int" 0xfffffc00 0x1e240000 (Outside [(5, OpS)]) + , Encoding "FCVTAS_64S_float2int" 0xfffffc00 0x9e240000 (Outside [(5, OpS)]) + , Encoding "FCVTAS_32D_float2int" 0xfffffc00 0x1e640000 (Outside [(5, OpD)]) + , Encoding "FCVTAS_64D_float2int" 0xfffffc00 0x9e640000 (Outside [(5, OpD)]) + , Encoding "FCVTAU_asisdmiscfp16_R" 0xfffffc00 0x7e79c800 + (Outside [(5, OpH)]) + , Encoding "FCVTAU_asisdmisc_R" 0xffbffc00 0x7e21c800 (Outside []) + , Encoding "FCVTAU_asimdmiscfp16_R" 0xbffffc00 0x2e79c800 + (Outside [(5, OpV)]) + , Encoding "FCVTAU_asimdmisc_R" 0xbfbffc00 0x2e21c800 (Outside [(5, OpV)]) + , Encoding "FCVTAU_32H_float2int" 0xfffffc00 0x1ee50000 (Outside [(5, OpH)]) + , Encoding "FCVTAU_64H_float2int" 0xfffffc00 0x9ee50000 (Outside [(5, OpH)]) + , Encoding "FCVTAU_32S_float2int" 0xfffffc00 0x1e250000 (Outside [(5, OpS)]) + , Encoding "FCVTAU_64S_float2int" 0xfffffc00 0x9e250000 (Outside [(5, OpS)]) + , Encoding "FCVTAU_32D_float2int" 0xfffffc00 0x1e650000 (Outside [(5, OpD)]) + , Encoding "FCVTAU_64D_float2int" 0xfffffc00 0x9e650000 (Outside [(5, OpD)]) + , Encoding "FCVTL_asimdmisc_L" 0xbfbffc00 0x0e217800 (Outside [(5, OpV)]) + , Encoding "FCVTMS_asisdmiscfp16_R" 0xfffffc00 0x5e79b800 + (Outside [(5, OpH)]) + , Encoding "FCVTMS_asisdmisc_R" 0xffbffc00 0x5e21b800 (Outside []) + , Encoding "FCVTMS_asimdmiscfp16_R" 0xbffffc00 0x0e79b800 + (Outside [(5, OpV)]) + , Encoding "FCVTMS_asimdmisc_R" 0xbfbffc00 0x0e21b800 (Outside [(5, OpV)]) + , Encoding "FCVTMS_32H_float2int" 0xfffffc00 0x1ef00000 (Outside [(5, OpH)]) + , Encoding "FCVTMS_64H_float2int" 0xfffffc00 0x9ef00000 (Outside [(5, OpH)]) + , Encoding "FCVTMS_32S_float2int" 0xfffffc00 0x1e300000 (Outside [(5, OpS)]) + , Encoding "FCVTMS_64S_float2int" 0xfffffc00 0x9e300000 (Outside [(5, OpS)]) + , Encoding "FCVTMS_32D_float2int" 0xfffffc00 0x1e700000 (Outside [(5, OpD)]) + , Encoding "FCVTMS_64D_float2int" 0xfffffc00 0x9e700000 (Outside [(5, OpD)]) + , Encoding "FCVTMU_asisdmiscfp16_R" 0xfffffc00 0x7e79b800 + (Outside [(5, OpH)]) + , Encoding "FCVTMU_asisdmisc_R" 0xffbffc00 0x7e21b800 (Outside []) + , Encoding "FCVTMU_asimdmiscfp16_R" 0xbffffc00 0x2e79b800 + (Outside [(5, OpV)]) + , Encoding "FCVTMU_asimdmisc_R" 0xbfbffc00 0x2e21b800 (Outside [(5, OpV)]) + , Encoding "FCVTMU_32H_float2int" 0xfffffc00 0x1ef10000 (Outside [(5, OpH)]) + , Encoding "FCVTMU_64H_float2int" 0xfffffc00 0x9ef10000 (Outside [(5, OpH)]) + , Encoding "FCVTMU_32S_float2int" 0xfffffc00 0x1e310000 (Outside [(5, OpS)]) + , Encoding "FCVTMU_64S_float2int" 0xfffffc00 0x9e310000 (Outside [(5, OpS)]) + , Encoding "FCVTMU_32D_float2int" 0xfffffc00 0x1e710000 (Outside [(5, OpD)]) + , Encoding "FCVTMU_64D_float2int" 0xfffffc00 0x9e710000 (Outside [(5, OpD)]) + , Encoding "FCVTN_asimdmisc_N" 0xbfbffc00 0x0e216800 (Outside [(5, OpV)]) + , Encoding "FCVTNS_asisdmiscfp16_R" 0xfffffc00 0x5e79a800 + (Outside [(5, OpH)]) + , Encoding "FCVTNS_asisdmisc_R" 0xffbffc00 0x5e21a800 (Outside []) + , Encoding "FCVTNS_asimdmiscfp16_R" 0xbffffc00 0x0e79a800 + (Outside [(5, OpV)]) + , Encoding "FCVTNS_asimdmisc_R" 0xbfbffc00 0x0e21a800 (Outside [(5, OpV)]) + , Encoding "FCVTNS_32H_float2int" 0xfffffc00 0x1ee00000 (Outside [(5, OpH)]) + , Encoding "FCVTNS_64H_float2int" 0xfffffc00 0x9ee00000 (Outside [(5, OpH)]) + , Encoding "FCVTNS_32S_float2int" 0xfffffc00 0x1e200000 (Outside [(5, OpS)]) + , Encoding "FCVTNS_64S_float2int" 0xfffffc00 0x9e200000 (Outside [(5, OpS)]) + , Encoding "FCVTNS_32D_float2int" 0xfffffc00 0x1e600000 (Outside [(5, OpD)]) + , Encoding "FCVTNS_64D_float2int" 0xfffffc00 0x9e600000 (Outside [(5, OpD)]) + , Encoding "FCVTNU_asisdmiscfp16_R" 0xfffffc00 0x7e79a800 + (Outside [(5, OpH)]) + , Encoding "FCVTNU_asisdmisc_R" 0xffbffc00 0x7e21a800 (Outside []) + , Encoding "FCVTNU_asimdmiscfp16_R" 0xbffffc00 0x2e79a800 + (Outside [(5, OpV)]) + , Encoding "FCVTNU_asimdmisc_R" 0xbfbffc00 0x2e21a800 (Outside [(5, OpV)]) + , Encoding "FCVTNU_32H_float2int" 0xfffffc00 0x1ee10000 (Outside [(5, OpH)]) + , Encoding "FCVTNU_64H_float2int" 0xfffffc00 0x9ee10000 (Outside [(5, OpH)]) + , Encoding "FCVTNU_32S_float2int" 0xfffffc00 0x1e210000 (Outside [(5, OpS)]) + , Encoding "FCVTNU_64S_float2int" 0xfffffc00 0x9e210000 (Outside [(5, OpS)]) + , Encoding "FCVTNU_32D_float2int" 0xfffffc00 0x1e610000 (Outside [(5, OpD)]) + , Encoding "FCVTNU_64D_float2int" 0xfffffc00 0x9e610000 (Outside [(5, OpD)]) + , Encoding "FCVTPS_asisdmiscfp16_R" 0xfffffc00 0x5ef9a800 + (Outside [(5, OpH)]) + , Encoding "FCVTPS_asisdmisc_R" 0xffbffc00 0x5ea1a800 (Outside []) + , Encoding "FCVTPS_asimdmiscfp16_R" 0xbffffc00 0x0ef9a800 + (Outside [(5, OpV)]) + , Encoding "FCVTPS_asimdmisc_R" 0xbfbffc00 0x0ea1a800 (Outside [(5, OpV)]) + , Encoding "FCVTPS_32H_float2int" 0xfffffc00 0x1ee80000 (Outside [(5, OpH)]) + , Encoding "FCVTPS_64H_float2int" 0xfffffc00 0x9ee80000 (Outside [(5, OpH)]) + , Encoding "FCVTPS_32S_float2int" 0xfffffc00 0x1e280000 (Outside [(5, OpS)]) + , Encoding "FCVTPS_64S_float2int" 0xfffffc00 0x9e280000 (Outside [(5, OpS)]) + , Encoding "FCVTPS_32D_float2int" 0xfffffc00 0x1e680000 (Outside [(5, OpD)]) + , Encoding "FCVTPS_64D_float2int" 0xfffffc00 0x9e680000 (Outside [(5, OpD)]) + , Encoding "FCVTPU_asisdmiscfp16_R" 0xfffffc00 0x7ef9a800 + (Outside [(5, OpH)]) + , Encoding "FCVTPU_asisdmisc_R" 0xffbffc00 0x7ea1a800 (Outside []) + , Encoding "FCVTPU_asimdmiscfp16_R" 0xbffffc00 0x2ef9a800 + (Outside [(5, OpV)]) + , Encoding "FCVTPU_asimdmisc_R" 0xbfbffc00 0x2ea1a800 (Outside [(5, OpV)]) + , Encoding "FCVTPU_32H_float2int" 0xfffffc00 0x1ee90000 (Outside [(5, OpH)]) + , Encoding "FCVTPU_64H_float2int" 0xfffffc00 0x9ee90000 (Outside [(5, OpH)]) + , Encoding "FCVTPU_32S_float2int" 0xfffffc00 0x1e290000 (Outside [(5, OpS)]) + , Encoding "FCVTPU_64S_float2int" 0xfffffc00 0x9e290000 (Outside [(5, OpS)]) + , Encoding "FCVTPU_32D_float2int" 0xfffffc00 0x1e690000 (Outside [(5, OpD)]) + , Encoding "FCVTPU_64D_float2int" 0xfffffc00 0x9e690000 (Outside [(5, OpD)]) + , Encoding "FCVTXN_asisdmisc_N" 0xffbffc00 0x7e216800 (Outside []) + , Encoding "FCVTXN_asimdmisc_N" 0xbfbffc00 0x2e216800 (Outside [(5, OpV)]) + , Encoding "FCVTZS_asisdshf_C" 0xff80fc00 0x5f00fc00 (Outside []) + , Encoding "FCVTZS_asimdshf_C" 0xbf80fc00 0x0f00fc00 (Outside [(5, OpV)]) + , Encoding "FCVTZS_asisdmiscfp16_R" 0xfffffc00 0x5ef9b800 + (Outside [(5, OpH)]) + , Encoding "FCVTZS_asisdmisc_R" 0xffbffc00 0x5ea1b800 (Outside []) + , Encoding "FCVTZS_asimdmiscfp16_R" 0xbffffc00 0x0ef9b800 + (Outside [(5, OpV)]) + , Encoding "FCVTZS_asimdmisc_R" 0xbfbffc00 0x0ea1b800 (Outside [(5, OpV)]) + , Encoding "FCVTZS_32H_float2fix" 0xffff0000 0x1ed80000 (Outside [(5, OpH)]) + , Encoding "FCVTZS_64H_float2fix" 0xffff0000 0x9ed80000 (Outside [(5, OpH)]) + , Encoding "FCVTZS_32S_float2fix" 0xffff0000 0x1e180000 (Outside [(5, OpS)]) + , Encoding "FCVTZS_64S_float2fix" 0xffff0000 0x9e180000 (Outside [(5, OpS)]) + , Encoding "FCVTZS_32D_float2fix" 0xffff0000 0x1e580000 (Outside [(5, OpD)]) + , Encoding "FCVTZS_64D_float2fix" 0xffff0000 0x9e580000 (Outside [(5, OpD)]) + , Encoding "FCVTZS_32H_float2int" 0xfffffc00 0x1ef80000 (Outside [(5, OpH)]) + , Encoding "FCVTZS_64H_float2int" 0xfffffc00 0x9ef80000 (Outside [(5, OpH)]) + , Encoding "FCVTZS_32S_float2int" 0xfffffc00 0x1e380000 (Outside [(5, OpS)]) + , Encoding "FCVTZS_64S_float2int" 0xfffffc00 0x9e380000 (Outside [(5, OpS)]) + , Encoding "FCVTZS_32D_float2int" 0xfffffc00 0x1e780000 (Outside [(5, OpD)]) + , Encoding "FCVTZS_64D_float2int" 0xfffffc00 0x9e780000 (Outside [(5, OpD)]) + , Encoding "FCVTZU_asisdshf_C" 0xff80fc00 0x7f00fc00 (Outside []) + , Encoding "FCVTZU_asimdshf_C" 0xbf80fc00 0x2f00fc00 (Outside [(5, OpV)]) + , Encoding "FCVTZU_asisdmiscfp16_R" 0xfffffc00 0x7ef9b800 + (Outside [(5, OpH)]) + , Encoding "FCVTZU_asisdmisc_R" 0xffbffc00 0x7ea1b800 (Outside []) + , Encoding "FCVTZU_asimdmiscfp16_R" 0xbffffc00 0x2ef9b800 + (Outside [(5, OpV)]) + , Encoding "FCVTZU_asimdmisc_R" 0xbfbffc00 0x2ea1b800 (Outside [(5, OpV)]) + , Encoding "FCVTZU_32H_float2fix" 0xffff0000 0x1ed90000 (Outside [(5, OpH)]) + , Encoding "FCVTZU_64H_float2fix" 0xffff0000 0x9ed90000 (Outside [(5, OpH)]) + , Encoding "FCVTZU_32S_float2fix" 0xffff0000 0x1e190000 (Outside [(5, OpS)]) + , Encoding "FCVTZU_64S_float2fix" 0xffff0000 0x9e190000 (Outside [(5, OpS)]) + , Encoding "FCVTZU_32D_float2fix" 0xffff0000 0x1e590000 (Outside [(5, OpD)]) + , Encoding "FCVTZU_64D_float2fix" 0xffff0000 0x9e590000 (Outside [(5, OpD)]) + , Encoding "FCVTZU_32H_float2int" 0xfffffc00 0x1ef90000 (Outside [(5, OpH)]) + , Encoding "FCVTZU_64H_float2int" 0xfffffc00 0x9ef90000 (Outside [(5, OpH)]) + , Encoding "FCVTZU_32S_float2int" 0xfffffc00 0x1e390000 (Outside [(5, OpS)]) + , Encoding "FCVTZU_64S_float2int" 0xfffffc00 0x9e390000 (Outside [(5, OpS)]) + , Encoding "FCVTZU_32D_float2int" 0xfffffc00 0x1e790000 (Outside [(5, OpD)]) + , Encoding "FCVTZU_64D_float2int" 0xfffffc00 0x9e790000 (Outside [(5, OpD)]) + , Encoding "FDIV_asimdsamefp16_only" 0xbfe0fc00 0x2e403c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FDIV_asimdsame_only" 0xbfa0fc00 0x2e20fc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FDIV_H_floatdp2" 0xffe0fc00 0x1ee01800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FDIV_S_floatdp2" 0xffe0fc00 0x1e201800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FDIV_D_floatdp2" 0xffe0fc00 0x1e601800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FJCVTZS_32D_float2int" 0xfffffc00 0x1e7e0000 (Outside [(5, OpD)]) + , Encoding "FMADD_H_floatdp3" 0xffe08000 0x1fc00000 + (Outside [(5, OpH), (10, OpH), (16, OpH)]) + , Encoding "FMADD_S_floatdp3" 0xffe08000 0x1f000000 + (Outside [(5, OpS), (10, OpS), (16, OpS)]) + , Encoding "FMADD_D_floatdp3" 0xffe08000 0x1f400000 + (Outside [(5, OpD), (10, OpD), (16, OpD)]) + , Encoding "FMAX_asimdsamefp16_only" 0xbfe0fc00 0x0e403400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAX_asimdsame_only" 0xbfa0fc00 0x0e20f400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAX_H_floatdp2" 0xffe0fc00 0x1ee04800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMAX_S_floatdp2" 0xffe0fc00 0x1e204800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FMAX_D_floatdp2" 0xffe0fc00 0x1e604800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FMAXNM_asimdsamefp16_only" 0xbfe0fc00 0x0e400400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXNM_asimdsame_only" 0xbfa0fc00 0x0e20c400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXNM_H_floatdp2" 0xffe0fc00 0x1ee06800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMAXNM_S_floatdp2" 0xffe0fc00 0x1e206800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FMAXNM_D_floatdp2" 0xffe0fc00 0x1e606800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FMAXNMP_asisdpair_only_H" 0xffbffc00 0x5e30c800 + (Outside [(5, OpVWhole)]) + , Encoding "FMAXNMP_asisdpair_only_SD" 0xffbffc00 0x7e30c800 + (Outside [(5, OpVWhole)]) + , Encoding "FMAXNMP_asimdsamefp16_only" 0xbfe0fc00 0x2e400400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXNMP_asimdsame_only" 0xbfa0fc00 0x2e20c400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXNMV_asimdall_only_H" 0xbffffc00 0x0e30c800 + (Outside [(5, OpV)]) + , Encoding "FMAXNMV_asimdall_only_SD" 0xbfbffc00 0x2e30c800 + (Outside [(5, OpV)]) + , Encoding "FMAXP_asisdpair_only_H" 0xffbffc00 0x5e30f800 + (Outside [(5, OpVWhole)]) + , Encoding "FMAXP_asisdpair_only_SD" 0xffbffc00 0x7e30f800 + (Outside [(5, OpVWhole)]) + , Encoding "FMAXP_asimdsamefp16_only" 0xbfe0fc00 0x2e403400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXP_asimdsame_only" 0xbfa0fc00 0x2e20f400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMAXV_asimdall_only_H" 0xbffffc00 0x0e30f800 (Outside [(5, OpV)]) + , Encoding "FMAXV_asimdall_only_SD" 0xbfbffc00 0x2e30f800 + (Outside [(5, OpV)]) + , Encoding "FMIN_asimdsamefp16_only" 0xbfe0fc00 0x0ec03400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMIN_asimdsame_only" 0xbfa0fc00 0x0ea0f400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMIN_H_floatdp2" 0xffe0fc00 0x1ee05800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMIN_S_floatdp2" 0xffe0fc00 0x1e205800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FMIN_D_floatdp2" 0xffe0fc00 0x1e605800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FMINNM_asimdsamefp16_only" 0xbfe0fc00 0x0ec00400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINNM_asimdsame_only" 0xbfa0fc00 0x0ea0c400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINNM_H_floatdp2" 0xffe0fc00 0x1ee07800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMINNM_S_floatdp2" 0xffe0fc00 0x1e207800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FMINNM_D_floatdp2" 0xffe0fc00 0x1e607800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FMINNMP_asisdpair_only_H" 0xffbffc00 0x5eb0c800 + (Outside [(5, OpVWhole)]) + , Encoding "FMINNMP_asisdpair_only_SD" 0xffbffc00 0x7eb0c800 + (Outside [(5, OpVWhole)]) + , Encoding "FMINNMP_asimdsamefp16_only" 0xbfe0fc00 0x2ec00400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINNMP_asimdsame_only" 0xbfa0fc00 0x2ea0c400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINNMV_asimdall_only_H" 0xbffffc00 0x0eb0c800 + (Outside [(5, OpV)]) + , Encoding "FMINNMV_asimdall_only_SD" 0xbfbffc00 0x2eb0c800 + (Outside [(5, OpV)]) + , Encoding "FMINP_asisdpair_only_H" 0xffbffc00 0x5eb0f800 + (Outside [(5, OpVWhole)]) + , Encoding "FMINP_asisdpair_only_SD" 0xffbffc00 0x7eb0f800 + (Outside [(5, OpVWhole)]) + , Encoding "FMINP_asimdsamefp16_only" 0xbfe0fc00 0x2ec03400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINP_asimdsame_only" 0xbfa0fc00 0x2ea0f400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMINV_asimdall_only_H" 0xbffffc00 0x0eb0f800 (Outside [(5, OpV)]) + , Encoding "FMINV_asimdall_only_SD" 0xbfbffc00 0x2eb0f800 + (Outside [(5, OpV)]) + , Encoding "FMLA_asisdelem_RH_H" 0xffc0f400 0x5f001000 (Outside [(5, OpH)]) + , Encoding "FMLA_asisdelem_R_SD" 0xff80f400 0x5f801000 (Outside []) + , Encoding "FMLA_asimdelem_RH_H" 0xbfc0f400 0x0f001000 (Outside [(5, OpV)]) + , Encoding "FMLA_asimdelem_R_SD" 0xbf80f400 0x0f801000 (Outside [(5, OpV)]) + , Encoding "FMLA_asimdsamefp16_only" 0xbfe0fc00 0x0e400c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLA_asimdsame_only" 0xbfa0fc00 0x0e20cc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLAL_asimdelem_LH" 0xbfc0f400 0x0f800000 (Outside [(5, OpV)]) + , Encoding "FMLAL2_asimdelem_LH" 0xbfc0f400 0x2f808000 (Outside [(5, OpV)]) + , Encoding "FMLAL_asimdsame_F" 0xbfe0fc00 0x0e20ec00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLAL2_asimdsame_F" 0xbfe0fc00 0x2e20cc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLS_asisdelem_RH_H" 0xffc0f400 0x5f005000 (Outside [(5, OpH)]) + , Encoding "FMLS_asisdelem_R_SD" 0xff80f400 0x5f805000 (Outside []) + , Encoding "FMLS_asimdelem_RH_H" 0xbfc0f400 0x0f005000 (Outside [(5, OpV)]) + , Encoding "FMLS_asimdelem_R_SD" 0xbf80f400 0x0f805000 (Outside [(5, OpV)]) + , Encoding "FMLS_asimdsamefp16_only" 0xbfe0fc00 0x0ec00c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLS_asimdsame_only" 0xbfa0fc00 0x0ea0cc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLSL_asimdelem_LH" 0xbfc0f400 0x0f804000 (Outside [(5, OpV)]) + , Encoding "FMLSL2_asimdelem_LH" 0xbfc0f400 0x2f80c000 (Outside [(5, OpV)]) + , Encoding "FMLSL_asimdsame_F" 0xbfe0fc00 0x0ea0ec00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMLSL2_asimdsame_F" 0xbfe0fc00 0x2ea0cc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMOV_asimdimm_H_h" 0xbff8fc00 0x0f00fc00 (Outside []) + , Encoding "FMOV_asimdimm_S_s" 0xbff8fc00 0x0f00f400 (Outside []) + , Encoding "FMOV_asimdimm_D2_d" 0xfff8fc00 0x6f00f400 (Outside []) + , Encoding "FMOV_H_floatdp1" 0xfffffc00 0x1ee04000 (Outside [(5, OpH)]) + , Encoding "FMOV_S_floatdp1" 0xfffffc00 0x1e204000 (Outside [(5, OpS)]) + , Encoding "FMOV_D_floatdp1" 0xfffffc00 0x1e604000 (Outside [(5, OpD)]) + , Encoding "FMOV_32H_float2int" 0xffe9fc00 0x1ee00000 (Outside [(5, OpH)]) + , Encoding "FMOV_64H_float2int" 0xffe9fc00 0x9ee00000 (Outside [(5, OpH)]) + , Encoding "FMOV_H32_float2int" 0xffe9fc00 0x1ee10000 (Outside [(5, OpW)]) + , Encoding "FMOV_S32_float2int" 0xffe9fc00 0x1e210000 (Outside [(5, OpW)]) + , Encoding "FMOV_32S_float2int" 0xffe9fc00 0x1e200000 (Outside [(5, OpS)]) + , Encoding "FMOV_H64_float2int" 0xffe9fc00 0x9ee10000 (Outside [(5, OpX)]) + , Encoding "FMOV_D64_float2int" 0xffe9fc00 0x9e610000 (Outside [(5, OpX)]) + , Encoding "FMOV_V64I_float2int" 0xffe9fc00 0x9ea90000 (Outside [(5, OpX)]) + , Encoding "FMOV_64D_float2int" 0xffe9fc00 0x9e600000 (Outside [(5, OpD)]) + , Encoding "FMOV_64VX_float2int" 0xffe9fc00 0x9ea80000 + (Outside [(5, OpVWhole)]) + , Encoding "FMOV_H_floatimm" 0xffe01fe0 0x1ee01000 (Outside []) + , Encoding "FMOV_S_floatimm" 0xffe01fe0 0x1e201000 (Outside []) + , Encoding "FMOV_D_floatimm" 0xffe01fe0 0x1e601000 (Outside []) + , Encoding "FMSUB_H_floatdp3" 0xffe08000 0x1fc08000 + (Outside [(5, OpH), (10, OpH), (16, OpH)]) + , Encoding "FMSUB_S_floatdp3" 0xffe08000 0x1f008000 + (Outside [(5, OpS), (10, OpS), (16, OpS)]) + , Encoding "FMSUB_D_floatdp3" 0xffe08000 0x1f408000 + (Outside [(5, OpD), (10, OpD), (16, OpD)]) + , Encoding "FMUL_asisdelem_RH_H" 0xffc0f400 0x5f009000 (Outside [(5, OpH)]) + , Encoding "FMUL_asisdelem_R_SD" 0xff80f400 0x5f809000 (Outside []) + , Encoding "FMUL_asimdelem_RH_H" 0xbfc0f400 0x0f009000 (Outside [(5, OpV)]) + , Encoding "FMUL_asimdelem_R_SD" 0xbf80f400 0x0f809000 (Outside [(5, OpV)]) + , Encoding "FMUL_asimdsamefp16_only" 0xbfe0fc00 0x2e401c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMUL_asimdsame_only" 0xbfa0fc00 0x2e20dc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMUL_H_floatdp2" 0xffe0fc00 0x1ee00800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMUL_S_floatdp2" 0xffe0fc00 0x1e200800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FMUL_D_floatdp2" 0xffe0fc00 0x1e600800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FMULX_asisdelem_RH_H" 0xffc0f400 0x7f009000 (Outside [(5, OpH)]) + , Encoding "FMULX_asisdelem_R_SD" 0xff80f400 0x7f809000 (Outside []) + , Encoding "FMULX_asimdelem_RH_H" 0xbfc0f400 0x2f009000 (Outside [(5, OpV)]) + , Encoding "FMULX_asimdelem_R_SD" 0xbf80f400 0x2f809000 (Outside [(5, OpV)]) + , Encoding "FMULX_asisdsamefp16_only" 0xffe0fc00 0x5e401c00 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FMULX_asisdsame_only" 0xffa0fc00 0x5e20dc00 (Outside []) + , Encoding "FMULX_asimdsamefp16_only" 0xbfe0fc00 0x0e401c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FMULX_asimdsame_only" 0xbfa0fc00 0x0e20dc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FNEG_asimdmiscfp16_R" 0xbffffc00 0x2ef8f800 (Outside [(5, OpV)]) + , Encoding "FNEG_asimdmisc_R" 0xbfbffc00 0x2ea0f800 (Outside [(5, OpV)]) + , Encoding "FNEG_H_floatdp1" 0xfffffc00 0x1ee14000 (Outside [(5, OpH)]) + , Encoding "FNEG_S_floatdp1" 0xfffffc00 0x1e214000 (Outside [(5, OpS)]) + , Encoding "FNEG_D_floatdp1" 0xfffffc00 0x1e614000 (Outside [(5, OpD)]) + , Encoding "FNMADD_H_floatdp3" 0xffe08000 0x1fe00000 + (Outside [(5, OpH), (10, OpH), (16, OpH)]) + , Encoding "FNMADD_S_floatdp3" 0xffe08000 0x1f200000 + (Outside [(5, OpS), (10, OpS), (16, OpS)]) + , Encoding "FNMADD_D_floatdp3" 0xffe08000 0x1f600000 + (Outside [(5, OpD), (10, OpD), (16, OpD)]) + , Encoding "FNMSUB_H_floatdp3" 0xffe08000 0x1fe08000 + (Outside [(5, OpH), (10, OpH), (16, OpH)]) + , Encoding "FNMSUB_S_floatdp3" 0xffe08000 0x1f208000 + (Outside [(5, OpS), (10, OpS), (16, OpS)]) + , Encoding "FNMSUB_D_floatdp3" 0xffe08000 0x1f608000 + (Outside [(5, OpD), (10, OpD), (16, OpD)]) + , Encoding "FNMUL_H_floatdp2" 0xffe0fc00 0x1ee08800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FNMUL_S_floatdp2" 0xffe0fc00 0x1e208800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FNMUL_D_floatdp2" 0xffe0fc00 0x1e608800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "FRECPE_asisdmiscfp16_R" 0xfffffc00 0x5ef9d800 + (Outside [(5, OpH)]) + , Encoding "FRECPE_asisdmisc_R" 0xffbffc00 0x5ea1d800 (Outside []) + , Encoding "FRECPE_asimdmiscfp16_R" 0xbffffc00 0x0ef9d800 + (Outside [(5, OpV)]) + , Encoding "FRECPE_asimdmisc_R" 0xbfbffc00 0x0ea1d800 (Outside [(5, OpV)]) + , Encoding "FRECPS_asisdsamefp16_only" 0xffe0fc00 0x5e403c00 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FRECPS_asisdsame_only" 0xffa0fc00 0x5e20fc00 (Outside []) + , Encoding "FRECPS_asimdsamefp16_only" 0xbfe0fc00 0x0e403c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FRECPS_asimdsame_only" 0xbfa0fc00 0x0e20fc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FRECPX_asisdmiscfp16_R" 0xfffffc00 0x5ef9f800 + (Outside [(5, OpH)]) + , Encoding "FRECPX_asisdmisc_R" 0xffbffc00 0x5ea1f800 (Outside []) + , Encoding "FRINT32X_asimdmisc_R" 0xbfbffc00 0x2e21e800 (Outside [(5, OpV)]) + , Encoding "FRINT32X_S_floatdp1" 0xff7ffc00 0x1e28c000 (Outside [(5, OpS)]) + , Encoding "FRINT32X_D_floatdp1" 0xff7ffc00 0x1e68c000 (Outside [(5, OpD)]) + , Encoding "FRINT32Z_asimdmisc_R" 0xbfbffc00 0x0e21e800 (Outside [(5, OpV)]) + , Encoding "FRINT32Z_S_floatdp1" 0xff7ffc00 0x1e284000 (Outside [(5, OpS)]) + , Encoding "FRINT32Z_D_floatdp1" 0xff7ffc00 0x1e684000 (Outside [(5, OpD)]) + , Encoding "FRINT64X_asimdmisc_R" 0xbfbffc00 0x2e21f800 (Outside [(5, OpV)]) + , Encoding "FRINT64X_S_floatdp1" 0xff7ffc00 0x1e29c000 (Outside [(5, OpS)]) + , Encoding "FRINT64X_D_floatdp1" 0xff7ffc00 0x1e69c000 (Outside [(5, OpD)]) + , Encoding "FRINT64Z_asimdmisc_R" 0xbfbffc00 0x0e21f800 (Outside [(5, OpV)]) + , Encoding "FRINT64Z_S_floatdp1" 0xff7ffc00 0x1e294000 (Outside [(5, OpS)]) + , Encoding "FRINT64Z_D_floatdp1" 0xff7ffc00 0x1e694000 (Outside [(5, OpD)]) + , Encoding "FRINTA_asimdmiscfp16_R" 0xbffffc00 0x2e798800 + (Outside [(5, OpV)]) + , Encoding "FRINTA_asimdmisc_R" 0xbfbffc00 0x2e218800 (Outside [(5, OpV)]) + , Encoding "FRINTA_H_floatdp1" 0xfffffc00 0x1ee64000 (Outside [(5, OpH)]) + , Encoding "FRINTA_S_floatdp1" 0xfffffc00 0x1e264000 (Outside [(5, OpS)]) + , Encoding "FRINTA_D_floatdp1" 0xfffffc00 0x1e664000 (Outside [(5, OpD)]) + , Encoding "FRINTI_asimdmiscfp16_R" 0xbffffc00 0x2ef99800 + (Outside [(5, OpV)]) + , Encoding "FRINTI_asimdmisc_R" 0xbfbffc00 0x2ea19800 (Outside [(5, OpV)]) + , Encoding "FRINTI_H_floatdp1" 0xfffffc00 0x1ee7c000 (Outside [(5, OpH)]) + , Encoding "FRINTI_S_floatdp1" 0xfffffc00 0x1e27c000 (Outside [(5, OpS)]) + , Encoding "FRINTI_D_floatdp1" 0xfffffc00 0x1e67c000 (Outside [(5, OpD)]) + , Encoding "FRINTM_asimdmiscfp16_R" 0xbffffc00 0x0e799800 + (Outside [(5, OpV)]) + , Encoding "FRINTM_asimdmisc_R" 0xbfbffc00 0x0e219800 (Outside [(5, OpV)]) + , Encoding "FRINTM_H_floatdp1" 0xfffffc00 0x1ee54000 (Outside [(5, OpH)]) + , Encoding "FRINTM_S_floatdp1" 0xfffffc00 0x1e254000 (Outside [(5, OpS)]) + , Encoding "FRINTM_D_floatdp1" 0xfffffc00 0x1e654000 (Outside [(5, OpD)]) + , Encoding "FRINTN_asimdmiscfp16_R" 0xbffffc00 0x0e798800 + (Outside [(5, OpV)]) + , Encoding "FRINTN_asimdmisc_R" 0xbfbffc00 0x0e218800 (Outside [(5, OpV)]) + , Encoding "FRINTN_H_floatdp1" 0xfffffc00 0x1ee44000 (Outside [(5, OpH)]) + , Encoding "FRINTN_S_floatdp1" 0xfffffc00 0x1e244000 (Outside [(5, OpS)]) + , Encoding "FRINTN_D_floatdp1" 0xfffffc00 0x1e644000 (Outside [(5, OpD)]) + , Encoding "FRINTP_asimdmiscfp16_R" 0xbffffc00 0x0ef98800 + (Outside [(5, OpV)]) + , Encoding "FRINTP_asimdmisc_R" 0xbfbffc00 0x0ea18800 (Outside [(5, OpV)]) + , Encoding "FRINTP_H_floatdp1" 0xfffffc00 0x1ee4c000 (Outside [(5, OpH)]) + , Encoding "FRINTP_S_floatdp1" 0xfffffc00 0x1e24c000 (Outside [(5, OpS)]) + , Encoding "FRINTP_D_floatdp1" 0xfffffc00 0x1e64c000 (Outside [(5, OpD)]) + , Encoding "FRINTX_asimdmiscfp16_R" 0xbffffc00 0x2e799800 + (Outside [(5, OpV)]) + , Encoding "FRINTX_asimdmisc_R" 0xbfbffc00 0x2e219800 (Outside [(5, OpV)]) + , Encoding "FRINTX_H_floatdp1" 0xfffffc00 0x1ee74000 (Outside [(5, OpH)]) + , Encoding "FRINTX_S_floatdp1" 0xfffffc00 0x1e274000 (Outside [(5, OpS)]) + , Encoding "FRINTX_D_floatdp1" 0xfffffc00 0x1e674000 (Outside [(5, OpD)]) + , Encoding "FRINTZ_asimdmiscfp16_R" 0xbffffc00 0x0ef99800 + (Outside [(5, OpV)]) + , Encoding "FRINTZ_asimdmisc_R" 0xbfbffc00 0x0ea19800 (Outside [(5, OpV)]) + , Encoding "FRINTZ_H_floatdp1" 0xfffffc00 0x1ee5c000 (Outside [(5, OpH)]) + , Encoding "FRINTZ_S_floatdp1" 0xfffffc00 0x1e25c000 (Outside [(5, OpS)]) + , Encoding "FRINTZ_D_floatdp1" 0xfffffc00 0x1e65c000 (Outside [(5, OpD)]) + , Encoding "FRSQRTE_asisdmiscfp16_R" 0xfffffc00 0x7ef9d800 + (Outside [(5, OpH)]) + , Encoding "FRSQRTE_asisdmisc_R" 0xffbffc00 0x7ea1d800 (Outside []) + , Encoding "FRSQRTE_asimdmiscfp16_R" 0xbffffc00 0x2ef9d800 + (Outside [(5, OpV)]) + , Encoding "FRSQRTE_asimdmisc_R" 0xbfbffc00 0x2ea1d800 (Outside [(5, OpV)]) + , Encoding "FRSQRTS_asisdsamefp16_only" 0xffe0fc00 0x5ec03c00 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FRSQRTS_asisdsame_only" 0xffa0fc00 0x5ea0fc00 (Outside []) + , Encoding "FRSQRTS_asimdsamefp16_only" 0xbfe0fc00 0x0ec03c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FRSQRTS_asimdsame_only" 0xbfa0fc00 0x0ea0fc00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FSQRT_asimdmiscfp16_R" 0xbffffc00 0x2ef9f800 (Outside [(5, OpV)]) + , Encoding "FSQRT_asimdmisc_R" 0xbfbffc00 0x2ea1f800 (Outside [(5, OpV)]) + , Encoding "FSQRT_H_floatdp1" 0xfffffc00 0x1ee1c000 (Outside [(5, OpH)]) + , Encoding "FSQRT_S_floatdp1" 0xfffffc00 0x1e21c000 (Outside [(5, OpS)]) + , Encoding "FSQRT_D_floatdp1" 0xfffffc00 0x1e61c000 (Outside [(5, OpD)]) + , Encoding "FSUB_asimdsamefp16_only" 0xbfe0fc00 0x0ec01400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FSUB_asimdsame_only" 0xbfa0fc00 0x0ea0d400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "FSUB_H_floatdp2" 0xffe0fc00 0x1ee03800 + (Outside [(5, OpH), (16, OpH)]) + , Encoding "FSUB_S_floatdp2" 0xffe0fc00 0x1e203800 + (Outside [(5, OpS), (16, OpS)]) + , Encoding "FSUB_D_floatdp2" 0xffe0fc00 0x1e603800 + (Outside [(5, OpD), (16, OpD)]) + , Encoding "GCSB_HD_hints" 0xffffffff 0xd503227f Control + , Encoding "GCSSTR_64_ldst_gcs" 0xfffffc00 0xd91f0c00 (Outside [(0, OpX)]) + , Encoding "GCSSTTR_64_ldst_gcs" 0xfffffc00 0xd91f1c00 (Outside [(0, OpX)]) + , Encoding "GMI_64G_dp_2src" 0xffe0fc00 0x9ac01400 + (Outside [(5, OpXSp), (16, OpX)]) + , Encoding "HINT_HM_hints" 0xfffff01f 0xd503201f Control + , Encoding "HLT_EX_exception" 0xffe0001f 0xd4400000 Control + , Encoding "HVC_EX_exception" 0xffe0001f 0xd4000002 Control + , Encoding "INS_asimdins_IV_v" 0xffe08400 0x6e000400 Covered + , Encoding "INS_asimdins_IR_r" 0xffe0fc00 0x4e001c00 Covered + , Encoding "IRG_64I_dp_2src" 0xffe0fc00 0x9ac01000 + (Outside [(5, OpXSp), (16, OpX)]) + , Encoding "ISB_BI_barriers" 0xfffff0ff 0xd50330df Control + , Encoding "LD1_asisdlse_R1_1v" 0xbfffd000 0x0c405000 Covered + , Encoding "LD1_asisdlse_R2_2v" 0xbfffd000 0x0c408000 Covered + , Encoding "LD1_asisdlse_R3_3v" 0xbfffd000 0x0c404000 Covered + , Encoding "LD1_asisdlse_R4_4v" 0xbfffd000 0x0c400000 Covered + , Encoding "LD1_asisdlsep_I1_i1" 0xbfffd000 0x0cdf5000 Covered + , Encoding "LD1_asisdlsep_R1_r1" 0xbfe0d000 0x0cc05000 Covered + , Encoding "LD1_asisdlsep_I2_i2" 0xbfffd000 0x0cdf8000 Covered + , Encoding "LD1_asisdlsep_R2_r2" 0xbfe0d000 0x0cc08000 Covered + , Encoding "LD1_asisdlsep_I3_i3" 0xbfffd000 0x0cdf4000 Covered + , Encoding "LD1_asisdlsep_R3_r3" 0xbfe0d000 0x0cc04000 Covered + , Encoding "LD1_asisdlsep_I4_i4" 0xbfffd000 0x0cdf0000 Covered + , Encoding "LD1_asisdlsep_R4_r4" 0xbfe0d000 0x0cc00000 Covered + , Encoding "LD1_asisdlso_B1_1b" 0xbfffc000 0x0d400000 Covered + , Encoding "LD1_asisdlso_H1_1h" 0xbfffc400 0x0d404000 Covered + , Encoding "LD1_asisdlso_S1_1s" 0xbfffcc00 0x0d408000 Covered + , Encoding "LD1_asisdlso_D1_1d" 0xbfffdc00 0x0d408400 Covered + , Encoding "LD1_asisdlsop_B1_i1b" 0xbfffc000 0x0ddf0000 Covered + , Encoding "LD1_asisdlsop_BX1_r1b" 0xbfe0c000 0x0dc00000 Covered + , Encoding "LD1_asisdlsop_H1_i1h" 0xbfffc400 0x0ddf4000 Covered + , Encoding "LD1_asisdlsop_HX1_r1h" 0xbfe0c400 0x0dc04000 Covered + , Encoding "LD1_asisdlsop_S1_i1s" 0xbfffcc00 0x0ddf8000 Covered + , Encoding "LD1_asisdlsop_SX1_r1s" 0xbfe0cc00 0x0dc08000 Covered + , Encoding "LD1_asisdlsop_D1_i1d" 0xbfffdc00 0x0ddf8400 Covered + , Encoding "LD1_asisdlsop_DX1_r1d" 0xbfe0dc00 0x0dc08400 Covered + , Encoding "LD1R_asisdlso_R1" 0xbffff000 0x0d40c000 Covered + , Encoding "LD1R_asisdlsop_R1_i" 0xbffff000 0x0ddfc000 Covered + , Encoding "LD1R_asisdlsop_RX1_r" 0xbfe0f000 0x0dc0c000 Covered + , Encoding "LD2_asisdlse_R2" 0xbffff000 0x0c408000 Covered + , Encoding "LD2_asisdlsep_I2_i" 0xbffff000 0x0cdf8000 Covered + , Encoding "LD2_asisdlsep_R2_r" 0xbfe0f000 0x0cc08000 Covered + , Encoding "LD2_asisdlso_B2_2b" 0xbfffc000 0x0d600000 Covered + , Encoding "LD2_asisdlso_H2_2h" 0xbfffc400 0x0d604000 Covered + , Encoding "LD2_asisdlso_S2_2s" 0xbfffcc00 0x0d608000 Covered + , Encoding "LD2_asisdlso_D2_2d" 0xbfffdc00 0x0d608400 Covered + , Encoding "LD2_asisdlsop_B2_i2b" 0xbfffc000 0x0dff0000 Covered + , Encoding "LD2_asisdlsop_BX2_r2b" 0xbfe0c000 0x0de00000 Covered + , Encoding "LD2_asisdlsop_H2_i2h" 0xbfffc400 0x0dff4000 Covered + , Encoding "LD2_asisdlsop_HX2_r2h" 0xbfe0c400 0x0de04000 Covered + , Encoding "LD2_asisdlsop_S2_i2s" 0xbfffcc00 0x0dff8000 Covered + , Encoding "LD2_asisdlsop_SX2_r2s" 0xbfe0cc00 0x0de08000 Covered + , Encoding "LD2_asisdlsop_D2_i2d" 0xbfffdc00 0x0dff8400 Covered + , Encoding "LD2_asisdlsop_DX2_r2d" 0xbfe0dc00 0x0de08400 Covered + , Encoding "LD2R_asisdlso_R2" 0xbffff000 0x0d60c000 Covered + , Encoding "LD2R_asisdlsop_R2_i" 0xbffff000 0x0dffc000 Covered + , Encoding "LD2R_asisdlsop_RX2_r" 0xbfe0f000 0x0de0c000 Covered + , Encoding "LD3_asisdlse_R3" 0xbffff000 0x0c404000 Covered + , Encoding "LD3_asisdlsep_I3_i" 0xbffff000 0x0cdf4000 Covered + , Encoding "LD3_asisdlsep_R3_r" 0xbfe0f000 0x0cc04000 Covered + , Encoding "LD3_asisdlso_B3_3b" 0xbfffc000 0x0d400000 Covered + , Encoding "LD3_asisdlso_H3_3h" 0xbfffc400 0x0d404000 Covered + , Encoding "LD3_asisdlso_S3_3s" 0xbfffcc00 0x0d408000 Covered + , Encoding "LD3_asisdlso_D3_3d" 0xbfffdc00 0x0d408400 Covered + , Encoding "LD3_asisdlsop_B3_i3b" 0xbfffc000 0x0ddf0000 Covered + , Encoding "LD3_asisdlsop_BX3_r3b" 0xbfe0c000 0x0dc00000 Covered + , Encoding "LD3_asisdlsop_H3_i3h" 0xbfffc400 0x0ddf4000 Covered + , Encoding "LD3_asisdlsop_HX3_r3h" 0xbfe0c400 0x0dc04000 Covered + , Encoding "LD3_asisdlsop_S3_i3s" 0xbfffcc00 0x0ddf8000 Covered + , Encoding "LD3_asisdlsop_SX3_r3s" 0xbfe0cc00 0x0dc08000 Covered + , Encoding "LD3_asisdlsop_D3_i3d" 0xbfffdc00 0x0ddf8400 Covered + , Encoding "LD3_asisdlsop_DX3_r3d" 0xbfe0dc00 0x0dc08400 Covered + , Encoding "LD3R_asisdlso_R3" 0xbffff000 0x0d40e000 Covered + , Encoding "LD3R_asisdlsop_R3_i" 0xbffff000 0x0ddfe000 Covered + , Encoding "LD3R_asisdlsop_RX3_r" 0xbfe0f000 0x0dc0e000 Covered + , Encoding "LD4_asisdlse_R4" 0xbffff000 0x0c400000 Covered + , Encoding "LD4_asisdlsep_I4_i" 0xbffff000 0x0cdf0000 Covered + , Encoding "LD4_asisdlsep_R4_r" 0xbfe0f000 0x0cc00000 Covered + , Encoding "LD4_asisdlso_B4_4b" 0xbfffc000 0x0d600000 Covered + , Encoding "LD4_asisdlso_H4_4h" 0xbfffc400 0x0d604000 Covered + , Encoding "LD4_asisdlso_S4_4s" 0xbfffcc00 0x0d608000 Covered + , Encoding "LD4_asisdlso_D4_4d" 0xbfffdc00 0x0d608400 Covered + , Encoding "LD4_asisdlsop_B4_i4b" 0xbfffc000 0x0dff0000 Covered + , Encoding "LD4_asisdlsop_BX4_r4b" 0xbfe0c000 0x0de00000 Covered + , Encoding "LD4_asisdlsop_H4_i4h" 0xbfffc400 0x0dff4000 Covered + , Encoding "LD4_asisdlsop_HX4_r4h" 0xbfe0c400 0x0de04000 Covered + , Encoding "LD4_asisdlsop_S4_i4s" 0xbfffcc00 0x0dff8000 Covered + , Encoding "LD4_asisdlsop_SX4_r4s" 0xbfe0cc00 0x0de08000 Covered + , Encoding "LD4_asisdlsop_D4_i4d" 0xbfffdc00 0x0dff8400 Covered + , Encoding "LD4_asisdlsop_DX4_r4d" 0xbfe0dc00 0x0de08400 Covered + , Encoding "LD4R_asisdlso_R4" 0xbffff000 0x0d60e000 Covered + , Encoding "LD4R_asisdlsop_R4_i" 0xbffff000 0x0dffe000 Covered + , Encoding "LD4R_asisdlsop_RX4_r" 0xbfe0f000 0x0de0e000 Covered + , Encoding "LD64B_64L_memop" 0xfffffc00 0xf83fd000 (Outside [(0, OpX)]) + , Encoding "LDADD_32_memop" 0x7fe0fc00 0x38200000 Covered + , Encoding "LDADDA_32_memop" 0x7fe0fc00 0x38a00000 Covered + , Encoding "LDADDAL_32_memop" 0x7fe0fc00 0x38e00000 Covered + , Encoding "LDADDL_32_memop" 0x7fe0fc00 0x38600000 Covered + , Encoding "LDADD_64_memop" 0x7fe0fc00 0x78200000 Covered + , Encoding "LDADDA_64_memop" 0x7fe0fc00 0x78a00000 Covered + , Encoding "LDADDAL_64_memop" 0x7fe0fc00 0x78e00000 Covered + , Encoding "LDADDL_64_memop" 0x7fe0fc00 0x78600000 Covered + , Encoding "LDADDAB_32_memop" 0xffe0fc00 0x38a00000 Covered + , Encoding "LDADDALB_32_memop" 0xffe0fc00 0x38e00000 Covered + , Encoding "LDADDB_32_memop" 0xffe0fc00 0x38200000 Covered + , Encoding "LDADDLB_32_memop" 0xffe0fc00 0x38600000 Covered + , Encoding "LDADDAH_32_memop" 0xffe0fc00 0x78a00000 Covered + , Encoding "LDADDALH_32_memop" 0xffe0fc00 0x78e00000 Covered + , Encoding "LDADDH_32_memop" 0xffe0fc00 0x78200000 Covered + , Encoding "LDADDLH_32_memop" 0xffe0fc00 0x78600000 Covered + , Encoding "LDAP1_asisdlso_D1" 0xbffffc00 0x0d418400 Covered + , Encoding "LDAPR_32L_memop" 0x7fe0fc00 0x38a0c000 Covered + , Encoding "LDAPR_64L_memop" 0x7fe0fc00 0x78a0c000 Covered + , Encoding "LDAPR_32L_ldapstl_writeback" 0x7ffffc00 0x19c00800 Covered + , Encoding "LDAPR_64L_ldapstl_writeback" 0x7ffffc00 0x59c00800 Covered + , Encoding "LDAPRB_32L_memop" 0xffe0fc00 0x38a0c000 Covered + , Encoding "LDAPRH_32L_memop" 0xffe0fc00 0x78a0c000 Covered + , Encoding "LDAPUR_B_ldapstl_simd" 0xffa00c00 0x1d000800 Covered + , Encoding "LDAPUR_H_ldapstl_simd" 0xffa00c00 0x5d000800 Covered + , Encoding "LDAPUR_S_ldapstl_simd" 0xffa00c00 0x9d000800 Covered + , Encoding "LDAPUR_D_ldapstl_simd" 0xffa00c00 0xdd000800 Covered + , Encoding "LDAPUR_Q_ldapstl_simd" 0xffa00c00 0x1d800800 Covered + , Encoding "LDAPUR_32_ldapstl_unscaled" 0x7fe00c00 0x19400000 Covered + , Encoding "LDAPUR_64_ldapstl_unscaled" 0x7fe00c00 0x59400000 Covered + , Encoding "LDAPURB_32_ldapstl_unscaled" 0xffe00c00 0x19400000 Covered + , Encoding "LDAPURH_32_ldapstl_unscaled" 0xffe00c00 0x59400000 Covered + , Encoding "LDAPURSB_32_ldapstl_unscaled" 0xff600c00 0x19400000 Covered + , Encoding "LDAPURSB_64_ldapstl_unscaled" 0xff600c00 0x19000000 Covered + , Encoding "LDAPURSH_32_ldapstl_unscaled" 0xff600c00 0x59400000 Covered + , Encoding "LDAPURSH_64_ldapstl_unscaled" 0xff600c00 0x59000000 Covered + , Encoding "LDAPURSW_64_ldapstl_unscaled" 0xffe00c00 0x99800000 Covered + , Encoding "LDAR_LR32_ldstord" 0x7fe08000 0x08c08000 Covered + , Encoding "LDAR_LR64_ldstord" 0x7fe08000 0x48c08000 Covered + , Encoding "LDARB_LR32_ldstord" 0xffe08000 0x08c08000 Covered + , Encoding "LDARH_LR32_ldstord" 0xffe08000 0x48c08000 Covered + , Encoding "LDAXP_LP32_ldstexclp" 0xffe08000 0x88608000 Covered + , Encoding "LDAXP_LP64_ldstexclp" 0xffe08000 0xc8608000 Covered + , Encoding "LDAXR_LR32_ldstexclr" 0x7fe08000 0x08408000 Covered + , Encoding "LDAXR_LR64_ldstexclr" 0x7fe08000 0x48408000 Covered + , Encoding "LDAXRB_LR32_ldstexclr" 0xffe08000 0x08408000 Covered + , Encoding "LDAXRH_LR32_ldstexclr" 0xffe08000 0x48408000 Covered + , Encoding "LDCLR_32_memop" 0x7fe0fc00 0x38201000 Covered + , Encoding "LDCLRA_32_memop" 0x7fe0fc00 0x38a01000 Covered + , Encoding "LDCLRAL_32_memop" 0x7fe0fc00 0x38e01000 Covered + , Encoding "LDCLRL_32_memop" 0x7fe0fc00 0x38601000 Covered + , Encoding "LDCLR_64_memop" 0x7fe0fc00 0x78201000 Covered + , Encoding "LDCLRA_64_memop" 0x7fe0fc00 0x78a01000 Covered + , Encoding "LDCLRAL_64_memop" 0x7fe0fc00 0x78e01000 Covered + , Encoding "LDCLRL_64_memop" 0x7fe0fc00 0x78601000 Covered + , Encoding "LDCLRAB_32_memop" 0xffe0fc00 0x38a01000 Covered + , Encoding "LDCLRALB_32_memop" 0xffe0fc00 0x38e01000 Covered + , Encoding "LDCLRB_32_memop" 0xffe0fc00 0x38201000 Covered + , Encoding "LDCLRLB_32_memop" 0xffe0fc00 0x38601000 Covered + , Encoding "LDCLRAH_32_memop" 0xffe0fc00 0x78a01000 Covered + , Encoding "LDCLRALH_32_memop" 0xffe0fc00 0x78e01000 Covered + , Encoding "LDCLRH_32_memop" 0xffe0fc00 0x78201000 Covered + , Encoding "LDCLRLH_32_memop" 0xffe0fc00 0x78601000 Covered + , Encoding "LDCLRP_128_memop_128" 0xffe0fc00 0x19201000 Covered + , Encoding "LDCLRPA_128_memop_128" 0xffe0fc00 0x19a01000 Covered + , Encoding "LDCLRPAL_128_memop_128" 0xffe0fc00 0x19e01000 Covered + , Encoding "LDCLRPL_128_memop_128" 0xffe0fc00 0x19601000 Covered + , Encoding "LDEOR_32_memop" 0x7fe0fc00 0x38202000 Covered + , Encoding "LDEORA_32_memop" 0x7fe0fc00 0x38a02000 Covered + , Encoding "LDEORAL_32_memop" 0x7fe0fc00 0x38e02000 Covered + , Encoding "LDEORL_32_memop" 0x7fe0fc00 0x38602000 Covered + , Encoding "LDEOR_64_memop" 0x7fe0fc00 0x78202000 Covered + , Encoding "LDEORA_64_memop" 0x7fe0fc00 0x78a02000 Covered + , Encoding "LDEORAL_64_memop" 0x7fe0fc00 0x78e02000 Covered + , Encoding "LDEORL_64_memop" 0x7fe0fc00 0x78602000 Covered + , Encoding "LDEORAB_32_memop" 0xffe0fc00 0x38a02000 Covered + , Encoding "LDEORALB_32_memop" 0xffe0fc00 0x38e02000 Covered + , Encoding "LDEORB_32_memop" 0xffe0fc00 0x38202000 Covered + , Encoding "LDEORLB_32_memop" 0xffe0fc00 0x38602000 Covered + , Encoding "LDEORAH_32_memop" 0xffe0fc00 0x78a02000 Covered + , Encoding "LDEORALH_32_memop" 0xffe0fc00 0x78e02000 Covered + , Encoding "LDEORH_32_memop" 0xffe0fc00 0x78202000 Covered + , Encoding "LDEORLH_32_memop" 0xffe0fc00 0x78602000 Covered + , Encoding "LDG_64Loffset_ldsttags" 0xffe00c00 0xd9600000 (Outside []) + , Encoding "LDGM_64bulk_ldsttags" 0xfffffc00 0xd9e00000 (Outside []) + , Encoding "LDIAPP_32L_ldiappstilp" 0x7fe01c00 0x19401800 Covered + , Encoding "LDIAPP_32LE_ldiappstilp" 0x7fe01c00 0x19400800 Covered + , Encoding "LDIAPP_64L_ldiappstilp" 0x7fe01c00 0x59401800 Covered + , Encoding "LDIAPP_64LS_ldiappstilp" 0x7fe01c00 0x59400800 Covered + , Encoding "LDLAR_LR32_ldstord" 0x7fe08000 0x08c00000 Covered + , Encoding "LDLAR_LR64_ldstord" 0x7fe08000 0x48c00000 Covered + , Encoding "LDLARB_LR32_ldstord" 0xffe08000 0x08c00000 Covered + , Encoding "LDLARH_LR32_ldstord" 0xffe08000 0x48c00000 Covered + , Encoding "LDNP_S_ldstnapair_offs" 0xffc00000 0x2c400000 Covered + , Encoding "LDNP_D_ldstnapair_offs" 0xffc00000 0x6c400000 Covered + , Encoding "LDNP_Q_ldstnapair_offs" 0xffc00000 0xac400000 Covered + , Encoding "LDNP_32_ldstnapair_offs" 0xbfc00000 0x28400000 Covered + , Encoding "LDNP_64_ldstnapair_offs" 0xbfc00000 0xa8400000 Covered + , Encoding "LDP_S_ldstpair_post" 0xffc00000 0x2cc00000 Covered + , Encoding "LDP_D_ldstpair_post" 0xffc00000 0x6cc00000 Covered + , Encoding "LDP_Q_ldstpair_post" 0xffc00000 0xacc00000 Covered + , Encoding "LDP_S_ldstpair_pre" 0xffc00000 0x2dc00000 Covered + , Encoding "LDP_D_ldstpair_pre" 0xffc00000 0x6dc00000 Covered + , Encoding "LDP_Q_ldstpair_pre" 0xffc00000 0xadc00000 Covered + , Encoding "LDP_S_ldstpair_off" 0xffc00000 0x2d400000 Covered + , Encoding "LDP_D_ldstpair_off" 0xffc00000 0x6d400000 Covered + , Encoding "LDP_Q_ldstpair_off" 0xffc00000 0xad400000 Covered + , Encoding "LDP_32_ldstpair_post" 0xbfc00000 0x28c00000 Covered + , Encoding "LDP_64_ldstpair_post" 0xbfc00000 0xa8c00000 Covered + , Encoding "LDP_32_ldstpair_pre" 0xbfc00000 0x29c00000 Covered + , Encoding "LDP_64_ldstpair_pre" 0xbfc00000 0xa9c00000 Covered + , Encoding "LDP_32_ldstpair_off" 0xbfc00000 0x29400000 Covered + , Encoding "LDP_64_ldstpair_off" 0xbfc00000 0xa9400000 Covered + , Encoding "LDPSW_64_ldstpair_post" 0xffc00000 0x68c00000 Covered + , Encoding "LDPSW_64_ldstpair_pre" 0xffc00000 0x69c00000 Covered + , Encoding "LDPSW_64_ldstpair_off" 0xffc00000 0x69400000 Covered + , Encoding "LDR_B_ldst_immpost" 0xffa00c00 0x3c000400 Covered + , Encoding "LDR_H_ldst_immpost" 0xffa00c00 0x7c000400 Covered + , Encoding "LDR_S_ldst_immpost" 0xffa00c00 0xbc000400 Covered + , Encoding "LDR_D_ldst_immpost" 0xffa00c00 0xfc000400 Covered + , Encoding "LDR_Q_ldst_immpost" 0xffa00c00 0x3c800400 Covered + , Encoding "LDR_B_ldst_immpre" 0xffa00c00 0x3c000c00 Covered + , Encoding "LDR_H_ldst_immpre" 0xffa00c00 0x7c000c00 Covered + , Encoding "LDR_S_ldst_immpre" 0xffa00c00 0xbc000c00 Covered + , Encoding "LDR_D_ldst_immpre" 0xffa00c00 0xfc000c00 Covered + , Encoding "LDR_Q_ldst_immpre" 0xffa00c00 0x3c800c00 Covered + , Encoding "LDR_B_ldst_pos" 0xff800000 0x3d000000 Covered + , Encoding "LDR_H_ldst_pos" 0xff800000 0x7d000000 Covered + , Encoding "LDR_S_ldst_pos" 0xff800000 0xbd000000 Covered + , Encoding "LDR_D_ldst_pos" 0xff800000 0xfd000000 Covered + , Encoding "LDR_Q_ldst_pos" 0xff800000 0x3d800000 Covered + , Encoding "LDR_32_ldst_immpost" 0x7fe00c00 0x38400400 Covered + , Encoding "LDR_64_ldst_immpost" 0x7fe00c00 0x78400400 Covered + , Encoding "LDR_32_ldst_immpre" 0x7fe00c00 0x38400c00 Covered + , Encoding "LDR_64_ldst_immpre" 0x7fe00c00 0x78400c00 Covered + , Encoding "LDR_32_ldst_pos" 0x7fc00000 0x39400000 Covered + , Encoding "LDR_64_ldst_pos" 0x7fc00000 0x79400000 Covered + , Encoding "LDR_S_loadlit" 0xff000000 0x1c000000 Covered + , Encoding "LDR_D_loadlit" 0xff000000 0x5c000000 Covered + , Encoding "LDR_Q_loadlit" 0xff000000 0x9c000000 Covered + , Encoding "LDR_32_loadlit" 0x7f000000 0x18000000 Covered + , Encoding "LDR_64_loadlit" 0x7f000000 0x58000000 Covered + , Encoding "LDR_B_ldst_regoff" 0xffa00c00 0x3c200800 Covered + , Encoding "LDR_BL_ldst_regoff" 0xffa0ec00 0x3c206800 Covered + , Encoding "LDR_H_ldst_regoff" 0xffa00c00 0x7c200800 Covered + , Encoding "LDR_S_ldst_regoff" 0xffa00c00 0xbc200800 Covered + , Encoding "LDR_D_ldst_regoff" 0xffa00c00 0xfc200800 Covered + , Encoding "LDR_Q_ldst_regoff" 0xffa00c00 0x3ca00800 Covered + , Encoding "LDR_32_ldst_regoff" 0x7fe00c00 0x38600800 Covered + , Encoding "LDR_64_ldst_regoff" 0x7fe00c00 0x78600800 Covered + , Encoding "LDRAA_64_ldst_pac" 0xffa00c00 0xf8200400 Covered + , Encoding "LDRAA_64W_ldst_pac" 0xffa00c00 0xf8200c00 Covered + , Encoding "LDRAB_64_ldst_pac" 0xffa00c00 0xf8a00400 Covered + , Encoding "LDRAB_64W_ldst_pac" 0xffa00c00 0xf8a00c00 Covered + , Encoding "LDRB_32_ldst_immpost" 0xffe00c00 0x38400400 Covered + , Encoding "LDRB_32_ldst_immpre" 0xffe00c00 0x38400c00 Covered + , Encoding "LDRB_32_ldst_pos" 0xffc00000 0x39400000 Covered + , Encoding "LDRB_32B_ldst_regoff" 0xffe00c00 0x38600800 Covered + , Encoding "LDRB_32BL_ldst_regoff" 0xffe0ec00 0x38606800 Covered + , Encoding "LDRH_32_ldst_immpost" 0xffe00c00 0x78400400 Covered + , Encoding "LDRH_32_ldst_immpre" 0xffe00c00 0x78400c00 Covered + , Encoding "LDRH_32_ldst_pos" 0xffc00000 0x79400000 Covered + , Encoding "LDRH_32_ldst_regoff" 0xffe00c00 0x78600800 Covered + , Encoding "LDRSB_32_ldst_immpost" 0xff600c00 0x38400400 Covered + , Encoding "LDRSB_64_ldst_immpost" 0xff600c00 0x38000400 Covered + , Encoding "LDRSB_32_ldst_immpre" 0xff600c00 0x38400c00 Covered + , Encoding "LDRSB_64_ldst_immpre" 0xff600c00 0x38000c00 Covered + , Encoding "LDRSB_32_ldst_pos" 0xff400000 0x39400000 Covered + , Encoding "LDRSB_64_ldst_pos" 0xff400000 0x39000000 Covered + , Encoding "LDRSB_32B_ldst_regoff" 0xff600c00 0x38600800 Covered + , Encoding "LDRSB_32BL_ldst_regoff" 0xff60ec00 0x38606800 Covered + , Encoding "LDRSB_64B_ldst_regoff" 0xff600c00 0x38200800 Covered + , Encoding "LDRSB_64BL_ldst_regoff" 0xff60ec00 0x38206800 Covered + , Encoding "LDRSH_32_ldst_immpost" 0xff600c00 0x78400400 Covered + , Encoding "LDRSH_64_ldst_immpost" 0xff600c00 0x78000400 Covered + , Encoding "LDRSH_32_ldst_immpre" 0xff600c00 0x78400c00 Covered + , Encoding "LDRSH_64_ldst_immpre" 0xff600c00 0x78000c00 Covered + , Encoding "LDRSH_32_ldst_pos" 0xff400000 0x79400000 Covered + , Encoding "LDRSH_64_ldst_pos" 0xff400000 0x79000000 Covered + , Encoding "LDRSH_32_ldst_regoff" 0xff600c00 0x78600800 Covered + , Encoding "LDRSH_64_ldst_regoff" 0xff600c00 0x78200800 Covered + , Encoding "LDRSW_64_ldst_immpost" 0xffe00c00 0xb8800400 Covered + , Encoding "LDRSW_64_ldst_immpre" 0xffe00c00 0xb8800c00 Covered + , Encoding "LDRSW_64_ldst_pos" 0xffc00000 0xb9800000 Covered + , Encoding "LDRSW_64_loadlit" 0xff000000 0x98000000 Covered + , Encoding "LDRSW_64_ldst_regoff" 0xffe00c00 0xb8a00800 Covered + , Encoding "LDSET_32_memop" 0x7fe0fc00 0x38203000 Covered + , Encoding "LDSETA_32_memop" 0x7fe0fc00 0x38a03000 Covered + , Encoding "LDSETAL_32_memop" 0x7fe0fc00 0x38e03000 Covered + , Encoding "LDSETL_32_memop" 0x7fe0fc00 0x38603000 Covered + , Encoding "LDSET_64_memop" 0x7fe0fc00 0x78203000 Covered + , Encoding "LDSETA_64_memop" 0x7fe0fc00 0x78a03000 Covered + , Encoding "LDSETAL_64_memop" 0x7fe0fc00 0x78e03000 Covered + , Encoding "LDSETL_64_memop" 0x7fe0fc00 0x78603000 Covered + , Encoding "LDSETAB_32_memop" 0xffe0fc00 0x38a03000 Covered + , Encoding "LDSETALB_32_memop" 0xffe0fc00 0x38e03000 Covered + , Encoding "LDSETB_32_memop" 0xffe0fc00 0x38203000 Covered + , Encoding "LDSETLB_32_memop" 0xffe0fc00 0x38603000 Covered + , Encoding "LDSETAH_32_memop" 0xffe0fc00 0x78a03000 Covered + , Encoding "LDSETALH_32_memop" 0xffe0fc00 0x78e03000 Covered + , Encoding "LDSETH_32_memop" 0xffe0fc00 0x78203000 Covered + , Encoding "LDSETLH_32_memop" 0xffe0fc00 0x78603000 Covered + , Encoding "LDSETP_128_memop_128" 0xffe0fc00 0x19203000 Covered + , Encoding "LDSETPA_128_memop_128" 0xffe0fc00 0x19a03000 Covered + , Encoding "LDSETPAL_128_memop_128" 0xffe0fc00 0x19e03000 Covered + , Encoding "LDSETPL_128_memop_128" 0xffe0fc00 0x19603000 Covered + , Encoding "LDSMAX_32_memop" 0x7fe0fc00 0x38204000 Covered + , Encoding "LDSMAXA_32_memop" 0x7fe0fc00 0x38a04000 Covered + , Encoding "LDSMAXAL_32_memop" 0x7fe0fc00 0x38e04000 Covered + , Encoding "LDSMAXL_32_memop" 0x7fe0fc00 0x38604000 Covered + , Encoding "LDSMAX_64_memop" 0x7fe0fc00 0x78204000 Covered + , Encoding "LDSMAXA_64_memop" 0x7fe0fc00 0x78a04000 Covered + , Encoding "LDSMAXAL_64_memop" 0x7fe0fc00 0x78e04000 Covered + , Encoding "LDSMAXL_64_memop" 0x7fe0fc00 0x78604000 Covered + , Encoding "LDSMAXAB_32_memop" 0xffe0fc00 0x38a04000 Covered + , Encoding "LDSMAXALB_32_memop" 0xffe0fc00 0x38e04000 Covered + , Encoding "LDSMAXB_32_memop" 0xffe0fc00 0x38204000 Covered + , Encoding "LDSMAXLB_32_memop" 0xffe0fc00 0x38604000 Covered + , Encoding "LDSMAXAH_32_memop" 0xffe0fc00 0x78a04000 Covered + , Encoding "LDSMAXALH_32_memop" 0xffe0fc00 0x78e04000 Covered + , Encoding "LDSMAXH_32_memop" 0xffe0fc00 0x78204000 Covered + , Encoding "LDSMAXLH_32_memop" 0xffe0fc00 0x78604000 Covered + , Encoding "LDSMIN_32_memop" 0x7fe0fc00 0x38205000 Covered + , Encoding "LDSMINA_32_memop" 0x7fe0fc00 0x38a05000 Covered + , Encoding "LDSMINAL_32_memop" 0x7fe0fc00 0x38e05000 Covered + , Encoding "LDSMINL_32_memop" 0x7fe0fc00 0x38605000 Covered + , Encoding "LDSMIN_64_memop" 0x7fe0fc00 0x78205000 Covered + , Encoding "LDSMINA_64_memop" 0x7fe0fc00 0x78a05000 Covered + , Encoding "LDSMINAL_64_memop" 0x7fe0fc00 0x78e05000 Covered + , Encoding "LDSMINL_64_memop" 0x7fe0fc00 0x78605000 Covered + , Encoding "LDSMINAB_32_memop" 0xffe0fc00 0x38a05000 Covered + , Encoding "LDSMINALB_32_memop" 0xffe0fc00 0x38e05000 Covered + , Encoding "LDSMINB_32_memop" 0xffe0fc00 0x38205000 Covered + , Encoding "LDSMINLB_32_memop" 0xffe0fc00 0x38605000 Covered + , Encoding "LDSMINAH_32_memop" 0xffe0fc00 0x78a05000 Covered + , Encoding "LDSMINALH_32_memop" 0xffe0fc00 0x78e05000 Covered + , Encoding "LDSMINH_32_memop" 0xffe0fc00 0x78205000 Covered + , Encoding "LDSMINLH_32_memop" 0xffe0fc00 0x78605000 Covered + , Encoding "LDTR_32_ldst_unpriv" 0x7fe00c00 0x38400800 Covered + , Encoding "LDTR_64_ldst_unpriv" 0x7fe00c00 0x78400800 Covered + , Encoding "LDTRB_32_ldst_unpriv" 0xffe00c00 0x38400800 Covered + , Encoding "LDTRH_32_ldst_unpriv" 0xffe00c00 0x78400800 Covered + , Encoding "LDTRSB_32_ldst_unpriv" 0xff600c00 0x38400800 Covered + , Encoding "LDTRSB_64_ldst_unpriv" 0xff600c00 0x38000800 Covered + , Encoding "LDTRSH_32_ldst_unpriv" 0xff600c00 0x78400800 Covered + , Encoding "LDTRSH_64_ldst_unpriv" 0xff600c00 0x78000800 Covered + , Encoding "LDTRSW_64_ldst_unpriv" 0xffe00c00 0xb8800800 Covered + , Encoding "LDUMAX_32_memop" 0x7fe0fc00 0x38206000 Covered + , Encoding "LDUMAXA_32_memop" 0x7fe0fc00 0x38a06000 Covered + , Encoding "LDUMAXAL_32_memop" 0x7fe0fc00 0x38e06000 Covered + , Encoding "LDUMAXL_32_memop" 0x7fe0fc00 0x38606000 Covered + , Encoding "LDUMAX_64_memop" 0x7fe0fc00 0x78206000 Covered + , Encoding "LDUMAXA_64_memop" 0x7fe0fc00 0x78a06000 Covered + , Encoding "LDUMAXAL_64_memop" 0x7fe0fc00 0x78e06000 Covered + , Encoding "LDUMAXL_64_memop" 0x7fe0fc00 0x78606000 Covered + , Encoding "LDUMAXAB_32_memop" 0xffe0fc00 0x38a06000 Covered + , Encoding "LDUMAXALB_32_memop" 0xffe0fc00 0x38e06000 Covered + , Encoding "LDUMAXB_32_memop" 0xffe0fc00 0x38206000 Covered + , Encoding "LDUMAXLB_32_memop" 0xffe0fc00 0x38606000 Covered + , Encoding "LDUMAXAH_32_memop" 0xffe0fc00 0x78a06000 Covered + , Encoding "LDUMAXALH_32_memop" 0xffe0fc00 0x78e06000 Covered + , Encoding "LDUMAXH_32_memop" 0xffe0fc00 0x78206000 Covered + , Encoding "LDUMAXLH_32_memop" 0xffe0fc00 0x78606000 Covered + , Encoding "LDUMIN_32_memop" 0x7fe0fc00 0x38207000 Covered + , Encoding "LDUMINA_32_memop" 0x7fe0fc00 0x38a07000 Covered + , Encoding "LDUMINAL_32_memop" 0x7fe0fc00 0x38e07000 Covered + , Encoding "LDUMINL_32_memop" 0x7fe0fc00 0x38607000 Covered + , Encoding "LDUMIN_64_memop" 0x7fe0fc00 0x78207000 Covered + , Encoding "LDUMINA_64_memop" 0x7fe0fc00 0x78a07000 Covered + , Encoding "LDUMINAL_64_memop" 0x7fe0fc00 0x78e07000 Covered + , Encoding "LDUMINL_64_memop" 0x7fe0fc00 0x78607000 Covered + , Encoding "LDUMINAB_32_memop" 0xffe0fc00 0x38a07000 Covered + , Encoding "LDUMINALB_32_memop" 0xffe0fc00 0x38e07000 Covered + , Encoding "LDUMINB_32_memop" 0xffe0fc00 0x38207000 Covered + , Encoding "LDUMINLB_32_memop" 0xffe0fc00 0x38607000 Covered + , Encoding "LDUMINAH_32_memop" 0xffe0fc00 0x78a07000 Covered + , Encoding "LDUMINALH_32_memop" 0xffe0fc00 0x78e07000 Covered + , Encoding "LDUMINH_32_memop" 0xffe0fc00 0x78207000 Covered + , Encoding "LDUMINLH_32_memop" 0xffe0fc00 0x78607000 Covered + , Encoding "LDUR_B_ldst_unscaled" 0xffa00c00 0x3c000000 Covered + , Encoding "LDUR_H_ldst_unscaled" 0xffa00c00 0x7c000000 Covered + , Encoding "LDUR_S_ldst_unscaled" 0xffa00c00 0xbc000000 Covered + , Encoding "LDUR_D_ldst_unscaled" 0xffa00c00 0xfc000000 Covered + , Encoding "LDUR_Q_ldst_unscaled" 0xffa00c00 0x3c800000 Covered + , Encoding "LDUR_32_ldst_unscaled" 0x7fe00c00 0x38400000 Covered + , Encoding "LDUR_64_ldst_unscaled" 0x7fe00c00 0x78400000 Covered + , Encoding "LDURB_32_ldst_unscaled" 0xffe00c00 0x38400000 Covered + , Encoding "LDURH_32_ldst_unscaled" 0xffe00c00 0x78400000 Covered + , Encoding "LDURSB_32_ldst_unscaled" 0xff600c00 0x38400000 Covered + , Encoding "LDURSB_64_ldst_unscaled" 0xff600c00 0x38000000 Covered + , Encoding "LDURSH_32_ldst_unscaled" 0xff600c00 0x78400000 Covered + , Encoding "LDURSH_64_ldst_unscaled" 0xff600c00 0x78000000 Covered + , Encoding "LDURSW_64_ldst_unscaled" 0xffe00c00 0xb8800000 Covered + , Encoding "LDXP_LP32_ldstexclp" 0xffe08000 0x88600000 Covered + , Encoding "LDXP_LP64_ldstexclp" 0xffe08000 0xc8600000 Covered + , Encoding "LDXR_LR32_ldstexclr" 0x7fe08000 0x08400000 Covered + , Encoding "LDXR_LR64_ldstexclr" 0x7fe08000 0x48400000 Covered + , Encoding "LDXRB_LR32_ldstexclr" 0xffe08000 0x08400000 Covered + , Encoding "LDXRH_LR32_ldstexclr" 0xffe08000 0x48400000 Covered + , Encoding "LSLV_32_dp_2src" 0xffe0fc00 0x1ac02000 Covered + , Encoding "LSLV_64_dp_2src" 0xffe0fc00 0x9ac02000 Covered + , Encoding "LSRV_32_dp_2src" 0xffe0fc00 0x1ac02400 Covered + , Encoding "LSRV_64_dp_2src" 0xffe0fc00 0x9ac02400 Covered + , Encoding "MADD_32A_dp_3src" 0xffe08000 0x1b000000 Covered + , Encoding "MADD_64A_dp_3src" 0xffe08000 0x9b000000 Covered + , Encoding "MLA_asimdelem_R" 0xbf00f400 0x2f000000 Covered + , Encoding "MLA_asimdsame_only" 0xbf20fc00 0x0e209400 Covered + , Encoding "MLS_asimdelem_R" 0xbf00f400 0x2f004000 Covered + , Encoding "MLS_asimdsame_only" 0xbf20fc00 0x2e209400 Covered + , Encoding "MOVI_asimdimm_N_b" 0xbff8fc00 0x0f00e400 Covered + , Encoding "MOVI_asimdimm_L_hl" 0xbff8dc00 0x0f008400 Covered + , Encoding "MOVI_asimdimm_L_sl" 0xbff89c00 0x0f000400 Covered + , Encoding "MOVI_asimdimm_M_sm" 0xbff8ec00 0x0f00c400 Covered + , Encoding "MOVI_asimdimm_D_ds" 0xfff8fc00 0x2f00e400 Covered + , Encoding "MOVI_asimdimm_D2_d" 0xfff8fc00 0x6f00e400 Covered + , Encoding "MOVK_32_movewide" 0xffc00000 0x72800000 Covered + , Encoding "MOVK_64_movewide" 0xff800000 0xf2800000 Covered + , Encoding "MOVN_32_movewide" 0xffc00000 0x12800000 Covered + , Encoding "MOVN_64_movewide" 0xff800000 0x92800000 Covered + , Encoding "MOVZ_32_movewide" 0xffc00000 0x52800000 Covered + , Encoding "MOVZ_64_movewide" 0xff800000 0xd2800000 Covered + , Encoding "MRRS_RS_systemmovepr" 0xfff00000 0xd5700000 Control + , Encoding "MRS_RS_systemmove" 0xfff00000 0xd5300000 Control + , Encoding "MSR_SI_pstate" 0xfff8f01f 0xd500401f Control + , Encoding "MSR_SR_systemmove" 0xfff00000 0xd5100000 Control + , Encoding "MSRR_SR_systemmovepr" 0xfff00000 0xd5500000 Control + , Encoding "MSUB_32A_dp_3src" 0xffe08000 0x1b008000 Covered + , Encoding "MSUB_64A_dp_3src" 0xffe08000 0x9b008000 Covered + , Encoding "MUL_asimdelem_R" 0xbf00f400 0x0f008000 Covered + , Encoding "MUL_asimdsame_only" 0xbf20fc00 0x0e209c00 Covered + , Encoding "MVNI_asimdimm_L_hl" 0xbff8dc00 0x2f008400 Covered + , Encoding "MVNI_asimdimm_L_sl" 0xbff89c00 0x2f000400 Covered + , Encoding "MVNI_asimdimm_M_sm" 0xbff8ec00 0x2f00c400 Covered + , Encoding "NEG_asisdmisc_R" 0xff3ffc00 0x7e20b800 Covered + , Encoding "NEG_asimdmisc_R" 0xbf3ffc00 0x2e20b800 Covered + , Encoding "NOP_HI_hints" 0xffffffff 0xd503201f Covered + , Encoding "NOT_asimdmisc_R" 0xbffffc00 0x2e205800 Covered + , Encoding "ORN_asimdsame_only" 0xbfe0fc00 0x0ee01c00 Covered + , Encoding "ORN_32_log_shift" 0xff200000 0x2a200000 Covered + , Encoding "ORN_64_log_shift" 0xff200000 0xaa200000 Covered + , Encoding "ORR_asimdimm_L_hl" 0xbff8cc00 0x0f008400 Covered + , Encoding "ORR_asimdimm_L_sl" 0xbff88c00 0x0f000400 Covered + , Encoding "ORR_asimdsame_only" 0xbfe0fc00 0x0ea01c00 Covered + , Encoding "ORR_32_log_imm" 0xffc00000 0x32000000 Covered + , Encoding "ORR_64_log_imm" 0xff800000 0xb2000000 Covered + , Encoding "ORR_32_log_shift" 0xff200000 0x2a000000 Covered + , Encoding "ORR_64_log_shift" 0xff200000 0xaa000000 Covered + , Encoding "PACDA_64P_dp_1src" 0xfffffc00 0xdac10800 (Outside [(5, OpXSp)]) + , Encoding "PACDZA_64Z_dp_1src" 0xffffffe0 0xdac12be0 (Outside []) + , Encoding "PACDB_64P_dp_1src" 0xfffffc00 0xdac10c00 (Outside [(5, OpXSp)]) + , Encoding "PACDZB_64Z_dp_1src" 0xffffffe0 0xdac12fe0 (Outside []) + , Encoding "PACGA_64P_dp_2src" 0xffe0fc00 0x9ac03000 + (Outside [(5, OpX), (16, OpXSp)]) + , Encoding "PACIA_64P_dp_1src" 0xfffffc00 0xdac10000 (Outside [(5, OpXSp)]) + , Encoding "PACIZA_64Z_dp_1src" 0xffffffe0 0xdac123e0 (Outside []) + , Encoding "PACIA1716_HI_hints" 0xfffff23f 0xd503201f (Outside []) + , Encoding "PACIASP_HI_hints" 0xfffff23f 0xd503223f (Outside []) + , Encoding "PACIAZ_HI_hints" 0xfffff23f 0xd503221f (Outside []) + , Encoding "PACIB_64P_dp_1src" 0xfffffc00 0xdac10400 (Outside [(5, OpXSp)]) + , Encoding "PACIZB_64Z_dp_1src" 0xffffffe0 0xdac127e0 (Outside []) + , Encoding "PACIB1716_HI_hints" 0xfffff23f 0xd503201f (Outside []) + , Encoding "PACIBSP_HI_hints" 0xfffff23f 0xd503223f (Outside []) + , Encoding "PACIBZ_HI_hints" 0xfffff23f 0xd503221f (Outside []) + , Encoding "PMUL_asimdsame_only" 0xbf20fc00 0x2e209c00 Covered + , Encoding "PMULL_asimddiff_L" 0xbf20fc00 0x0e20e000 Covered + , Encoding "PRFM_P_ldst_pos" 0xffc00000 0xf9800000 (Outside []) + , Encoding "PRFM_P_loadlit" 0xff000000 0xd8000000 (Outside []) + , Encoding "PRFM_P_ldst_regoff" 0xffe04c00 0xf8a04800 (Outside []) + , Encoding "PRFUM_P_ldst_unscaled" 0xffe00c00 0xf8800000 (Outside []) + , Encoding "PSB_HC_hints" 0xffffffff 0xd503223f Control + , Encoding "RADDHN_asimddiff_N" 0xbf20fc00 0x2e204000 Covered + , Encoding "RAX1_VVV2_cryptosha512_3" 0xffe0fc00 0xce608c00 Covered + , Encoding "RBIT_asimdmisc_R" 0xbffffc00 0x2e605800 Covered + , Encoding "RBIT_32_dp_1src" 0xfffffc00 0x5ac00000 Covered + , Encoding "RBIT_64_dp_1src" 0xfffffc00 0xdac00000 Covered + , Encoding "RCWCAS_C64_rcwcomswap" 0xffe0fc00 0x19200800 Covered + , Encoding "RCWCASA_C64_rcwcomswap" 0xffe0fc00 0x19a00800 Covered + , Encoding "RCWCASAL_C64_rcwcomswap" 0xffe0fc00 0x19e00800 Covered + , Encoding "RCWCASL_C64_rcwcomswap" 0xffe0fc00 0x19600800 Covered + , Encoding "RCWCASP_C64_rcwcomswappr" 0xffe0fc00 0x19200c00 Covered + , Encoding "RCWCASPA_C64_rcwcomswappr" 0xffe0fc00 0x19a00c00 Covered + , Encoding "RCWCASPAL_C64_rcwcomswappr" 0xffe0fc00 0x19e00c00 Covered + , Encoding "RCWCASPL_C64_rcwcomswappr" 0xffe0fc00 0x19600c00 Covered + , Encoding "RCWCLR_64_memop" 0xffe0fc00 0x38209000 Covered + , Encoding "RCWCLRA_64_memop" 0xffe0fc00 0x38a09000 Covered + , Encoding "RCWCLRAL_64_memop" 0xffe0fc00 0x38e09000 Covered + , Encoding "RCWCLRL_64_memop" 0xffe0fc00 0x38609000 Covered + , Encoding "RCWCLRP_128_memop_128" 0xffe0fc00 0x19209000 Covered + , Encoding "RCWCLRPA_128_memop_128" 0xffe0fc00 0x19a09000 Covered + , Encoding "RCWCLRPAL_128_memop_128" 0xffe0fc00 0x19e09000 Covered + , Encoding "RCWCLRPL_128_memop_128" 0xffe0fc00 0x19609000 Covered + , Encoding "RCWSCAS_C64_rcwcomswap" 0xffe0fc00 0x59200800 Covered + , Encoding "RCWSCASA_C64_rcwcomswap" 0xffe0fc00 0x59a00800 Covered + , Encoding "RCWSCASAL_C64_rcwcomswap" 0xffe0fc00 0x59e00800 Covered + , Encoding "RCWSCASL_C64_rcwcomswap" 0xffe0fc00 0x59600800 Covered + , Encoding "RCWSCASP_C64_rcwcomswappr" 0xffe0fc00 0x59200c00 Covered + , Encoding "RCWSCASPA_C64_rcwcomswappr" 0xffe0fc00 0x59a00c00 Covered + , Encoding "RCWSCASPAL_C64_rcwcomswappr" 0xffe0fc00 0x59e00c00 Covered + , Encoding "RCWSCASPL_C64_rcwcomswappr" 0xffe0fc00 0x59600c00 Covered + , Encoding "RCWSCLR_64_memop" 0xffe0fc00 0x78209000 Covered + , Encoding "RCWSCLRA_64_memop" 0xffe0fc00 0x78a09000 Covered + , Encoding "RCWSCLRAL_64_memop" 0xffe0fc00 0x78e09000 Covered + , Encoding "RCWSCLRL_64_memop" 0xffe0fc00 0x78609000 Covered + , Encoding "RCWSCLRP_128_memop_128" 0xffe0fc00 0x59209000 Covered + , Encoding "RCWSCLRPA_128_memop_128" 0xffe0fc00 0x59a09000 Covered + , Encoding "RCWSCLRPAL_128_memop_128" 0xffe0fc00 0x59e09000 Covered + , Encoding "RCWSCLRPL_128_memop_128" 0xffe0fc00 0x59609000 Covered + , Encoding "RCWSET_64_memop" 0xffe0fc00 0x3820b000 Covered + , Encoding "RCWSETA_64_memop" 0xffe0fc00 0x38a0b000 Covered + , Encoding "RCWSETAL_64_memop" 0xffe0fc00 0x38e0b000 Covered + , Encoding "RCWSETL_64_memop" 0xffe0fc00 0x3860b000 Covered + , Encoding "RCWSETP_128_memop_128" 0xffe0fc00 0x1920b000 Covered + , Encoding "RCWSETPA_128_memop_128" 0xffe0fc00 0x19a0b000 Covered + , Encoding "RCWSETPAL_128_memop_128" 0xffe0fc00 0x19e0b000 Covered + , Encoding "RCWSETPL_128_memop_128" 0xffe0fc00 0x1960b000 Covered + , Encoding "RCWSSET_64_memop" 0xffe0fc00 0x7820b000 Covered + , Encoding "RCWSSETA_64_memop" 0xffe0fc00 0x78a0b000 Covered + , Encoding "RCWSSETAL_64_memop" 0xffe0fc00 0x78e0b000 Covered + , Encoding "RCWSSETL_64_memop" 0xffe0fc00 0x7860b000 Covered + , Encoding "RCWSSETP_128_memop_128" 0xffe0fc00 0x5920b000 Covered + , Encoding "RCWSSETPA_128_memop_128" 0xffe0fc00 0x59a0b000 Covered + , Encoding "RCWSSETPAL_128_memop_128" 0xffe0fc00 0x59e0b000 Covered + , Encoding "RCWSSETPL_128_memop_128" 0xffe0fc00 0x5960b000 Covered + , Encoding "RCWSSWP_64_memop" 0xffe0fc00 0x7820a000 Covered + , Encoding "RCWSSWPA_64_memop" 0xffe0fc00 0x78a0a000 Covered + , Encoding "RCWSSWPAL_64_memop" 0xffe0fc00 0x78e0a000 Covered + , Encoding "RCWSSWPL_64_memop" 0xffe0fc00 0x7860a000 Covered + , Encoding "RCWSSWPP_128_memop_128" 0xffe0fc00 0x5920a000 Covered + , Encoding "RCWSSWPPA_128_memop_128" 0xffe0fc00 0x59a0a000 Covered + , Encoding "RCWSSWPPAL_128_memop_128" 0xffe0fc00 0x59e0a000 Covered + , Encoding "RCWSSWPPL_128_memop_128" 0xffe0fc00 0x5960a000 Covered + , Encoding "RCWSWP_64_memop" 0xffe0fc00 0x3820a000 Covered + , Encoding "RCWSWPA_64_memop" 0xffe0fc00 0x38a0a000 Covered + , Encoding "RCWSWPAL_64_memop" 0xffe0fc00 0x38e0a000 Covered + , Encoding "RCWSWPL_64_memop" 0xffe0fc00 0x3860a000 Covered + , Encoding "RCWSWPP_128_memop_128" 0xffe0fc00 0x1920a000 Covered + , Encoding "RCWSWPPA_128_memop_128" 0xffe0fc00 0x19a0a000 Covered + , Encoding "RCWSWPPAL_128_memop_128" 0xffe0fc00 0x19e0a000 Covered + , Encoding "RCWSWPPL_128_memop_128" 0xffe0fc00 0x1960a000 Covered + , Encoding "RET_64R_branch_reg" 0xfffffc1f 0xd65f0000 Control + , Encoding "RETAA_64E_branch_reg" 0xffffffff 0xd65f0bff Control + , Encoding "RETAB_64E_branch_reg" 0xffffffff 0xd65f0fff Control + , Encoding "REV_32_dp_1src" 0xfffff400 0x5ac00000 Covered + , Encoding "REV_64_dp_1src" 0xfffff400 0xdac00400 Covered + , Encoding "REV16_asimdmisc_R" 0xbf3ffc00 0x0e201800 Covered + , Encoding "REV16_32_dp_1src" 0xfffffc00 0x5ac00400 Covered + , Encoding "REV16_64_dp_1src" 0xfffffc00 0xdac00400 Covered + , Encoding "REV32_asimdmisc_R" 0xbf3ffc00 0x2e200800 Covered + , Encoding "REV32_64_dp_1src" 0xfffffc00 0xdac00800 Covered + , Encoding "REV64_asimdmisc_R" 0xbf3ffc00 0x0e200800 Covered + , Encoding "RMIF_only_rmif" 0xffe07c10 0xba000400 Covered + , Encoding "RORV_32_dp_2src" 0xffe0fc00 0x1ac02c00 Covered + , Encoding "RORV_64_dp_2src" 0xffe0fc00 0x9ac02c00 Covered + , Encoding "RPRFM_R_ldst_regoff" 0xffe04c18 0xf8a04818 (Outside [(16, OpX)]) + , Encoding "RSHRN_asimdshf_N" 0xbf80fc00 0x0f008c00 Covered + , Encoding "RSUBHN_asimddiff_N" 0xbf20fc00 0x2e206000 Covered + , Encoding "SABA_asimdsame_only" 0xbf20fc00 0x0e207c00 Covered + , Encoding "SABAL_asimddiff_L" 0xbf20fc00 0x0e205000 Covered + , Encoding "SABD_asimdsame_only" 0xbf20fc00 0x0e207400 Covered + , Encoding "SABDL_asimddiff_L" 0xbf20fc00 0x0e207000 Covered + , Encoding "SADALP_asimdmisc_P" 0xbf3ffc00 0x0e206800 Covered + , Encoding "SADDL_asimddiff_L" 0xbf20fc00 0x0e200000 Covered + , Encoding "SADDLP_asimdmisc_P" 0xbf3ffc00 0x0e202800 Covered + , Encoding "SADDLV_asimdall_only" 0xbf3ffc00 0x0e303800 Covered + , Encoding "SADDW_asimddiff_W" 0xbf20fc00 0x0e201000 Covered + , Encoding "SB_only_barriers" 0xfffff0ff 0xd50330ff Control + , Encoding "SBC_32_addsub_carry" 0xffe0fc00 0x5a000000 Covered + , Encoding "SBC_64_addsub_carry" 0xffe0fc00 0xda000000 Covered + , Encoding "SBCS_32_addsub_carry" 0xffe0fc00 0x7a000000 Covered + , Encoding "SBCS_64_addsub_carry" 0xffe0fc00 0xfa000000 Covered + , Encoding "SBFM_32M_bitfield" 0xffc00000 0x13000000 Covered + , Encoding "SBFM_64M_bitfield" 0xffc00000 0x93400000 Covered + , Encoding "SCVTF_asisdshf_C" 0xff80fc00 0x5f00e400 (Outside []) + , Encoding "SCVTF_asimdshf_C" 0xbf80fc00 0x0f00e400 (Outside [(5, OpV)]) + , Encoding "SCVTF_asisdmiscfp16_R" 0xfffffc00 0x5e79d800 (Outside [(5, OpH)]) + , Encoding "SCVTF_asisdmisc_R" 0xffbffc00 0x5e21d800 (Outside []) + , Encoding "SCVTF_asimdmiscfp16_R" 0xbffffc00 0x0e79d800 (Outside [(5, OpV)]) + , Encoding "SCVTF_asimdmisc_R" 0xbfbffc00 0x0e21d800 (Outside [(5, OpV)]) + , Encoding "SCVTF_H32_float2fix" 0xffff0000 0x1ec20000 (Outside [(5, OpW)]) + , Encoding "SCVTF_S32_float2fix" 0xffff0000 0x1e020000 (Outside [(5, OpW)]) + , Encoding "SCVTF_D32_float2fix" 0xffff0000 0x1e420000 (Outside [(5, OpW)]) + , Encoding "SCVTF_H64_float2fix" 0xffff0000 0x9ec20000 (Outside [(5, OpX)]) + , Encoding "SCVTF_S64_float2fix" 0xffff0000 0x9e020000 (Outside [(5, OpX)]) + , Encoding "SCVTF_D64_float2fix" 0xffff0000 0x9e420000 (Outside [(5, OpX)]) + , Encoding "SCVTF_H32_float2int" 0xfffffc00 0x1ee20000 (Outside [(5, OpW)]) + , Encoding "SCVTF_S32_float2int" 0xfffffc00 0x1e220000 (Outside [(5, OpW)]) + , Encoding "SCVTF_D32_float2int" 0xfffffc00 0x1e620000 (Outside [(5, OpW)]) + , Encoding "SCVTF_H64_float2int" 0xfffffc00 0x9ee20000 (Outside [(5, OpX)]) + , Encoding "SCVTF_S64_float2int" 0xfffffc00 0x9e220000 (Outside [(5, OpX)]) + , Encoding "SCVTF_D64_float2int" 0xfffffc00 0x9e620000 (Outside [(5, OpX)]) + , Encoding "SDIV_32_dp_2src" 0xffe0fc00 0x1ac00c00 + (Outside [(5, OpW), (16, OpW)]) + , Encoding "SDIV_64_dp_2src" 0xffe0fc00 0x9ac00c00 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SDOT_asimdelem_D" 0xbf00f400 0x0f00e000 + (Outside [(0, OpV), (5, OpV)]) + , Encoding "SDOT_asimdsame2_D" 0xbf20fc00 0x0e009400 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "SETF8_only_setf" 0xfffffc1f 0x3a00080d Covered + , Encoding "SETF16_only_setf" 0xfffffc1f 0x3a00480d Covered + , Encoding "SETGE_SET_memcms" 0x3fe0cc00 0x1dc08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGM_SET_memcms" 0x3fe0cc00 0x1dc04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGP_SET_memcms" 0x3fe0cc00 0x1dc00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGEN_SET_memcms" 0x3fe0cc00 0x1dc08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGMN_SET_memcms" 0x3fe0cc00 0x1dc04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGPN_SET_memcms" 0x3fe0cc00 0x1dc00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGET_SET_memcms" 0x3fe0cc00 0x1dc08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGMT_SET_memcms" 0x3fe0cc00 0x1dc04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGPT_SET_memcms" 0x3fe0cc00 0x1dc00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGETN_SET_memcms" 0x3fe0cc00 0x1dc08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGMTN_SET_memcms" 0x3fe0cc00 0x1dc04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETGPTN_SET_memcms" 0x3fe0cc00 0x1dc00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETE_SET_memcms" 0x3fe0cc00 0x19c08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETM_SET_memcms" 0x3fe0cc00 0x19c04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETP_SET_memcms" 0x3fe0cc00 0x19c00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETEN_SET_memcms" 0x3fe0cc00 0x19c08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETMN_SET_memcms" 0x3fe0cc00 0x19c04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETPN_SET_memcms" 0x3fe0cc00 0x19c00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETET_SET_memcms" 0x3fe0cc00 0x19c08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETMT_SET_memcms" 0x3fe0cc00 0x19c04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETPT_SET_memcms" 0x3fe0cc00 0x19c00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETETN_SET_memcms" 0x3fe0cc00 0x19c08400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETMTN_SET_memcms" 0x3fe0cc00 0x19c04400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SETPTN_SET_memcms" 0x3fe0cc00 0x19c00400 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "SEV_HI_hints" 0xffffffff 0xd503209f Control + , Encoding "SEVL_HI_hints" 0xffffffff 0xd50320bf Control + , Encoding "SHA1C_QSV_cryptosha3" 0xffe0fc00 0x5e000000 Covered + , Encoding "SHA1H_SS_cryptosha2" 0xfffffc00 0x5e280800 Covered + , Encoding "SHA1M_QSV_cryptosha3" 0xffe0fc00 0x5e002000 Covered + , Encoding "SHA1P_QSV_cryptosha3" 0xffe0fc00 0x5e001000 Covered + , Encoding "SHA1SU0_VVV_cryptosha3" 0xffe0fc00 0x5e003000 Covered + , Encoding "SHA1SU1_VV_cryptosha2" 0xfffffc00 0x5e281800 Covered + , Encoding "SHA256H2_QQV_cryptosha3" 0xffe0fc00 0x5e005000 Covered + , Encoding "SHA256H_QQV_cryptosha3" 0xffe0fc00 0x5e004000 Covered + , Encoding "SHA256SU0_VV_cryptosha2" 0xfffffc00 0x5e282800 Covered + , Encoding "SHA256SU1_VVV_cryptosha3" 0xffe0fc00 0x5e006000 Covered + , Encoding "SHA512H2_QQV_cryptosha512_3" 0xffe0fc00 0xce608400 Covered + , Encoding "SHA512H_QQV_cryptosha512_3" 0xffe0fc00 0xce608000 Covered + , Encoding "SHA512SU0_VV2_cryptosha512_2" 0xfffffc00 0xcec08000 Covered + , Encoding "SHA512SU1_VVV2_cryptosha512_3" 0xffe0fc00 0xce608800 Covered + , Encoding "SHADD_asimdsame_only" 0xbf20fc00 0x0e200400 Covered + , Encoding "SHL_asisdshf_R" 0xff80fc00 0x5f005400 Covered + , Encoding "SHL_asimdshf_R" 0xbf80fc00 0x0f005400 Covered + , Encoding "SHLL_asimdmisc_S" 0xbf3ffc00 0x2e213800 Covered + , Encoding "SHRN_asimdshf_N" 0xbf80fc00 0x0f008400 Covered + , Encoding "SHSUB_asimdsame_only" 0xbf20fc00 0x0e202400 Covered + , Encoding "SLI_asisdshf_R" 0xff80fc00 0x7f005400 Covered + , Encoding "SLI_asimdshf_R" 0xbf80fc00 0x2f005400 Covered + , Encoding "SM3PARTW1_VVV4_cryptosha512_3" 0xffe0fc00 0xce60c000 Covered + , Encoding "SM3PARTW2_VVV4_cryptosha512_3" 0xffe0fc00 0xce60c400 Covered + , Encoding "SM3SS1_VVV4_crypto4" 0xffe08000 0xce400000 Covered + , Encoding "SM3TT1A_VVV4_crypto3_imm2" 0xffe0cc00 0xce408000 Covered + , Encoding "SM3TT1B_VVV4_crypto3_imm2" 0xffe0cc00 0xce408400 Covered + , Encoding "SM3TT2A_VVV4_crypto3_imm2" 0xffe0cc00 0xce408800 Covered + , Encoding "SM3TT2B_VVV_crypto3_imm2" 0xffe0cc00 0xce408c00 Covered + , Encoding "SM4E_VV4_cryptosha512_2" 0xfffffc00 0xcec08400 Covered + , Encoding "SM4EKEY_VVV4_cryptosha512_3" 0xffe0fc00 0xce60c800 Covered + , Encoding "SMADDL_64WA_dp_3src" 0xffe08000 0x9b200000 Covered + , Encoding "SMAX_asimdsame_only" 0xbf20fc00 0x0e206400 Covered + , Encoding "SMAX_32_minmax_imm" 0xfffc0000 0x11c00000 Covered + , Encoding "SMAX_64_minmax_imm" 0xfffc0000 0x91c00000 Covered + , Encoding "SMAX_32_dp_2src" 0xffe0fc00 0x1ac06000 Covered + , Encoding "SMAX_64_dp_2src" 0xffe0fc00 0x9ac06000 Covered + , Encoding "SMAXP_asimdsame_only" 0xbf20fc00 0x0e20a400 Covered + , Encoding "SMAXV_asimdall_only" 0xbf3ffc00 0x0e30a800 Covered + , Encoding "SMC_EX_exception" 0xffe0001f 0xd4000003 Control + , Encoding "SMIN_asimdsame_only" 0xbf20fc00 0x0e206c00 Covered + , Encoding "SMIN_32_minmax_imm" 0xfffc0000 0x11c80000 Covered + , Encoding "SMIN_64_minmax_imm" 0xfffc0000 0x91c80000 Covered + , Encoding "SMIN_32_dp_2src" 0xffe0fc00 0x1ac06800 Covered + , Encoding "SMIN_64_dp_2src" 0xffe0fc00 0x9ac06800 Covered + , Encoding "SMINP_asimdsame_only" 0xbf20fc00 0x0e20ac00 Covered + , Encoding "SMINV_asimdall_only" 0xbf3ffc00 0x0e31a800 Covered + , Encoding "SMLAL_asimdelem_L" 0xbf00f400 0x0f002000 Covered + , Encoding "SMLAL_asimddiff_L" 0xbf20fc00 0x0e208000 Covered + , Encoding "SMLSL_asimdelem_L" 0xbf00f400 0x0f006000 Covered + , Encoding "SMLSL_asimddiff_L" 0xbf20fc00 0x0e20a000 Covered + , Encoding "SMMLA_asimdsame2_G" 0xffe0fc00 0x4e80a400 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "SMOV_asimdins_W_w" 0xffe0fc00 0x0e002c00 Covered + , Encoding "SMOV_asimdins_X_x" 0xffe0fc00 0x4e002c00 Covered + , Encoding "SMSUBL_64WA_dp_3src" 0xffe08000 0x9b208000 Covered + , Encoding "SMULH_64_dp_3src" 0xffe08000 0x9b400000 Covered + , Encoding "SMULL_asimdelem_L" 0xbf00f400 0x0f00a000 Covered + , Encoding "SMULL_asimddiff_L" 0xbf20fc00 0x0e20c000 Covered + , Encoding "SQABS_asisdmisc_R" 0xff3ffc00 0x5e207800 (Outside []) + , Encoding "SQABS_asimdmisc_R" 0xbf3ffc00 0x0e207800 (Outside [(5, OpV)]) + , Encoding "SQADD_asisdsame_only" 0xff20fc00 0x5e200c00 (Outside []) + , Encoding "SQADD_asimdsame_only" 0xbf20fc00 0x0e200c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQDMLAL_asisdelem_L" 0xff00f400 0x5f003000 (Outside []) + , Encoding "SQDMLAL_asimdelem_L" 0xbf00f400 0x0f003000 (Outside [(5, OpV)]) + , Encoding "SQDMLAL_asisddiff_only" 0xff20fc00 0x5e209000 (Outside []) + , Encoding "SQDMLAL_asimddiff_L" 0xbf20fc00 0x0e209000 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQDMLSL_asisdelem_L" 0xff00f400 0x5f007000 (Outside []) + , Encoding "SQDMLSL_asimdelem_L" 0xbf00f400 0x0f007000 (Outside [(5, OpV)]) + , Encoding "SQDMLSL_asisddiff_only" 0xff20fc00 0x5e20b000 (Outside []) + , Encoding "SQDMLSL_asimddiff_L" 0xbf20fc00 0x0e20b000 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQDMULH_asisdelem_R" 0xff00f400 0x5f00c000 Covered + , Encoding "SQDMULH_asimdelem_R" 0xbf00f400 0x0f00c000 Covered + , Encoding "SQDMULH_asisdsame_only" 0xff20fc00 0x5e20b400 Covered + , Encoding "SQDMULH_asimdsame_only" 0xbf20fc00 0x0e20b400 Covered + , Encoding "SQDMULL_asisdelem_L" 0xff00f400 0x5f00b000 (Outside []) + , Encoding "SQDMULL_asimdelem_L" 0xbf00f400 0x0f00b000 (Outside [(5, OpV)]) + , Encoding "SQDMULL_asisddiff_only" 0xff20fc00 0x5e20d000 (Outside []) + , Encoding "SQDMULL_asimddiff_L" 0xbf20fc00 0x0e20d000 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQNEG_asisdmisc_R" 0xff3ffc00 0x7e207800 (Outside []) + , Encoding "SQNEG_asimdmisc_R" 0xbf3ffc00 0x2e207800 (Outside [(5, OpV)]) + , Encoding "SQRDMLAH_asisdelem_R" 0xff00f400 0x7f00d000 Covered + , Encoding "SQRDMLAH_asimdelem_R" 0xbf00f400 0x2f00d000 Covered + , Encoding "SQRDMLAH_asisdsame2_only" 0xff20fc00 0x7e008400 Covered + , Encoding "SQRDMLAH_asimdsame2_only" 0xbf20fc00 0x2e008400 Covered + , Encoding "SQRDMLSH_asisdelem_R" 0xff00f400 0x7f00f000 (Outside []) + , Encoding "SQRDMLSH_asimdelem_R" 0xbf00f400 0x2f00f000 (Outside [(5, OpV)]) + , Encoding "SQRDMLSH_asisdsame2_only" 0xff20fc00 0x7e008c00 (Outside []) + , Encoding "SQRDMLSH_asimdsame2_only" 0xbf20fc00 0x2e008c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQRDMULH_asisdelem_R" 0xff00f400 0x5f00d000 Covered + , Encoding "SQRDMULH_asimdelem_R" 0xbf00f400 0x0f00d000 Covered + , Encoding "SQRDMULH_asisdsame_only" 0xff20fc00 0x7e20b400 Covered + , Encoding "SQRDMULH_asimdsame_only" 0xbf20fc00 0x2e20b400 Covered + , Encoding "SQRSHL_asisdsame_only" 0xff20fc00 0x5e205c00 (Outside []) + , Encoding "SQRSHL_asimdsame_only" 0xbf20fc00 0x0e205c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQRSHRN_asisdshf_N" 0xff80fc00 0x5f009c00 (Outside []) + , Encoding "SQRSHRN_asimdshf_N" 0xbf80fc00 0x0f009c00 (Outside [(5, OpV)]) + , Encoding "SQRSHRUN_asisdshf_N" 0xff80fc00 0x7f008c00 (Outside []) + , Encoding "SQRSHRUN_asimdshf_N" 0xbf80fc00 0x2f008c00 (Outside [(5, OpV)]) + , Encoding "SQSHL_asisdshf_R" 0xff80fc00 0x5f007400 (Outside []) + , Encoding "SQSHL_asimdshf_R" 0xbf80fc00 0x0f007400 (Outside [(5, OpV)]) + , Encoding "SQSHL_asisdsame_only" 0xff20fc00 0x5e204c00 (Outside []) + , Encoding "SQSHL_asimdsame_only" 0xbf20fc00 0x0e204c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQSHLU_asisdshf_R" 0xff80fc00 0x7f006400 (Outside []) + , Encoding "SQSHLU_asimdshf_R" 0xbf80fc00 0x2f006400 (Outside [(5, OpV)]) + , Encoding "SQSHRN_asisdshf_N" 0xff80fc00 0x5f009400 (Outside []) + , Encoding "SQSHRN_asimdshf_N" 0xbf80fc00 0x0f009400 (Outside [(5, OpV)]) + , Encoding "SQSHRUN_asisdshf_N" 0xff80fc00 0x7f008400 (Outside []) + , Encoding "SQSHRUN_asimdshf_N" 0xbf80fc00 0x2f008400 (Outside [(5, OpV)]) + , Encoding "SQSUB_asisdsame_only" 0xff20fc00 0x5e202c00 (Outside []) + , Encoding "SQSUB_asimdsame_only" 0xbf20fc00 0x0e202c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SQXTN_asisdmisc_N" 0xff3ffc00 0x5e214800 (Outside []) + , Encoding "SQXTN_asimdmisc_N" 0xbf3ffc00 0x0e214800 (Outside [(5, OpV)]) + , Encoding "SQXTUN_asisdmisc_N" 0xff3ffc00 0x7e212800 (Outside []) + , Encoding "SQXTUN_asimdmisc_N" 0xbf3ffc00 0x2e212800 (Outside [(5, OpV)]) + , Encoding "SRHADD_asimdsame_only" 0xbf20fc00 0x0e201400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SRI_asisdshf_R" 0xff80fc00 0x7f004400 Covered + , Encoding "SRI_asimdshf_R" 0xbf80fc00 0x2f004400 Covered + , Encoding "SRSHL_asisdsame_only" 0xff20fc00 0x5e205400 (Outside []) + , Encoding "SRSHL_asimdsame_only" 0xbf20fc00 0x0e205400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "SRSHR_asisdshf_R" 0xff80fc00 0x5f002400 (Outside []) + , Encoding "SRSHR_asimdshf_R" 0xbf80fc00 0x0f002400 (Outside [(5, OpV)]) + , Encoding "SRSRA_asisdshf_R" 0xff80fc00 0x5f003400 (Outside []) + , Encoding "SRSRA_asimdshf_R" 0xbf80fc00 0x0f003400 (Outside [(5, OpV)]) + , Encoding "SSHL_asisdsame_only" 0xff20fc00 0x5e204400 Covered + , Encoding "SSHL_asimdsame_only" 0xbf20fc00 0x0e204400 Covered + , Encoding "SSHLL_asimdshf_L" 0xbf80fc00 0x0f00a400 Covered + , Encoding "SSHR_asisdshf_R" 0xff80fc00 0x5f000400 Covered + , Encoding "SSHR_asimdshf_R" 0xbf80fc00 0x0f000400 Covered + , Encoding "SSRA_asisdshf_R" 0xff80fc00 0x5f001400 Covered + , Encoding "SSRA_asimdshf_R" 0xbf80fc00 0x0f001400 Covered + , Encoding "SSUBL_asimddiff_L" 0xbf20fc00 0x0e202000 Covered + , Encoding "SSUBW_asimddiff_W" 0xbf20fc00 0x0e203000 Covered + , Encoding "ST1_asisdlse_R1_1v" 0xbfffd000 0x0c005000 Covered + , Encoding "ST1_asisdlse_R2_2v" 0xbfffd000 0x0c008000 Covered + , Encoding "ST1_asisdlse_R3_3v" 0xbfffd000 0x0c004000 Covered + , Encoding "ST1_asisdlse_R4_4v" 0xbfffd000 0x0c000000 Covered + , Encoding "ST1_asisdlsep_I1_i1" 0xbfffd000 0x0c9f5000 Covered + , Encoding "ST1_asisdlsep_R1_r1" 0xbfe0d000 0x0c805000 Covered + , Encoding "ST1_asisdlsep_I2_i2" 0xbfffd000 0x0c9f8000 Covered + , Encoding "ST1_asisdlsep_R2_r2" 0xbfe0d000 0x0c808000 Covered + , Encoding "ST1_asisdlsep_I3_i3" 0xbfffd000 0x0c9f4000 Covered + , Encoding "ST1_asisdlsep_R3_r3" 0xbfe0d000 0x0c804000 Covered + , Encoding "ST1_asisdlsep_I4_i4" 0xbfffd000 0x0c9f0000 Covered + , Encoding "ST1_asisdlsep_R4_r4" 0xbfe0d000 0x0c800000 Covered + , Encoding "ST1_asisdlso_B1_1b" 0xbfffc000 0x0d000000 Covered + , Encoding "ST1_asisdlso_H1_1h" 0xbfffc400 0x0d004000 Covered + , Encoding "ST1_asisdlso_S1_1s" 0xbfffcc00 0x0d008000 Covered + , Encoding "ST1_asisdlso_D1_1d" 0xbfffdc00 0x0d008400 Covered + , Encoding "ST1_asisdlsop_B1_i1b" 0xbfffc000 0x0d9f0000 Covered + , Encoding "ST1_asisdlsop_BX1_r1b" 0xbfe0c000 0x0d800000 Covered + , Encoding "ST1_asisdlsop_H1_i1h" 0xbfffc400 0x0d9f4000 Covered + , Encoding "ST1_asisdlsop_HX1_r1h" 0xbfe0c400 0x0d804000 Covered + , Encoding "ST1_asisdlsop_S1_i1s" 0xbfffcc00 0x0d9f8000 Covered + , Encoding "ST1_asisdlsop_SX1_r1s" 0xbfe0cc00 0x0d808000 Covered + , Encoding "ST1_asisdlsop_D1_i1d" 0xbfffdc00 0x0d9f8400 Covered + , Encoding "ST1_asisdlsop_DX1_r1d" 0xbfe0dc00 0x0d808400 Covered + , Encoding "ST2_asisdlse_R2" 0xbffff000 0x0c008000 Covered + , Encoding "ST2_asisdlsep_I2_i" 0xbffff000 0x0c9f8000 Covered + , Encoding "ST2_asisdlsep_R2_r" 0xbfe0f000 0x0c808000 Covered + , Encoding "ST2_asisdlso_B2_2b" 0xbfffc000 0x0d200000 Covered + , Encoding "ST2_asisdlso_H2_2h" 0xbfffc400 0x0d204000 Covered + , Encoding "ST2_asisdlso_S2_2s" 0xbfffcc00 0x0d208000 Covered + , Encoding "ST2_asisdlso_D2_2d" 0xbfffdc00 0x0d208400 Covered + , Encoding "ST2_asisdlsop_B2_i2b" 0xbfffc000 0x0dbf0000 Covered + , Encoding "ST2_asisdlsop_BX2_r2b" 0xbfe0c000 0x0da00000 Covered + , Encoding "ST2_asisdlsop_H2_i2h" 0xbfffc400 0x0dbf4000 Covered + , Encoding "ST2_asisdlsop_HX2_r2h" 0xbfe0c400 0x0da04000 Covered + , Encoding "ST2_asisdlsop_S2_i2s" 0xbfffcc00 0x0dbf8000 Covered + , Encoding "ST2_asisdlsop_SX2_r2s" 0xbfe0cc00 0x0da08000 Covered + , Encoding "ST2_asisdlsop_D2_i2d" 0xbfffdc00 0x0dbf8400 Covered + , Encoding "ST2_asisdlsop_DX2_r2d" 0xbfe0dc00 0x0da08400 Covered + , Encoding "ST2G_64Spost_ldsttags" 0xffe00c00 0xd9a00400 + (Outside [(0, OpXSp)]) + , Encoding "ST2G_64Spre_ldsttags" 0xffe00c00 0xd9a00c00 + (Outside [(0, OpXSp)]) + , Encoding "ST2G_64Soffset_ldsttags" 0xffe00c00 0xd9a00800 + (Outside [(0, OpXSp)]) + , Encoding "ST3_asisdlse_R3" 0xbffff000 0x0c004000 Covered + , Encoding "ST3_asisdlsep_I3_i" 0xbffff000 0x0c9f4000 Covered + , Encoding "ST3_asisdlsep_R3_r" 0xbfe0f000 0x0c804000 Covered + , Encoding "ST3_asisdlso_B3_3b" 0xbfffc000 0x0d000000 Covered + , Encoding "ST3_asisdlso_H3_3h" 0xbfffc400 0x0d004000 Covered + , Encoding "ST3_asisdlso_S3_3s" 0xbfffcc00 0x0d008000 Covered + , Encoding "ST3_asisdlso_D3_3d" 0xbfffdc00 0x0d008400 Covered + , Encoding "ST3_asisdlsop_B3_i3b" 0xbfffc000 0x0d9f0000 Covered + , Encoding "ST3_asisdlsop_BX3_r3b" 0xbfe0c000 0x0d800000 Covered + , Encoding "ST3_asisdlsop_H3_i3h" 0xbfffc400 0x0d9f4000 Covered + , Encoding "ST3_asisdlsop_HX3_r3h" 0xbfe0c400 0x0d804000 Covered + , Encoding "ST3_asisdlsop_S3_i3s" 0xbfffcc00 0x0d9f8000 Covered + , Encoding "ST3_asisdlsop_SX3_r3s" 0xbfe0cc00 0x0d808000 Covered + , Encoding "ST3_asisdlsop_D3_i3d" 0xbfffdc00 0x0d9f8400 Covered + , Encoding "ST3_asisdlsop_DX3_r3d" 0xbfe0dc00 0x0d808400 Covered + , Encoding "ST4_asisdlse_R4" 0xbffff000 0x0c000000 Covered + , Encoding "ST4_asisdlsep_I4_i" 0xbffff000 0x0c9f0000 Covered + , Encoding "ST4_asisdlsep_R4_r" 0xbfe0f000 0x0c800000 Covered + , Encoding "ST4_asisdlso_B4_4b" 0xbfffc000 0x0d200000 Covered + , Encoding "ST4_asisdlso_H4_4h" 0xbfffc400 0x0d204000 Covered + , Encoding "ST4_asisdlso_S4_4s" 0xbfffcc00 0x0d208000 Covered + , Encoding "ST4_asisdlso_D4_4d" 0xbfffdc00 0x0d208400 Covered + , Encoding "ST4_asisdlsop_B4_i4b" 0xbfffc000 0x0dbf0000 Covered + , Encoding "ST4_asisdlsop_BX4_r4b" 0xbfe0c000 0x0da00000 Covered + , Encoding "ST4_asisdlsop_H4_i4h" 0xbfffc400 0x0dbf4000 Covered + , Encoding "ST4_asisdlsop_HX4_r4h" 0xbfe0c400 0x0da04000 Covered + , Encoding "ST4_asisdlsop_S4_i4s" 0xbfffcc00 0x0dbf8000 Covered + , Encoding "ST4_asisdlsop_SX4_r4s" 0xbfe0cc00 0x0da08000 Covered + , Encoding "ST4_asisdlsop_D4_i4d" 0xbfffdc00 0x0dbf8400 Covered + , Encoding "ST4_asisdlsop_DX4_r4d" 0xbfe0dc00 0x0da08400 Covered + , Encoding "ST64B_64L_memop" 0xfffffc00 0xf83f9000 (Outside [(0, OpX)]) + , Encoding "ST64BV_64_memop" 0xffe0fc00 0xf820b000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "ST64BV0_64_memop" 0xffe0fc00 0xf820a000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "STG_64Spost_ldsttags" 0xffe00c00 0xd9200400 + (Outside [(0, OpXSp)]) + , Encoding "STG_64Spre_ldsttags" 0xffe00c00 0xd9200c00 (Outside [(0, OpXSp)]) + , Encoding "STG_64Soffset_ldsttags" 0xffe00c00 0xd9200800 + (Outside [(0, OpXSp)]) + , Encoding "STGM_64bulk_ldsttags" 0xfffffc00 0xd9a00000 (Outside [(0, OpX)]) + , Encoding "STGP_64_ldstpair_post" 0xffc00000 0x68800000 + (Outside [(0, OpX), (10, OpX)]) + , Encoding "STGP_64_ldstpair_pre" 0xffc00000 0x69800000 + (Outside [(0, OpX), (10, OpX)]) + , Encoding "STGP_64_ldstpair_off" 0xffc00000 0x69000000 + (Outside [(0, OpX), (10, OpX)]) + , Encoding "STILP_32S_ldiappstilp" 0x7fe01c00 0x19001800 Covered + , Encoding "STILP_32SE_ldiappstilp" 0x7fe01c00 0x19000800 Covered + , Encoding "STILP_64S_ldiappstilp" 0x7fe01c00 0x59001800 Covered + , Encoding "STILP_64SS_ldiappstilp" 0x7fe01c00 0x59000800 Covered + , Encoding "STL1_asisdlso_D1" 0xbffffc00 0x0d018400 Covered + , Encoding "STLLR_SL32_ldstord" 0x7fe08000 0x08800000 Covered + , Encoding "STLLR_SL64_ldstord" 0x7fe08000 0x48800000 Covered + , Encoding "STLLRB_SL32_ldstord" 0xffe08000 0x08800000 Covered + , Encoding "STLLRH_SL32_ldstord" 0xffe08000 0x48800000 Covered + , Encoding "STLR_SL32_ldstord" 0x7fe08000 0x08808000 Covered + , Encoding "STLR_SL64_ldstord" 0x7fe08000 0x48808000 Covered + , Encoding "STLR_32S_ldapstl_writeback" 0x7ffffc00 0x19800800 Covered + , Encoding "STLR_64S_ldapstl_writeback" 0x7ffffc00 0x59800800 Covered + , Encoding "STLRB_SL32_ldstord" 0xffe08000 0x08808000 Covered + , Encoding "STLRH_SL32_ldstord" 0xffe08000 0x48808000 Covered + , Encoding "STLUR_B_ldapstl_simd" 0xffa00c00 0x1d000800 Covered + , Encoding "STLUR_H_ldapstl_simd" 0xffa00c00 0x5d000800 Covered + , Encoding "STLUR_S_ldapstl_simd" 0xffa00c00 0x9d000800 Covered + , Encoding "STLUR_D_ldapstl_simd" 0xffa00c00 0xdd000800 Covered + , Encoding "STLUR_Q_ldapstl_simd" 0xffa00c00 0x1d800800 Covered + , Encoding "STLUR_32_ldapstl_unscaled" 0x7fe00c00 0x19000000 Covered + , Encoding "STLUR_64_ldapstl_unscaled" 0x7fe00c00 0x59000000 Covered + , Encoding "STLURB_32_ldapstl_unscaled" 0xffe00c00 0x19000000 Covered + , Encoding "STLURH_32_ldapstl_unscaled" 0xffe00c00 0x59000000 Covered + , Encoding "STLXP_SP32_ldstexclp" 0xffe08000 0x88208000 Covered + , Encoding "STLXP_SP64_ldstexclp" 0xffe08000 0xc8208000 Covered + , Encoding "STLXR_SR32_ldstexclr" 0x7fe08000 0x08008000 Covered + , Encoding "STLXR_SR64_ldstexclr" 0x7fe08000 0x48008000 Covered + , Encoding "STLXRB_SR32_ldstexclr" 0xffe08000 0x08008000 Covered + , Encoding "STLXRH_SR32_ldstexclr" 0xffe08000 0x48008000 Covered + , Encoding "STNP_S_ldstnapair_offs" 0xffc00000 0x2c000000 Covered + , Encoding "STNP_D_ldstnapair_offs" 0xffc00000 0x6c000000 Covered + , Encoding "STNP_Q_ldstnapair_offs" 0xffc00000 0xac000000 Covered + , Encoding "STNP_32_ldstnapair_offs" 0xbfc00000 0x28000000 Covered + , Encoding "STNP_64_ldstnapair_offs" 0xbfc00000 0xa8000000 Covered + , Encoding "STP_S_ldstpair_post" 0xffc00000 0x2c800000 Covered + , Encoding "STP_D_ldstpair_post" 0xffc00000 0x6c800000 Covered + , Encoding "STP_Q_ldstpair_post" 0xffc00000 0xac800000 Covered + , Encoding "STP_S_ldstpair_pre" 0xffc00000 0x2d800000 Covered + , Encoding "STP_D_ldstpair_pre" 0xffc00000 0x6d800000 Covered + , Encoding "STP_Q_ldstpair_pre" 0xffc00000 0xad800000 Covered + , Encoding "STP_S_ldstpair_off" 0xffc00000 0x2d000000 Covered + , Encoding "STP_D_ldstpair_off" 0xffc00000 0x6d000000 Covered + , Encoding "STP_Q_ldstpair_off" 0xffc00000 0xad000000 Covered + , Encoding "STP_32_ldstpair_post" 0xbfc00000 0x28800000 Covered + , Encoding "STP_64_ldstpair_post" 0xbfc00000 0xa8800000 Covered + , Encoding "STP_32_ldstpair_pre" 0xbfc00000 0x29800000 Covered + , Encoding "STP_64_ldstpair_pre" 0xbfc00000 0xa9800000 Covered + , Encoding "STP_32_ldstpair_off" 0xbfc00000 0x29000000 Covered + , Encoding "STP_64_ldstpair_off" 0xbfc00000 0xa9000000 Covered + , Encoding "STR_B_ldst_immpost" 0xffa00c00 0x3c000400 Covered + , Encoding "STR_H_ldst_immpost" 0xffa00c00 0x7c000400 Covered + , Encoding "STR_S_ldst_immpost" 0xffa00c00 0xbc000400 Covered + , Encoding "STR_D_ldst_immpost" 0xffa00c00 0xfc000400 Covered + , Encoding "STR_Q_ldst_immpost" 0xffa00c00 0x3c800400 Covered + , Encoding "STR_B_ldst_immpre" 0xffa00c00 0x3c000c00 Covered + , Encoding "STR_H_ldst_immpre" 0xffa00c00 0x7c000c00 Covered + , Encoding "STR_S_ldst_immpre" 0xffa00c00 0xbc000c00 Covered + , Encoding "STR_D_ldst_immpre" 0xffa00c00 0xfc000c00 Covered + , Encoding "STR_Q_ldst_immpre" 0xffa00c00 0x3c800c00 Covered + , Encoding "STR_B_ldst_pos" 0xff800000 0x3d000000 Covered + , Encoding "STR_H_ldst_pos" 0xff800000 0x7d000000 Covered + , Encoding "STR_S_ldst_pos" 0xff800000 0xbd000000 Covered + , Encoding "STR_D_ldst_pos" 0xff800000 0xfd000000 Covered + , Encoding "STR_Q_ldst_pos" 0xff800000 0x3d800000 Covered + , Encoding "STR_32_ldst_immpost" 0x7fe00c00 0x38000400 Covered + , Encoding "STR_64_ldst_immpost" 0x7fe00c00 0x78000400 Covered + , Encoding "STR_32_ldst_immpre" 0x7fe00c00 0x38000c00 Covered + , Encoding "STR_64_ldst_immpre" 0x7fe00c00 0x78000c00 Covered + , Encoding "STR_32_ldst_pos" 0x7fc00000 0x39000000 Covered + , Encoding "STR_64_ldst_pos" 0x7fc00000 0x79000000 Covered + , Encoding "STR_B_ldst_regoff" 0xffa00c00 0x3c200800 Covered + , Encoding "STR_BL_ldst_regoff" 0xffa0ec00 0x3c206800 Covered + , Encoding "STR_H_ldst_regoff" 0xffa00c00 0x7c200800 Covered + , Encoding "STR_S_ldst_regoff" 0xffa00c00 0xbc200800 Covered + , Encoding "STR_D_ldst_regoff" 0xffa00c00 0xfc200800 Covered + , Encoding "STR_Q_ldst_regoff" 0xffa00c00 0x3ca00800 Covered + , Encoding "STR_32_ldst_regoff" 0x7fe00c00 0x38200800 Covered + , Encoding "STR_64_ldst_regoff" 0x7fe00c00 0x78200800 Covered + , Encoding "STRB_32_ldst_immpost" 0xffe00c00 0x38000400 Covered + , Encoding "STRB_32_ldst_immpre" 0xffe00c00 0x38000c00 Covered + , Encoding "STRB_32_ldst_pos" 0xffc00000 0x39000000 Covered + , Encoding "STRB_32B_ldst_regoff" 0xffe00c00 0x38200800 Covered + , Encoding "STRB_32BL_ldst_regoff" 0xffe0ec00 0x38206800 Covered + , Encoding "STRH_32_ldst_immpost" 0xffe00c00 0x78000400 Covered + , Encoding "STRH_32_ldst_immpre" 0xffe00c00 0x78000c00 Covered + , Encoding "STRH_32_ldst_pos" 0xffc00000 0x79000000 Covered + , Encoding "STRH_32_ldst_regoff" 0xffe00c00 0x78200800 Covered + , Encoding "STTR_32_ldst_unpriv" 0x7fe00c00 0x38000800 Covered + , Encoding "STTR_64_ldst_unpriv" 0x7fe00c00 0x78000800 Covered + , Encoding "STTRB_32_ldst_unpriv" 0xffe00c00 0x38000800 Covered + , Encoding "STTRH_32_ldst_unpriv" 0xffe00c00 0x78000800 Covered + , Encoding "STUR_B_ldst_unscaled" 0xffa00c00 0x3c000000 Covered + , Encoding "STUR_H_ldst_unscaled" 0xffa00c00 0x7c000000 Covered + , Encoding "STUR_S_ldst_unscaled" 0xffa00c00 0xbc000000 Covered + , Encoding "STUR_D_ldst_unscaled" 0xffa00c00 0xfc000000 Covered + , Encoding "STUR_Q_ldst_unscaled" 0xffa00c00 0x3c800000 Covered + , Encoding "STUR_32_ldst_unscaled" 0x7fe00c00 0x38000000 Covered + , Encoding "STUR_64_ldst_unscaled" 0x7fe00c00 0x78000000 Covered + , Encoding "STURB_32_ldst_unscaled" 0xffe00c00 0x38000000 Covered + , Encoding "STURH_32_ldst_unscaled" 0xffe00c00 0x78000000 Covered + , Encoding "STXP_SP32_ldstexclp" 0xffe08000 0x88200000 Covered + , Encoding "STXP_SP64_ldstexclp" 0xffe08000 0xc8200000 Covered + , Encoding "STXR_SR32_ldstexclr" 0x7fe08000 0x08000000 Covered + , Encoding "STXR_SR64_ldstexclr" 0x7fe08000 0x48000000 Covered + , Encoding "STXRB_SR32_ldstexclr" 0xffe08000 0x08000000 Covered + , Encoding "STXRH_SR32_ldstexclr" 0xffe08000 0x48000000 Covered + , Encoding "STZ2G_64Spost_ldsttags" 0xffe00c00 0xd9e00400 + (Outside [(0, OpXSp)]) + , Encoding "STZ2G_64Spre_ldsttags" 0xffe00c00 0xd9e00c00 + (Outside [(0, OpXSp)]) + , Encoding "STZ2G_64Soffset_ldsttags" 0xffe00c00 0xd9e00800 + (Outside [(0, OpXSp)]) + , Encoding "STZG_64Spost_ldsttags" 0xffe00c00 0xd9600400 + (Outside [(0, OpXSp)]) + , Encoding "STZG_64Spre_ldsttags" 0xffe00c00 0xd9600c00 + (Outside [(0, OpXSp)]) + , Encoding "STZG_64Soffset_ldsttags" 0xffe00c00 0xd9600800 + (Outside [(0, OpXSp)]) + , Encoding "STZGM_64bulk_ldsttags" 0xfffffc00 0xd9200000 (Outside [(0, OpX)]) + , Encoding "SUB_32_addsub_ext" 0xffe00000 0x4b200000 Covered + , Encoding "SUB_64_addsub_ext" 0xffe00000 0xcb200000 Covered + , Encoding "SUB_32_addsub_imm" 0xff800000 0x51000000 Covered + , Encoding "SUB_64_addsub_imm" 0xff800000 0xd1000000 Covered + , Encoding "SUB_32_addsub_shift" 0xff200000 0x4b000000 Covered + , Encoding "SUB_64_addsub_shift" 0xff200000 0xcb000000 Covered + , Encoding "SUB_asisdsame_only" 0xff20fc00 0x7e208400 Covered + , Encoding "SUB_asimdsame_only" 0xbf20fc00 0x2e208400 Covered + , Encoding "SUBG_64_addsub_immtags" 0xffc00000 0xd1800000 + (Outside [(5, OpXSp)]) + , Encoding "SUBHN_asimddiff_N" 0xbf20fc00 0x0e206000 Covered + , Encoding "SUBP_64S_dp_2src" 0xffe0fc00 0x9ac00000 + (Outside [(5, OpXSp), (16, OpXSp)]) + , Encoding "SUBPS_64S_dp_2src" 0xffe0fc00 0xbac00000 + (Outside [(5, OpXSp), (16, OpXSp)]) + , Encoding "SUBS_32S_addsub_ext" 0xffe00000 0x6b200000 Covered + , Encoding "SUBS_64S_addsub_ext" 0xffe00000 0xeb200000 Covered + , Encoding "SUBS_32S_addsub_imm" 0xff800000 0x71000000 Covered + , Encoding "SUBS_64S_addsub_imm" 0xff800000 0xf1000000 Covered + , Encoding "SUBS_32_addsub_shift" 0xff200000 0x6b000000 Covered + , Encoding "SUBS_64_addsub_shift" 0xff200000 0xeb000000 Covered + , Encoding "SUDOT_asimdelem_D" 0xbfc0f400 0x0f00f000 + (Outside [(0, OpV), (5, OpV)]) + , Encoding "SUQADD_asisdmisc_R" 0xff3ffc00 0x5e203800 (Outside []) + , Encoding "SUQADD_asimdmisc_R" 0xbf3ffc00 0x0e203800 (Outside [(5, OpV)]) + , Encoding "SVC_EX_exception" 0xffe0001f 0xd4000001 Control + , Encoding "SWP_32_memop" 0x7fe0fc00 0x38208000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPA_32_memop" 0x7fe0fc00 0x38a08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPAL_32_memop" 0x7fe0fc00 0x38e08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPL_32_memop" 0x7fe0fc00 0x38608000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWP_64_memop" 0x7fe0fc00 0x78208000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "SWPA_64_memop" 0x7fe0fc00 0x78a08000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "SWPAL_64_memop" 0x7fe0fc00 0x78e08000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "SWPL_64_memop" 0x7fe0fc00 0x78608000 + (Outside [(0, OpX), (16, OpX)]) + , Encoding "SWPAB_32_memop" 0xffe0fc00 0x38a08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPALB_32_memop" 0xffe0fc00 0x38e08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPB_32_memop" 0xffe0fc00 0x38208000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPLB_32_memop" 0xffe0fc00 0x38608000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPAH_32_memop" 0xffe0fc00 0x78a08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPALH_32_memop" 0xffe0fc00 0x78e08000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPH_32_memop" 0xffe0fc00 0x78208000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPLH_32_memop" 0xffe0fc00 0x78608000 + (Outside [(0, OpW), (16, OpW)]) + , Encoding "SWPP_128_memop_128" 0xffe0fc00 0x19208000 Covered + , Encoding "SWPPA_128_memop_128" 0xffe0fc00 0x19a08000 Covered + , Encoding "SWPPAL_128_memop_128" 0xffe0fc00 0x19e08000 Covered + , Encoding "SWPPL_128_memop_128" 0xffe0fc00 0x19608000 Covered + , Encoding "SYS_CR_systeminstrs" 0xfff80000 0xd5080000 Control + , Encoding "SYSL_RC_systeminstrs" 0xfff80000 0xd5280000 Control + , Encoding "SYSP_CR_syspairinstrs" 0xfff80000 0xd5480000 Control + , Encoding "TBL_asimdtbl_L2_2" 0xbfe0fc00 0x0e002000 Covered + , Encoding "TBL_asimdtbl_L3_3" 0xbfe0fc00 0x0e004000 Covered + , Encoding "TBL_asimdtbl_L4_4" 0xbfe0fc00 0x0e006000 Covered + , Encoding "TBL_asimdtbl_L1_1" 0xbfe0fc00 0x0e000000 Covered + , Encoding "TBNZ_only_testbranch" 0x7f000000 0x37000000 Control + , Encoding "TBX_asimdtbl_L2_2" 0xbfe0fc00 0x0e003000 Covered + , Encoding "TBX_asimdtbl_L3_3" 0xbfe0fc00 0x0e005000 Covered + , Encoding "TBX_asimdtbl_L4_4" 0xbfe0fc00 0x0e007000 Covered + , Encoding "TBX_asimdtbl_L1_1" 0xbfe0fc00 0x0e001000 Covered + , Encoding "TBZ_only_testbranch" 0x7f000000 0x36000000 Control + , Encoding "TCANCEL_EX_exception" 0xffe0001f 0xd4600000 Control + , Encoding "TCOMMIT_only_barriers" 0xffffffff 0xd503307f Control + , Encoding "TRN1_asimdperm_only" 0xbf20fc00 0x0e002800 Covered + , Encoding "TRN2_asimdperm_only" 0xbf20fc00 0x0e006800 Covered + , Encoding "TSB_HC_hints" 0xffffffff 0xd503225f Control + , Encoding "TSTART_BR_systemresult" 0xffffffe0 0xd5233060 Control + , Encoding "TTEST_BR_systemresult" 0xffffffe0 0xd5233160 Control + , Encoding "UABA_asimdsame_only" 0xbf20fc00 0x2e207c00 Covered + , Encoding "UABAL_asimddiff_L" 0xbf20fc00 0x2e205000 Covered + , Encoding "UABD_asimdsame_only" 0xbf20fc00 0x2e207400 Covered + , Encoding "UABDL_asimddiff_L" 0xbf20fc00 0x2e207000 Covered + , Encoding "UADALP_asimdmisc_P" 0xbf3ffc00 0x2e206800 Covered + , Encoding "UADDL_asimddiff_L" 0xbf20fc00 0x2e200000 Covered + , Encoding "UADDLP_asimdmisc_P" 0xbf3ffc00 0x2e202800 Covered + , Encoding "UADDLV_asimdall_only" 0xbf3ffc00 0x2e303800 Covered + , Encoding "UADDW_asimddiff_W" 0xbf20fc00 0x2e201000 Covered + , Encoding "UBFM_32M_bitfield" 0xffc00000 0x53000000 Covered + , Encoding "UBFM_64M_bitfield" 0xffc00000 0xd3400000 Covered + , Encoding "UCVTF_asisdshf_C" 0xff80fc00 0x7f00e400 (Outside []) + , Encoding "UCVTF_asimdshf_C" 0xbf80fc00 0x2f00e400 (Outside [(5, OpV)]) + , Encoding "UCVTF_asisdmiscfp16_R" 0xfffffc00 0x7e79d800 (Outside [(5, OpH)]) + , Encoding "UCVTF_asisdmisc_R" 0xffbffc00 0x7e21d800 (Outside []) + , Encoding "UCVTF_asimdmiscfp16_R" 0xbffffc00 0x2e79d800 (Outside [(5, OpV)]) + , Encoding "UCVTF_asimdmisc_R" 0xbfbffc00 0x2e21d800 (Outside [(5, OpV)]) + , Encoding "UCVTF_H32_float2fix" 0xffff0000 0x1ec30000 (Outside [(5, OpW)]) + , Encoding "UCVTF_S32_float2fix" 0xffff0000 0x1e030000 (Outside [(5, OpW)]) + , Encoding "UCVTF_D32_float2fix" 0xffff0000 0x1e430000 (Outside [(5, OpW)]) + , Encoding "UCVTF_H64_float2fix" 0xffff0000 0x9ec30000 (Outside [(5, OpX)]) + , Encoding "UCVTF_S64_float2fix" 0xffff0000 0x9e030000 (Outside [(5, OpX)]) + , Encoding "UCVTF_D64_float2fix" 0xffff0000 0x9e430000 (Outside [(5, OpX)]) + , Encoding "UCVTF_H32_float2int" 0xfffffc00 0x1ee30000 (Outside [(5, OpW)]) + , Encoding "UCVTF_S32_float2int" 0xfffffc00 0x1e230000 (Outside [(5, OpW)]) + , Encoding "UCVTF_D32_float2int" 0xfffffc00 0x1e630000 (Outside [(5, OpW)]) + , Encoding "UCVTF_H64_float2int" 0xfffffc00 0x9ee30000 (Outside [(5, OpX)]) + , Encoding "UCVTF_S64_float2int" 0xfffffc00 0x9e230000 (Outside [(5, OpX)]) + , Encoding "UCVTF_D64_float2int" 0xfffffc00 0x9e630000 (Outside [(5, OpX)]) + , Encoding "UDF_only_perm_undef" 0xffff0000 0x00000000 (Outside []) + , Encoding "UDIV_32_dp_2src" 0xffe0fc00 0x1ac00800 + (Outside [(5, OpW), (16, OpW)]) + , Encoding "UDIV_64_dp_2src" 0xffe0fc00 0x9ac00800 + (Outside [(5, OpX), (16, OpX)]) + , Encoding "UDOT_asimdelem_D" 0xbf00f400 0x2f00e000 + (Outside [(0, OpV), (5, OpV)]) + , Encoding "UDOT_asimdsame2_D" 0xbf20fc00 0x2e009400 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "UHADD_asimdsame_only" 0xbf20fc00 0x2e200400 Covered + , Encoding "UHSUB_asimdsame_only" 0xbf20fc00 0x2e202400 Covered + , Encoding "UMADDL_64WA_dp_3src" 0xffe08000 0x9ba00000 Covered + , Encoding "UMAX_asimdsame_only" 0xbf20fc00 0x2e206400 Covered + , Encoding "UMAX_32U_minmax_imm" 0xfffc0000 0x11c40000 Covered + , Encoding "UMAX_64U_minmax_imm" 0xfffc0000 0x91c40000 Covered + , Encoding "UMAX_32_dp_2src" 0xffe0fc00 0x1ac06400 Covered + , Encoding "UMAX_64_dp_2src" 0xffe0fc00 0x9ac06400 Covered + , Encoding "UMAXP_asimdsame_only" 0xbf20fc00 0x2e20a400 Covered + , Encoding "UMAXV_asimdall_only" 0xbf3ffc00 0x2e30a800 Covered + , Encoding "UMIN_asimdsame_only" 0xbf20fc00 0x2e206c00 Covered + , Encoding "UMIN_32U_minmax_imm" 0xfffc0000 0x11cc0000 Covered + , Encoding "UMIN_64U_minmax_imm" 0xfffc0000 0x91cc0000 Covered + , Encoding "UMIN_32_dp_2src" 0xffe0fc00 0x1ac06c00 Covered + , Encoding "UMIN_64_dp_2src" 0xffe0fc00 0x9ac06c00 Covered + , Encoding "UMINP_asimdsame_only" 0xbf20fc00 0x2e20ac00 Covered + , Encoding "UMINV_asimdall_only" 0xbf3ffc00 0x2e31a800 Covered + , Encoding "UMLAL_asimdelem_L" 0xbf00f400 0x2f002000 Covered + , Encoding "UMLAL_asimddiff_L" 0xbf20fc00 0x2e208000 Covered + , Encoding "UMLSL_asimdelem_L" 0xbf00f400 0x2f006000 Covered + , Encoding "UMLSL_asimddiff_L" 0xbf20fc00 0x2e20a000 Covered + , Encoding "UMMLA_asimdsame2_G" 0xffe0fc00 0x6e80a400 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "UMOV_asimdins_W_w" 0xffe0fc00 0x0e003c00 Covered + , Encoding "UMOV_asimdins_X_x" 0xffeffc00 0x4e083c00 Covered + , Encoding "UMSUBL_64WA_dp_3src" 0xffe08000 0x9ba08000 Covered + , Encoding "UMULH_64_dp_3src" 0xffe08000 0x9bc00000 Covered + , Encoding "UMULL_asimdelem_L" 0xbf00f400 0x2f00a000 Covered + , Encoding "UMULL_asimddiff_L" 0xbf20fc00 0x2e20c000 Covered + , Encoding "UQADD_asisdsame_only" 0xff20fc00 0x7e200c00 (Outside []) + , Encoding "UQADD_asimdsame_only" 0xbf20fc00 0x2e200c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "UQRSHL_asisdsame_only" 0xff20fc00 0x7e205c00 (Outside []) + , Encoding "UQRSHL_asimdsame_only" 0xbf20fc00 0x2e205c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "UQRSHRN_asisdshf_N" 0xff80fc00 0x7f009c00 (Outside []) + , Encoding "UQRSHRN_asimdshf_N" 0xbf80fc00 0x2f009c00 (Outside [(5, OpV)]) + , Encoding "UQSHL_asisdshf_R" 0xff80fc00 0x7f007400 (Outside []) + , Encoding "UQSHL_asimdshf_R" 0xbf80fc00 0x2f007400 (Outside [(5, OpV)]) + , Encoding "UQSHL_asisdsame_only" 0xff20fc00 0x7e204c00 (Outside []) + , Encoding "UQSHL_asimdsame_only" 0xbf20fc00 0x2e204c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "UQSHRN_asisdshf_N" 0xff80fc00 0x7f009400 (Outside []) + , Encoding "UQSHRN_asimdshf_N" 0xbf80fc00 0x2f009400 (Outside [(5, OpV)]) + , Encoding "UQSUB_asisdsame_only" 0xff20fc00 0x7e202c00 (Outside []) + , Encoding "UQSUB_asimdsame_only" 0xbf20fc00 0x2e202c00 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "UQXTN_asisdmisc_N" 0xff3ffc00 0x7e214800 (Outside []) + , Encoding "UQXTN_asimdmisc_N" 0xbf3ffc00 0x2e214800 (Outside [(5, OpV)]) + , Encoding "URECPE_asimdmisc_R" 0xbfbffc00 0x0ea1c800 (Outside [(5, OpV)]) + , Encoding "URHADD_asimdsame_only" 0xbf20fc00 0x2e201400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "URSHL_asisdsame_only" 0xff20fc00 0x7e205400 (Outside []) + , Encoding "URSHL_asimdsame_only" 0xbf20fc00 0x2e205400 + (Outside [(5, OpV), (16, OpV)]) + , Encoding "URSHR_asisdshf_R" 0xff80fc00 0x7f002400 (Outside []) + , Encoding "URSHR_asimdshf_R" 0xbf80fc00 0x2f002400 (Outside [(5, OpV)]) + , Encoding "URSQRTE_asimdmisc_R" 0xbfbffc00 0x2ea1c800 (Outside [(5, OpV)]) + , Encoding "URSRA_asisdshf_R" 0xff80fc00 0x7f003400 (Outside []) + , Encoding "URSRA_asimdshf_R" 0xbf80fc00 0x2f003400 (Outside [(5, OpV)]) + , Encoding "USDOT_asimdelem_D" 0xbfc0f400 0x0f80f000 + (Outside [(0, OpV), (5, OpV)]) + , Encoding "USDOT_asimdsame2_D" 0xbfe0fc00 0x0e809c00 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "USHL_asisdsame_only" 0xff20fc00 0x7e204400 Covered + , Encoding "USHL_asimdsame_only" 0xbf20fc00 0x2e204400 Covered + , Encoding "USHLL_asimdshf_L" 0xbf80fc00 0x2f00a400 Covered + , Encoding "USHR_asisdshf_R" 0xff80fc00 0x7f000400 Covered + , Encoding "USHR_asimdshf_R" 0xbf80fc00 0x2f000400 Covered + , Encoding "USMMLA_asimdsame2_G" 0xffe0fc00 0x4e80ac00 + (Outside [(0, OpV), (5, OpV), (16, OpV)]) + , Encoding "USQADD_asisdmisc_R" 0xff3ffc00 0x7e203800 (Outside []) + , Encoding "USQADD_asimdmisc_R" 0xbf3ffc00 0x2e203800 (Outside [(5, OpV)]) + , Encoding "USRA_asisdshf_R" 0xff80fc00 0x7f001400 Covered + , Encoding "USRA_asimdshf_R" 0xbf80fc00 0x2f001400 Covered + , Encoding "USUBL_asimddiff_L" 0xbf20fc00 0x2e202000 Covered + , Encoding "USUBW_asimddiff_W" 0xbf20fc00 0x2e203000 Covered + , Encoding "UZP1_asimdperm_only" 0xbf20fc00 0x0e001800 Covered + , Encoding "UZP2_asimdperm_only" 0xbf20fc00 0x0e005800 Covered + , Encoding "WFE_HI_hints" 0xffffffff 0xd503205f Control + , Encoding "WFET_only_systeminstrswithreg" 0xffffffe0 0xd5031000 Control + , Encoding "WFI_HI_hints" 0xffffffff 0xd503207f Control + , Encoding "WFIT_only_systeminstrswithreg" 0xffffffe0 0xd5031020 Control + , Encoding "XAFLAG_M_pstate" 0xfffff0ff 0xd500403f Control + , Encoding "XAR_VVV2_crypto3_imm6" 0xffe00000 0xce800000 Covered + , Encoding "XPACD_64Z_dp_1src" 0xffffffe0 0xdac147e0 (Outside []) + , Encoding "XPACI_64Z_dp_1src" 0xffffffe0 0xdac143e0 (Outside []) + , Encoding "XPACLRI_HI_hints" 0xffffffff 0xd50320ff (Outside []) + , Encoding "XTN_asimdmisc_N" 0xbf3ffc00 0x0e212800 Covered + , Encoding "YIELD_HI_hints" 0xffffffff 0xd503203f Control + , Encoding "ZIP1_asimdperm_only" 0xbf20fc00 0x0e003800 Covered + , Encoding "ZIP2_asimdperm_only" 0xbf20fc00 0x0e007800 Covered + ] diff --git a/lib/Vestigia/Contract/Intel.hs b/lib/Vestigia/Contract/Intel.hs @@ -0,0 +1,282 @@ +{-# OPTIONS_HADDOCK prune #-} +{-# LANGUAGE OverloadedStrings #-} + +-- | +-- Module: Vestigia.Contract.Intel +-- Copyright: (c) 2026 Jared Tobin +-- License: MIT +-- Maintainer: Jared Tobin <jared@ppad.tech> +-- +-- Intel's data-operand-independent-timing contract (DOITM), row by +-- row, transcribed from Intel's list. +-- +-- == Source +-- +-- Intel, /Data Operand Independent Timing Instructions/, document ID +-- 768547, updated 2026-02-23, Table 1 \"Documented Data Operand +-- Independent Timing Instructions\" (840 mnemonic\/opcode rows, 594 +-- distinct mnemonics), retrieved 2026-10-27 from @www.intel.com@ +-- under +-- @\/content\/www\/us\/en\/developer\/articles\/technical\/@ +-- @software-security-guidance\/resources\/@, saved from a browser +-- (the host refuses automated retrieval; sha256 of the page as saved +-- @0f67179a44c9f872ab240c3363ee664340beea36ce4a07cbfe1a34cc7adb6a10@). +-- The revision of 2023-02-28, as the Internet Archive kept it through +-- 2025-11-13, lacks BSWAP, CQO, MOVAPS, MOVSS, MOVUPS, ROL, ROR, +-- RORX, SHLD, SHRD, and XORPS; this one adds them and drops none. +-- +-- == Rule +-- +-- A row names a mnemonic and an opcode byte: the instruction's last +-- opcode byte, after any prefixes, VEX or EVEX payload, and escape +-- bytes. The list's own preface reads: +-- +-- > The table below lists instructions that have data-independent +-- > timing. [...] Note that these data operand independent timing +-- > instructions may have variable latency for reasons unrelated to +-- > the data values (for example, loading data from memory or the +-- > encoding of the instruction). +-- +-- The @REP_@ rows carry a footnote, \"These REP_ instructions' +-- latency varies based on the loop count (*CX)\", whose marker is +-- dropped from their names here: a count that depends on the secret +-- repeats the instruction a different number of times, which is +-- control flow. + +module Vestigia.Contract.Intel ( + instructions + ) where + +import qualified Data.Text as T +import Data.Word (Word8) + +-- | Every row: a mnemonic, as the list spells it, and an opcode byte. +instructions :: [(T.Text, Word8)] +instructions = + [ ("ADC", 0x10), ("ADC", 0x11), ("ADC", 0x12), ("ADC", 0x13), ("ADC", 0x14) + , ("ADC", 0x15), ("ADC", 0x80), ("ADC", 0x81), ("ADC", 0x82), ("ADC", 0x83) + , ("ADCX", 0xf6), ("ADD", 0x00), ("ADD", 0x01), ("ADD", 0x02), ("ADD", 0x03) + , ("ADD", 0x04), ("ADD", 0x05), ("ADD", 0x80), ("ADD", 0x81), ("ADD", 0x82) + , ("ADD", 0x83), ("ADOX", 0xf6), ("AESDEC", 0xde), ("AESDECLAST", 0xdf) + , ("AESENC", 0xdc), ("AESENCLAST", 0xdd), ("AESIMC", 0xdb) + , ("AESKEYGENASSIST", 0xdf), ("AND", 0x20), ("AND", 0x21), ("AND", 0x22) + , ("AND", 0x23), ("AND", 0x24), ("AND", 0x25), ("AND", 0x80), ("AND", 0x81) + , ("AND", 0x82), ("AND", 0x83), ("ANDN", 0xf2), ("BSWAP", 0xc8) + , ("BSWAP", 0xc9), ("BSWAP", 0xca), ("BSWAP", 0xcb), ("BSWAP", 0xcc) + , ("BSWAP", 0xcd), ("BSWAP", 0xce), ("BSWAP", 0xcf), ("BT", 0xa3) + , ("BT", 0xba), ("BTC", 0xba), ("BTC", 0xbb), ("BTR", 0xb3), ("BTR", 0xba) + , ("BTS", 0xab), ("BTS", 0xba), ("CMOVB", 0x42), ("CMOVBE", 0x46) + , ("CMOVL", 0x4c), ("CMOVLE", 0x4e), ("CMOVNB", 0x43), ("CMOVNBE", 0x47) + , ("CMOVNL", 0x4d), ("CMOVNLE", 0x4f), ("CMOVNO", 0x41), ("CMOVNP", 0x4b) + , ("CMOVNS", 0x49), ("CMOVNZ", 0x45), ("CMOVO", 0x40), ("CMOVP", 0x4a) + , ("CMOVS", 0x48), ("CMOVZ", 0x44), ("CMP", 0x38), ("CMP", 0x39) + , ("CMP", 0x3a), ("CMP", 0x3b), ("CMP", 0x3c), ("CMP", 0x3d), ("CMP", 0x80) + , ("CMP", 0x81), ("CMP", 0x82), ("CMP", 0x83), ("CQO", 0x99), ("DEC", 0x48) + , ("DEC", 0x49), ("DEC", 0x4a), ("DEC", 0x4b), ("DEC", 0x4c), ("DEC", 0x4d) + , ("DEC", 0x4e), ("DEC", 0x4f), ("DEC", 0xfe), ("DEC", 0xff) + , ("GF2P8AFFINEINVQB", 0xcf), ("GF2P8AFFINEQB", 0xce), ("GF2P8MULB", 0xcf) + , ("IMUL", 0x69), ("IMUL", 0x6b), ("IMUL", 0xaf), ("IMUL", 0xf6) + , ("IMUL", 0xf7), ("INC", 0x40), ("INC", 0x41), ("INC", 0x42), ("INC", 0x43) + , ("INC", 0x44), ("INC", 0x45), ("INC", 0x46), ("INC", 0x47), ("INC", 0xfe) + , ("INC", 0xff), ("KADDB", 0x4a), ("KADDD", 0x4a), ("KADDQ", 0x4a) + , ("KADDW", 0x4a), ("KANDB", 0x41), ("KANDD", 0x41), ("KANDNB", 0x42) + , ("KANDND", 0x42), ("KANDNQ", 0x42), ("KANDNW", 0x42), ("KANDQ", 0x41) + , ("KANDW", 0x41), ("KMOVB", 0x90), ("KMOVB", 0x91), ("KMOVB", 0x92) + , ("KMOVB", 0x93), ("KMOVD", 0x90), ("KMOVD", 0x91), ("KMOVD", 0x92) + , ("KMOVD", 0x93), ("KMOVQ", 0x90), ("KMOVQ", 0x91), ("KMOVQ", 0x92) + , ("KMOVQ", 0x93), ("KMOVW", 0x90), ("KMOVW", 0x91), ("KMOVW", 0x92) + , ("KMOVW", 0x93), ("KNOTB", 0x44), ("KNOTD", 0x44), ("KNOTQ", 0x44) + , ("KNOTW", 0x44), ("KORB", 0x45), ("KORD", 0x45), ("KORQ", 0x45) + , ("KORTESTB", 0x98), ("KORTESTD", 0x98), ("KORTESTQ", 0x98) + , ("KORTESTW", 0x98), ("KORW", 0x45), ("KSHIFTLB", 0x32), ("KSHIFTLD", 0x33) + , ("KSHIFTLQ", 0x33), ("KSHIFTLW", 0x32), ("KSHIFTRB", 0x30) + , ("KSHIFTRD", 0x31), ("KSHIFTRQ", 0x31), ("KSHIFTRW", 0x30) + , ("KTESTB", 0x99), ("KTESTD", 0x99), ("KTESTQ", 0x99), ("KTESTW", 0x99) + , ("KUNPCKBW", 0x4b), ("KUNPCKDQ", 0x4b), ("KUNPCKWD", 0x4b) + , ("KXNORB", 0x46), ("KXNORD", 0x46), ("KXNORQ", 0x46), ("KXNORW", 0x46) + , ("KXORB", 0x47), ("KXORD", 0x47), ("KXORQ", 0x47), ("KXORW", 0x47) + , ("LDDQU", 0xf0), ("LEA", 0x8d), ("MOV", 0x88), ("MOV", 0x89), ("MOV", 0x8a) + , ("MOV", 0x8b), ("MOV", 0xa0), ("MOV", 0xa1), ("MOV", 0xa2), ("MOV", 0xa3) + , ("MOV", 0xb0), ("MOV", 0xb1), ("MOV", 0xb2), ("MOV", 0xb3), ("MOV", 0xb4) + , ("MOV", 0xb5), ("MOV", 0xb6), ("MOV", 0xb7), ("MOV", 0xb8), ("MOV", 0xb9) + , ("MOV", 0xba), ("MOV", 0xbb), ("MOV", 0xbc), ("MOV", 0xbd), ("MOV", 0xbe) + , ("MOV", 0xbf), ("MOV", 0xc6), ("MOV", 0xc7), ("MOVAPS", 0x28) + , ("MOVAPS", 0x29), ("MOVD", 0x6e), ("MOVD", 0x7e), ("MOVDDUP", 0x12) + , ("MOVDQ2Q", 0xd6), ("MOVDQA", 0x6f), ("MOVDQA", 0x7f), ("MOVDQU", 0x6f) + , ("MOVDQU", 0x7f), ("MOVNTDQ", 0xe7), ("MOVNTDQA", 0x2a), ("MOVQ", 0x6e) + , ("MOVQ", 0x7e), ("MOVQ", 0xd6), ("MOVSB", 0xa4), ("MOVSD", 0xa5) + , ("MOVSHDUP", 0x16), ("MOVSLDUP", 0x12), ("MOVSQ", 0xa5), ("MOVSS", 0x10) + , ("MOVSS", 0x11), ("MOVSW", 0xa5), ("MOVSX", 0xbe), ("MOVSX", 0xbf) + , ("MOVSXD", 0x63), ("MOVUPS", 0x10), ("MOVUPS", 0x11), ("MOVZX", 0xb6) + , ("MOVZX", 0xb7), ("MPSADBW", 0x42), ("MUL", 0xf6), ("MUL", 0xf7) + , ("MULX", 0xf6), ("NEG", 0xf6), ("NEG", 0xf7), ("NOT", 0xf6), ("NOT", 0xf7) + , ("OR", 0x08), ("OR", 0x80), ("OR", 0x81), ("OR", 0x82), ("OR", 0x83) + , ("OR", 0x09), ("OR", 0x0a), ("OR", 0x0b), ("OR", 0x0c), ("OR", 0x0d) + , ("PABSB", 0x1c), ("PABSD", 0x1e), ("PABSW", 0x1d), ("PACKSSDW", 0x6b) + , ("PACKSSWB", 0x63), ("PACKUSDW", 0x2b), ("PACKUSWB", 0x67), ("PADDB", 0xfc) + , ("PADDD", 0xfe), ("PADDQ", 0xd4), ("PADDSB", 0xec), ("PADDSW", 0xed) + , ("PADDUSB", 0xdc), ("PADDUSW", 0xdd), ("PADDW", 0xfd), ("PALIGNR", 0x0f) + , ("PAND", 0xdb), ("PANDN", 0xdf), ("PAVGB", 0xe0), ("PAVGW", 0xe3) + , ("PBLENDVB", 0x10), ("PBLENDW", 0x0e), ("PCLMULQDQ", 0x44) + , ("PCMPEQB", 0x74), ("PCMPEQD", 0x76), ("PCMPEQQ", 0x29), ("PCMPEQW", 0x75) + , ("PCMPGTB", 0x64), ("PCMPGTD", 0x66), ("PCMPGTQ", 0x37), ("PCMPGTW", 0x65) + , ("PEXTRB", 0x14), ("PEXTRD", 0x16), ("PEXTRQ", 0x16), ("PEXTRW", 0x15) + , ("PEXTRW", 0xc5), ("PHADDD", 0x02), ("PHADDSW", 0x03), ("PHADDW", 0x01) + , ("PHMINPOSUW", 0x41), ("PHSUBD", 0x06), ("PHSUBSW", 0x07), ("PHSUBW", 0x05) + , ("PINSRB", 0x20), ("PINSRD", 0x22), ("PINSRQ", 0x22), ("PINSRW", 0xc4) + , ("PMADDUBSW", 0x04), ("PMADDWD", 0xf5), ("PMAXSB", 0x3c), ("PMAXSW", 0xee) + , ("PMAXUB", 0xde), ("PMAXUD", 0x3f), ("PMAXUW", 0x3e), ("PMINSB", 0x38) + , ("PMINSW", 0xea), ("PMINUB", 0xda), ("PMINUD", 0x3b), ("PMINUW", 0x3a) + , ("PMOVMSKB", 0xd7), ("PMOVSXBD", 0x21), ("PMOVSXBQ", 0x22) + , ("PMOVSXBW", 0x20), ("PMOVSXDQ", 0x25), ("PMOVSXWD", 0x23) + , ("PMOVSXWQ", 0x24), ("PMOVZXBD", 0x31), ("PMOVZXBQ", 0x32) + , ("PMOVZXBW", 0x30), ("PMOVZXDQ", 0x35), ("PMOVZXWD", 0x33) + , ("PMOVZXWQ", 0x34), ("PMULDQ", 0x28), ("PMULHRSW", 0x0b), ("PMULHUW", 0xe4) + , ("PMULHW", 0xe5), ("PMULLD", 0x40), ("PMULLW", 0xd5), ("PMULUDQ", 0xf4) + , ("POP", 0x58), ("POP", 0x59), ("POP", 0x5a), ("POP", 0x5b), ("POP", 0x5c) + , ("POP", 0x5d), ("POP", 0x5e), ("POP", 0x5f), ("POP", 0x8f), ("POR", 0xeb) + , ("PSADBW", 0xf6), ("PSHUFB", 0x00), ("PSHUFD", 0x70), ("PSHUFHW", 0x70) + , ("PSHUFLW", 0x70), ("PSIGNB", 0x08), ("PSIGND", 0x0a), ("PSIGNW", 0x09) + , ("PSLLD", 0x72), ("PSLLD", 0xf2), ("PSLLDQ", 0x73), ("PSLLQ", 0x73) + , ("PSLLQ", 0xf3), ("PSLLW", 0x71), ("PSLLW", 0xf1), ("PSRAD", 0x72) + , ("PSRAD", 0xe2), ("PSRAW", 0x71), ("PSRAW", 0xe1), ("PSRLD", 0x72) + , ("PSRLD", 0xd2), ("PSRLDQ", 0x73), ("PSRLQ", 0x73), ("PSRLQ", 0xd3) + , ("PSRLW", 0x71), ("PSRLW", 0xd1), ("PSUBB", 0xf8), ("PSUBD", 0xfa) + , ("PSUBQ", 0xfb), ("PSUBSB", 0xe8), ("PSUBSW", 0xe9), ("PSUBUSB", 0xd8) + , ("PSUBUSW", 0xd9), ("PSUBW", 0xf9), ("PTEST", 0x17), ("PUNPCKHBW", 0x68) + , ("PUNPCKHDQ", 0x6a), ("PUNPCKHQDQ", 0x6d), ("PUNPCKHWD", 0x69) + , ("PUNPCKLBW", 0x60), ("PUNPCKLDQ", 0x62), ("PUNPCKLQDQ", 0x6c) + , ("PUNPCKLWD", 0x61), ("PUSH", 0x50), ("PUSH", 0x51), ("PUSH", 0x52) + , ("PUSH", 0x53), ("PUSH", 0x54), ("PUSH", 0x55), ("PUSH", 0x56) + , ("PUSH", 0x57), ("PUSH", 0x68), ("PUSH", 0x6a), ("PUSH", 0xff) + , ("PXOR", 0xef), ("REP_MOVSB", 0xa4), ("REP_MOVSD", 0xa5) + , ("REP_MOVSW", 0xa5), ("REP_STOSB", 0xaa), ("REP_STOSD", 0xab) + , ("REP_STOSW", 0xab), ("ROL", 0xc0), ("ROL", 0xc1), ("ROL", 0xd0) + , ("ROL", 0xd1), ("ROL", 0xd2), ("ROL", 0xd3), ("ROR", 0xc0), ("ROR", 0xc1) + , ("ROR", 0xd0), ("ROR", 0xd1), ("ROR", 0xd2), ("ROR", 0xd3), ("RORX", 0xf0) + , ("SAR", 0xc0), ("SAR", 0xc1), ("SAR", 0xd0), ("SAR", 0xd1), ("SAR", 0xd2) + , ("SAR", 0xd3), ("SBB", 0x18), ("SBB", 0x19), ("SBB", 0x1a), ("SBB", 0x1b) + , ("SBB", 0x1c), ("SBB", 0x1d), ("SBB", 0x80), ("SBB", 0x81), ("SBB", 0x82) + , ("SBB", 0x83), ("SETB", 0x92), ("SETBE", 0x96), ("SETL", 0x9c) + , ("SETLE", 0x9e), ("SETNB", 0x93), ("SETNBE", 0x97), ("SETNL", 0x9d) + , ("SETNLE", 0x9f), ("SETNO", 0x91), ("SETNP", 0x9b), ("SETNS", 0x99) + , ("SETNZ", 0x95), ("SETO", 0x90), ("SETP", 0x9a), ("SETS", 0x98) + , ("SETZ", 0x94), ("SHA1MSG1", 0xc9), ("SHA1MSG2", 0xca), ("SHA1NEXTE", 0xc8) + , ("SHA1RNDS4", 0xcc), ("SHA256MSG1", 0xcc), ("SHA256MSG2", 0xcd) + , ("SHA256RNDS2", 0xcb), ("SHL", 0xc0), ("SHL", 0xc1), ("SHL", 0xd0) + , ("SHL", 0xd1), ("SHL", 0xd2), ("SHL", 0xd3), ("SHLD", 0x24), ("SHLD", 0xa4) + , ("SHLD", 0xa5), ("SHLX", 0xf7), ("SHR", 0xc0), ("SHR", 0xc1), ("SHR", 0xd0) + , ("SHR", 0xd1), ("SHR", 0xd2), ("SHR", 0xd3), ("SHRD", 0x2c), ("SHRD", 0xac) + , ("SHRD", 0xad), ("SHRX", 0xf7), ("SUB", 0x28), ("SUB", 0x29), ("SUB", 0x2a) + , ("SUB", 0x2b), ("SUB", 0x2c), ("SUB", 0x2d), ("SUB", 0x80), ("SUB", 0x81) + , ("SUB", 0x82), ("SUB", 0x83), ("TEST", 0x84), ("TEST", 0x85) + , ("TEST", 0xa8), ("TEST", 0xa9), ("TEST", 0xf6), ("TEST", 0xf7) + , ("VAESDEC", 0xde), ("VAESDECLAST", 0xdf), ("VAESENC", 0xdc) + , ("VAESENCLAST", 0xdd), ("VAESIMC", 0xdb), ("VAESKEYGENASSIST", 0xdf) + , ("VALIGND", 0x03), ("VALIGNQ", 0x03), ("VBLENDMPD", 0x65) + , ("VBLENDMPS", 0x65), ("VBROADCASTF128", 0x1a), ("VBROADCASTF32X2", 0x19) + , ("VBROADCASTF32X4", 0x1a), ("VBROADCASTF32X8", 0x1b) + , ("VBROADCASTF64X2", 0x1a), ("VBROADCASTF64X4", 0x1b) + , ("VBROADCASTI128", 0x5a), ("VBROADCASTI32X2", 0x59) + , ("VBROADCASTI32X4", 0x5a), ("VBROADCASTI32X8", 0x5b) + , ("VBROADCASTI64X2", 0x5a), ("VBROADCASTI64X4", 0x5b) + , ("VBROADCASTSD", 0x19), ("VBROADCASTSS", 0x18), ("VCOMPRESSPD", 0x8a) + , ("VCOMPRESSPS", 0x8a), ("VDBPSADBW", 0x42), ("VEXPANDPD", 0x88) + , ("VEXPANDPS", 0x88), ("VEXTRACTF128", 0x19), ("VEXTRACTF32X4", 0x19) + , ("VEXTRACTF32X8", 0x1b), ("VEXTRACTF64X2", 0x19), ("VEXTRACTF64X4", 0x1b) + , ("VEXTRACTI128", 0x39), ("VEXTRACTI32X4", 0x39), ("VEXTRACTI32X8", 0x3b) + , ("VEXTRACTI64X2", 0x39), ("VEXTRACTI64X4", 0x3b) + , ("VGF2P8AFFINEINVQB", 0xcf), ("VGF2P8AFFINEQB", 0xce), ("VGF2P8MULB", 0xcf) + , ("VINSERTF128", 0x18), ("VINSERTF32X4", 0x18), ("VINSERTF32X8", 0x1a) + , ("VINSERTF64X2", 0x18), ("VINSERTF64X4", 0x1a), ("VINSERTI128", 0x38) + , ("VINSERTI32X4", 0x38), ("VINSERTI32X8", 0x3a), ("VINSERTI64X2", 0x38) + , ("VINSERTI64X4", 0x3a), ("VLDDQU", 0xf0), ("VMOVD", 0x6e), ("VMOVD", 0x7e) + , ("VMOVDDUP", 0x12), ("VMOVDQA", 0x6f), ("VMOVDQA", 0x7f) + , ("VMOVDQA32", 0x6f), ("VMOVDQA32", 0x7f), ("VMOVDQA64", 0x6f) + , ("VMOVDQA64", 0x7f), ("VMOVDQU", 0x6f), ("VMOVDQU", 0x7f) + , ("VMOVDQU16", 0x6f), ("VMOVDQU16", 0x7f), ("VMOVDQU32", 0x6f) + , ("VMOVDQU32", 0x7f), ("VMOVDQU64", 0x6f), ("VMOVDQU64", 0x7f) + , ("VMOVDQU8", 0x6f), ("VMOVDQU8", 0x7f), ("VMOVNTDQ", 0xe7) + , ("VMOVNTDQA", 0x2a), ("VMOVQ", 0x6e), ("VMOVQ", 0x7e), ("VMOVQ", 0xd6) + , ("VMOVSD", 0x10), ("VMOVSD", 0x11), ("VMOVSHDUP", 0x16) + , ("VMOVSLDUP", 0x12), ("VMPSADBW", 0x42), ("VPABSB", 0x1c), ("VPABSD", 0x1e) + , ("VPABSQ", 0x1f), ("VPABSW", 0x1d), ("VPACKSSDW", 0x6b) + , ("VPACKSSWB", 0x63), ("VPACKUSDW", 0x2b), ("VPACKUSWB", 0x67) + , ("VPADDB", 0xfc), ("VPADDD", 0xfe), ("VPADDQ", 0xd4), ("VPADDSB", 0xec) + , ("VPADDSW", 0xed), ("VPADDUSB", 0xdc), ("VPADDUSW", 0xdd), ("VPADDW", 0xfd) + , ("VPALIGNR", 0x0f), ("VPAND", 0xdb), ("VPANDD", 0xdb), ("VPANDN", 0xdf) + , ("VPANDND", 0xdf), ("VPANDNQ", 0xdf), ("VPANDQ", 0xdb), ("VPAVGB", 0xe0) + , ("VPAVGW", 0xe3), ("VPBLENDD", 0x02), ("VPBLENDMB", 0x66) + , ("VPBLENDMD", 0x64), ("VPBLENDMQ", 0x64), ("VPBLENDMW", 0x66) + , ("VPBLENDVB", 0x4c), ("VPBLENDW", 0x0e), ("VPBROADCASTB", 0x78) + , ("VPBROADCASTB", 0x7a), ("VPBROADCASTD", 0x58), ("VPBROADCASTD", 0x7c) + , ("VPBROADCASTMB2Q", 0x2a), ("VPBROADCASTMW2D", 0x3a) + , ("VPBROADCASTQ", 0x59), ("VPBROADCASTQ", 0x7c), ("VPBROADCASTW", 0x79) + , ("VPBROADCASTW", 0x7b), ("VPCLMULQDQ", 0x44), ("VPCMPB", 0x3f) + , ("VPCMPEQB", 0x74), ("VPCMPEQD", 0x76), ("VPCMPEQQ", 0x29) + , ("VPCMPEQW", 0x75), ("VPCMPGTB", 0x64), ("VPCMPGTD", 0x66) + , ("VPCMPGTQ", 0x37), ("VPCMPGTW", 0x65), ("VPCMPQ", 0x1f), ("VPCMPUB", 0x3e) + , ("VPCMPUD", 0x1e), ("VPCMPUQ", 0x1e), ("VPCMPUW", 0x3e), ("VPCMPW", 0x3f) + , ("VPERM2F128", 0x06), ("VPERM2I128", 0x46), ("VPERMD", 0x36) + , ("VPERMI2D", 0x76), ("VPERMI2PD", 0x77), ("VPERMI2PS", 0x77) + , ("VPERMI2Q", 0x76), ("VPERMI2W", 0x75), ("VPERMILPD", 0x05) + , ("VPERMILPD", 0x0d), ("VPERMILPS", 0x04), ("VPERMILPS", 0x0c) + , ("VPERMPD", 0x01), ("VPERMPD", 0x16), ("VPERMPS", 0x16), ("VPERMQ", 0x00) + , ("VPERMQ", 0x36), ("VPERMT2D", 0x7e), ("VPERMT2PD", 0x7f) + , ("VPERMT2PS", 0x7f), ("VPERMT2Q", 0x7e), ("VPERMT2W", 0x7d) + , ("VPERMW", 0x8d), ("VPEXTRB", 0x14), ("VPEXTRD", 0x16), ("VPEXTRQ", 0x16) + , ("VPEXTRW", 0x15), ("VPEXTRW", 0xc5), ("VPHADDD", 0x02), ("VPHADDSW", 0x03) + , ("VPHADDW", 0x01), ("VPHMINPOSUW", 0x41), ("VPHSUBD", 0x06) + , ("VPHSUBSW", 0x07), ("VPHSUBW", 0x05), ("VPINSRB", 0x20), ("VPINSRD", 0x22) + , ("VPINSRQ", 0x22), ("VPINSRW", 0xc4), ("VPLZCNTD", 0x44) + , ("VPLZCNTQ", 0x44), ("VPMADD52HUQ", 0xb5), ("VPMADD52LUQ", 0xb4) + , ("VPMADDUBSW", 0x04), ("VPMADDWD", 0xf5), ("VPMAXSB", 0x3c) + , ("VPMAXSQ", 0x3d), ("VPMAXSW", 0xee), ("VPMAXUB", 0xde), ("VPMAXUD", 0x3f) + , ("VPMAXUQ", 0x3f), ("VPMAXUW", 0x3e), ("VPMINSB", 0x38), ("VPMINSQ", 0x39) + , ("VPMINSW", 0xea), ("VPMINUB", 0xda), ("VPMINUD", 0x3b), ("VPMINUQ", 0x3b) + , ("VPMINUW", 0x3a), ("VPMOVB2M", 0x29), ("VPMOVD2M", 0x39) + , ("VPMOVDB", 0x31), ("VPMOVDW", 0x33), ("VPMOVM2B", 0x28) + , ("VPMOVM2D", 0x38), ("VPMOVM2Q", 0x38), ("VPMOVM2W", 0x28) + , ("VPMOVMSKB", 0xd7), ("VPMOVQ2M", 0x39), ("VPMOVQB", 0x32) + , ("VPMOVQD", 0x35), ("VPMOVQW", 0x34), ("VPMOVSDB", 0x21) + , ("VPMOVSDW", 0x23), ("VPMOVSQB", 0x22), ("VPMOVSQD", 0x25) + , ("VPMOVSQW", 0x24), ("VPMOVSWB", 0x20), ("VPMOVSXBD", 0x21) + , ("VPMOVSXBQ", 0x22), ("VPMOVSXBW", 0x20), ("VPMOVSXDQ", 0x25) + , ("VPMOVSXWD", 0x23), ("VPMOVSXWQ", 0x24), ("VPMOVUSDB", 0x11) + , ("VPMOVUSDW", 0x13), ("VPMOVUSQB", 0x12), ("VPMOVUSQD", 0x15) + , ("VPMOVUSQW", 0x14), ("VPMOVUSWB", 0x10), ("VPMOVW2M", 0x29) + , ("VPMOVWB", 0x30), ("VPMOVZXBD", 0x31), ("VPMOVZXBQ", 0x32) + , ("VPMOVZXBW", 0x30), ("VPMOVZXDQ", 0x35), ("VPMOVZXWD", 0x33) + , ("VPMOVZXWQ", 0x34), ("VPMULDQ", 0x28), ("VPMULHRSW", 0x0b) + , ("VPMULHUW", 0xe4), ("VPMULHW", 0xe5), ("VPMULLD", 0x40), ("VPMULLQ", 0x40) + , ("VPMULLW", 0xd5), ("VPMULUDQ", 0xf4), ("VPOR", 0xeb), ("VPORD", 0xeb) + , ("VPORQ", 0xeb), ("VPROLD", 0x72), ("VPROLQ", 0x72), ("VPROLVD", 0x15) + , ("VPROLVQ", 0x15), ("VPRORD", 0x72), ("VPRORQ", 0x72), ("VPRORVD", 0x14) + , ("VPRORVQ", 0x14), ("VPSADBW", 0xf6), ("VPSHLDD", 0x71), ("VPSHLDQ", 0x71) + , ("VPSHLDVD", 0x71), ("VPSHLDVQ", 0x71), ("VPSHLDVW", 0x70) + , ("VPSHLDW", 0x70), ("VPSHRDD", 0x73), ("VPSHRDQ", 0x73), ("VPSHRDVD", 0x73) + , ("VPSHRDVQ", 0x73), ("VPSHRDVW", 0x72), ("VPSHRDW", 0x72) + , ("VPSHUFB", 0x00), ("VPSHUFD", 0x70), ("VPSHUFHW", 0x70) + , ("VPSHUFLW", 0x70), ("VPSIGNB", 0x08), ("VPSIGND", 0x0a), ("VPSIGNW", 0x09) + , ("VPSLLD", 0x72), ("VPSLLD", 0xf2), ("VPSLLDQ", 0x73), ("VPSLLQ", 0x73) + , ("VPSLLQ", 0xf3), ("VPSLLVD", 0x47), ("VPSLLVQ", 0x47), ("VPSLLVW", 0x12) + , ("VPSLLW", 0x71), ("VPSLLW", 0xf1), ("VPSRAD", 0x72), ("VPSRAD", 0xe2) + , ("VPSRAQ", 0x72), ("VPSRAQ", 0xe2), ("VPSRAVD", 0x46), ("VPSRAVQ", 0x46) + , ("VPSRAVW", 0x11), ("VPSRAW", 0x71), ("VPSRAW", 0xe1), ("VPSRLD", 0x72) + , ("VPSRLD", 0xd2), ("VPSRLDQ", 0x73), ("VPSRLQ", 0x73), ("VPSRLQ", 0xd3) + , ("VPSRLVD", 0x45), ("VPSRLVQ", 0x45), ("VPSRLVW", 0x10), ("VPSRLW", 0x71) + , ("VPSRLW", 0xd1), ("VPSUBB", 0xf8), ("VPSUBD", 0xfa), ("VPSUBQ", 0xfb) + , ("VPSUBSB", 0xe8), ("VPSUBSW", 0xe9), ("VPSUBUSB", 0xd8) + , ("VPSUBUSW", 0xd9), ("VPSUBW", 0xf9), ("VPTERNLOGD", 0x25) + , ("VPTERNLOGQ", 0x25), ("VPTEST", 0x17), ("VPTESTMB", 0x26) + , ("VPTESTMD", 0x27), ("VPTESTMQ", 0x27), ("VPTESTMW", 0x26) + , ("VPTESTNMB", 0x26), ("VPTESTNMD", 0x27), ("VPTESTNMQ", 0x27) + , ("VPTESTNMW", 0x26), ("VPUNPCKHBW", 0x68), ("VPUNPCKHDQ", 0x6a) + , ("VPUNPCKHQDQ", 0x6d), ("VPUNPCKHWD", 0x69), ("VPUNPCKLBW", 0x60) + , ("VPUNPCKLDQ", 0x62), ("VPUNPCKLQDQ", 0x6c), ("VPUNPCKLWD", 0x61) + , ("VPXOR", 0xef), ("VPXORD", 0xef), ("VPXORQ", 0xef), ("VSHUFF32X4", 0x23) + , ("VSHUFF64X2", 0x23), ("VSHUFI32X4", 0x43), ("VSHUFI64X2", 0x43) + , ("VZEROALL", 0x77), ("VZEROUPPER", 0x77), ("XOR", 0x30), ("XOR", 0x31) + , ("XOR", 0x32), ("XOR", 0x33), ("XOR", 0x34), ("XOR", 0x35), ("XOR", 0x80) + , ("XOR", 0x81), ("XOR", 0x82), ("XOR", 0x83), ("XORPS", 0x57) + ] diff --git a/lib/Vestigia/Contract/Types.hs b/lib/Vestigia/Contract/Types.hs @@ -0,0 +1,57 @@ +{-# OPTIONS_HADDOCK prune #-} + +-- | +-- Module: Vestigia.Contract.Types +-- Copyright: (c) 2026 Jared Tobin +-- License: MIT +-- Maintainer: Jared Tobin <jared@ppad.tech> +-- +-- What a contract's table says of an AArch64 encoding. + +module Vestigia.Contract.Types ( + Operand(..) + , Status(..) + , Encoding(..) + ) where + +import qualified Data.Text as T +import Data.Word (Word32) + +-- | A source register an encoding names, by the field it is read +-- from: a general-purpose register at 64 or 32 bits (field value +-- 31 the zero register, or the stack pointer where the encoding +-- says so), a SIMD&FP register at a fixed width, a vector whose +-- width is the encoding's Q bit (bit 30), or a SIMD&FP register +-- read whole where nothing fixes its width. +data Operand = + OpX + | OpXSp + | OpW + | OpWSp + | OpQ + | OpD + | OpS + | OpH + | OpB + | OpV + | OpVWhole + deriving (Eq, Show) + +-- | An encoding the contract covers; one it does not that is control +-- flow or system, which reads no data the contract speaks to; or one +-- it does not, with its source registers, each by the low bit of its +-- field. +data Status = + Covered + | Control + | Outside ![(Int, Operand)] + deriving (Eq, Show) + +-- | An encoding, by its name in the specification, its fixed bits, +-- and what the contract says of it. +data Encoding = Encoding { + enName :: !T.Text + , enMask :: !Word32 + , enValue :: !Word32 + , enStatus :: !Status + } deriving (Eq, Show) diff --git a/lib/Vestigia/Diff.hs b/lib/Vestigia/Diff.hs @@ -63,6 +63,13 @@ -- runs that never reached it. Whether two runs -- that differed there both had their secrets accepted is the -- reader's to say, from what each run returned. +-- +-- Runs recorded under a data-independent-timing contract +-- (Vestigia.Contract) also fingerprint the operands of every +-- instruction outside it. One run equally often on other operands +-- in some declared run is outside the contract on the secret: not an +-- origin, since the contract says nothing either way of its time, +-- but reported beside them, as is how many such instructions ran. module Vestigia.Diff ( Insn(..) @@ -96,6 +103,7 @@ import qualified Data.Text.Encoding.Error as TEE import Numeric (readHex, showHex) import Text.Read (readMaybe) +import Vestigia.Contract (contractSource, readContract) import Vestigia.Json import Vestigia.Symbol (Place(..)) @@ -137,6 +145,15 @@ data Dump = Dump { , dpContexts :: !(M.Map Integer (Integer, Integer)) , dpCallers :: !(M.Map Integer (Bool, [Integer])) , dpRun :: !(Maybe Run) + -- | the operands, fingerprinted, of the instructions outside the + -- contract the run was recorded under + , dpOutside :: !(M.Map Integer T.Text) + -- | the text of each instruction the watch list named + , dpTexts :: !(M.Map Integer T.Text) + -- | the guest's ISA, and the contract, as `vestigia record` + -- appends them + , dpIsa :: !(Maybe T.Text) + , dpContract :: !(Maybe T.Text) } deriving (Eq, Show) -- | Read a plugin dump. A dump in which no instruction ran records @@ -147,11 +164,13 @@ data Dump = Dump { -- program's own. The record `vestigia record` appends (an @A@ line -- per argument, its bytes in hex; @N@, the environment's variables -- and bytes, in hex; @X@, the exit status, in decimal) is read --- whole or not at all. +-- whole or not at all. Beside it, @M@ names the guest's ISA and @G@ +-- the contract the run was recorded under. readDump :: T.Text -> Either String Dump readDump t = do d <- foldM line (Dump M.empty M.empty S.empty M.empty M.empty M.empty - Nothing, [], Nothing, Nothing) (T.lines t) + Nothing M.empty M.empty Nothing Nothing, [], Nothing + , Nothing) (T.lines t) let (dump, as, env, st) = d cx = dpContexts dump unless (any ((> 0) . inCount) (M.elems (dpInsns dump))) $ @@ -187,6 +206,16 @@ readDump t = do k <- unhex pc pure (d { dpOperands = M.insert k fp (dpOperands d) }, as, env , st) + [ "U", pc, fp ] -> do + k <- unhex pc + pure (d { dpOutside = M.insert k fp (dpOutside d) }, as, env + , st) + ("W" : pc : text@(_ : _)) -> do + k <- unhex pc + pure (d { dpTexts = M.insert k (T.unwords text) (dpTexts d) }, as + , env, st) + [ "M", isa ] -> pure (d { dpIsa = Just isa }, as, env, st) + [ "G", c ] -> pure (d { dpContract = Just c }, as, env, st) [ "C", c, caller, call ] -> do v <- (,) <$> unhex caller <*> unhex call k <- unhex c @@ -324,6 +353,20 @@ data Divergence = Divergence { -- in the declared and designed runs, at most 16 of them, and -- whether there were more than those , dvCallers :: !(M.Map Integer ([[(Maybe T.Text, Integer)]], Bool)) + -- | the instructions outside the contract run equally often in + -- every declared run, on other operands in one, each with the + -- runs alike there and those that never ran it + , dvOutside :: ![Insn] + , dvOutsideBehaviour :: !(M.Map Integer ([[Int]], [Int])) + -- | the instructions outside the contract some run executed, by + -- object + , dvWatched :: !(M.Map T.Text (S.Set Integer)) + -- | the text of each instruction the watch list named + , dvTexts :: !(M.Map Integer T.Text) + -- | the guest's ISA and the contract, as the declared runs name + -- them + , dvIsa :: !(Maybe T.Text) + , dvContract :: !(Maybe T.Text) } deriving (Eq, Show) -- | Compare runs, uncontrolled. @@ -361,9 +404,36 @@ diffDesigned cs ds xs = Divergence { , inCount i > 0 , Just obj <- [ inObject i ] ] , dvCallers = M.fromList - [ (inPc i, callersAt (inPc i)) | (_, i) <- origins ] + [ (inPc i, callersAt (inPc i)) + | i <- fmap snd origins <> outside ] + , dvOutside = outside + , dvOutsideBehaviour = M.fromList + [ ( inPc i + , ( classes (==) [ (k, M.lookup (inPc i) (dpOutside d)) + | (k, d) <- ranIn' ds (inPc i) ] + , [ k | (k, d) <- zip [ 0 .. ] ds + , maybe True ((== 0) . inCount) + (M.lookup (inPc i) (dpInsns d)) ] ) ) + | i <- outside ] + , dvWatched = M.fromListWith S.union + [ (obj, S.singleton (inOffset i)) + | d <- ds <> xs <> cs + , pc <- M.keys (dpOutside d) + , Just i <- [ M.lookup pc (dpInsns d) ] + , inCount i > 0 + , Just obj <- [ inObject i ] ] + , dvTexts = M.unions (fmap dpTexts (ds <> xs <> cs)) + , dvIsa = case ds of + (d : _) -> dpIsa d + [] -> Nothing + , dvContract = case ds of + (d : _) -> dpContract d + [] -> Nothing } where + ranIn' rs pc = [ (k, d) | (k, d) <- zip [ 0 .. ] rs + , Just i <- [ M.lookup pc (dpInsns d) ] + , inCount i > 0 ] callersAt pc = let found = [ (partial, fmap (callsOf d) ks) | d <- runs @@ -384,7 +454,8 @@ diffDesigned cs ds xs = Divergence { ta = M.lookup pc (dpTransfers a) tb = M.lookup pc (dpTransfers b) , fmap sig ia /= fmap sig ib || ta /= tb - || M.lookup pc (dpOperands a) /= M.lookup pc (dpOperands b) ] + || M.lookup pc (dpOperands a) /= M.lookup pc (dpOperands b) + || M.lookup pc (dpOutside a) /= M.lookup pc (dpOutside b) ] sig i = (inCount i, inFingerprint i, inOrder i) origins = [ o | o@(_, i) <- controls <> addresses <> operands @@ -467,10 +538,11 @@ diffDesigned cs ds xs = Divergence { -- the address and operand origins dataPcs = S.fromList [ inPc i | (_, i) <- addresses <> operands ] downstream = - (((pcs `S.difference` steady) - `S.union` (divergentPcs `S.intersection` returns)) - `S.difference` controlPcs) - `S.difference` dataPcs + ((((pcs `S.difference` steady) + `S.union` (divergentPcs `S.intersection` returns)) + `S.difference` controlPcs) + `S.difference` dataPcs) + `S.difference` S.fromList (fmap inPc outside) controls = [ (ControlOrigin, i) @@ -486,6 +558,20 @@ diffDesigned cs ds xs = Divergence { , Just i <- [ firstInsn pc ] , inAccesses i > 0 ] + -- an instruction outside the contract run equally often in + -- every declared run, on other operands in one, where it is not + -- an origin already + outside = + [ i + | pc <- S.toAscList steadyDeclared + , not (pc `S.member` unsteady) + , not (pc `S.member` controlPcs) + , not (pc `S.member` dataPcs) + , let fps = [ M.lookup pc (dpOutside d) | d <- ds ] + , any (/= Nothing) fps + , not (alike fps) + , Just i <- [ firstInsn pc ] ] + -- a division run equally often in every declared run, on other -- operands in one operands = @@ -506,6 +592,9 @@ restrictTo ps dv , dvDownstream = filter (inside . inObject) (dvDownstream dv) , dvExecuted = M.filterWithKey (\o _ -> inside (Just o)) (dvExecuted dv) + , dvOutside = filter (inside . inObject) (dvOutside dv) + , dvWatched = M.filterWithKey (\o _ -> inside (Just o)) + (dvWatched dv) } where inside mo = case mo of @@ -518,19 +607,29 @@ originText o = case o of AddressOrigin -> "address" OperandOrigin -> "operand" --- | The report: @vestigia/diff-v3@. Runs are given the declared, +-- | The report: @vestigia/diff-v4@. Runs are given the declared, -- then the designed, then the controls, and an origin names the -- runs alike at it by the first two. An origin's stacks are its own -- frames then its calls', innermost first, each frame with the -- object and address of the instruction it names, as memcheck's --- are in a taint report. +-- are in a taint report. The ISA and contract the runs were +-- recorded under head it; the instructions outside the contract +-- whose operands differed are given as origins are, and those that +-- ran, by object, as what was executed is. divergenceJson :: T.Text -> [Named] -> M.Map (T.Text, Integer) [Place] -> Divergence -> Value divergenceJson version runs places dv = Object - [ ("schema", String "vestigia/diff-v3") + [ ("schema", String "vestigia/diff-v4") , ("tool", Object [ ("name", String "vestigia") , ("version", String version) ]) + , ("isa", maybe Null String (dvIsa dv)) + , ("contract", case dvContract dv of + Just n -> Object + [ ("name", String n) + , ("source", maybe Null (String . contractSource) + (readContract n)) ] + Nothing -> Null) , ("runs", Array [ Object [ ("name", String (nmName r)) @@ -547,28 +646,18 @@ divergenceJson version runs places dv = Object , ("operand", count OperandOrigin) , ("downstream", Number (toInteger (length (dvDownstream dv)))) , ("unsteady", Number (toInteger (length (dvUnsteady dv)))) + , ("outside", Number (toInteger (length (dvOutside dv)))) + , ("watched", Number (toInteger (sum (fmap S.size + (M.elems (dvWatched dv)))))) ]) , ("origins", Array - [ Object $ - [ ("class", String (originText o)) - , ("pc", String (hex (inPc i))) - , ("object", maybe Null String (inObject i)) - , ("offset", String (hex (inOffset i))) - , ("count", Number (inCount i)) - , ("frames", Array (fmap placeJson (placesOf i))) - , ("stacks", Array - [ Array (located (inObject i, inOffset i) - <> concatMap located calls) - | calls <- stacks ]) - , ("partial", Bool partial) - , ("groups", Array (fmap (Array . fmap named) groups)) - , ("absent", Array (fmap named absent)) - ] - | (o, i) <- dvOrigins dv - , let (groups, absent) = M.findWithDefault ([], []) (o, inPc i) - (dvBehaviour dv) - (stacks, partial) = M.findWithDefault ([], False) (inPc i) - (dvCallers dv) ]) + [ site (originText o) i + (M.findWithDefault ([], []) (o, inPc i) (dvBehaviour dv)) + | (o, i) <- dvOrigins dv ]) + , ("outside", Array + [ site "outside" i + (M.findWithDefault ([], []) (inPc i) (dvOutsideBehaviour dv)) + | i <- dvOutside dv ]) , ("downstream", Object [ (obj, Array (fmap (String . hex) (S.toAscList offs))) | (obj, offs) <- M.toList (M.fromListWith S.union @@ -578,8 +667,31 @@ divergenceJson version runs places dv = Object , ("executed", Object [ (o, Array (fmap (String . hex) (S.toAscList xs))) | (o, xs) <- M.toList (dvExecuted dv) ]) + , ("watched", Object + [ (o, Array (fmap (String . hex) (S.toAscList xs))) + | (o, xs) <- M.toList (dvWatched dv) ]) ] where + site cls i (groups, absent) = + let (stacks, partial) = M.findWithDefault ([], False) (inPc i) + (dvCallers dv) + in Object + [ ("class", String cls) + , ("pc", String (hex (inPc i))) + , ("object", maybe Null String (inObject i)) + , ("offset", String (hex (inOffset i))) + , ("count", Number (inCount i)) + , ("instruction", maybe Null String + (M.lookup (inPc i) (dvTexts dv))) + , ("frames", Array (fmap placeJson (placesOf i))) + , ("stacks", Array + [ Array (located (inObject i, inOffset i) + <> concatMap located calls) + | calls <- stacks ]) + , ("partial", Bool partial) + , ("groups", Array (fmap (Array . fmap named) groups)) + , ("absent", Array (fmap named absent)) + ] names = [ nmName r | r <- runs, nmKind r /= ControlRun ] kindText k = case k of DeclaredRun -> "declared" @@ -623,12 +735,13 @@ divergenceSummary :: M.Map (T.Text, Integer) [Place] -> Divergence -> T.Text divergenceSummary places dv = T.unlines $ [ T.intercalate " " - [ originText o + [ cls , hex (inOffset i) , maybe "?" id (plFunction =<< innermost i) , maybe "?" location (innermost i) , maybe "-" base (inObject i) ] - | (o, i) <- dvOrigins dv ] + | (cls, i) <- [ (originText o, i) | (o, i) <- dvOrigins dv ] + <> [ ("outside", i) | i <- dvOutside dv ] ] <> [ T.pack (show (length (dvOrigins dv))) <> " origin(s) over " <> T.pack (show (dvRuns dv)) <> " run(s)" <> (if dvDesigned dv == 0 then "" @@ -638,8 +751,15 @@ divergenceSummary places dv = T.unlines $ <> " instruction(s) downstream; " <> T.pack (show (length (dvUnsteady dv))) <> " unsteady over " <> T.pack (show (dvControls dv)) - <> " control(s)" ] + <> " control(s)" + <> maybe "" + (\c -> "; " <> T.pack (show watched) + <> " instruction(s) outside " <> c <> " ran, " + <> T.pack (show (length (dvOutside dv))) + <> " on operands that differed") + (dvContract dv) ] where + watched = sum (fmap S.size (M.elems (dvWatched dv))) innermost i = case inObject i of Just obj -> case M.findWithDefault [] (obj, inOffset i) places of (p : _) -> Just p diff --git a/nix/lib.nix b/nix/lib.nix @@ -67,6 +67,8 @@ let "${plugin}/lib/libvestigia-qemu.so" "--set-default VESTIGIA_ADDR2LINE" "${pkgs.llvm}/bin/llvm-addr2line" + "--set-default VESTIGIA_OBJDUMP" + "${pkgs.llvm}/bin/llvm-objdump" ])} ln -s ${include}/include $out/include ''; @@ -111,16 +113,26 @@ let # without the secret is set aside rather than taken for it. # `designed` runs, aimed at particular paths, are compared beside # them for control and coverage but not for addresses (vestigia - # diff --designed). A run's own failure leaves its status; a dump - # vestigia cannot read fails the build. - diffOf = { name, harness, runs, objects ? [ ], designed ? [ ] }: + # diff --designed). Under a `contract` (arm-dit or intel-doitm, the + # harness's ISA's), every run also fingerprints the operands of the + # instructions outside it in `objects` (vestigia record --contract). + # A run's own failure leaves its status; a dump vestigia cannot read + # fails the build. + diffOf = { name, harness, runs, objects ? [ ], designed ? [ ] + , contract ? null }: + let + watch = lib.optionalString (contract != null) + ("--contract ${lib.escapeShellArg contract} " + + lib.concatMapStrings (o: "--object ${lib.escapeShellArg o} ") + objects); + in pkgs.runCommand "vestigia-diff-${name}" { } '' mkdir -p $out start=$(date +%s%N) ${lib.concatImapStrings (k: args: '' set +e ${vestigia}/bin/vestigia record --dump $out/dump-${toString k} \ - -- ${harness} ${lib.escapeShellArgs args} \ + ${watch}-- ${harness} ${lib.escapeShellArgs args} \ > $out/stdout-${toString k} 2> $out/stderr-${toString k} echo $? > $out/status-${toString k} set -e @@ -128,7 +140,7 @@ let set +e ${vestigia}/bin/vestigia record \ --dump $out/designed-${toString k} \ - -- ${harness} ${lib.escapeShellArgs args} \ + ${watch}-- ${harness} ${lib.escapeShellArgs args} \ > $out/stdout-designed-${toString k} \ 2> $out/stderr-designed-${toString k} echo $? > $out/status-designed-${toString k} @@ -136,7 +148,7 @@ let '') designed} set +e ${vestigia}/bin/vestigia record --dump $out/control-1 \ - -- ${harness} ${lib.escapeShellArgs (builtins.head runs)} \ + ${watch}-- ${harness} ${lib.escapeShellArgs (builtins.head runs)} \ > $out/stdout-control-1 2> $out/stderr-control-1 echo $? > $out/status-control-1 set -e diff --git a/nix/probe.nix b/nix/probe.nix @@ -2,7 +2,9 @@ # site and origin it should show found where it should be, and # nothing else in the harness. On an x86_64 host, the same harness # built for aarch64 is traced differentially too, under QEMU; memcheck -# needs a native host. +# needs a native host. Each differential trace is repeated under its +# ISA's data-independent-timing contract, which finds the floating- +# point division outside it and changes no origin. { pkgs, vestigia }: let @@ -41,13 +43,16 @@ let inherit objects; }; - diffOf = name: harness: vestigia.diffOf { - inherit name objects; + diffOf = name: harness: contract: vestigia.diffOf { + inherit name objects contract; harness = "${harness}/bin/probe"; runs = map (s: [ s ]) secrets; }; - diff = diffOf "probe" probe; - diffCross = diffOf "probe-aarch64" cross; + native = if x86_64 then "intel-doitm" else "arm-dit"; + diff = diffOf "probe" probe null; + diffCross = diffOf "probe-aarch64" cross null; + diffContract = diffOf "probe-contract" probe native; + diffCrossContract = diffOf "probe-aarch64-contract" cross "arm-dit"; # each report's (class, function) pairs in the harness, sorted expected = { @@ -98,6 +103,27 @@ pkgs.runCommand "vestigia-probe-check" { '${builtins.toJSON expected.diff}' ''} + # under a contract, the floating-point division is outside it, and + # the origins are those found without one + for d in ${diffContract} ${lib.optionalString x86_64 + "${diffCrossContract}"}; do + check $d/diff.json '[.outside[] | .frames[0].function] | unique' \ + '["fpdivide"]' + check $d/diff.json \ + '[.origins[] | [.class, .frames[0].function]] | unique' \ + '${builtins.toJSON expected.diff}' + check $d/diff.json '.summary.watched > 0' 'true' + check $d/diff.json '[.outside[] | .instruction | type] | unique' \ + '["string"]' + done + check ${diffContract}/diff.json '[.contract.name, .isa]' \ + '${builtins.toJSON [ native (if x86_64 then "x86_64" else "aarch64") ]}' + check ${diff}/diff.json '.contract' 'null' + ${lib.optionalString x86_64 '' + check ${diffCrossContract}/diff.json '[.contract.name, .isa]' \ + '["arm-dit","aarch64"]' + ''} + # each origin's stack runs from its own function to the call in # main that reached it for d in ${diff} ${lib.optionalString x86_64 "${diffCross}"}; do diff --git a/plugin/vestigia-qemu.c b/plugin/vestigia-qemu.c @@ -31,12 +31,32 @@ * division) is given the contexts it ran in: the chains of calls, by * their addresses, that reached it, up to CONTEXTS of them. * + * Given a watch list (its `watch` argument, written by `vestigia + * record` under a data-independent-timing contract), it also + * fingerprints the operands of every instruction the list names: each + * one outside the contract, by its object and address there, with the + * registers it reads, fingerprinted before it runs, and any value it + * loads or stores, as it is accessed. One run as often but on other + * operands computed them from the secret. The list names divisions + * too, for their text alone: the plugin reads a division's operands + * from its bytes, as above. A list is read whole: + * + * O <object> + * D <address> <text> + * U <address> <memory> <n> <register>:<low>:<width>... <text> + * + * in hex where an address, each register by the name QEMU's debugger + * stub gives it, the bits read from its low bit; <memory> is 1 where + * the instruction names memory. + * * At exit it writes, to the file named by its `out` argument: * * I <pc> <count> <accesses> <fingerprint> <order> <object> <address> * E <from> <to> <count> * R <pc> * D <pc> <operands> + * U <pc> <operands> + * W <pc> <text> * C <context> <caller> <call> * K <pc> <partial> <context>... * @@ -67,8 +87,9 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION; -/* what an instruction is to a comparison, read from its bytes */ -enum { PLAIN, RETURN, DIVISION, CALL }; +/* what an instruction is to a comparison, read from its bytes, or + from the watch list (OUTSIDE) */ +enum { PLAIN, RETURN, DIVISION, CALL, OUTSIDE }; /* the most contexts kept for one instruction */ #define CONTEXTS 16 @@ -85,6 +106,16 @@ typedef struct Decoded { int width, a, b, high; } Decoded; +/* an instruction the watch list names */ +typedef struct Watch { + int division; /* a division, named for its text alone */ + int nregs; + char **names; /* the registers it reads, by QEMU's names */ + int *low, *width; /* the bits read of each */ + struct qemu_plugin_register **handles; + char *text; +} Watch; + typedef struct Insn { uint64_t pc; uint64_t size; @@ -94,7 +125,9 @@ typedef struct Insn { uint64_t accesses; uint64_t fingerprint; uint64_t order; /* the successors, in the order they followed */ - uint64_t operands; /* a division's operands, in order */ + uint64_t operands; /* a division's or a watched instruction's + operands, in order */ + const Watch *watch; /* where the watch list names it */ GHashTable *succ; /* target pc -> count, for transfers */ uint32_t last; /* the context it last ran in */ uint32_t contexts[CONTEXTS]; @@ -127,6 +160,10 @@ static GArray *calls; /* the calls in progress, innermost last */ static uint32_t current; /* the context the guest runs in */ static struct qemu_plugin_register *gpr[GPRS]; static GByteArray *regbuf; +static GHashTable *watches; /* "<object>\n<address>" -> Watch */ +static GHashTable *registers; /* QEMU's name -> its handle */ +static GArray *regions; /* the host's mappings, as last read */ +static GHashTable *segments; /* a file's path -> its Segments */ static const uint64_t fnv_offset = 0xcbf29ce484222325ULL; static const uint64_t fnv_prime = 0x100000001b3ULL; @@ -334,6 +371,25 @@ static void on_divide(unsigned int vcpu, void *udata) { mix(i, (read_gpr(i->d.a) >> (i->d.high ? 8 : 0)) & mask); } +/* a watched instruction: each register it reads, its bits from the + low one, mixed in eight bytes at a time */ +static void on_outside(unsigned int vcpu, void *udata) { + Insn *i = udata; + const Watch *w = i->watch; + (void)vcpu; + for (int k = 0; k < w->nregs; k++) { + int n, from = w->low[k] / 8, to = (w->low[k] + w->width[k]) / 8; + g_byte_array_set_size(regbuf, 0); + n = qemu_plugin_read_register(w->handles[k], regbuf); + if (to > n) to = n; + for (int b = from; b < to; b += 8) { + uint64_t v = 0; + memcpy(&v, regbuf->data + b, MIN((size_t)(to - b), sizeof v)); + mix(i, v); + } + } +} + static void on_mem(unsigned int vcpu, qemu_plugin_meminfo_t info, uint64_t vaddr, void *udata) { Insn *i = udata; @@ -341,7 +397,7 @@ static void on_mem(unsigned int vcpu, qemu_plugin_meminfo_t info, i->fingerprint = (i->fingerprint ^ vaddr) * fnv_prime; i->accesses++; if (i->last != current) note_context(i); - if (i->d.kind == DIVISION) { + if (i->d.kind == DIVISION || i->d.kind == OUTSIDE) { qemu_plugin_mem_value v = qemu_plugin_mem_get_value(info); switch (v.type) { case QEMU_PLUGIN_MEM_VALUE_U8: mix(i, v.data.u8); break; @@ -367,6 +423,7 @@ static void find_registers(void) { for (guint k = 0; k < rs->len; k++) { qemu_plugin_reg_descriptor *r = &g_array_index(rs, qemu_plugin_reg_descriptor, k); + g_hash_table_insert(registers, g_strdup(r->name), r->handle); for (int j = 0; j < wanted; j++) { char name[8]; if (aarch64) g_snprintf(name, sizeof name, "x%d", j); @@ -381,6 +438,28 @@ static void find_registers(void) { "which a division's operands are read\n", j); _exit(EXIT_FAILURE); } + /* every register the watch list reads, or none of the run */ + GHashTableIter it; + gpointer key, val; + g_hash_table_iter_init(&it, watches); + while (g_hash_table_iter_next(&it, &key, &val)) { + Watch *w = val; + for (int k = 0; k < w->nregs; k++) { + w->handles[k] = g_hash_table_lookup(registers, w->names[k]); + /* a CPU with SVE names its SIMD&FP registers by their scalable + views, whose low 128 bits they are */ + if (w->handles[k] == NULL && w->names[k][0] == 'v') { + char *z = g_strdup_printf("z%s", w->names[k] + 1); + w->handles[k] = g_hash_table_lookup(registers, z); + g_free(z); + } + if (w->handles[k] == NULL) { + fprintf(stderr, "vestigia-qemu: QEMU names no register %s, " + "which the watch list reads\n", w->names[k]); + _exit(EXIT_FAILURE); + } + } + } } static void on_vcpu_init(qemu_plugin_id_t id, unsigned int vcpu) { @@ -400,6 +479,8 @@ static void on_vcpu_init(qemu_plugin_id_t id, unsigned int vcpu) { } } +static const Watch *watched(uintptr_t haddr); + static void on_translate(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) { size_t n = qemu_plugin_tb_n_insns(tb); (void)id; @@ -412,12 +493,25 @@ static void on_translate(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) { (uintptr_t)qemu_plugin_insn_haddr(qi), aarch64 ? decode_aarch64(bytes, len) : decode_x86_64(bytes, len)); - if (k == n - 1 || i->d.kind == DIVISION) i->origin = 1; + /* an instruction the watch list names: a division its text, any + other its registers; one translated anew keeps what it had */ + if (i->watch == NULL && g_hash_table_size(watches) > 0) { + const Watch *w = watched(i->haddr); + if (w != NULL && (i->d.kind == DIVISION || !w->division)) { + i->watch = w; + if (i->d.kind != DIVISION) i->d.kind = OUTSIDE; + } + } + if (k == n - 1 || i->d.kind == DIVISION || i->d.kind == OUTSIDE) + i->origin = 1; qemu_plugin_register_vcpu_insn_exec_cb(qi, on_exec, QEMU_PLUGIN_CB_NO_REGS, i); if (i->d.kind == DIVISION) qemu_plugin_register_vcpu_insn_exec_cb(qi, on_divide, QEMU_PLUGIN_CB_R_REGS, i); + else if (i->d.kind == OUTSIDE) + qemu_plugin_register_vcpu_insn_exec_cb(qi, on_outside, + QEMU_PLUGIN_CB_R_REGS, i); qemu_plugin_register_vcpu_mem_cb(qi, on_mem, QEMU_PLUGIN_CB_NO_REGS, QEMU_PLUGIN_MEM_RW, i); } @@ -527,6 +621,110 @@ static gboolean address_in(const Segments *s, uint64_t off, return FALSE; } +/* the watch list's entry for the instruction at a host address: its + file and address there, the mappings read anew where the address + lies in none known */ +static const Watch *watched(uintptr_t haddr) { + const Region *r = region_of(regions, haddr); + Segments *s; + uint64_t addr; + if (r == NULL) { + for (guint k = 0; k < regions->len; k++) + g_free(g_array_index(regions, Region, k).path); + g_array_free(regions, TRUE); + regions = read_maps(); + r = region_of(regions, haddr); + } + if (r == NULL) return NULL; + s = segments_of(segments, r->path); + if (s == NULL + || !address_in(s, (uint64_t)(haddr - r->start) + r->offset, &addr)) + return NULL; + char *key = g_strdup_printf("%s\n%" PRIx64, r->path, addr); + const Watch *w = g_hash_table_lookup(watches, key); + g_free(key); + return w; +} + +/* read a watch list whole; a line it cannot read stops the run */ +static gboolean read_watches(const char *path) { + gchar *text = NULL; + gchar *object = NULL; + if (!g_file_get_contents(path, &text, NULL, NULL)) { + fprintf(stderr, "vestigia-qemu: cannot read the watch list %s\n", + path); + return FALSE; + } + gchar **lines = g_strsplit(text, "\n", -1); + gboolean ok = TRUE; + for (gchar **l = lines; ok && *l != NULL; l++) { + gchar *line = *l; + if (line[0] == '\0') continue; + if (line[0] == 'O' && line[1] == ' ') { + g_free(object); + object = g_strdup(line + 2); + continue; + } + if (object == NULL || (line[0] != 'D' && line[0] != 'U') + || line[1] != ' ') { + ok = FALSE; + break; + } + char *p = line + 2, *end; + uint64_t addr = g_ascii_strtoull(p, &end, 16); + Watch *w = g_new0(Watch, 1); + if (end == p || *end != ' ') ok = FALSE; + p = end + 1; + if (ok && line[0] == 'D') + w->division = 1; + else if (ok) { + /* <memory> <n> then n registers */ + if ((p[0] != '0' && p[0] != '1') || p[1] != ' ') ok = FALSE; + p += 2; + w->nregs = ok ? (int)g_ascii_strtoll(p, &end, 10) : 0; + if (end == p || *end != ' ' || w->nregs < 0 || w->nregs > 16) + ok = FALSE; + p = end + 1; + w->names = g_new0(char *, w->nregs); + w->low = g_new0(int, w->nregs); + w->width = g_new0(int, w->nregs); + w->handles = g_new0(struct qemu_plugin_register *, w->nregs); + for (int k = 0; ok && k < w->nregs; k++) { + char *sp = strchr(p, ' '); + if (sp == NULL) { + ok = FALSE; + break; + } + gchar *spec = g_strndup(p, (gsize)(sp - p)); + gchar **f = g_strsplit(spec, ":", 3); + g_free(spec); + if (g_strv_length(f) != 3) ok = FALSE; + else { + w->names[k] = g_strdup(f[0]); + w->low[k] = atoi(f[1]); + w->width[k] = atoi(f[2]); + if (w->low[k] % 8 != 0 || w->width[k] % 8 != 0 + || w->width[k] <= 0) + ok = FALSE; + } + g_strfreev(f); + p = sp + 1; + } + } + if (!ok) break; + w->text = g_strdup(p); + g_hash_table_insert(watches, + g_strdup_printf("%s\n%" PRIx64, object, addr), w); + } + if (!ok) + fprintf(stderr, "vestigia-qemu: %s: an unreadable watch list\n", + path); + g_strfreev(lines); + g_free(object); + g_free(text); + return ok; +} + static void at_exit(qemu_plugin_id_t id, void *p) { (void)id; (void)p; @@ -558,6 +756,10 @@ static void at_exit(qemu_plugin_id_t id, void *p) { if (i->d.kind == RETURN) fprintf(out, "R %" PRIx64 "\n", i->pc); if (i->d.kind == DIVISION) fprintf(out, "D %" PRIx64 " %016" PRIx64 "\n", i->pc, i->operands); + if (i->d.kind == OUTSIDE) + fprintf(out, "U %" PRIx64 " %016" PRIx64 "\n", i->pc, i->operands); + if (i->watch != NULL) + fprintf(out, "W %" PRIx64 " %s\n", i->pc, i->watch->text); if (i->ncontexts > 0) { fprintf(out, "K %" PRIx64 " %d", i->pc, i->partial); for (int k = 0; k < i->ncontexts; k++) @@ -582,16 +784,25 @@ static void at_exit(qemu_plugin_id_t id, void *p) { QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info, int argc, char **argv) { + const char *watch_path = NULL; aarch64 = strcmp(info->target_name, "aarch64") == 0; for (int k = 0; k < argc; k++) if (strncmp(argv[k], "out=", 4) == 0) out_path = g_strdup(argv[k] + 4); + else if (strncmp(argv[k], "watch=", 6) == 0) + watch_path = argv[k] + 6; if (out_path == NULL) { fprintf(stderr, "vestigia-qemu: an out=FILE argument is needed\n"); return -1; } insns = g_hash_table_new(g_int64_hash, g_int64_equal); regbuf = g_byte_array_new(); + watches = g_hash_table_new(g_str_hash, g_str_equal); + registers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, + NULL); + regions = g_array_new(FALSE, FALSE, sizeof(Region)); + segments = g_hash_table_new(g_str_hash, g_str_equal); + if (watch_path != NULL && !read_watches(watch_path)) return -1; contexts = g_array_new(FALSE, FALSE, sizeof(Context)); interned = g_hash_table_new_full(context_hash, context_equal, g_free, NULL); diff --git a/test/Main.hs b/test/Main.hs @@ -12,6 +12,7 @@ import qualified Data.Text.Encoding as TE import Test.Tasty import Test.Tasty.HUnit +import Vestigia.Contract import Vestigia.Diff import Vestigia.Json import Vestigia.Memcheck @@ -24,6 +25,7 @@ main = defaultMain $ testGroup "vestigia" [ xmlTests , memcheckTests , traceTests + , contractTests , diffTests , symbolTests , jsonTests @@ -142,6 +144,94 @@ traceTests = testGroup "trace" fmap fst (trUnrelated tr) @?= [ 0 ] ] +contractTests :: TestTree +contractTests = testGroup "contract" + [ testCase "AArch64: a division, and what DIT covers" $ do + classify ArmDit (word 0x1ac20820) @?= Division -- udiv w0 + classify ArmDit (word 0x9ac20c20) @?= Division -- sdiv x0 + classify ArmDit (word 0x8b020020) @?= Inside -- add x0 + classify ArmDit (word 0x9bc27c20) @?= Inside -- umulh x0 + classify ArmDit (word 0xdac00c20) @?= Inside -- rev x0 + classify ArmDit (word 0xd65f03c0) @?= Excluded -- ret + classify ArmDit (word 0x90000420) @?= Excluded -- adrp x0 + + , testCase "AArch64: outside DIT, with the registers read" $ do + -- fdiv d0, d1, d2 + classify ArmDit (word 0x1e621820) + @?= Watched [ Register "v1" 0 64, Register "v2" 0 64 ] False + -- fmov x0, d1 + classify ArmDit (word 0x9e660020) + @?= Watched [ Register "v1" 0 64 ] False + -- fadd v0.4s, v1.4s, v2.4s, and its 64-bit arrangement + classify ArmDit (word 0x4e22d420) + @?= Watched [ Register "v1" 0 128, Register "v2" 0 128 ] False + classify ArmDit (word 0x0e22d420) + @?= Watched [ Register "v1" 0 64, Register "v2" 0 64 ] False + + , testCase "x86_64: a division, and what DOITM covers" $ do + classify IntelDoitm (x86 [ 0x48, 0xf7, 0xf6 ] "div" "rsi") + @?= Division + classify IntelDoitm (x86 [ 0xc1, 0xc0, 0x07 ] "rol" "eax, 0x7") + @?= Inside + classify IntelDoitm (x86 [ 0x48, 0x0f, 0xc8 ] "bswap" "rax") + @?= Inside + classify IntelDoitm (x86 [ 0x48, 0x0f, 0x44, 0xc3 ] "cmove" + "rax, rbx") @?= Inside + classify IntelDoitm (x86 [ 0x48, 0xb8, 1, 0, 0, 0, 0, 0, 0, 0 ] + "movabs" "rax, 0x1") @?= Inside + classify IntelDoitm (x86 [ 0xc5, 0xf5, 0xd4, 0xc2 ] "vpaddq" + "ymm0, ymm1, ymm2") @?= Inside + classify IntelDoitm (x86 [ 0x75, 0x02 ] "jne" "0x10") @?= Excluded + classify IntelDoitm (x86 [ 0x90 ] "nop" "") @?= Excluded + + , testCase "x86_64: outside DOITM, with the registers read" $ do + -- popcnt only writes its destination + classify IntelDoitm (x86 [ 0xf3, 0x48, 0x0f, 0xb8, 0xc3 ] "popcnt" + "rax, rbx") + @?= Watched [ Register "rbx" 0 64 ] False + classify IntelDoitm (x86 [ 0x92 ] "xchg" "eax, edx") + @?= Watched [ Register "rax" 0 32, Register "rdx" 0 32 ] False + -- a legacy SSE division reads its destination too + classify IntelDoitm (x86 [ 0xf2, 0x0f, 0x5e, 0xc1 ] "divsd" + "xmm0, xmm1") + @?= Watched [ Register "xmm0" 0 128, Register "xmm1" 0 128 ] False + classify IntelDoitm (x86 [ 0x98 ] "cwde" "") + @?= Watched [ Register "rax" 0 16 ] False + -- a memory operand's registers are its address's, not its data + classify IntelDoitm (x86 [ 0x0f, 0x54, 0x07 ] "andps" + "xmm0, xmmword ptr [rdi]") + @?= Watched [ Register "xmm0" 0 128 ] True + + , testCase "llvm-objdump's lines are read" $ do + readDisassembly (T.unlines + [ "0000000000001000 <f>:" + , " 1000: 48 89 e5 \tmov\trbp, rsp" + , " 1003: f3 48 ab \trep\t\tstosq\tqword \ + \ptr es:[rdi], rax" + , " 1006: 48 8b 05 4d b5 06 00 \tmov\trax, qword ptr \ + \[rip + 0x6b54d] # 0x86d58 <x>" + , "\t\t..." + , " 1b824: 9112a000 \tadd\tx0, x0, #0x4a8" ]) + @?= [ Line 0x1000 [ 0x48, 0x89, 0xe5 ] [] "mov" "rbp, rsp" + , Line 0x1003 [ 0xf3, 0x48, 0xab ] [ "rep" ] "stosq" + "qword ptr es:[rdi], rax" + , Line 0x1006 [ 0x48, 0x8b, 0x05, 0x4d, 0xb5, 0x06, 0x00 ] [] + "mov" "rax, qword ptr [rip + 0x6b54d]" + , Line 0x1b824 [ 0x9112a000 ] [] "add" "x0, x0, #0x4a8" ] + + , testCase "the watch list names what lies outside" $ + watchSection IntelDoitm "/lib.so" + [ x86 [ 0x48, 0xf7, 0xf6 ] "div" "rsi" + , x86 [ 0x48, 0x01, 0xd8 ] "add" "rax, rbx" + , x86 [ 0x92 ] "xchg" "eax, edx" ] + @?= T.unlines + [ "O /lib.so", "D 0 div rsi" + , "U 0 0 2 rax:0:32 rdx:0:32 xchg eax, edx" ] + ] + where + word w = Line 0 [ w ] [] "" "" + x86 bs m ops = Line 0 bs [] m ops + diffTests :: TestTree diffTests = testGroup "diff" [ testCase "a dump reads whole" $ do @@ -299,6 +389,36 @@ diffTests = testGroup "diff" -- a control dividing other operands sets it apart as unsteady fmap inPc (dvUnsteady (diffControlled [ x ] [ a, b ])) @?= [ 0x40 ] + , testCase "an instruction outside the contract is reported apart" $ do + -- 0x40 runs once in every run, outside the contract, on other + -- operands in B; 0x30 is watched too, on the same operands + let under d = d <> "U 30 7777\nW 30 popcnt rax, rbx\nU 40 " + a <- either assertFailure pure + (readDump (under dumpA <> "1111\nM x86_64\nG intel-doitm\n")) + b <- either assertFailure pure + (readDump (under dumpB <> "2222\nM x86_64\nG intel-doitm\n")) + x <- either assertFailure pure + (readDump (under dumpA <> "3333\nM x86_64\nG intel-doitm\n")) + dpIsa a @?= Just "x86_64" + dpContract a @?= Just "intel-doitm" + M.lookup 0x30 (dpTexts a) @?= Just "popcnt rax, rbx" + let dv = diffDumps [ a, b ] + -- not an origin: the contract says nothing either way of it + fmap (\(o, i) -> (o, inPc i)) (dvOrigins dv) + @?= [ (ControlOrigin, 0x10), (AddressOrigin, 0x20) ] + fmap inPc (dvOutside dv) @?= [ 0x40 ] + M.lookup 0x40 (dvOutsideBehaviour (diffDumps [ a, b, a ])) + @?= Just ([ [ 0, 2 ], [ 1 ] ], []) + dvWatched dv @?= M.fromList [ ("/lib.so", S.fromList [ 0x30, 0x40 ]) ] + notElem 0x40 (fmap inPc (dvDownstream dv)) @? "downstream" + -- runs alike in their operands show nothing outside + dvOutside (diffDumps [ a, a ]) @?= [] + -- a control on other operands sets it apart as unsteady + dvOutside (diffControlled [ x ] [ a, b ]) @?= [] + fmap inPc (dvUnsteady (diffControlled [ x ] [ a, b ])) @?= [ 0x40 ] + -- and the objects kept are the objects reported + dvOutside (restrictTo [ "/other.so" ] dv) @?= [] + , testCase "an origin is given the calls that reached it" $ do -- 0x10 ran in context 2 (the call at 0x40 made in context 1, -- the call at 0x30 made in the program's own) in A, and in the diff --git a/vestigia.cabal b/vestigia.cabal @@ -29,7 +29,11 @@ library c-sources: cbits/norandom.c exposed-modules: - Vestigia.Diff + Vestigia.Contract + , Vestigia.Contract.Arm + , Vestigia.Contract.Intel + , Vestigia.Contract.Types + , Vestigia.Diff , Vestigia.Json , Vestigia.Layout , Vestigia.Memcheck