mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			187 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| VIXL: Armv8 Runtime Code Generation Library, 3.0.0
 | |
| ==================================================
 | |
| 
 | |
| Contents:
 | |
| 
 | |
|  * Overview
 | |
|  * Licence
 | |
|  * Requirements
 | |
|  * Known limitations
 | |
|  * Usage
 | |
| 
 | |
| 
 | |
| Overview
 | |
| ========
 | |
| 
 | |
| VIXL contains three components.
 | |
| 
 | |
|  1. Programmatic **assemblers** to generate A64, A32 or T32 code at runtime. The
 | |
|     assemblers abstract some of the constraints of each ISA; for example, most
 | |
|     instructions support any immediate.
 | |
|  2. **Disassemblers** that can print any instruction emitted by the assemblers.
 | |
|  3. A **simulator** that can simulate any instruction emitted by the A64
 | |
|     assembler. The simulator allows generated code to be run on another
 | |
|     architecture without the need for a full ISA model.
 | |
| 
 | |
| The VIXL git repository can be found [on 'https://git.linaro.org'][vixl].
 | |
| 
 | |
| Changes from previous versions of VIXL can be found in the
 | |
| [Changelog](doc/changelog.md).
 | |
| 
 | |
| 
 | |
| Licence
 | |
| =======
 | |
| 
 | |
| This software is covered by the licence described in the [LICENCE](LICENCE)
 | |
| file.
 | |
| 
 | |
| 
 | |
| Requirements
 | |
| ============
 | |
| 
 | |
| To build VIXL the following software is required:
 | |
| 
 | |
|  1. Python 2.7
 | |
|  2. SCons 2.0
 | |
|  3. GCC 4.8+ or Clang 3.4+
 | |
| 
 | |
| A 64-bit host machine is required, implementing an LP64 data model. VIXL has
 | |
| been tested using GCC on AArch64 Debian, GCC and Clang on amd64 Ubuntu
 | |
| systems.
 | |
| 
 | |
| To run the linter and code formatting stages of the tests, the following
 | |
| software is also required:
 | |
| 
 | |
|  1. Git
 | |
|  2. [Google's `cpplint.py`][cpplint]
 | |
|  3. clang-format-3.8
 | |
| 
 | |
| Refer to the 'Usage' section for details.
 | |
| 
 | |
| 
 | |
| Known Limitations for AArch64 code generation
 | |
| =============================================
 | |
| 
 | |
| VIXL was developed for JavaScript engines so a number of features from A64 were
 | |
| deemed unnecessary:
 | |
| 
 | |
|  * Limited rounding mode support for floating point.
 | |
|  * Limited support for synchronisation instructions.
 | |
|  * Limited support for system instructions.
 | |
|  * A few miscellaneous integer and floating point instructions are missing.
 | |
| 
 | |
| The VIXL simulator supports only those instructions that the VIXL assembler can
 | |
| generate. The `doc` directory contains a
 | |
| [list of supported A64 instructions](doc/aarch64/supported-instructions-aarch64.md).
 | |
| 
 | |
| The VIXL simulator was developed to run on 64-bit amd64 platforms. Whilst it
 | |
| builds and mostly works for 32-bit x86 platforms, there are a number of
 | |
| floating-point operations which do not work correctly, and a number of tests
 | |
| fail as a result.
 | |
| 
 | |
| VIXL may not build using Clang 3.7, due to a compiler warning. A workaround is
 | |
| to disable conversion of warnings to errors, or to delete the offending
 | |
| `return` statement reported and rebuild. This problem will be fixed in the next
 | |
| release.
 | |
| 
 | |
| Debug Builds
 | |
| ------------
 | |
| 
 | |
| Your project's build system must define `VIXL_DEBUG` (eg. `-DVIXL_DEBUG`)
 | |
| when using a VIXL library that has been built with debug enabled.
 | |
| 
 | |
| Some classes defined in VIXL header files contain fields that are only present
 | |
| in debug builds, so if `VIXL_DEBUG` is defined when the library is built, but
 | |
| not defined for the header files included in your project, you will see runtime
 | |
| failures.
 | |
| 
 | |
| Exclusive-Access Instructions
 | |
| -----------------------------
 | |
| 
 | |
| All exclusive-access instructions are supported, but the simulator cannot
 | |
| accurately simulate their behaviour as described in the ARMv8 Architecture
 | |
| Reference Manual.
 | |
| 
 | |
|  * A local monitor is simulated, so simulated exclusive loads and stores execute
 | |
|    as expected in a single-threaded environment.
 | |
|  * The global monitor is simulated by occasionally causing exclusive-access
 | |
|    instructions to fail regardless of the local monitor state.
 | |
|  * Load-acquire, store-release semantics are approximated by issuing a host
 | |
|    memory barrier after loads or before stores. The built-in
 | |
|    `__sync_synchronize()` is used for this purpose.
 | |
| 
 | |
| The simulator tries to be strict, and implements the following restrictions that
 | |
| the ARMv8 ARM allows:
 | |
| 
 | |
|  * A pair of load-/store-exclusive instructions will only succeed if they have
 | |
|    the same address and access size.
 | |
|  * Most of the time, cache-maintenance operations or explicit memory accesses
 | |
|    will clear the exclusive monitor.
 | |
|     * To ensure that simulated code does not depend on this behaviour, the
 | |
|       exclusive monitor will sometimes be left intact after these instructions.
 | |
| 
 | |
| Instructions affected by these limitations:
 | |
|   `stxrb`, `stxrh`, `stxr`, `ldxrb`, `ldxrh`, `ldxr`, `stxp`, `ldxp`, `stlxrb`,
 | |
|   `stlxrh`, `stlxr`, `ldaxrb`, `ldaxrh`, `ldaxr`, `stlxp`, `ldaxp`, `stlrb`,
 | |
|   `stlrh`, `stlr`, `ldarb`, `ldarh`, `ldar`, `clrex`.
 | |
| 
 | |
| 
 | |
| Usage
 | |
| =====
 | |
| 
 | |
| Running all Tests
 | |
| -----------------
 | |
| 
 | |
| The helper script `tools/test.py` will build and run every test that is provided
 | |
| with VIXL, in both release and debug mode. It is a useful script for verifying
 | |
| that all of VIXL's dependencies are in place and that VIXL is working as it
 | |
| should.
 | |
| 
 | |
| By default, the `tools/test.py` script runs a linter to check that the source
 | |
| code conforms with the code style guide, and to detect several common errors
 | |
| that the compiler may not warn about. This is most useful for VIXL developers.
 | |
| The linter has the following dependencies:
 | |
| 
 | |
|  1. Git must be installed, and the VIXL project must be in a valid Git
 | |
|     repository, such as one produced using `git clone`.
 | |
|  2. `cpplint.py`, [as provided by Google][cpplint], must be available (and
 | |
|     executable) on the `PATH`.
 | |
| 
 | |
| It is possible to tell `tools/test.py` to skip the linter stage by passing
 | |
| `--nolint`. This removes the dependency on `cpplint.py` and Git. The `--nolint`
 | |
| option is implied if the VIXL project is a snapshot (with no `.git` directory).
 | |
| 
 | |
| Additionally, `tools/test.py` tests code formatting using `clang-format-3.8`.
 | |
| If you don't have `clang-format-3.8`, disable the test using the
 | |
| `--noclang-format` option.
 | |
| 
 | |
| Also note that the tests for the tracing features depend upon external `diff`
 | |
| and `sed` tools. If these tools are not available in `PATH`, these tests will
 | |
| fail.
 | |
| 
 | |
| Getting Started
 | |
| ---------------
 | |
| 
 | |
| We have separate guides for introducing VIXL, depending on what architecture you
 | |
| are targeting. A guide for working with AArch32 can be found
 | |
| [here][getting-started-aarch32], while the AArch64 guide is
 | |
| [here][getting-started-aarch64]. Example source code is provided in the
 | |
| [examples](examples) directory. You can build examples with either `scons
 | |
| aarch32_examples` or `scons aarch64_examples` from the root directory, or use
 | |
| `scons --help` to get a detailed list of available build targets.
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| [cpplint]: http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py
 | |
|            "Google's cpplint.py script."
 | |
| 
 | |
| [vixl]: https://git.linaro.org/arm/vixl.git
 | |
|         "The VIXL repository at 'https://git.linaro.org'."
 | |
| 
 | |
| [getting-started-aarch32]: doc/aarch32/getting-started-aarch32.md
 | |
|                            "Introduction to VIXL for AArch32."
 | |
| 
 | |
| [getting-started-aarch64]: doc/aarch64/getting-started-aarch64.md
 | |
|                            "Introduction to VIXL for AArch64."
 | 
