xref: /aosp_15_r20/external/vixl/README.md (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf EbrahimiVIXL: ARMv8 Runtime Code Generation Library
2*f5c631daSSadaf Ebrahimi===========================================
3*f5c631daSSadaf Ebrahimi
4*f5c631daSSadaf EbrahimiContents:
5*f5c631daSSadaf Ebrahimi
6*f5c631daSSadaf Ebrahimi * Overview
7*f5c631daSSadaf Ebrahimi * Licence
8*f5c631daSSadaf Ebrahimi * Requirements
9*f5c631daSSadaf Ebrahimi * Known limitations
10*f5c631daSSadaf Ebrahimi * Bug reports
11*f5c631daSSadaf Ebrahimi * Usage
12*f5c631daSSadaf Ebrahimi
13*f5c631daSSadaf Ebrahimi
14*f5c631daSSadaf EbrahimiOverview
15*f5c631daSSadaf Ebrahimi========
16*f5c631daSSadaf Ebrahimi
17*f5c631daSSadaf EbrahimiVIXL contains three components.
18*f5c631daSSadaf Ebrahimi
19*f5c631daSSadaf Ebrahimi 1. Programmatic **assemblers** to generate A64, A32 or T32 code at runtime. The
20*f5c631daSSadaf Ebrahimi    assemblers abstract some of the constraints of each ISA; for example, most
21*f5c631daSSadaf Ebrahimi    instructions support any immediate.
22*f5c631daSSadaf Ebrahimi 2. **Disassemblers** that can print any instruction emitted by the assemblers.
23*f5c631daSSadaf Ebrahimi 3. A **simulator** that can simulate any instruction emitted by the A64
24*f5c631daSSadaf Ebrahimi    assembler. The simulator allows generated code to be run on another
25*f5c631daSSadaf Ebrahimi    architecture without the need for a full ISA model.
26*f5c631daSSadaf Ebrahimi
27*f5c631daSSadaf EbrahimiThe VIXL git repository can be found [on GitHub][vixl].
28*f5c631daSSadaf Ebrahimi
29*f5c631daSSadaf EbrahimiBuild and Test Status
30*f5c631daSSadaf Ebrahimi---------------------
31*f5c631daSSadaf Ebrahimi
32*f5c631daSSadaf Ebrahimi  * [![Build Status](https://ci.linaro.org/buildStatus/icon?job=linaro-art-vixlpresubmit)](https://ci.linaro.org/job/linaro-art-vixlpresubmit/) Simulator
33*f5c631daSSadaf Ebrahimi  * [![Build Status](https://ci.linaro.org/buildStatus/icon?job=linaro-art-vixlpresubmit-native-armv8)](https://ci.linaro.org/job/linaro-art-vixlpresubmit-native-armv8/) Native
34*f5c631daSSadaf Ebrahimi  * [![Build Status](https://ci.linaro.org/buildStatus/icon?job=linaro-art-vixlpresubmit-macos)](https://ci.linaro.org/job/linaro-art-vixlpresubmit-macos/) MacOS
35*f5c631daSSadaf Ebrahimi
36*f5c631daSSadaf Ebrahimi
37*f5c631daSSadaf EbrahimiLicence
38*f5c631daSSadaf Ebrahimi=======
39*f5c631daSSadaf Ebrahimi
40*f5c631daSSadaf EbrahimiThis software is covered by the licence described in the [LICENCE](LICENCE)
41*f5c631daSSadaf Ebrahimifile.
42*f5c631daSSadaf Ebrahimi
43*f5c631daSSadaf EbrahimiContributions, as pull requests or via other means, are accepted under the terms
44*f5c631daSSadaf Ebrahimiof the same [LICENCE](LICENCE).
45*f5c631daSSadaf Ebrahimi
46*f5c631daSSadaf EbrahimiRequirements
47*f5c631daSSadaf Ebrahimi============
48*f5c631daSSadaf Ebrahimi
49*f5c631daSSadaf EbrahimiTo build VIXL the following software is required:
50*f5c631daSSadaf Ebrahimi
51*f5c631daSSadaf Ebrahimi 1. Python 2.7
52*f5c631daSSadaf Ebrahimi 2. SCons 2.0
53*f5c631daSSadaf Ebrahimi 3. GCC 4.8+ or Clang 4.0+
54*f5c631daSSadaf Ebrahimi
55*f5c631daSSadaf EbrahimiA 64-bit host machine is required, implementing an LP64 data model. VIXL has
56*f5c631daSSadaf Ebrahimibeen tested using GCC on AArch64 Debian, GCC and Clang on amd64 Ubuntu
57*f5c631daSSadaf Ebrahimisystems.
58*f5c631daSSadaf Ebrahimi
59*f5c631daSSadaf EbrahimiTo run the linter and code formatting stages of the tests, the following
60*f5c631daSSadaf Ebrahimisoftware is also required:
61*f5c631daSSadaf Ebrahimi
62*f5c631daSSadaf Ebrahimi 1. Git
63*f5c631daSSadaf Ebrahimi 2. [Google's `cpplint.py`][cpplint]
64*f5c631daSSadaf Ebrahimi 3. clang-format-4.0
65*f5c631daSSadaf Ebrahimi 4. clang-tidy-4.0
66*f5c631daSSadaf Ebrahimi
67*f5c631daSSadaf EbrahimiRefer to the 'Usage' section for details.
68*f5c631daSSadaf Ebrahimi
69*f5c631daSSadaf EbrahimiNote that in Ubuntu 18.04, clang-tidy-4.0 will only work if the clang-4.0
70*f5c631daSSadaf Ebrahimipackage is also installed.
71*f5c631daSSadaf Ebrahimi
72*f5c631daSSadaf EbrahimiSupported Arm Architecture Features
73*f5c631daSSadaf Ebrahimi===================================
74*f5c631daSSadaf Ebrahimi
75*f5c631daSSadaf Ebrahimi| Feature    | VIXL CPUFeatures Flag | Notes                           |
76*f5c631daSSadaf Ebrahimi|------------|-----------------------|---------------------------------|
77*f5c631daSSadaf Ebrahimi| BTI        | kBTI                  | Per-page enabling not supported |
78*f5c631daSSadaf Ebrahimi| DotProd    | kDotProduct           |                                 |
79*f5c631daSSadaf Ebrahimi| FCMA       | kFcma                 |                                 |
80*f5c631daSSadaf Ebrahimi| FHM        | kFHM                  |                                 |
81*f5c631daSSadaf Ebrahimi| FP16       | kFPHalf, kNEONHalf    |                                 |
82*f5c631daSSadaf Ebrahimi| FRINTTS    | kFrintToFixedSizedInt |                                 |
83*f5c631daSSadaf Ebrahimi| FlagM      | kFlagM                |                                 |
84*f5c631daSSadaf Ebrahimi| FlagM2     | kAXFlag               |                                 |
85*f5c631daSSadaf Ebrahimi| I8MM       | kI8MM                 |                                 |
86*f5c631daSSadaf Ebrahimi| JSCVT      | kJSCVT                |                                 |
87*f5c631daSSadaf Ebrahimi| LOR        | kLORegions            |                                 |
88*f5c631daSSadaf Ebrahimi| LRCPC      | kRCpc                 |                                 |
89*f5c631daSSadaf Ebrahimi| LRCPC2     | kRCpcImm              |                                 |
90*f5c631daSSadaf Ebrahimi| LSE        | kAtomics              |                                 |
91*f5c631daSSadaf Ebrahimi| PAuth      | kPAuth, kPAuthGeneric | Not ERETAA, ERETAB              |
92*f5c631daSSadaf Ebrahimi| RAS        | kRAS                  |                                 |
93*f5c631daSSadaf Ebrahimi| RDM        | kRDM                  |                                 |
94*f5c631daSSadaf Ebrahimi| SVE        | kSVE                  |                                 |
95*f5c631daSSadaf Ebrahimi| SVE2       | kSVE2                 |                                 |
96*f5c631daSSadaf Ebrahimi| SVEBitPerm | kSVEBitPerm           |                                 |
97*f5c631daSSadaf Ebrahimi| SVEF32MM   | kSVEF32MM             |                                 |
98*f5c631daSSadaf Ebrahimi| SVEF64MM   | kSVEF64MM             |                                 |
99*f5c631daSSadaf Ebrahimi| SVEI8MM    | kSVEI8MM              |                                 |
100*f5c631daSSadaf Ebrahimi
101*f5c631daSSadaf EbrahimiEnable generating code for an architecture feature by combining a flag with
102*f5c631daSSadaf Ebrahimithe MacroAssembler's defaults. For example, to generate code for SVE, use
103*f5c631daSSadaf Ebrahimi`masm.GetCPUFeatures()->Combine(CPUFeatures::kSVE);`.
104*f5c631daSSadaf Ebrahimi
105*f5c631daSSadaf EbrahimiSee [the cpu features header file](src/cpu-features.h) for more information.
106*f5c631daSSadaf Ebrahimi
107*f5c631daSSadaf Ebrahimi
108*f5c631daSSadaf EbrahimiKnown Limitations
109*f5c631daSSadaf Ebrahimi=================
110*f5c631daSSadaf Ebrahimi
111*f5c631daSSadaf EbrahimiVIXL was developed for JavaScript engines so a number of features from A64 were
112*f5c631daSSadaf Ebrahimideemed unnecessary:
113*f5c631daSSadaf Ebrahimi
114*f5c631daSSadaf Ebrahimi * Limited rounding mode support for floating point.
115*f5c631daSSadaf Ebrahimi * Limited support for synchronisation instructions.
116*f5c631daSSadaf Ebrahimi * Limited support for system instructions.
117*f5c631daSSadaf Ebrahimi * A few miscellaneous integer and floating point instructions are missing.
118*f5c631daSSadaf Ebrahimi
119*f5c631daSSadaf EbrahimiThe VIXL simulator supports only those instructions that the VIXL assembler can
120*f5c631daSSadaf Ebrahimigenerate. The `doc` directory contains a
121*f5c631daSSadaf Ebrahimi[list of supported A64 instructions](doc/aarch64/supported-instructions-aarch64.md).
122*f5c631daSSadaf Ebrahimi
123*f5c631daSSadaf EbrahimiThe VIXL simulator was developed to run on 64-bit amd64 platforms. Whilst it
124*f5c631daSSadaf Ebrahimibuilds and mostly works for 32-bit x86 platforms, there are a number of
125*f5c631daSSadaf Ebrahimifloating-point operations which do not work correctly, and a number of tests
126*f5c631daSSadaf Ebrahimifail as a result.
127*f5c631daSSadaf Ebrahimi
128*f5c631daSSadaf EbrahimiDebug Builds
129*f5c631daSSadaf Ebrahimi------------
130*f5c631daSSadaf Ebrahimi
131*f5c631daSSadaf EbrahimiYour project's build system must define `VIXL_DEBUG` (eg. `-DVIXL_DEBUG`)
132*f5c631daSSadaf Ebrahimiwhen using a VIXL library that has been built with debug enabled.
133*f5c631daSSadaf Ebrahimi
134*f5c631daSSadaf EbrahimiSome classes defined in VIXL header files contain fields that are only present
135*f5c631daSSadaf Ebrahimiin debug builds, so if `VIXL_DEBUG` is defined when the library is built, but
136*f5c631daSSadaf Ebrahiminot defined for the header files included in your project, you will see runtime
137*f5c631daSSadaf Ebrahimifailures.
138*f5c631daSSadaf Ebrahimi
139*f5c631daSSadaf EbrahimiExclusive-Access Instructions
140*f5c631daSSadaf Ebrahimi-----------------------------
141*f5c631daSSadaf Ebrahimi
142*f5c631daSSadaf EbrahimiAll exclusive-access instructions are supported, but the simulator cannot
143*f5c631daSSadaf Ebrahimiaccurately simulate their behaviour as described in the ARMv8 Architecture
144*f5c631daSSadaf EbrahimiReference Manual.
145*f5c631daSSadaf Ebrahimi
146*f5c631daSSadaf Ebrahimi * A local monitor is simulated, so simulated exclusive loads and stores execute
147*f5c631daSSadaf Ebrahimi   as expected in a single-threaded environment.
148*f5c631daSSadaf Ebrahimi * The global monitor is simulated by occasionally causing exclusive-access
149*f5c631daSSadaf Ebrahimi   instructions to fail regardless of the local monitor state.
150*f5c631daSSadaf Ebrahimi * Load-acquire, store-release semantics are approximated by issuing a host
151*f5c631daSSadaf Ebrahimi   memory barrier after loads or before stores. The built-in
152*f5c631daSSadaf Ebrahimi   `__sync_synchronize()` is used for this purpose.
153*f5c631daSSadaf Ebrahimi
154*f5c631daSSadaf EbrahimiThe simulator tries to be strict, and implements the following restrictions that
155*f5c631daSSadaf Ebrahimithe ARMv8 ARM allows:
156*f5c631daSSadaf Ebrahimi
157*f5c631daSSadaf Ebrahimi * A pair of load-/store-exclusive instructions will only succeed if they have
158*f5c631daSSadaf Ebrahimi   the same address and access size.
159*f5c631daSSadaf Ebrahimi * Most of the time, cache-maintenance operations or explicit memory accesses
160*f5c631daSSadaf Ebrahimi   will clear the exclusive monitor.
161*f5c631daSSadaf Ebrahimi    * To ensure that simulated code does not depend on this behaviour, the
162*f5c631daSSadaf Ebrahimi      exclusive monitor will sometimes be left intact after these instructions.
163*f5c631daSSadaf Ebrahimi
164*f5c631daSSadaf EbrahimiInstructions affected by these limitations:
165*f5c631daSSadaf Ebrahimi  `stxrb`, `stxrh`, `stxr`, `ldxrb`, `ldxrh`, `ldxr`, `stxp`, `ldxp`, `stlxrb`,
166*f5c631daSSadaf Ebrahimi  `stlxrh`, `stlxr`, `ldaxrb`, `ldaxrh`, `ldaxr`, `stlxp`, `ldaxp`, `stlrb`,
167*f5c631daSSadaf Ebrahimi  `stlrh`, `stlr`, `ldarb`, `ldarh`, `ldar`, `clrex`.
168*f5c631daSSadaf Ebrahimi
169*f5c631daSSadaf EbrahimiSecurity Considerations
170*f5c631daSSadaf Ebrahimi-----------------------
171*f5c631daSSadaf Ebrahimi
172*f5c631daSSadaf EbrahimiVIXL allows callers to generate any code they want. The generated code is
173*f5c631daSSadaf Ebrahimiarbitrary, and can therefore call back into any other component in the process.
174*f5c631daSSadaf EbrahimiAs with any self-modifying code, vulnerabilities in the client or in VIXL itself
175*f5c631daSSadaf Ebrahimicould lead to arbitrary code generation.
176*f5c631daSSadaf Ebrahimi
177*f5c631daSSadaf EbrahimiFor performance reasons, VIXL's Assembler only performs debug-mode checking of
178*f5c631daSSadaf Ebrahimiinstruction operands (such as immediate field encodability). This can minimise
179*f5c631daSSadaf Ebrahimicode-generation overheads for advanced compilers that already model instructions
180*f5c631daSSadaf Ebrahimiaccurately, and might consider the Assembler's checks to be redundant. The
181*f5c631daSSadaf EbrahimiAssembler should only be used directly where encodability is independently
182*f5c631daSSadaf Ebrahimichecked, and where fine control over all generated code is required.
183*f5c631daSSadaf Ebrahimi
184*f5c631daSSadaf EbrahimiThe MacroAssembler synthesises multiple-instruction sequences to support _some_
185*f5c631daSSadaf Ebrahimiunencodable operand combinations. The MacroAssembler can provide a useful safety
186*f5c631daSSadaf Ebrahimicheck in cases where the Assembler's precision is not required; an unexpected
187*f5c631daSSadaf Ebrahimiunencodable operand should result in a macro with the correct behaviour, rather
188*f5c631daSSadaf Ebrahimithan an invalid instruction.
189*f5c631daSSadaf Ebrahimi
190*f5c631daSSadaf EbrahimiIn general, the MacroAssembler handles operands which are likely to vary with
191*f5c631daSSadaf Ebrahimiuser-supplied data, but does not usually handle inputs which are likely to be
192*f5c631daSSadaf Ebrahimieasily covered by tests. For example, move-immediate arguments are likely to be
193*f5c631daSSadaf Ebrahimidata-dependent, but register types (e.g. `x` vs `w`) are not.
194*f5c631daSSadaf Ebrahimi
195*f5c631daSSadaf EbrahimiWe recommend that _all_ users use the MacroAssembler, using `ExactAssemblyScope`
196*f5c631daSSadaf Ebrahimito invoke the Assembler when specific instruction sequences are required. This
197*f5c631daSSadaf Ebrahimiapproach is recommended even in cases where a compiler can model the
198*f5c631daSSadaf Ebrahimiinstructions precisely, because, subject to the limitations described above, it
199*f5c631daSSadaf Ebrahimioffers an additional layer of protection against logic bugs in instruction
200*f5c631daSSadaf Ebrahimiselection.
201*f5c631daSSadaf Ebrahimi
202*f5c631daSSadaf EbrahimiBug reports
203*f5c631daSSadaf Ebrahimi===========
204*f5c631daSSadaf Ebrahimi
205*f5c631daSSadaf EbrahimiBug reports may be made in the Issues section of GitHub, or sent to
206*f5c631daSSadaf Ebrahimi[email protected]. Please provide any steps required to recreate a bug, along with
207*f5c631daSSadaf Ebrahimibuild environment and host system information.
208*f5c631daSSadaf Ebrahimi
209*f5c631daSSadaf EbrahimiUsage
210*f5c631daSSadaf Ebrahimi=====
211*f5c631daSSadaf Ebrahimi
212*f5c631daSSadaf EbrahimiRunning all Tests
213*f5c631daSSadaf Ebrahimi-----------------
214*f5c631daSSadaf Ebrahimi
215*f5c631daSSadaf EbrahimiThe helper script `tools/test.py` will build and run every test that is provided
216*f5c631daSSadaf Ebrahimiwith VIXL, in both release and debug mode. It is a useful script for verifying
217*f5c631daSSadaf Ebrahimithat all of VIXL's dependencies are in place and that VIXL is working as it
218*f5c631daSSadaf Ebrahimishould.
219*f5c631daSSadaf Ebrahimi
220*f5c631daSSadaf EbrahimiBy default, the `tools/test.py` script runs a linter to check that the source
221*f5c631daSSadaf Ebrahimicode conforms with the code style guide, and to detect several common errors
222*f5c631daSSadaf Ebrahimithat the compiler may not warn about. This is most useful for VIXL developers.
223*f5c631daSSadaf EbrahimiThe linter has the following dependencies:
224*f5c631daSSadaf Ebrahimi
225*f5c631daSSadaf Ebrahimi 1. Git must be installed, and the VIXL project must be in a valid Git
226*f5c631daSSadaf Ebrahimi    repository, such as one produced using `git clone`.
227*f5c631daSSadaf Ebrahimi 2. `cpplint.py`, [as provided by Google][cpplint], must be available (and
228*f5c631daSSadaf Ebrahimi    executable) on the `PATH`.
229*f5c631daSSadaf Ebrahimi
230*f5c631daSSadaf EbrahimiIt is possible to tell `tools/test.py` to skip the linter stage by passing
231*f5c631daSSadaf Ebrahimi`--nolint`. This removes the dependency on `cpplint.py` and Git. The `--nolint`
232*f5c631daSSadaf Ebrahimioption is implied if the VIXL project is a snapshot (with no `.git` directory).
233*f5c631daSSadaf Ebrahimi
234*f5c631daSSadaf EbrahimiAdditionally, `tools/test.py` tests code formatting using `clang-format-4.0`,
235*f5c631daSSadaf Ebrahimiand performs static analysis using `clang-tidy-4.0`. If you don't have these
236*f5c631daSSadaf Ebrahimitools, disable the test using `--noclang-format` or `--noclang-tidy`,
237*f5c631daSSadaf Ebrahimirespectively.
238*f5c631daSSadaf Ebrahimi
239*f5c631daSSadaf EbrahimiAlso note that the tests for the tracing features depend upon external `diff`
240*f5c631daSSadaf Ebrahimiand `sed` tools. If these tools are not available in `PATH`, these tests will
241*f5c631daSSadaf Ebrahimifail.
242*f5c631daSSadaf Ebrahimi
243*f5c631daSSadaf EbrahimiGetting Started
244*f5c631daSSadaf Ebrahimi---------------
245*f5c631daSSadaf Ebrahimi
246*f5c631daSSadaf EbrahimiWe have separate guides for introducing VIXL, depending on what architecture you
247*f5c631daSSadaf Ebrahimiare targeting. A guide for working with AArch32 can be found
248*f5c631daSSadaf Ebrahimi[here][getting-started-aarch32], while the AArch64 guide is
249*f5c631daSSadaf Ebrahimi[here][getting-started-aarch64]. Example source code is provided in the
250*f5c631daSSadaf Ebrahimi[examples](examples) directory. You can build examples with either `scons
251*f5c631daSSadaf Ebrahimiaarch32_examples` or `scons aarch64_examples` from the root directory, or use
252*f5c631daSSadaf Ebrahimi`scons --help` to get a detailed list of available build targets.
253*f5c631daSSadaf Ebrahimi
254*f5c631daSSadaf Ebrahimi
255*f5c631daSSadaf Ebrahimi
256*f5c631daSSadaf Ebrahimi
257*f5c631daSSadaf Ebrahimi[cpplint]: https://github.com/google/styleguide/tree/gh-pages/cpplint
258*f5c631daSSadaf Ebrahimi           "Google's cpplint.py script."
259*f5c631daSSadaf Ebrahimi
260*f5c631daSSadaf Ebrahimi[vixl]: https://github.com/Linaro/vixl
261*f5c631daSSadaf Ebrahimi        "The VIXL repository on GitHub."
262*f5c631daSSadaf Ebrahimi
263*f5c631daSSadaf Ebrahimi[getting-started-aarch32]: doc/aarch32/getting-started-aarch32.md
264*f5c631daSSadaf Ebrahimi                           "Introduction to VIXL for AArch32."
265*f5c631daSSadaf Ebrahimi
266*f5c631daSSadaf Ebrahimi[getting-started-aarch64]: doc/aarch64/getting-started-aarch64.md
267*f5c631daSSadaf Ebrahimi                           "Introduction to VIXL for AArch64."
268