Compare commits
No commits in common. "HEAD" and "3e75c64ece0527dec384829dc28dd2c9d3ce5370" have entirely different histories.
HEAD
...
3e75c64ece
34
.gitmodules
vendored
Normal file
34
.gitmodules
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[submodule "deps/minhook"]
|
||||||
|
path = deps/minhook
|
||||||
|
url = https://github.com/TsudaKageyu/minhook.git
|
||||||
|
[submodule "deps/asmjit"]
|
||||||
|
path = deps/asmjit
|
||||||
|
url = https://github.com/asmjit/asmjit.git
|
||||||
|
[submodule "deps/zlib"]
|
||||||
|
path = deps/zlib
|
||||||
|
url = https://github.com/madler/zlib.git
|
||||||
|
branch = develop
|
||||||
|
[submodule "deps/libtomcrypt"]
|
||||||
|
path = deps/libtomcrypt
|
||||||
|
url = https://github.com/libtom/libtomcrypt.git
|
||||||
|
branch = develop
|
||||||
|
[submodule "deps/libtommath"]
|
||||||
|
path = deps/libtommath
|
||||||
|
url = https://github.com/libtom/libtommath.git
|
||||||
|
branch = develop
|
||||||
|
[submodule "deps/rapidjson"]
|
||||||
|
path = deps/rapidjson
|
||||||
|
url = https://github.com/Tencent/rapidjson.git
|
||||||
|
[submodule "deps/udis86"]
|
||||||
|
path = deps/udis86
|
||||||
|
url = https://github.com/vmt/udis86.git
|
||||||
|
[submodule "deps/stb"]
|
||||||
|
path = deps/stb
|
||||||
|
url = https://github.com/nothings/stb.git
|
||||||
|
[submodule "deps/curl"]
|
||||||
|
path = deps/curl
|
||||||
|
url = https://github.com/curl/curl.git
|
||||||
|
branch = curl-8_4_0
|
||||||
|
[submodule "deps/discord-rpc"]
|
||||||
|
path = deps/discord-rpc
|
||||||
|
url = https://github.com/discord/discord-rpc.git
|
166
README.md
166
README.md
@ -1,176 +1,22 @@
|
|||||||
# T7x Client
|
# What is T7x ☄️
|
||||||
|
|
||||||
[](https://discord.gg/sKeVmR3)
|
|
||||||
[](https://rimmyscorner.com/)
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="assets/github/banner-t7x.png?raw=true" />
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
### <u>**IMPORTANT:**</u>
|
|
||||||
- ### T7x is cross-compatible with the BOIII Client. You can play the same servers on T7x and BOIII Client, however T7x is newer.
|
|
||||||
- ### You are <u>***NOT***</u> required to own Call of Duty: Black Ops 3 in order to play this client. Steam Ownership Verification has been <u>***removed***</u>.
|
|
||||||
- ### You can view the changes made from original repository [here](https://git.rimmyscorner.com/Rim/t7x/compare/3e75c64ece0527dec384829dc28dd2c9d3ce5370..HEAD).
|
|
||||||
---
|
|
||||||
|
|
||||||
## Installer (Easiest)
|
|
||||||
1. Download the [T7xInstaller.exe](https://git.rimmyscorner.com/Rim/t7x/releases/download/latest/t7xInstaller.exe) from [Releases](https://git.rimmyscorner.com/Rim/t7x/releases/tag/latest)
|
|
||||||
2. Place in *Call of Duty Black Ops III* game directory and run
|
|
||||||
> ***Note**: Run as Administrator if your game installation is in a protected folder*
|
|
||||||
|
|
||||||
(*The installer is fully [Open Source](https://git.rimmyscorner.com/Rim/t7x/src/branch/main/installer/t7x_Installer.nsi), created using Nullsoft Scriptable Install System*)
|
|
||||||
|
|
||||||
## Download
|
|
||||||
Clone the Git repository or download as ZIP.
|
|
||||||
|
|
||||||
- <u>**Download Release**</u>
|
|
||||||
- Click on `Releases` at the top and navigate to the latest release
|
|
||||||
- Download `t7x.zip`
|
|
||||||
- If you plan on running a server, download `T7DedicatedConfigs.zip`
|
|
||||||
|
|
||||||
- <u>**Download ZIP**</u>
|
|
||||||
- Click on the three dots at the top of the repo ( `◘◘◘` )
|
|
||||||
- Click `Download ZIP`
|
|
||||||
|
|
||||||
- <u>**Clone the repository:**</u>
|
|
||||||
- Open a terminal or command prompt.
|
|
||||||
- Run the following command:
|
|
||||||
```
|
|
||||||
git clone https://git.rimmyscorner.com/Rim/t7x.git
|
|
||||||
```
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
1. Place the executable `t7x.exe` in your `Call of Duty Black Ops III` directory.
|
|
||||||
> **Note**: Default location is `C:\Program Files (x86)\Steam\steamapps\common\Call of Duty Black Ops III`
|
|
||||||
2. Place the `localappdata\t7x` folder into your Local AppData. Place **ONLY** the `t7x` folder in, not `localappdata\t7x`. Your final path should look like `C:\Users\%USERPROFILE%\AppData\Local\t7x\*`
|
|
||||||
> **Note**: On Windows, press `Win + R`, type `%localappdata%`, click ok. Default location is `C:\Users\%USERPROFILE%\AppData\Local`
|
|
||||||
3. Launch `t7x.exe`.
|
|
||||||
4. You can change your name by modifying `Call of Duty Black Ops III\t7x\players\properties.json` or use `/name PLAYERNAME` in-game.
|
|
||||||
5. If running a server, extract `T7xDedicatedConfigs.zip` into your `Call of Duty Black Ops III` folder.
|
|
||||||
|
|
||||||
## Repository Contents
|
|
||||||
- T7x Client
|
|
||||||
- All Necessary Files (Including `ext.dll`)
|
|
||||||
- T7x Client Dedicated Server Configuration Files
|
|
||||||
- Python Script to format file hashes for files.json
|
|
||||||
- Localized dependencies
|
|
||||||
|
|
||||||
## Added Features
|
|
||||||
- Remove Steam Ownership Verification
|
|
||||||
- Removed T7x Watermark
|
|
||||||
- No Auto-Update (The new ext.dll adds Steam Verification, this is *CRUCIAL* if you do not own the game)
|
|
||||||
- Reverted launcher to the original style
|
|
||||||
- Changed executable icon to match original
|
|
||||||
- Add files.json for users to host their own Master Server/HTTP fastDL Index
|
|
||||||
|
|
||||||
## Getting Game Files
|
|
||||||
|
|
||||||
- You can download the `Call of Duty Black Ops III` game files [directly](https://gofile.io/d/7pvpEs) or torrent them [here](https://git.rimmyscorner.com/Rim/cod-games-download/releases/download/v1.0.0/t7_full_game.zip).
|
|
||||||
- The DLC torrent is included.
|
|
||||||
|
|
||||||
## Installing Git (Optional)
|
|
||||||
|
|
||||||
If you don't have `git` installed on your machine, follow these steps:
|
|
||||||
|
|
||||||
1. Visit the [Git download page](https://git-scm.com/downloads).
|
|
||||||
2. Download the appropriate version for your operating system.
|
|
||||||
3. Run the installer.
|
|
||||||
- During the installation, you will be asked if you want to add Git to your system's PATH environment variable. Ensure you choose the option to do so. This allows you to use Git from the command line without specifying its full path.
|
|
||||||
4. After installation, open a terminal or command prompt and type `git --version` to ensure Git is correctly installed.
|
|
||||||
|
|
||||||
## Compile from Source Code
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- [Visual Studio 2022](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false)
|
|
||||||
- The required code libraries installed using [VSBuildTools](https://aka.ms/vs/17/release/vs_BuildTools.exe)
|
|
||||||
|
|
||||||
### Build
|
|
||||||
|
|
||||||
1. Clone the Git repository using `git clone https://git.rimmyscorner.com/Rim/t7x.git` (It is recommended to clone, however you can `Download ZIP` as all submodules have been localized).
|
|
||||||
2. Run `generate.bat` to initialize the submodules and build the VS `.sln` file.
|
|
||||||
3. Open the project in Visual Studio, change the top drop down lists to `Release`, `x64`. You can also modify (or leave same) the Visual Studio edition/path in the `build.bat` file and build the solution via the batch script.
|
|
||||||
4. Build the application.
|
|
||||||
<br>
|
|
||||||
|
|
||||||
# T7 Server Config
|
|
||||||
Config for T7 Dedicated Servers for use with the T7x Client.
|
|
||||||
|
|
||||||
## How to use
|
|
||||||
1. Download the BO3 Unranked Dedicated Server via Steam (It's located in the "Tools" section in your steam library.)
|
|
||||||
2. Add t7x.exe to the `Call of Duty Black Ops 3` folder.
|
|
||||||
3. Download this repository and extract startup batch files as well as the t7x and zone folder to the UnrankedServer Folder
|
|
||||||
4. Edit the config(s) in `/zone/` to your liking.
|
|
||||||
5. (Optional) Edit your game rules under `Call of Duty Black Ops 3/t7x/gamesettings/mp`.
|
|
||||||
6. Port forward UDP 27017.
|
|
||||||
7. Start the Server using T7x_MP_Server.bat or T7x_ZM_Server.bat
|
|
||||||
|
|
||||||
## Additional Steps required for hosting Zombies Dedicated Servers
|
|
||||||
As of right now you need to take additional Steps to host Zombies Servers.
|
|
||||||
For Zombie Dedis to work they need to have the Zombies Maps and common FastFiles, these do not come with the UnrankedServer Files. This means you need to copy those over from your installed BO3 game folder.
|
|
||||||
|
|
||||||
Copy common fastfiles that is needed for zombies.
|
|
||||||
|
|
||||||
```
|
|
||||||
zone/en_zm_patch.ff
|
|
||||||
zone/en_zm_common.ff
|
|
||||||
zone/zm_patch.ff
|
|
||||||
zone/zm_common.fd
|
|
||||||
zone/zm_common.ff
|
|
||||||
zone/zm_levelcommon.ff
|
|
||||||
```
|
|
||||||
|
|
||||||
Now for the map. Shadows of Evil is zm_zod.
|
|
||||||
|
|
||||||
```
|
|
||||||
zone/en_zm_zod.ff
|
|
||||||
zone/en_zm_zod_patch.ff
|
|
||||||
zone/zm_zod.ff
|
|
||||||
zone/zm_zod_patch.ff
|
|
||||||
```
|
|
||||||
|
|
||||||
from your BO3 Game folder into the UnrankedServer's ```zone``` Folder. Do the same with the FastFiles of the Maps you want to host on the Server, you do not need to copy the .xpak files, those hold Textures and Sounds which the Server doesn't need. You can use the zm_server.cfg as a short name references if you want to grab the others.
|
|
||||||
|
|
||||||
You are now ready to start the Server using `T7x_ZM_Server.bat`. If the server still instantly closes while opening the `T7x_ZM_Server.bat` or `T7x_CP_Server.bat`. Check the console_mp.log from identities\dedicatedpc\ folder. Scroll down until you see "Could not find zone: xxxx".
|
|
||||||
|
|
||||||
## Disclaimer
|
|
||||||
|
|
||||||
This software has been created purely for the purposes of
|
|
||||||
academic research. It is not intended to be used to attack
|
|
||||||
other systems. Project maintainers are not responsible or
|
|
||||||
liable for misuse of the software. Use responsibly.
|
|
||||||
|
|
||||||
## Credits:
|
|
||||||
|
|
||||||
- [Dss0](https://github.com/Dss0/t7-server-config) - Dedicated Server Files & Tutorial
|
|
||||||
- [momo5502](https://github.com/momo5502) - Arxan/Steam research, original developer
|
|
||||||
- [AlterWare](https://alterware.dev/) - T7x project revival and rebranding
|
|
||||||
|
|
||||||
## ***End README***
|
|
||||||
|
|
||||||
# <u>Legacy README.md</u>
|
|
||||||
|
|
||||||
### What is T7x ☄️
|
|
||||||
|
|
||||||
T7x is a [discontinued][notice-link] game modification for Call of Duty: Black Ops 3.
|
T7x is a [discontinued][notice-link] game modification for Call of Duty: Black Ops 3.
|
||||||
~~The Steam version of Black Ops 3 is required to be owned and installed for T7x to work. You can get it from <a href="https://store.steampowered.com/app/311210/Call_of_Duty_Black_Ops_III/">here</a>.~~
|
The Steam version of Black Ops 3 is required to be owned and installed for T7x to work. You can get it from <a href="https://store.steampowered.com/app/311210/Call_of_Duty_Black_Ops_III/">here</a>.
|
||||||
|
|
||||||
### Build
|
## Build
|
||||||
|
|
||||||
You can learn more about how you can build this project using the MSVC compiler by reading [build.md][build-link]
|
You can learn more about how you can build this project using the MSVC compiler by reading [build.md][build-link]
|
||||||
|
|
||||||
### Writeups & Articles
|
## Writeups & Articles
|
||||||
|
|
||||||
- <a href="https://momo5502.com/posts/2022-11-17-reverse-engineering-integrity-checks-in-black-ops-3/">Reverse engineering integrity checks in Black Ops 3</a>
|
- <a href="https://momo5502.com/posts/2022-11-17-reverse-engineering-integrity-checks-in-black-ops-3/">Reverse engineering integrity checks in Black Ops 3</a>
|
||||||
- <a href="https://techcrunch.com/2023/02/28/gamers-are-fixing-a-video-game-taken-over-by-hackers/">Gamers are fixing a video game ‘taken over’ by hackers</a>
|
- <a href="https://techcrunch.com/2023/02/28/gamers-are-fixing-a-video-game-taken-over-by-hackers/">Gamers are fixing a video game ‘taken over’ by hackers</a>
|
||||||
|
|
||||||
### Credits
|
## Credits
|
||||||
|
|
||||||
- Thanks to <a href="https://github.com/shiversoftdev">@shiversoftdev</a> for providing the fixes from his <a href="https://github.com/shiversoftdev/t7patch">community patch</a>
|
- Thanks to <a href="https://github.com/shiversoftdev">@shiversoftdev</a> for providing the fixes from his <a href="https://github.com/shiversoftdev/t7patch">community patch</a>
|
||||||
|
|
||||||
### Disclaimer
|
## Disclaimer
|
||||||
|
|
||||||
This software has been created purely for the purposes of
|
This software has been created purely for the purposes of
|
||||||
academic research. It is not intended to be used to harm
|
academic research. It is not intended to be used to harm
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 660 KiB |
Binary file not shown.
@ -1,5 +0,0 @@
|
|||||||
@echo off
|
|
||||||
|
|
||||||
"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\msbuild.exe" build\t7x.sln /p:Configuration=Release /p:Platform=x64
|
|
||||||
|
|
||||||
pause
|
|
16
build.md
16
build.md
@ -1,11 +1,7 @@
|
|||||||
## Prerequisites
|
|
||||||
|
|
||||||
- [Visual Studio 2022](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false)
|
|
||||||
- The required code libraries installed using [VSBuildTools](https://aka.ms/vs/17/release/vs_BuildTools.exe)
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
- Install [Git](https://git-scm.com), the distributed revision control system and add it to your system PATH
|
||||||
1. Clone the Git repository using `git clone https://git.rimmyscorner.com/Parasyn/t7x.git` (It is recommended to clone, however you can `Download ZIP` as all submodules have been localized).
|
- Install [*Premake5*](https://premake.github.io) and add it to your system PATH
|
||||||
2. Run `generate.bat` to initialize the submodules and build the VS .sln file.
|
- [Clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) this repository
|
||||||
3. Open the project in Visual Studio, change the top drop down lists to `Release`, `x64`. You can also modify (or leave same) the Visual Studio edition/path in the `build.bat` file and build the solution via the batch script.
|
- Update the git submodules using ``git submodule update --init --recursive``
|
||||||
4. Build the application.
|
- Run Premake with with the following command ``premake5 vs2022``
|
||||||
|
- You may now open ``build/t7x.sln`` with Visual Studio and proceed with building ⚒️
|
||||||
|
0
cache/cache.bin
vendored
0
cache/cache.bin
vendored
0
cache/data.bin
vendored
0
cache/data.bin
vendored
@ -1,40 +0,0 @@
|
|||||||
# T7 Server Config
|
|
||||||
Config for T7 Dedicated Servers for use with the T7x Client.
|
|
||||||
|
|
||||||
# How to use
|
|
||||||
1. Download the BO3 Unranked Dedicated Server via Steam (It's located in the "Tools" section in your steam library.)
|
|
||||||
2. Open the Unranked Server folder in windows explorer (if you own BO3 on Steam and have it installed it will be in your BO3 Game Folder)
|
|
||||||
3. Add t7x.exe to the UnrankedServer Folder
|
|
||||||
4. Download this repository and extract startup batch files as well as the t7x and zone folder to the UnrankedServer Folder
|
|
||||||
5. Edit the config(s) in /zone to your liking.
|
|
||||||
6. (Optional) Edit your game rules under boiii/gamesettings/mp.
|
|
||||||
6. Port forward UDP 27017.
|
|
||||||
7. Start the Server using BOIII_MP_Server.bat or T7x_ZM_Server.bat
|
|
||||||
|
|
||||||
# Additional Steps required for hosting Zombies Dedicated Servers
|
|
||||||
As of right now you need to take additional Steps to host Zombies Servers.
|
|
||||||
For Zombie Dedis to work they need to have the Zombies Maps and common FastFiles, these do not come with the UnrankedServer Files. This means you need to copy those over from your installed BO3 game folder.
|
|
||||||
|
|
||||||
Copy common fastfiles that is needed for zombies.
|
|
||||||
|
|
||||||
```
|
|
||||||
zone/en_zm_patch.ff
|
|
||||||
zone/en_zm_common.ff
|
|
||||||
zone/zm_patch.ff
|
|
||||||
zone/zm_common.fd
|
|
||||||
zone/zm_common.ff
|
|
||||||
zone/zm_levelcommon.ff
|
|
||||||
```
|
|
||||||
|
|
||||||
Now for the map. Shadows of Evil is zm_zod.
|
|
||||||
|
|
||||||
```
|
|
||||||
zone/en_zm_zod.ff
|
|
||||||
zone/en_zm_zod_patch.ff
|
|
||||||
zone/zm_zod.ff
|
|
||||||
zone/zm_zod_patch.ff
|
|
||||||
```
|
|
||||||
|
|
||||||
from your BO3 Game folder into the UnrankedServer's ```zone``` Folder. Do the same with the FastFiles of the Maps you want to host on the Server, you do not need to copy the .xpak files, those hold Textures and Sounds which the Server doesn't need. You can use the zm_server.cfg as a short name references if you want to grab the others.
|
|
||||||
|
|
||||||
You are now ready to start the Server using T7x_ZM_Server.bat. If the server still instantly closes while opening the T7x_ZM_Server.bat or T7x_CP_Server.bat. Check the console_mp.log from identities\dedicatedpc\ folder. Scroll down until you see "Could not find zone: xxxx".
|
|
@ -1,36 +0,0 @@
|
|||||||
@echo off
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::/// T7x Dedicated Server Configuration start-up file ///
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// //
|
|
||||||
::// Your Game Server Port. //
|
|
||||||
::// Make sure you Port Forward both UDP & TCP //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set GamePort=27017
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Below edits are optional unless you run multiable servers or mods.//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Load a mod on your server //
|
|
||||||
::// Example: ModfolderName=mods/bots //
|
|
||||||
::// //
|
|
||||||
::// UNLOAD a mod on your server //
|
|
||||||
::// Example: ModfolderName= //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ModFolderName=
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Your edited server.cfg in the "zone" folder goes here... //
|
|
||||||
::// This is were you edit your hostname, rcon, inactivity, etc //
|
|
||||||
::// (Optional) //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ServerFilename=server_cp.cfg
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
:://DONE!! WARNING! Don't mess with anything below this line. SEROUSLY!//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
start t7x.exe -dedicated +set fs_game "%ModFolderName%" +set net_port "%GamePort%" +set logfile 2 +exec %ServerFilename%
|
|
@ -1,36 +0,0 @@
|
|||||||
@echo off
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::/// T7x Dedicated Server Configuration start-up file ///
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// //
|
|
||||||
::// Your Game Server Port. //
|
|
||||||
::// Make sure you Port Forward both UDP & TCP //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set GamePort=27017
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Below edits are optional unless you run multiable servers or mods.//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Load a mod on your server //
|
|
||||||
::// Example: ModfolderName=mods/bots //
|
|
||||||
::// //
|
|
||||||
::// UNLOAD a mod on your server //
|
|
||||||
::// Example: ModfolderName= //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ModFolderName=
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Your edited server.cfg in the "zone" folder goes here... //
|
|
||||||
::// This is were you edit your hostname, rcon, inactivity, etc //
|
|
||||||
::// (Optional) //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ServerFilename=server.cfg
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
:://DONE!! WARNING! Don't mess with anything below this line. SEROUSLY!//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
start t7x.exe -dedicated +set fs_game "%ModFolderName%" +set net_port "%GamePort%" +set logfile 2 +exec %ServerFilename%
|
|
@ -1,36 +0,0 @@
|
|||||||
@echo off
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::/// T7x Dedicated Server Configuration start-up file ///
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// //
|
|
||||||
::// Your Game Server Port. //
|
|
||||||
::// Make sure you Port Forward both UDP & TCP //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set GamePort=27017
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Below edits are optional unless you run multiable servers or mods.//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Load a mod on your server //
|
|
||||||
::// Example: ModfolderName=mods/bots //
|
|
||||||
::// //
|
|
||||||
::// UNLOAD a mod on your server //
|
|
||||||
::// Example: ModfolderName= //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ModFolderName=
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
::// Your edited server.cfg in the "zone" folder goes here... //
|
|
||||||
::// This is were you edit your hostname, rcon, inactivity, etc //
|
|
||||||
::// (Optional) //
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set ServerFilename=server_zm.cfg
|
|
||||||
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
:://DONE!! WARNING! Don't mess with anything below this line. SEROUSLY!//
|
|
||||||
::///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
start t7x.exe -dedicated +set fs_game "%ModFolderName%" +set net_port "%GamePort%" +set logfile 2 +exec %ServerFilename%
|
|
@ -1,19 +0,0 @@
|
|||||||
Snake,BOT
|
|
||||||
Diamante,BOT
|
|
||||||
Dss0,BOT
|
|
||||||
st0rm,BOT
|
|
||||||
Louvenarde,BOT
|
|
||||||
serious,BOT
|
|
||||||
JariK,BOT
|
|
||||||
xensik,BOT
|
|
||||||
Jebus3211,BOT
|
|
||||||
FragsAreUs,BOT
|
|
||||||
Fry,BOT
|
|
||||||
X3RX35,BOT
|
|
||||||
Brent,BOT
|
|
||||||
Joel,BOT
|
|
||||||
RektInator,BOT
|
|
||||||
Doctor,BOT
|
|
||||||
Jimbo,BOT
|
|
||||||
Laupetin,BOT
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
gametype_setting scorelimit 7500
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting prematchperiod 0
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerrespawndelay 0
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting disableweapondrop 1
|
|
||||||
gametype_setting allowAnnouncer 0
|
|
||||||
gametype_setting startRound 1
|
|
||||||
gametype_setting magic 1
|
|
||||||
gametype_setting headshotsonly 0
|
|
||||||
gametype_setting allowdogs 0
|
|
||||||
gametype_setting disableClassSelection 0
|
|
||||||
gametype_setting disableCompass 1
|
|
||||||
gametype_setting characterCustomization 0
|
|
@ -1,16 +0,0 @@
|
|||||||
gametype_setting scorelimit 7500
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting prematchperiod 0
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerrespawndelay 0
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting disableweapondrop 1
|
|
||||||
gametype_setting allowAnnouncer 0
|
|
||||||
gametype_setting startRound 1
|
|
||||||
gametype_setting magic 1
|
|
||||||
gametype_setting headshotsonly 0
|
|
||||||
gametype_setting allowdogs 0
|
|
||||||
gametype_setting disableClassSelection 1
|
|
||||||
gametype_setting disableCompass 1
|
|
||||||
gametype_setting characterCustomization 0
|
|
@ -1,108 +0,0 @@
|
|||||||
gametype_setting allowAnnouncer 1
|
|
||||||
gametype_setting allowBattleChatter 1
|
|
||||||
gametype_setting allowFinalKillcam 1
|
|
||||||
gametype_setting allowHitMarkers 2
|
|
||||||
gametype_setting allowInGameTeamChange 0
|
|
||||||
gametype_setting allowKillcam 1
|
|
||||||
gametype_setting allowSpectating 0
|
|
||||||
gametype_setting autoDestroyTime 0
|
|
||||||
gametype_setting autoTeamBalance 0
|
|
||||||
gametype_setting bombTimer 0
|
|
||||||
gametype_setting bulletDamageScalar 1.0
|
|
||||||
gametype_setting captureTime 10
|
|
||||||
gametype_setting crateCaptureTime 3
|
|
||||||
gametype_setting cumulativeRoundScores 0
|
|
||||||
gametype_setting deathPointLoss 0
|
|
||||||
gametype_setting defuseTime 0
|
|
||||||
gametype_setting delayPlayer 0
|
|
||||||
gametype_setting destroyTime 0
|
|
||||||
gametype_setting disableAmbientFx 0
|
|
||||||
gametype_setting disableAttachments 0
|
|
||||||
gametype_setting disableCAC 0
|
|
||||||
gametype_setting disableContracts 0
|
|
||||||
gametype_setting disableTacInsert 0
|
|
||||||
gametype_setting disableweapondrop 1
|
|
||||||
gametype_setting disallowaimslowdown 0
|
|
||||||
gametype_setting disallowprone 0
|
|
||||||
gametype_setting enemyCarrierVisible 0
|
|
||||||
gametype_setting extraTime 0
|
|
||||||
gametype_setting flagCaptureGracePeriod 0
|
|
||||||
gametype_setting flagDecayTime 0
|
|
||||||
gametype_setting flagRespawnTime 0
|
|
||||||
gametype_setting forceRadar 0
|
|
||||||
gametype_setting friendlyfiretype 0
|
|
||||||
gametype_setting hardcoremode 0
|
|
||||||
gametype_setting hotPotato 0
|
|
||||||
gametype_setting idleFlagDecay 0
|
|
||||||
gametype_setting idleFlagResetTime 0
|
|
||||||
gametype_setting inactivityKick 0
|
|
||||||
gametype_setting kothMode 0
|
|
||||||
gametype_setting leaderBonus 0
|
|
||||||
gametype_setting loadoutKillstreaksEnabled 0
|
|
||||||
gametype_setting maxAllocation 10
|
|
||||||
gametype_setting maxObjectiveEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerDefensive 0
|
|
||||||
gametype_setting maxPlayerEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerOffensive 0
|
|
||||||
gametype_setting multiBomb 0
|
|
||||||
gametype_setting objectivePingTime 6
|
|
||||||
gametype_setting objectiveSpawnTime 0
|
|
||||||
gametype_setting onlyHeadshots 0
|
|
||||||
gametype_setting perksEnabled 0
|
|
||||||
gametype_setting plantTime 0
|
|
||||||
gametype_setting playerForceRespawn 1
|
|
||||||
gametype_setting playerHealthRegenTime 5
|
|
||||||
gametype_setting playerKillsMax 0
|
|
||||||
gametype_setting playerMaxHealth 100
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerObjectiveHeldRespawnDelay 0
|
|
||||||
gametype_setting playerQueuedRespawn 0
|
|
||||||
gametype_setting playerRespawnDelay 0
|
|
||||||
gametype_setting playerSprintTime 4
|
|
||||||
gametype_setting pregameAlwaysShowCACEdit 1
|
|
||||||
gametype_setting pregameAlwaysShowStreakEdit 1
|
|
||||||
gametype_setting pregameCACModifyTime 0
|
|
||||||
gametype_setting pregameDraftEnabled 0
|
|
||||||
gametype_setting pregameDraftRoundTime 0
|
|
||||||
gametype_setting pregameItemMaxVotes 0
|
|
||||||
gametype_setting pregameItemVoteEnabled 0
|
|
||||||
gametype_setting pregameItemVoteRoundTime 0
|
|
||||||
gametype_setting pregamePositionShuffleMethod 0
|
|
||||||
gametype_setting pregamePositionSortType 0
|
|
||||||
gametype_setting pregamePostRoundTime 0
|
|
||||||
gametype_setting pregamePostStageTime 0
|
|
||||||
gametype_setting pregamePreStageTime 0
|
|
||||||
gametype_setting pregameScorestreakModifyTime 0
|
|
||||||
gametype_setting randomObjectiveLocations 0
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting roundStartExplosiveDelay 5
|
|
||||||
gametype_setting roundStartKillstreakDelay 0
|
|
||||||
gametype_setting roundswitch 1 // rounds between switching teams
|
|
||||||
gametype_setting roundwinlimit 0
|
|
||||||
gametype_setting scoreHeroPowerGainFactor 1.0
|
|
||||||
gametype_setting scoreHeroPowerTimeFactor 1.0
|
|
||||||
gametype_setting scorelimit 100
|
|
||||||
gametype_setting spectateType 1
|
|
||||||
gametype_setting teamCount 1
|
|
||||||
gametype_setting teamKillPenalty 2
|
|
||||||
gametype_setting teamKillPointLoss 0
|
|
||||||
gametype_setting teamKillPunishCount 3
|
|
||||||
gametype_setting teamKillReducedPenalty 0.25
|
|
||||||
gametype_setting teamKillScore 4
|
|
||||||
gametype_setting teamKillSpawnDelay 20
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting totalKillsMax 0
|
|
||||||
gametype_setting vehiclesEnabled 1
|
|
||||||
gametype_setting vehiclesTimed 1
|
|
||||||
gametype_setting voipDeadChatWithDead 0
|
|
||||||
gametype_setting voipDeadChatWithTeam 1
|
|
||||||
gametype_setting voipDeadHearAllLiving 0
|
|
||||||
gametype_setting voipDeadHearKiller 0
|
|
||||||
gametype_setting voipDeadHearTeamLiving 1
|
|
||||||
gametype_setting voipEveryoneHearsEveryone 0
|
|
||||||
gametype_setting voipKillersHearVictim 1
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting zmDifficulty 1
|
|
||||||
|
|
||||||
// player movement
|
|
||||||
gametype_setting trm_maxHeight 144.0
|
|
@ -1,4 +0,0 @@
|
|||||||
gametype_setting disableClassSelection 1
|
|
||||||
gametype_setting disableCompass 1
|
|
||||||
gametype_setting characterCustomization 1
|
|
||||||
gametype_setting spectateType 0
|
|
@ -1,59 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "5" // Time limit of the game.
|
|
||||||
gts roundScoreLimit "10" // Round score limit reach
|
|
||||||
gts scorelimit "0" // Score limit.
|
|
||||||
gts roundlimit "2" // The number of rounds that will be played before the game ends.
|
|
||||||
|
|
||||||
gts ballCount "1" // How many balls you can handle?
|
|
||||||
gts carryScore "2"
|
|
||||||
gts throwScore "1"
|
|
||||||
gts carrierArmor "100"
|
|
||||||
gts idleFlagResetTime "15" // The time before a ball is automatically returned to base. (0-60 seconds)
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.684" //Score earned towards Hero Weapons and Abilities are multiplied by this factor in BALL
|
|
||||||
gts scoreHeroPowerTimeFactor "0.684"
|
|
||||||
|
|
||||||
gts enemyCarrierVisible "2" // delayed can see person with ball on map
|
|
||||||
|
|
||||||
gts captureTime "0" // Pickup Time. The amount of time it takes to pickup the ball.
|
|
||||||
gts defuseTime "0" // Return Time. How long it takes to return ball. (-1 = off. 0 = Instant. (Default) 10 = limit of seconds.)
|
|
||||||
|
|
||||||
gts spawntraptriggertime "10"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleTimeLeft "4"
|
|
||||||
gts gameAdvertisementRuleRound "3"
|
|
@ -1,29 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "60" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
gts teamScorePerKill "0"
|
|
||||||
gts teamScorePerCleanDeposit "1" // Points awarded to the team when depositing a fragment.
|
|
||||||
gts cleanDepositOfflineTime "0"
|
|
||||||
gts cleanDepositOnlineTime "60" // The amount of team each fracture site is active.
|
|
||||||
gts cleanDepositRotation "1"
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.646" // Score earned towards Hero Weapons and Abilities are multiplied by this factor
|
|
||||||
gts scoreHeroPowerTimeFactor "0.646"
|
|
@ -1,53 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "100" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2" // Set this higher if you want Multi-Team Deathmatch that was cut from playlist. (2-6)
|
|
||||||
//gts roundLimit "1" // The number of rounds that will be played before the game ends.
|
|
||||||
gts teamScorePerKill "0" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamScorePerKillConfirmed "1" // Points per Kills Confirmed. - The number of points for each kill confirmed. (0-25)
|
|
||||||
//gts teamScorePerKillDenied "0" // Points per Kill Denied - The number of points for each kill denied. (0-25)
|
|
||||||
//gts teamScorePerHeadshot "0" // Headshot Bonus Points - Extra points awarded if the kill is a headshot in addition to the points per kill. (0-25)
|
|
||||||
//gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
|
|
||||||
gts antiBoostDistance "100"
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.646" //Score earned towards Hero Weapons and Abilities are multiplied by this factor
|
|
||||||
gts scoreHeroPowerTimeFactor "0.646"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "15"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "2"
|
|
@ -1,50 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before the round start.
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played
|
|
||||||
|
|
||||||
gts timelimit "5" // Time limit of the game.
|
|
||||||
gts scorelimit "3" // The number of flags needed to win the round.
|
|
||||||
gts roundLimit "2" // The number of rounds that will be played before the game ends.
|
|
||||||
gts roundwinlimit "2" // Round Win Limit. The number of rounds a team needs to win before the game ends.
|
|
||||||
gts enemyCarrierVisible "2" // Enemy Carrier. How and if the enemy appears on the minimap. (0 = No. 1 = Yes. 2 = Delayed)
|
|
||||||
gts idleFlagResetTime "30" // The time before a flag is automatically returned to base. (0-60 seconds)
|
|
||||||
gts captureTime "0" // Pickup Time. The amount of time it takes to pickup the enemy flag.
|
|
||||||
gts defuseTime "0" // Return Time. How long it takes to return a flag. (-1 = off. 0 = Instant. (Default) 10 = limit of seconds.)
|
|
||||||
gts playerRespawnDelay "5" // The amount of time a player has to wait before respawning.
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.835" //Score earned towards Hero Weapons and Abilities are multiplied by this factor in CTF
|
|
||||||
gts scoreHeroPowerTimeFactor "0.835"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "4"
|
|
||||||
gts gameAdvertisementRuleRound "3"
|
|
@ -1,175 +0,0 @@
|
|||||||
|
|
||||||
gametype_setting allowAnnouncer 1
|
|
||||||
gametype_setting allowBattleChatter 1
|
|
||||||
gametype_setting allowFinalKillcam 1
|
|
||||||
gametype_setting allowHitMarkers 2
|
|
||||||
gametype_setting allowInGameTeamChange 1
|
|
||||||
gametype_setting allowKillcam 1
|
|
||||||
gametype_setting allowMapScripting 1
|
|
||||||
gametype_setting allowSpectating 1
|
|
||||||
gametype_setting antiBoostDistance 100
|
|
||||||
gametype_setting autoDestroyTime 0
|
|
||||||
gametype_setting autoTeamBalance 0
|
|
||||||
gametype_setting ballCount 1
|
|
||||||
gametype_setting bombTimer 0
|
|
||||||
gametype_setting bootTime 5
|
|
||||||
gametype_setting bulletDamageScalar 1.0
|
|
||||||
gametype_setting captureTime 10
|
|
||||||
gametype_setting carryScore 0
|
|
||||||
gametype_setting carrierArmor 100
|
|
||||||
gametype_setting crateCaptureTime 3
|
|
||||||
gametype_setting cumulativeRoundScores 1
|
|
||||||
gametype_setting deathPointLoss 0
|
|
||||||
gametype_setting defuseTime 0
|
|
||||||
gametype_setting delayPlayer 0
|
|
||||||
gametype_setting destroyTime 0
|
|
||||||
gametype_setting disableAmbientFx 0
|
|
||||||
gametype_setting disableAttachments 0
|
|
||||||
gametype_setting disableCAC 0
|
|
||||||
gametype_setting disableClassSelection 0
|
|
||||||
gametype_setting disableContracts 0
|
|
||||||
gametype_setting disableTacInsert 0
|
|
||||||
gametype_setting disableThirdPersonSpectating 0
|
|
||||||
gametype_setting disableVehicleSpawners 0
|
|
||||||
gametype_setting disableweapondrop 0
|
|
||||||
gametype_setting disallowaimslowdown 0
|
|
||||||
gametype_setting disallowprone 0
|
|
||||||
gametype_setting droppedTagRespawn 0
|
|
||||||
gametype_setting enemyCarrierVisible 2
|
|
||||||
gametype_setting extraTime 0
|
|
||||||
gametype_setting flagCanBeNeutralized 0
|
|
||||||
gametype_setting flagCaptureCondition 1
|
|
||||||
gametype_setting flagCaptureGracePeriod 0
|
|
||||||
gametype_setting flagDecayTime 0
|
|
||||||
gametype_setting flagRespawnTime 0
|
|
||||||
gametype_setting forceRadar 0
|
|
||||||
gametype_setting friendlyfiretype 0
|
|
||||||
gametype_setting gameAdvertisementRuleScorePercent 0
|
|
||||||
gametype_setting gameAdvertisementRuleTimeLeft 0
|
|
||||||
gametype_setting gameAdvertisementRuleRound 0
|
|
||||||
gametype_setting gameAdvertisementRuleRoundsWon 0
|
|
||||||
gametype_setting gunSelection 0
|
|
||||||
gametype_setting hardcoremode 0
|
|
||||||
gametype_setting hotPotato 0
|
|
||||||
gametype_setting idleFlagDecay 0
|
|
||||||
gametype_setting idleFlagResetTime 0
|
|
||||||
gametype_setting inactivityKick 0
|
|
||||||
gametype_setting incrementalSpawnDelay 0
|
|
||||||
gametype_setting infectionMode 0
|
|
||||||
gametype_setting killEventScoreMultiplier 1
|
|
||||||
gametype_setting kothMode 0
|
|
||||||
gametype_setting leaderBonus 0
|
|
||||||
gametype_setting loadoutKillstreaksEnabled 1
|
|
||||||
gametype_setting killstreaksGiveGameScore 1
|
|
||||||
gametype_setting maxAllocation 10
|
|
||||||
gametype_setting maxObjectiveEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerDefensive 0
|
|
||||||
gametype_setting maxPlayerEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerOffensive 0
|
|
||||||
gametype_setting maxSuicidesBeforeKick 0
|
|
||||||
gametype_setting movePlayers 1
|
|
||||||
gametype_setting multiBomb 0
|
|
||||||
gametype_setting objectivePingTime 4
|
|
||||||
gametype_setting objectiveSpawnTime 0
|
|
||||||
gametype_setting oldschoolMode 0
|
|
||||||
gametype_setting classicMode 0
|
|
||||||
gametype_setting onlyHeadshots 0
|
|
||||||
gametype_setting OvertimetimeLimit 2
|
|
||||||
gametype_setting perksEnabled 1
|
|
||||||
gametype_setting plantTime 0
|
|
||||||
gametype_setting playerForceRespawn 1
|
|
||||||
gametype_setting playerHealthRegenTime 5
|
|
||||||
gametype_setting playerKillsMax 0
|
|
||||||
gametype_setting playerMaxHealth 100
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerObjectiveHeldRespawnDelay 0
|
|
||||||
gametype_setting playerQueuedRespawn 0
|
|
||||||
gametype_setting playerRespawnDelay 0
|
|
||||||
gametype_setting playerSprintTime 4
|
|
||||||
gametype_setting pointsForSurvivalBonus 0
|
|
||||||
gametype_setting pointsPerMeleeKill 0
|
|
||||||
gametype_setting pointsPerPrimaryGrenadeKill 0
|
|
||||||
gametype_setting pointsPerPrimaryKill 0
|
|
||||||
gametype_setting pointsPerSecondaryKill 0
|
|
||||||
gametype_setting pointsPerWeaponKill 0
|
|
||||||
gametype_setting pregameAlwaysShowCACEdit 1
|
|
||||||
gametype_setting pregameAlwaysShowStreakEdit 1
|
|
||||||
gametype_setting pregameCACModifyTime 90
|
|
||||||
gametype_setting pregameDraftEnabled 0
|
|
||||||
gametype_setting pregameDraftRoundTime 30
|
|
||||||
gametype_setting pregameDraftType 0
|
|
||||||
gametype_setting pregameItemMaxVotes 1
|
|
||||||
gametype_setting pregameItemVoteEnabled 0
|
|
||||||
gametype_setting pregameItemVoteRoundTime 30
|
|
||||||
gametype_setting pregamePositionShuffleMethod 0
|
|
||||||
gametype_setting pregamePositionSortType 0
|
|
||||||
gametype_setting pregamePostRoundTime 3
|
|
||||||
gametype_setting pregamePostStageTime 3
|
|
||||||
gametype_setting pregamePreStageTime 5
|
|
||||||
gametype_setting pregameScorestreakModifyTime 30
|
|
||||||
gametype_setting prematchperiod 15
|
|
||||||
gametype_setting preroundperiod 5
|
|
||||||
gametype_setting prematchrequirement 0
|
|
||||||
gametype_setting prematchrequirementtime 0
|
|
||||||
gametype_setting randomObjectiveLocations 0
|
|
||||||
gametype_setting rebootPlayers 0
|
|
||||||
gametype_setting rebootTime 15
|
|
||||||
gametype_setting robotSpeed 1
|
|
||||||
gametype_setting robotShield 0
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting roundScoreLimit 0
|
|
||||||
gametype_setting roundStartExplosiveDelay 10
|
|
||||||
gametype_setting roundStartKillstreakDelay 15
|
|
||||||
gametype_setting roundswitch 1 // rounds between switching teams
|
|
||||||
gametype_setting roundwinlimit 0
|
|
||||||
gametype_setting scoreHeroPowerGainFactor 1.0
|
|
||||||
gametype_setting scoreHeroPowerTimeFactor 1.0
|
|
||||||
gametype_setting scoreThiefPowerGainFactor 1.0
|
|
||||||
gametype_setting scorelimit 100
|
|
||||||
gametype_setting scorePerPlayer 0
|
|
||||||
gametype_setting scoreResetOnDeath 1
|
|
||||||
gametype_setting setbacks 0
|
|
||||||
gametype_setting shutdownDamage 2
|
|
||||||
gametype_setting silentPlant 0
|
|
||||||
gametype_setting spawnprotectiontime 3
|
|
||||||
gametype_setting spawnsuicidepenalty 0
|
|
||||||
gametype_setting spawnteamkilledpenalty 0
|
|
||||||
gametype_setting spawntraptriggertime 5
|
|
||||||
gametype_setting spectateType 1
|
|
||||||
gametype_setting cleanDepositOnlineTime 60
|
|
||||||
gametype_setting cleanDepositRotation 1
|
|
||||||
gametype_setting teamAssignment 2
|
|
||||||
gametype_setting teamCount 2
|
|
||||||
gametype_setting teamKillPenalty 2
|
|
||||||
gametype_setting teamKillPointLoss 1
|
|
||||||
gametype_setting teamKillPunishCount 0
|
|
||||||
gametype_setting teamKillReducedPenalty 1
|
|
||||||
gametype_setting teamKillScore 4
|
|
||||||
gametype_setting teamKillSpawnDelay 20
|
|
||||||
gametype_setting teamNumLives 0
|
|
||||||
gametype_setting teamScorePerCleanDeposit 1
|
|
||||||
gametype_setting teamScorePerDeath 0
|
|
||||||
gametype_setting teamScorePerHeadshot 0
|
|
||||||
gametype_setting teamScorePerKill 1
|
|
||||||
gametype_setting teamScorePerKillConfirmed 1
|
|
||||||
gametype_setting teamScorePerKillDenied 0
|
|
||||||
gametype_setting throwScore 0
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting timePausesWhenInZone 0
|
|
||||||
gametype_setting useEmblemInsteadOfFactionIcon 0
|
|
||||||
gametype_setting vehiclesEnabled 1
|
|
||||||
gametype_setting vehiclesTimed 1
|
|
||||||
gametype_setting voipDeadChatWithDead 0
|
|
||||||
gametype_setting voipDeadChatWithTeam 1
|
|
||||||
gametype_setting voipDeadHearAllLiving 0
|
|
||||||
gametype_setting voipDeadHearKiller 0
|
|
||||||
gametype_setting voipDeadHearTeamLiving 1
|
|
||||||
gametype_setting voipEveryoneHearsEveryone 0
|
|
||||||
gametype_setting voipKillersHearVictim 1
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting weaponCount 0
|
|
||||||
gametype_setting weaponTimer 0
|
|
||||||
|
|
||||||
// player movement
|
|
||||||
gametype_setting trm_maxHeight 95.0
|
|
@ -1,56 +0,0 @@
|
|||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played
|
|
||||||
|
|
||||||
|
|
||||||
gts timelimit "2.5" // Time limit of the game.
|
|
||||||
gts scorelimit "2" // Score limit reach to end the game.
|
|
||||||
gts roundlimit "0" // The number of rounds that will be played before the game ends.
|
|
||||||
gts bombTimer "45" // Bomb Timer. The amount of time before the bomb detonates. (2.5-150 seconds)
|
|
||||||
gts plantTime "5" // Plant Time. The amount of time it takes to plant the bomb. (1-10 seconds)
|
|
||||||
gts defuseTime "5" // Defuse Time. The amount of time it takes to defuse the bomb.(1-10 seconds)
|
|
||||||
gts extraTime "2" // Extra Time. The amount of time added on to the current time when a bomb site is destroyed.
|
|
||||||
gts OvertimetimeLimit "2" // Overtime. The amount of time the Overtime round will last before it ends.
|
|
||||||
gts silentPlant "0" // Silent Plant. Players can hear the bomb being planted.
|
|
||||||
gts roundStartExplosiveDelay "2" // Delay explosive weapon use at the start of the round.
|
|
||||||
gts roundStartKillstreakDelay "15" // Delay scorestreaks start of the round.
|
|
||||||
|
|
||||||
gts maxObjectiveEventsPerMinute "5" // Used to determine whether a player is scoreboosting.
|
|
||||||
gts maxPlayerDefensive "128" // Used to determine whether a player is scoreboosting.
|
|
||||||
gts maxPlayerEventsPerMinute "2.5" // Used to determine whether a player is scoreboosting.
|
|
||||||
|
|
||||||
gts spawntraptriggertime "10"
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.679" //Score earned towards Hero Weapons and Abilities are multiplied by this factor in Demolition
|
|
||||||
gts scoreHeroPowerTimeFactor "0.679"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleRound "3"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "1"
|
|
@ -1,51 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "30" // Score limit reach to end the game.
|
|
||||||
gts disableTacInsert "1" // Disable Tactical Insertion. 3arc have this set 1 by default to keep players for boosting.
|
|
||||||
//gts roundLimit "1" // The number of rounds that will be played before the game ends.
|
|
||||||
//gts teamScorePerKill "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamScorePerDeath "0" // Points per Death - The number of points your team loses for each death. Points can never be lower than zero. (0-25)
|
|
||||||
//gts teamScorePerHeadshot "0" // Headshot Bonus Points - Extra points awarded if the kill is a headshot in addition to the points per kill. (0-25)
|
|
||||||
//gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
//gts roundStartExplosiveDelay "2" // Delay explosive weapon use at the start of the round.
|
|
||||||
//gts roundStartKillstreakDelay "0" // Delay killstreaks at the start of the round.
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts useEmblemInsteadOfFactionIcon "1" // Show player's art on scoreboard
|
|
||||||
gts voipEveryoneHearsEveryone "1" // Everyone on voice chat hear you.
|
|
||||||
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent 50
|
|
||||||
gts gameAdvertisementRuleTimeLeft 2
|
|
||||||
gts teamCount 1
|
|
@ -1,55 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "100" // Score limit.
|
|
||||||
gts roundScoreLimit "100" // Round score limit reach
|
|
||||||
|
|
||||||
gts captureTime "10" // Capture Time. The amount of time it takes to capture an objective.
|
|
||||||
gts roundlimit "2" // The number of rounds that will be played before the game ends.
|
|
||||||
gts maxObjectiveEventsPerMinute "3"
|
|
||||||
gts maxPlayerDefensive "128"
|
|
||||||
gts maxPlayerOffensive "128"
|
|
||||||
gts maxPlayerEventsPerMinute "3"
|
|
||||||
|
|
||||||
gts flagCanBeNeutralized "0"
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.616" //Score earned towards Hero Weapons and Abilities are multiplied by this factor
|
|
||||||
gts scoreHeroPowerTimeFactor "0.616"
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent 10
|
|
||||||
gts gameAdvertisementRuleRound 3
|
|
@ -1,64 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
|
|
||||||
gts timelimit "5" // Time limit of the game.
|
|
||||||
gts scorelimit "0" // Score limit.
|
|
||||||
gts roundscorelimit "1" // Round score limit reach
|
|
||||||
gts roundwinlimit "2"
|
|
||||||
gts roundlimit "2" // The number of rounds that will be played before the game ends.
|
|
||||||
gts teamCount "2"
|
|
||||||
|
|
||||||
gts shutdownDamage "3"
|
|
||||||
gts bootTime "5"
|
|
||||||
gts rebootTime "15" // How long it takes the robot to reboot after being shut down
|
|
||||||
gts rebootPlayers "0"
|
|
||||||
gts movePlayers "1"
|
|
||||||
gts robotSpeed "1" // Movment speed of the robot
|
|
||||||
gts robotShield "0"
|
|
||||||
|
|
||||||
//gts teamScorePerDeath "0" // Points per Death - The number of points your team loses for each death. Points can never be lower than zero. (0-25)
|
|
||||||
//gts teamScorePerHeadshot "0" // Headshot Bonus Points - Extra points awarded if the kill is a headshot in addition to the points per kill. (0-25)
|
|
||||||
//gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.788" // Score earned towards Hero Weapons and Abilities are multiplied by this factor
|
|
||||||
gts scoreHeroPowerTimeFactor "0.788"
|
|
||||||
|
|
||||||
gts spawntraptriggertime "5"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleTimeLeft "3.5"
|
|
||||||
gts gameAdvertisementRuleRound "3"
|
|
@ -1,33 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "0" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "10" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting. (Could be used as screen cheating)
|
|
||||||
//gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "0" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "0" // Controls whether the final killcam is played.
|
|
||||||
gts disableCAC "0"
|
|
||||||
gts disableClassSelection "1"
|
|
||||||
gts loadoutKillstreaksEnabled "0" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
gts disableTacInsert "1" // Disable Tactical Insertion.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
gts timelimit "15" // Time limit of the game.
|
|
||||||
gts scorelimit "0" // Score limit reach to end the game.
|
|
||||||
gts roundswitch "0"
|
|
||||||
gts teamCount "1"
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
//Don't touch the first 3 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
gts wagermatchhud "1"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
|
|
||||||
gts gunSelection 3 // Ladder. Determines which set of weapons the game uses (0 = Normal. 1 = Close Quarters. 2 = Marksman. 3 = Random.)
|
|
||||||
set black_market_gun_game "0" // Toggle 1 if you want Blackjack's GunGame. leave it 0 for regular. (This might conflect with gunselection set)
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod 20 // The amount of time before the game starts. (Give weak potato players a chance to load in and not spawn.)
|
|
||||||
gts preroundperiod "10" // The amount of time before a round starts.
|
|
||||||
gts disableClassSelection "1" // Disable CAC for GunGame.
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "30" // Score limit reach to end the game.
|
|
||||||
|
|
||||||
|
|
||||||
gts setbacks 1 // Setbacks. How much weapon progression a player loses when knifed. (1-10)
|
|
||||||
gts forceRadar "1" // Enable UAV all the time
|
|
||||||
gts loadoutKillstreaksEnabled "0" // Disable Killstreaks for GunGame.
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
gts disableweapondrop "1" // No weapons on the ground for GunGame.
|
|
||||||
gts perksEnabled "0" // Disable Perks on GunGame
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
//gts playerMaxHealth "100" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
|
|
||||||
gts useEmblemInsteadOfFactionIcon "1" // Show player's art on scoreboard
|
|
||||||
gts voipEveryoneHearsEveryone "1" // Everyone on voice chat hear you.
|
|
||||||
teamCount 1
|
|
@ -1,32 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "10" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting. (Could be used as screen cheating)
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "2" // Time limit of the game.
|
|
||||||
gts scorelimit "0" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
|
|
||||||
gts loadoutKillstreaksEnabled "0" // Disable Killstreaks by setting this to 0.
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts disableTacInsert "1" // Disable Tactical Insertion. Now that would be a dick move for the infected players.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "15"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "2"
|
|
||||||
gts gameAdvertisementRuleRound "0"
|
|
||||||
gts gameAdvertisementRuleRoundsWon "0"
|
|
@ -1,55 +0,0 @@
|
|||||||
//Don't touch the first 3 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
gts kothMode "1"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "5" // Time limit of the game.
|
|
||||||
gts scorelimit "250" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
|
|
||||||
gts maxPlayerEventsPerMinute "8"
|
|
||||||
|
|
||||||
gts autoDestroyTime "60" // Lifetime. The amount of time hardpoint is active.
|
|
||||||
gts captureTime "0" // Capture Time. The amount of time it takes to capture hardpoint.
|
|
||||||
gts objectiveSpawnTime "0" // Activation Delay Time. The amount of time before the next objective becomes active.
|
|
||||||
gts randomObjectiveLocations "0" // Hardpoint Locations. The order in which the hardpoint will appear. (0 = Liner 2 = Random After First)
|
|
||||||
gts scorePerPlayer "0" // Scoring. Determines if the team gets score at a constant rate or if more points are awarded when more players occupy the hardpoint.
|
|
||||||
gts timePausesWhenInZone "1" // timelimit pauses when you capture the hardpoint.
|
|
||||||
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.45" //Score earned towards Hero Weapons and Abilities are multiplied by this factor in Hardpoint
|
|
||||||
gts scoreHeroPowerTimeFactor "0.45"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "20"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "1.5"
|
|
@ -1,47 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
// Please note that only these maps support Prop Hunt //
|
|
||||||
// Make sure to change your sv_maprotation to only them! //
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Aquarium - mp_biodome //
|
|
||||||
// Combine - mp_sector //
|
|
||||||
// Evac - mp_apartments //
|
|
||||||
// Exodus - mp_chinatown //
|
|
||||||
// Fringe - mp_veiled //
|
|
||||||
// Hunted - mp_ethiopia //
|
|
||||||
// Infection - mp_infection //
|
|
||||||
// Redwood - mp_redwood //
|
|
||||||
// Spire - mp_aerospace //
|
|
||||||
// //
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "10" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
gts spectateType "3" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts disableClassSelection "1" // Disable CAC for prop hunt.
|
|
||||||
gts allowInGameTeamChange "0" // Keep it 0
|
|
||||||
|
|
||||||
gts timelimit "4" // Time limit of the game.
|
|
||||||
gts scorelimit "0" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
gts roundLimit "4" // The number of rounds that will be played before the game ends.
|
|
||||||
gts roundwinlimit "3"
|
|
||||||
gts roundSwitch "1"
|
|
||||||
gts playerNumLives "1" // Number of Lives - Keep it 1!
|
|
||||||
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1 - keep it 1!
|
|
||||||
|
|
||||||
gts voipDeadChatWithDead "1"
|
|
||||||
gts voipDeadChatWithTeam "0"
|
|
||||||
gts voipDeadHearTeamLiving "0"
|
|
@ -1,48 +0,0 @@
|
|||||||
//Don't touch the first 3 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
gts wagermatchhud "1"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts gunSelection "1" // Setback Weapon. The weapon that will set players back in points. (0 = None 1 = Combat Axe 2 = Crossbow 3 = Ballistic Knife)
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod 20 // The amount of time before the game starts. (Give weak potato players a chance to load in and not spawn.)
|
|
||||||
gts preroundperiod "10" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowInGameTeamChange "0" // Allow team change..not sure why this is on SAS
|
|
||||||
gts disableClassSelection "1" // Disable CAC for GunGame.
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
|
|
||||||
gts timelimit "5" // Time limit of the game.
|
|
||||||
gts scorelimit "0" // Score limit reach to end the game.
|
|
||||||
gts roundlimit "1"
|
|
||||||
|
|
||||||
|
|
||||||
gts forceRadar "1" // Enable UAV all the time
|
|
||||||
gts timecount "1"
|
|
||||||
gts loadoutKillstreaksEnabled "0" // Disable Killstreaks for SAS.
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
gts disableweapondrop "1" // No weapons on the ground for SAS.
|
|
||||||
gts perksEnabled "0" // Disable Perks on SAS
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
//gts playerMaxHealth "100" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
|
|
||||||
gts useEmblemInsteadOfFactionIcon "1" // Show player's art on scoreboard
|
|
||||||
gts voipEveryoneHearsEveryone "1" // Everyone on voice chat hear you.
|
|
||||||
|
|
||||||
|
|
||||||
gts pointsPerPrimaryKill "10"
|
|
||||||
gts pointsPerSecondaryKill "10"
|
|
||||||
gts pointsPerPrimaryGrenadeKill "5"
|
|
||||||
gts pointsPerMeleeKill "5"
|
|
||||||
gts roundStartExplosiveDelay "0"
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "35"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "1.5"
|
|
||||||
teamCount 1
|
|
@ -1,62 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "3" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting. (Could be used as screen cheating)
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
gts spectateType "3" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
|
|
||||||
gts timelimit "2 // Time limit of the game.
|
|
||||||
gts scorelimit "4" // Score limit reach to end the game.
|
|
||||||
|
|
||||||
gts bombTimer 45 // Bomb Timer. The amount of time before the bomb detonates.
|
|
||||||
gts plantTime 5 // Plant Time. The amount of time it takes to plant the bomb.
|
|
||||||
gts defuseTime 5 // Defuse Time. The amount of time it takes to defuse the bomb.
|
|
||||||
gts multiBomb 0 // Multi Bomb. Every attacking player gets a bomb.
|
|
||||||
gts roundswitch 1 // The number of rounds to play before teams switch sides.
|
|
||||||
gts roundlimit 0
|
|
||||||
//gts silentPlant 0 // Players can hear the bomb being planted.
|
|
||||||
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
gts playerLives "1"
|
|
||||||
gts playerNumLives "1" // Correct gts to configure amount of respawns
|
|
||||||
gts playerKillsMax "6"
|
|
||||||
gts totalKillsMax "11"
|
|
||||||
gts teamKillScore "4"
|
|
||||||
|
|
||||||
gts voipDeadChatWithDead "1"
|
|
||||||
gts voipDeadChatWithTeam "0"
|
|
||||||
gts voipDeadHearTeamLiving "0"
|
|
||||||
|
|
||||||
gts scoreHeroPowerGainFactor "0.8"
|
|
||||||
gts scoreHeroPowerTimeFactor "0.3"
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleRoundsWon 3
|
|
@ -1,229 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "75" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
|
|
||||||
//gts teamScorePerDeath "0" // Points per Death - The number of points your team loses for each death. Points can never be lower than zero. (0-25)
|
|
||||||
//gts teamScorePerHeadshot "0" // Headshot Bonus Points - Extra points awarded if the kill is a headshot in addition to the points per kill. (0-25)
|
|
||||||
gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
gts loadoutKillstreaksEnabled "0" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
gts disableVehicleSpawners "1" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "15"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "2"
|
|
||||||
gts gameAdvertisementRuleRound "0"
|
|
||||||
gts gameAdvertisementRuleRoundsWon "0"
|
|
||||||
|
|
||||||
//Unsure about this. Maybe someone figure out what restricted items of each weapon is..Would be useful for other game modes..
|
|
||||||
//Please PR on Github if you have a list!
|
|
||||||
|
|
||||||
// SNIPER ONLY
|
|
||||||
|
|
||||||
// Unknown items restrictions
|
|
||||||
gts restrictedItems 0 1
|
|
||||||
gts restrictedItems 4 1
|
|
||||||
gts restrictedItems 5 1
|
|
||||||
gts restrictedItems 6 1
|
|
||||||
gts restrictedItems 9 1
|
|
||||||
gts restrictedItems 49 1
|
|
||||||
gts restrictedItems 55 1
|
|
||||||
gts restrictedItems 60 1
|
|
||||||
gts restrictedItems 69 1
|
|
||||||
gts restrictedItems 73 1
|
|
||||||
gts restrictedItems 79 1
|
|
||||||
gts restrictedItems 93 1
|
|
||||||
gts restrictedItems 100 1
|
|
||||||
gts restrictedItems 101 1
|
|
||||||
gts restrictedItems 102 1
|
|
||||||
gts restrictedItems 104 1
|
|
||||||
gts restrictedItems 106 1
|
|
||||||
gts restrictedItems 107 1
|
|
||||||
gts restrictedItems 131 1
|
|
||||||
gts restrictedItems 132 1
|
|
||||||
gts restrictedItems 133 1
|
|
||||||
gts restrictedItems 134 1
|
|
||||||
gts restrictedItems 135 1
|
|
||||||
gts restrictedItems 136 1
|
|
||||||
gts restrictedItems 137 1
|
|
||||||
gts restrictedItems 138 1
|
|
||||||
gts restrictedItems 139 1
|
|
||||||
gts restrictedItems 140 1
|
|
||||||
gts restrictedItems 141 1
|
|
||||||
gts restrictedItems 142 1
|
|
||||||
gts restrictedItems 143 1
|
|
||||||
gts restrictedItems 144 1
|
|
||||||
gts restrictedItems 145 1
|
|
||||||
gts restrictedItems 146 1
|
|
||||||
|
|
||||||
// Submachine guns restrictions
|
|
||||||
gts restrictedItems 10 1 // kuda
|
|
||||||
gts restrictedItems 11 1 // pharo
|
|
||||||
gts restrictedItems 12 1 // vesper
|
|
||||||
gts restrictedItems 13 1 // razorback
|
|
||||||
gts restrictedItems 14 1 // vmp
|
|
||||||
gts restrictedItems 15 1 // weevil
|
|
||||||
gts restrictedItems 16 1 // AK-74u
|
|
||||||
gts restrictedItems 17 1 // HG40
|
|
||||||
gts restrictedItems 18 1 // HLX4
|
|
||||||
gts restrictedItems 19 1 // nail gun
|
|
||||||
gts restrictedItems 34 1 // xmc
|
|
||||||
gts restrictedItems 38 1 // ppsh
|
|
||||||
gts restrictedItems 110 1 // sten
|
|
||||||
|
|
||||||
// Assault rifles restrictions
|
|
||||||
gts restrictedItems 7 1 // Peacekeeper MK2
|
|
||||||
gts restrictedItems 20 1 // kn-44
|
|
||||||
gts restrictedItems 21 1 // icr-1
|
|
||||||
gts restrictedItems 22 1 // hvk-30
|
|
||||||
gts restrictedItems 23 1 // man-o-war
|
|
||||||
gts restrictedItems 24 1 // xr-2
|
|
||||||
gts restrictedItems 25 1 // M8A7
|
|
||||||
gts restrictedItems 26 1 // sheiva
|
|
||||||
gts restrictedItems 27 1 // kvk99m
|
|
||||||
gts restrictedItems 28 1 // MX Garand
|
|
||||||
gts restrictedItems 29 1 // FFAR
|
|
||||||
gts restrictedItems 37 1 // M16
|
|
||||||
gts restrictedItems 36 1 // LV8 Basilisk
|
|
||||||
gts restrictedItems 126 1 // Galil
|
|
||||||
gts restrictedItems 129 1 // M14
|
|
||||||
|
|
||||||
// Machine guns restrictions
|
|
||||||
gts restrictedItems 30 1 // Dingo
|
|
||||||
gts restrictedItems 31 1 // Dredge
|
|
||||||
gts restrictedItems 32 1 // BRM
|
|
||||||
gts restrictedItems 33 1 // Gorgon
|
|
||||||
gts restrictedItems 35 1 // R70-Ajax
|
|
||||||
gts restrictedItems 128 1 // RPK
|
|
||||||
|
|
||||||
// Shotguns restrictions
|
|
||||||
gts restrictedItems 44 1 // Olympia
|
|
||||||
gts restrictedItems 50 1 // Haymaker
|
|
||||||
gts restrictedItems 51 1 // Argus
|
|
||||||
gts restrictedItems 52 1 // KRM-262
|
|
||||||
gts restrictedItems 53 1 // Brecci
|
|
||||||
gts restrictedItems 56 1 // Banshii
|
|
||||||
|
|
||||||
|
|
||||||
// Melee weapons restrictions
|
|
||||||
gts restrictedItems 67 1 // fury's song
|
|
||||||
gts restrictedItems 68 1 // Skull splitter
|
|
||||||
gts restrictedItems 77 1 // Baseball bat
|
|
||||||
gts restrictedItems 83 1 // Carver
|
|
||||||
gts restrictedItems 84 1 // Malice
|
|
||||||
gts restrictedItems 85 1 // Iron jim
|
|
||||||
gts restrictedItems 94 1 // Slash N' Burn
|
|
||||||
gts restrictedItems 95 1 // Brass knuckles
|
|
||||||
gts restrictedItems 96 1 // Butterfly knife
|
|
||||||
gts restrictedItems 97 1 // Wrench
|
|
||||||
gts restrictedItems 99 1 // Combat nife
|
|
||||||
gts restrictedItems 103 1 // Nightbreaker
|
|
||||||
gts restrictedItems 105 1 // Buzzcut
|
|
||||||
gts restrictedItems 108 1 // Enforcer
|
|
||||||
gts restrictedItems 109 1 // Nunchucks
|
|
||||||
gts restrictedItems 120 1 // Prizefighters
|
|
||||||
gts restrictedItems 121 1 // Katana
|
|
||||||
gts restrictedItems 122 1 // Ace of spades
|
|
||||||
gts restrictedItems 124 1 // L3FT.E
|
|
||||||
gts restrictedItems 125 1 // Bushwhacker
|
|
||||||
gts restrictedItems 147 1 // Raven's eye
|
|
||||||
|
|
||||||
|
|
||||||
// Special weapons restrictions
|
|
||||||
gts restrictedItems 54 1 // NX-Shadowclaw
|
|
||||||
gts restrictedItems 127 1 // Ballistic knife
|
|
||||||
gts restrictedItems 123 1 // D13-Sector
|
|
||||||
|
|
||||||
|
|
||||||
// Launchers restrictions
|
|
||||||
gts restrictedItems 39 1 // Max-GL
|
|
||||||
gts restrictedItems 57 1 // L4-Siege
|
|
||||||
gts restrictedItems 58 1 // XM53
|
|
||||||
gts restrictedItems 59 1 // Blackcell
|
|
||||||
|
|
||||||
|
|
||||||
// Pistols restrictions
|
|
||||||
gts restrictedItems 1 1 // MR6
|
|
||||||
gts restrictedItems 2 1 // RK5
|
|
||||||
gts restrictedItems 3 1 // L-CAR 9
|
|
||||||
gts restrictedItems 8 1 // Marshall 16
|
|
||||||
gts restrictedItems 47 1 // Rift-E9
|
|
||||||
gts restrictedItems 48 1 // 1911
|
|
||||||
|
|
||||||
|
|
||||||
// Lethal specialists restrictions
|
|
||||||
gts restrictedItems 111 1 // Scythe
|
|
||||||
gts restrictedItems 112 1 // Tempest
|
|
||||||
gts restrictedItems 113 1 // Gravity spikes
|
|
||||||
gts restrictedItems 114 1 // Ripper
|
|
||||||
gts restrictedItems 115 1 // Annihilator
|
|
||||||
gts restrictedItems 116 1 // War machine
|
|
||||||
gts restrictedItems 117 1 // Sparrow
|
|
||||||
gts restrictedItems 118 1 // HIVE
|
|
||||||
gts restrictedItems 119 1 // Purifier
|
|
||||||
|
|
||||||
|
|
||||||
// Lethal grenades restrictions
|
|
||||||
gts restrictedItems 61 1 // frag
|
|
||||||
gts restrictedItems 62 1 // combat axe
|
|
||||||
gts restrictedItems 63 1 // semtex
|
|
||||||
gts restrictedItems 64 1 // c4
|
|
||||||
gts restrictedItems 65 1 // trip mine
|
|
||||||
gts restrictedItems 66 1 // thermite
|
|
||||||
|
|
||||||
|
|
||||||
// Tactical grenades restrictions
|
|
||||||
gts restrictedItems 70 1 // smoke screen
|
|
||||||
gts restrictedItems 71 1 // concussion
|
|
||||||
gts restrictedItems 72 1 // emp
|
|
||||||
gts restrictedItems 74 1 // flash bang
|
|
||||||
gts restrictedItems 75 1 // shock charge
|
|
||||||
gts restrictedItems 76 1 // black hat
|
|
||||||
gts restrictedItems 78 1 // trophy system
|
|
||||||
|
|
||||||
|
|
||||||
// Sniper scope restrictions
|
|
||||||
gts restrictedattachments 32 weaponindex 40 1 // Locus
|
|
||||||
gts restrictedattachments 32 weaponindex 41 1 // Drakon
|
|
||||||
gts restrictedattachments 32 weaponindex 42 1 // SVG-100
|
|
||||||
gts restrictedattachments 32 weaponindex 43 1 // P0-6
|
|
||||||
gts restrictedattachments 32 weaponindex 45 1 // Interdiction-RSA
|
|
||||||
gts restrictedattachments 22 weaponindex 46 1 // DBSR -> 22 unknown scope id
|
|
||||||
gts restrictedattachments 32 weaponindex 46 1 // DBSR no elo sight
|
|
||||||
gts restrictedattachments 33 weaponindex 46 1 // DBSR -> 33 unknown scope id
|
|
||||||
gts restrictedattachments 32 weaponindex 98 1 // XPR-50
|
|
||||||
gts restrictedattachments 32 weaponindex 130 1 // Dragoon
|
|
@ -1,50 +0,0 @@
|
|||||||
//Don't touch the first 2 lines below here.
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_default.cfg"
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg"
|
|
||||||
|
|
||||||
|
|
||||||
// Below this line you may uncomment the " // " commands and edit to your liking.
|
|
||||||
// If you unsure the default command. you can always " // " them back for later custom gameplay.
|
|
||||||
|
|
||||||
gts prematchrequirement "0" // (0-10) Number of players on each team or the total number of players before the pre-match countdown will start.
|
|
||||||
gts prematchrequirementtime "0" // (0-60) The amount of time before the match will start.
|
|
||||||
gts prematchperiod "15" // The amount of time before the game starts.
|
|
||||||
gts preroundperiod "5" // The amount of time before a round starts.
|
|
||||||
gts inactivityKick "120" // Kick players that's AFK
|
|
||||||
gts allowSpectating "1" // Allow players to spectate other players or CODcasting.
|
|
||||||
gts spectateType "1" // 0 disabled, 1 team only, 2 freelook, 3 team only spectate splitscreen players only
|
|
||||||
gts allowInGameTeamChange "1" // Allow players to switch teams?
|
|
||||||
gts autoTeamBalance "1" // Automatically assign players to teams
|
|
||||||
gts allowFinalKillcam "1" // Controls whether the final killcam is played.
|
|
||||||
|
|
||||||
gts timelimit "10" // Time limit of the game.
|
|
||||||
gts scorelimit "100" // Score limit reach to end the game.
|
|
||||||
gts teamCount "2"
|
|
||||||
gts roundLimit "1" // The number of rounds that will be played before the game ends.
|
|
||||||
|
|
||||||
//gts teamScorePerDeath "0" // Points per Death - The number of points your team loses for each death. Points can never be lower than zero. (0-25)
|
|
||||||
//gts teamScorePerHeadshot "0" // Headshot Bonus Points - Extra points awarded if the kill is a headshot in addition to the points per kill. (0-25)
|
|
||||||
//gts playerNumLives "0" // Number of Lives - The number of times each player can die before they are no longer allowed to respawn. (0-25)
|
|
||||||
//gts loadoutKillstreaksEnabled "1" // Disable Killstreaks by setting this to 0
|
|
||||||
//gts perksEnabled "1" // Disable Perks by setting this to 0
|
|
||||||
//gts disableVehicleSpawners "0" // This should disable robots from the DLC map Rupture by setting this to 1
|
|
||||||
//gts disableweapondrop "0" // No weapons on the ground.
|
|
||||||
//gts disallowprone "0" // Don't allow players to lay down.
|
|
||||||
//gts allowHitMarkers "2" // Rather or not to show hitmakers?
|
|
||||||
//gts allowAnnouncer "1" // Annouce enemy team actions
|
|
||||||
|
|
||||||
//Hardcore Mode
|
|
||||||
//gts hardcoreMode "1" // Enable hardcore mode.
|
|
||||||
//gts friendlyfiretype "1" // Enable or Disable Friendly Fire. 1 on, 2 reflect, 3 shared.
|
|
||||||
//gts playerHealthRegenTime "0" // Time it takes you to recover damage.
|
|
||||||
//gts playerMaxHealth "30" // Percent of Health players will have on Respawn.
|
|
||||||
//gts onlyHeadshots "0" // Headshots only
|
|
||||||
//gts allowKillcam "0" // Allow Killcam.
|
|
||||||
//gts allowbattlechatter "0" // Shut the fucking player dialogues up.
|
|
||||||
//gts teamKillPointLoss "1" // Points per Kill - The number of points for each kill. (0-25)
|
|
||||||
//gts teamKillPunishCount "3" // Kick constant Team killers out of your server.
|
|
||||||
|
|
||||||
gts gameAdvertisementRuleScorePercent "15"
|
|
||||||
gts gameAdvertisementRuleTimeLeft "2"
|
|
||||||
gts gameAdvertisementRuleRound "0"
|
|
||||||
gts gameAdvertisementRuleRoundsWon "0"
|
|
@ -1,104 +0,0 @@
|
|||||||
|
|
||||||
gametype_setting allowAnnouncer 1
|
|
||||||
gametype_setting allowBattleChatter 1
|
|
||||||
gametype_setting allowFinalKillcam 1
|
|
||||||
gametype_setting allowHitMarkers 2
|
|
||||||
gametype_setting allowInGameTeamChange 0
|
|
||||||
gametype_setting allowKillcam 1
|
|
||||||
gametype_setting allowSpectating 0
|
|
||||||
gametype_setting autoDestroyTime 0
|
|
||||||
gametype_setting autoTeamBalance 0
|
|
||||||
gametype_setting bombTimer 0
|
|
||||||
gametype_setting bulletDamageScalar 1.0
|
|
||||||
gametype_setting captureTime 10
|
|
||||||
gametype_setting crateCaptureTime 3
|
|
||||||
gametype_setting cumulativeRoundScores 0
|
|
||||||
gametype_setting deathPointLoss 0
|
|
||||||
gametype_setting defuseTime 0
|
|
||||||
gametype_setting delayPlayer 0
|
|
||||||
gametype_setting destroyTime 0
|
|
||||||
gametype_setting disableAmbientFx 0
|
|
||||||
gametype_setting disableAttachments 0
|
|
||||||
gametype_setting disableCAC 1
|
|
||||||
gametype_setting disableContracts 0
|
|
||||||
gametype_setting disableTacInsert 0
|
|
||||||
gametype_setting disableweapondrop 1
|
|
||||||
gametype_setting disallowaimslowdown 0
|
|
||||||
gametype_setting disallowprone 0
|
|
||||||
gametype_setting enemyCarrierVisible 0
|
|
||||||
gametype_setting extraTime 0
|
|
||||||
gametype_setting flagCaptureGracePeriod 0
|
|
||||||
gametype_setting flagDecayTime 0
|
|
||||||
gametype_setting flagRespawnTime 0
|
|
||||||
gametype_setting forceRadar 0
|
|
||||||
gametype_setting friendlyfiretype 0
|
|
||||||
gametype_setting hardcoremode 0
|
|
||||||
gametype_setting hotPotato 0
|
|
||||||
gametype_setting idleFlagDecay 0
|
|
||||||
gametype_setting idleFlagResetTime 0
|
|
||||||
gametype_setting inactivityKick 0
|
|
||||||
gametype_setting kothMode 0
|
|
||||||
gametype_setting leaderBonus 0
|
|
||||||
gametype_setting loadoutKillstreaksEnabled 1
|
|
||||||
gametype_setting maxObjectiveEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerDefensive 0
|
|
||||||
gametype_setting maxPlayerEventsPerMinute 0
|
|
||||||
gametype_setting maxPlayerOffensive 0
|
|
||||||
gametype_setting multiBomb 0
|
|
||||||
gametype_setting objectiveSpawnTime 0
|
|
||||||
gametype_setting onlyHeadshots 0
|
|
||||||
gametype_setting perksEnabled 0
|
|
||||||
gametype_setting plantTime 0
|
|
||||||
gametype_setting playerForceRespawn 1
|
|
||||||
gametype_setting playerHealthRegenTime 5
|
|
||||||
gametype_setting playerKillsMax 0
|
|
||||||
gametype_setting playerMaxHealth 100
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerObjectiveHeldRespawnDelay 0
|
|
||||||
gametype_setting playerQueuedRespawn 0
|
|
||||||
gametype_setting playerRespawnDelay 0
|
|
||||||
gametype_setting playerSprintTime 4
|
|
||||||
gametype_setting pregameAlwaysShowCACEdit 1
|
|
||||||
gametype_setting pregameAlwaysShowStreakEdit 1
|
|
||||||
gametype_setting pregameCACModifyTime 0
|
|
||||||
gametype_setting pregameDraftEnabled 0
|
|
||||||
gametype_setting pregameDraftRoundTime 0
|
|
||||||
gametype_setting pregameItemMaxVotes 0
|
|
||||||
gametype_setting pregameItemVoteEnabled 0
|
|
||||||
gametype_setting pregameItemVoteRoundTime 0
|
|
||||||
gametype_setting pregamePositionShuffleMethod 0
|
|
||||||
gametype_setting pregamePositionSortType 0
|
|
||||||
gametype_setting pregamePostRoundTime 0
|
|
||||||
gametype_setting pregamePostStageTime 0
|
|
||||||
gametype_setting pregamePreStageTime 0
|
|
||||||
gametype_setting pregameScorestreakModifyTime 0
|
|
||||||
gametype_setting randomObjectiveLocations 0
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting roundStartExplosiveDelay 5
|
|
||||||
gametype_setting roundStartKillstreakDelay 0
|
|
||||||
gametype_setting roundswitch 1 // rounds between switching teams
|
|
||||||
gametype_setting roundwinlimit 0
|
|
||||||
gametype_setting scoreHeroPowerGainFactor 1.0
|
|
||||||
gametype_setting scoreHeroPowerTimeFactor 1.0
|
|
||||||
gametype_setting scorelimit 100
|
|
||||||
gametype_setting spectateType 1
|
|
||||||
gametype_setting teamCount 1
|
|
||||||
gametype_setting teamKillPenalty 2
|
|
||||||
gametype_setting teamKillPointLoss 0
|
|
||||||
gametype_setting teamKillPunishCount 3
|
|
||||||
gametype_setting teamKillReducedPenalty 0.25
|
|
||||||
gametype_setting teamKillScore 4
|
|
||||||
gametype_setting teamKillSpawnDelay 20
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting totalKillsMax 0
|
|
||||||
gametype_setting vehiclesEnabled 1
|
|
||||||
gametype_setting vehiclesTimed 1
|
|
||||||
gametype_setting voipDeadChatWithDead 0
|
|
||||||
gametype_setting voipDeadChatWithTeam 1
|
|
||||||
gametype_setting voipDeadHearAllLiving 0
|
|
||||||
gametype_setting voipDeadHearKiller 0
|
|
||||||
gametype_setting voipDeadHearTeamLiving 1
|
|
||||||
gametype_setting voipEveryoneHearsEveryone 0
|
|
||||||
gametype_setting voipKillersHearVictim 1
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting zmDifficulty 1
|
|
@ -1,12 +0,0 @@
|
|||||||
gametype_setting scorelimit 7500
|
|
||||||
gametype_setting timelimit 10
|
|
||||||
gametype_setting roundlimit 1
|
|
||||||
gametype_setting playerNumlives 0
|
|
||||||
gametype_setting playerrespawndelay 0
|
|
||||||
gametype_setting waverespawndelay 0
|
|
||||||
gametype_setting disableweapondrop 1
|
|
||||||
gametype_setting allowAnnouncer 0
|
|
||||||
gametype_setting startRound 1
|
|
||||||
gametype_setting magic 1
|
|
||||||
gametype_setting headshotsonly 0
|
|
||||||
gametype_setting allowdogs 1
|
|
@ -1,71 +0,0 @@
|
|||||||
Lobby.Process.CreateDedicatedModsLobby = function (controller, toTarget)
|
|
||||||
local lobby_mode = Engine.DvarString( nil, "sv_lobby_mode" )
|
|
||||||
if lobby_mode ~= "" then
|
|
||||||
if lobby_mode == "zm" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_ZMLOBBYONLINECUSTOMGAME
|
|
||||||
elseif lobby_mode == "cp" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_CPLOBBYONLINECUSTOMGAME
|
|
||||||
elseif lobby_mode == "cpzm" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_CP2LOBBYONLINECUSTOMGAME
|
|
||||||
elseif lobby_mode == "fr" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_FRLOBBYONLINEGAME
|
|
||||||
toTarget.maxClients = Engine.DvarInt( nil, "com_maxclients" )
|
|
||||||
elseif lobby_mode == "doa" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_DOALOBBYONLINE
|
|
||||||
elseif lobby_mode == "mp" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_MPLOBBYONLINEMODGAME
|
|
||||||
elseif lobby_mode == "arena" then
|
|
||||||
toTarget = LobbyData.UITargets.UI_MPLOBBYONLINEARENAGAME
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local playlistID = Dvar.sv_playlist
|
|
||||||
Engine.SetPlaylistID(playlistID:get())
|
|
||||||
local lobbyInit = Lobby.Actions.ExecuteScript(function ()
|
|
||||||
Lobby.ProcessNavigate.SetupLobbyMapAndGameType(controller, toTarget)
|
|
||||||
end)
|
|
||||||
local setNetworkMode = Lobby.Actions.SetNetworkMode(controller, Enum.LobbyNetworkMode.LOBBY_NETWORKMODE_LIVE)
|
|
||||||
local lobbySettings = Lobby.Actions.LobbySettings(controller, toTarget)
|
|
||||||
local updateUI = Lobby.Actions.UpdateUI(controller, toTarget)
|
|
||||||
local createGameHost = Lobby.Actions.LobbyHostStart(controller, toTarget.mainMode, toTarget.lobbyType, toTarget.lobbyMode, toTarget.maxClients)
|
|
||||||
local lobbyAdvertise = Lobby.Actions.AdvertiseLobby(true)
|
|
||||||
local hostingEvent = Lobby.Actions.ExecuteScript(function ()
|
|
||||||
Engine.QoSProbeListenerEnable(toTarget.lobbyType, true)
|
|
||||||
Engine.SetDvar("live_dedicatedReady", 1)
|
|
||||||
Engine.RunPlaylistRules(controller)
|
|
||||||
Engine.RunPlaylistSettings(controller)
|
|
||||||
Lobby.Timer.HostingLobby({controller = controller, lobbyType = toTarget.lobbyType, mainMode = toTarget.mainMode, lobbyTimerType = toTarget.lobbyTimerType})
|
|
||||||
if Engine.DvarInt( nil, "sv_skip_lobby" ) == 1 then
|
|
||||||
-- Engine.ComError( Enum.errorCode.ERROR_SCRIPT, "Using sv_skip_lobby" )
|
|
||||||
local map_rotation_string = Engine.DvarString( nil, "sv_maprotation" )
|
|
||||||
if map_rotation_string ~= "" then
|
|
||||||
local map_rotation_tokens = split_string( map_rotation_string, " " )
|
|
||||||
if map_rotation_tokens[ 1 ] == "gametype" then
|
|
||||||
Engine.Exec(0, "lobby_setgametype " .. map_rotation_tokens[ 2 ] )
|
|
||||||
-- Engine.ComError( Enum.errorCode.ERROR_SCRIPT, "Set gametype to " .. map_rotation_tokens[ 2 ] .. " based on map rotation" )
|
|
||||||
if map_rotation_tokens[ 3 ] == "map" then
|
|
||||||
Engine.Exec(0, "lobby_setmap " .. map_rotation_tokens[ 4 ] )
|
|
||||||
-- Engine.ComError( Enum.errorCode.ERROR_SCRIPT, "Set map to " .. map_rotation_tokens[ 4 ] .. " based on map rotation" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
Engine.Exec(0, "launchgame")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
Lobby.Process.AddActions(setNetworkMode, lobbySettings)
|
|
||||||
Lobby.Process.AddActions(lobbySettings, lobbyInit)
|
|
||||||
Lobby.Process.AddActions(lobbyInit, updateUI)
|
|
||||||
Lobby.Process.AddActions(updateUI, createGameHost)
|
|
||||||
Lobby.Process.AddActions(createGameHost, lobbyAdvertise)
|
|
||||||
Lobby.Process.AddActions(lobbyAdvertise, hostingEvent)
|
|
||||||
Lobby.Process.AddActions(hostingEvent, nil)
|
|
||||||
return {head = setNetworkMode, interrupt = Lobby.Interrupt.NONE, force = true, cancellable = true}
|
|
||||||
end
|
|
||||||
|
|
||||||
function split_string(str, delimiter)
|
|
||||||
local tokens = {}
|
|
||||||
local pattern = string.format("([^%s]+)", delimiter)
|
|
||||||
for token in string.gmatch(str, pattern) do
|
|
||||||
table.insert(tokens, token)
|
|
||||||
end
|
|
||||||
return tokens
|
|
||||||
end
|
|
@ -1,141 +0,0 @@
|
|||||||
//////////////////////////////////////////////////
|
|
||||||
/// T7x Server Configuration //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// SERVER NAME & COLORS TIPS //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// ^1 Red //
|
|
||||||
// ^2 Green //
|
|
||||||
// ^3 Yellow //
|
|
||||||
// ^4 Blue //
|
|
||||||
// ^5 Cyan //
|
|
||||||
// ^6 Pink //
|
|
||||||
// ^7 White //
|
|
||||||
// ^8 Depends on the team colors playing. //
|
|
||||||
// ^9 Orange //
|
|
||||||
// ^0 Black //
|
|
||||||
// //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set live_steam_server_name "Default T7x Server" // Sets the server hostname.
|
|
||||||
set live_steam_server_description "My longest YEA T7x ever" // Sets a server description visible on the serverlist
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// NON-GAMEPLAY CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set com_maxclients "18" // Max players in your server.
|
|
||||||
set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled)
|
|
||||||
set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out.
|
|
||||||
set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) )
|
|
||||||
set sv_timeout "30" // Timeout time period. You will timeout after (30) seconds when attempting to connect or if you are getting connection interruptions
|
|
||||||
set sv_reconnectlimit "3" // How many times you can try to reconnect
|
|
||||||
set sv_pure "0" // verifying cilent files
|
|
||||||
set sv_floodProtect "1" // Chat Spam Protection
|
|
||||||
set g_log "t7x/games_mp.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot.
|
|
||||||
set sv_lobby_mode "mp" // Sets the lobby type to multiplayer.
|
|
||||||
set sv_skip_lobby "1" // Makes the server load the map immediately instead of waiting at the lobby. Turn this off if you want to use playlists instead(currently required for custom maps).
|
|
||||||
set sv_lanonly "0" // Keep your server from bordcasting to the public list and Local LAN only.
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// BOT CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set bot_maxallies "0" // Amount of Bots on the Friendly Team
|
|
||||||
set bot_maxAxis "0" // Amount of Bots on the Enemy Team
|
|
||||||
set bot_maxFree "0" // Bots free-for-all based modes? Untested.
|
|
||||||
set bot_difficulty "1" // Bot Skill. (0 - Easy, 1 - Normal, 2 - Hard, 3 - Veteran)
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// BASE GAME CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// dm - Free-for-all //
|
|
||||||
// tdm - Team Deathmatch //
|
|
||||||
// ball - Uplink //
|
|
||||||
// sd - Search and Destroy //
|
|
||||||
// sr - Search and Rescue //
|
|
||||||
// dom - Domination //
|
|
||||||
// dem - Demolition //
|
|
||||||
// conf - Kill Confirmed //
|
|
||||||
// ctf - Capture the Flag //
|
|
||||||
// shrp - Sharpshooter //
|
|
||||||
// gun - GunGame //
|
|
||||||
// sas - Sticks and Stones //
|
|
||||||
// koth - Hardpoint //
|
|
||||||
// escort - Safeguard //
|
|
||||||
// clean - Fracture //
|
|
||||||
// prop - Prop Hunt //
|
|
||||||
// infect - Infected //
|
|
||||||
// sniperonly - Snipers Only //
|
|
||||||
// //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
exec "gamedata/gamesettings/mp/gamesettings_tdm.cfg" // Change this to the gametype config of the mode you want to run (e.g. ../gamesettings_conf.cfg, ../gamesettings_escort.cfg)
|
|
||||||
//set gametype "tdm" // Set the gametype in the map rotation for now
|
|
||||||
|
|
||||||
set scr_teambalance "1" // Enable or Disable auto balance.
|
|
||||||
set cg_thirdPerson "0" // third-person mode
|
|
||||||
set g_deadChat "0" // Dead Players' Chat Messages can be seen by everyone
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
// MAP SHORT NAMES ROTATION LIST //
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// * - Maps that support Prop Hunt //
|
|
||||||
// //
|
|
||||||
///////////Base Maps/////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Aquarium* - mp_biodome //
|
|
||||||
// Breach - mp_spire //
|
|
||||||
// Combine* - mp_sector //
|
|
||||||
// Evac* - mp_apartments //
|
|
||||||
// Exodus* - mp_chinatown //
|
|
||||||
// Fringe* - mp_veiled //
|
|
||||||
// Havoc - mp_havoc //
|
|
||||||
// Hunted* - mp_ethiopia //
|
|
||||||
// Infection* - mp_infection //
|
|
||||||
// Metro - mp_metro //
|
|
||||||
// Redwood* - mp_redwood //
|
|
||||||
// Stronghold - mp_stronghold //
|
|
||||||
// Nuk3town* - mp_nuketown_x //
|
|
||||||
// //
|
|
||||||
///////////Awakening DLC/////////////////////////////
|
|
||||||
// //
|
|
||||||
// Gauntlet - mp_crucible //
|
|
||||||
// Rise - mp_rise //
|
|
||||||
// Skyjacked - mp_skyjacked //
|
|
||||||
// Splash - mp_waterpark //
|
|
||||||
// //
|
|
||||||
///////////Eclipse DLC///////////////////////////////
|
|
||||||
// //
|
|
||||||
// Knockout - mp_kung_fu //
|
|
||||||
// Rift - mp_conduit //
|
|
||||||
// Spire* - mp_aerospace //
|
|
||||||
// Verge - mp_banzai //
|
|
||||||
// //
|
|
||||||
///////////Descent DLC///////////////////////////////
|
|
||||||
// //
|
|
||||||
// Berserk - mp_shrine //
|
|
||||||
// Cryogen - mp_cryogen //
|
|
||||||
// Empire - mp_rome //
|
|
||||||
// Rumble - mp_arena //
|
|
||||||
// //
|
|
||||||
///////////Salvation DLC/////////////////////////////
|
|
||||||
// //
|
|
||||||
// Citadel - mp_ruins //
|
|
||||||
// Micro - mp_miniature //
|
|
||||||
// Outlaw - mp_western //
|
|
||||||
// Rupture - mp_city //
|
|
||||||
// //
|
|
||||||
///////////Bonus Maps////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Fringe Night - mp_veiled_heyday //
|
|
||||||
// Redwood Snow - mp_redwood_ice //
|
|
||||||
// //
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set sv_maprotation "gametype tdm map mp_biodome map mp_spire map mp_sector map mp_apartments map mp_chinatown map mp_veiled map mp_havoc map mp_ethiopia map mp_infection map mp_metro map mp_redwood map mp_stronghold map mp_nuketown_x map mp_shrine map mp_ruins map mp_cryogen map mp_rome map mp_crucible map mp_kung_fu map mp_miniature map mp_western map mp_conduit map mp_rise map mp_arena map mp_city map mp_skyjacked map mp_aerospace map mp_waterpark map mp_banzai map mp_veiled_heyday map mp_redwood_ice"
|
|
@ -1,80 +0,0 @@
|
|||||||
//////////////////////////////////////////////////
|
|
||||||
/// T7x Server Configuration //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// SERVER NAME & COLORS TIPS //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// ^1 Red //
|
|
||||||
// ^2 Green //
|
|
||||||
// ^3 Yellow //
|
|
||||||
// ^4 Blue //
|
|
||||||
// ^5 Cyan //
|
|
||||||
// ^6 Pink //
|
|
||||||
// ^7 White //
|
|
||||||
// ^8 Depends on the team colors playing. //
|
|
||||||
// ^9 Orange //
|
|
||||||
// ^0 Black //
|
|
||||||
// //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set live_steam_server_name "Default T7x Campaign Server" // Sets the server hostname.
|
|
||||||
set live_steam_server_description "My longest YEA T7x CAMPAIGN ever" // Sets a server description visible on the serverlist
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// NON-GAMEPLAY CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set com_maxclients "4" // Max players in your server.
|
|
||||||
set lobby_min_players "1" // Minimum amount of players for the Match to start.
|
|
||||||
set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled)
|
|
||||||
set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out.
|
|
||||||
set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) )
|
|
||||||
set sv_timeout "30" // Timeout time period. You will timeout after (30) seconds when attempting to connect or if you are getting connection interruptions
|
|
||||||
set sv_reconnectlimit "3" // How many times you can try to reconnect
|
|
||||||
set sv_pure "0" // verifying cilent files
|
|
||||||
set sv_floodProtect "1" // Chat Spam Protection
|
|
||||||
set g_log "t7x/games_cp.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot.
|
|
||||||
set sv_lobby_mode "cp" // Sets the lobby type to camapaign
|
|
||||||
set sv_skip_lobby "1" // Makes the server load the map immediately instead of waiting at the lobby. Turn this off if you want to use playlists instead(currently required for custom maps).
|
|
||||||
set sv_lanonly "0" // Keep your server from bordcasting to the public list and Local LAN only.
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// BASE GAME CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
exec "gamedata/gamesettings/cp/gamesettings_default.cfg" // Leave this as is
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg" // Leave this as is
|
|
||||||
exec "gamedata/gamesettings/cp/gamesettings_coop.cfg" // Leave this as is
|
|
||||||
|
|
||||||
set cg_thirdPerson "0" // third-person mode
|
|
||||||
set g_deadChat "0" // Dead Players' Chat Messages can be seen by everyone
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
// MAP SHORT NAMES ROTATION LIST //
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
///////Safehouses/////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Mobile - cp_sh_mobile //
|
|
||||||
// Singapore - cp_sh_singapore //
|
|
||||||
// Cairo - cp_sh_cairo //
|
|
||||||
// //
|
|
||||||
///////Missions///////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Black Ops - cp_mi_eth_prologue //
|
|
||||||
// New World - cp_mi_zurich_newworld //
|
|
||||||
// In Darkness - cp_mi_sing_blackstation //
|
|
||||||
// Provocation - cp_mi_sing_biodomes //
|
|
||||||
// Hypocenter - cp_mi_sing_sgen //
|
|
||||||
// Vengeance - cp_mi_sing_vengeance //
|
|
||||||
// Rise & Fall - cp_mi_cairo_ramses //
|
|
||||||
// Demon Within - cp_mi_cairo_infection //
|
|
||||||
// Sand Castle - cp_mi_cairo_aquifer //
|
|
||||||
// Lotus Towers - cp_mi_cairo_lotus //
|
|
||||||
// Life - cp_mi_zurich_coalescence //
|
|
||||||
// //
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set sv_maprotation "gametype coop map cp_mi_eth_prologue"
|
|
@ -1,93 +0,0 @@
|
|||||||
//////////////////////////////////////////////////
|
|
||||||
/// T7x Server Configuration //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// SERVER NAME & COLORS TIPS //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
// ^1 Red //
|
|
||||||
// ^2 Green //
|
|
||||||
// ^3 Yellow //
|
|
||||||
// ^4 Blue //
|
|
||||||
// ^5 Cyan //
|
|
||||||
// ^6 Pink //
|
|
||||||
// ^7 White //
|
|
||||||
// ^8 Depends on the team colors playing. //
|
|
||||||
// ^9 Orange //
|
|
||||||
// ^0 Black //
|
|
||||||
// //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set live_steam_server_name "Default T7x Zombies Server" // Sets the server hostname.
|
|
||||||
set live_steam_server_description "My longest YEA T7x ZOMBIES ever" // Sets a server description visible on the serverlist
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// NON-GAMEPLAY CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set com_maxclients "4" // Max players in your server.
|
|
||||||
set lobby_min_players "1" // Minimum amount of players for the Match to start.
|
|
||||||
set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled)
|
|
||||||
set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out.
|
|
||||||
set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) )
|
|
||||||
set sv_timeout "30" // Timeout time period. You will timeout after (30) seconds when attempting to connect or if you are getting connection interruptions
|
|
||||||
set sv_reconnectlimit "3" // How many times you can try to reconnect
|
|
||||||
set sv_pure "0" // verifying cilent files
|
|
||||||
set sv_floodProtect "1" // Chat Spam Protection
|
|
||||||
set g_log "t7x/games_zm.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot.
|
|
||||||
set sv_lobby_mode "zm" // Sets the lobby type to zombies
|
|
||||||
set sv_skip_lobby "1" // Makes the server load the map immediately instead of waiting at the lobby. Turn this off if you want to use playlists instead(currently required for custom maps).
|
|
||||||
set sv_lanonly "0" // Keep your server from bordcasting to the public list and Local LAN only.
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// BASE GAME CONFIGURATION //
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
exec "gamedata/gamesettings/zm/gamesettings_default.cfg" // Leave this as is
|
|
||||||
exec "gamedata/configs/common/default_xboxlive.cfg" // Leave this as is
|
|
||||||
exec "gamedata/gamesettings/zm/gamesettings_zclassic.cfg" // Leave this as is
|
|
||||||
|
|
||||||
set cg_thirdPerson "0" // third-person mode
|
|
||||||
set g_deadChat "0" // Dead Players' Chat Messages can be seen by everyone
|
|
||||||
set scr_firstGumFree "1" // Price of first Gobblegum (1 = free, 0 = 500)
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
// MAP SHORT NAMES ROTATION LIST //
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
// //
|
|
||||||
/////////Base Maps/////////////////////////////////
|
|
||||||
// //
|
|
||||||
// Shadows of Evil - zm_zod //
|
|
||||||
// //
|
|
||||||
/////////Awakening DLC/////////////////////////////
|
|
||||||
// //
|
|
||||||
// Der Eisendrache - zm_castle //
|
|
||||||
// //
|
|
||||||
/////////Eclipse DLC///////////////////////////////
|
|
||||||
// //
|
|
||||||
// Zetsubou No Shima - zm_island //
|
|
||||||
// //
|
|
||||||
/////////Descent DLC///////////////////////////////
|
|
||||||
// //
|
|
||||||
// Gorod Krovi - zm_stalingrad //
|
|
||||||
// //
|
|
||||||
/////////Salvation DLC/////////////////////////////
|
|
||||||
// //
|
|
||||||
// Revelations - zm_genesis //
|
|
||||||
// //
|
|
||||||
/////////Zombies Chronicles DLC////////////////////
|
|
||||||
// //
|
|
||||||
// Ascension - zm_cosmodrome //
|
|
||||||
// Kino der Toten - zm_theater //
|
|
||||||
// Moon - zm_moon //
|
|
||||||
// Nacht der Untoten - zm_prototype //
|
|
||||||
// Origins - zm_tomb //
|
|
||||||
// Shangri-La - zm_temple //
|
|
||||||
// Shi No Numa - zm_sumpf //
|
|
||||||
// The Giant - zm_factory //
|
|
||||||
// Verrückt - zm_asylum //
|
|
||||||
// //
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
|
|
||||||
set sv_maprotation "gametype zclassic map zm_tomb"
|
|
Binary file not shown.
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 14 KiB |
@ -117,9 +117,11 @@
|
|||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<h1>
|
<h1>
|
||||||
<span style="color: #f97316">T</span
|
<span style="color: #f97316">B</span
|
||||||
><span style="color: #ec511c">7</span
|
><span style="color: #ec511c">O</span
|
||||||
><span style="color: #e53f21">x</span>
|
><span style="color: #e53f21">I</span
|
||||||
|
><span style="color: #e23623">I</span
|
||||||
|
><span style="color: #dc2626">I</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="button" onclick="window.external.runGame()">Play</div>
|
<div class="button" onclick="window.external.runGame()">Play</div>
|
||||||
<div class="button" onclick="window.external.openUrl('https://bo3.eu')">
|
<div class="button" onclick="window.external.openUrl('https://bo3.eu')">
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: File a bug report
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Before you hit the submit button:
|
|
||||||
* Please see our [Contribution Guidelines](https://github.com/asmjit/asmjit/blob/master/CONTRIBUTING.md).
|
|
||||||
* Make sure that you use a recent AsmJit (master branch) before filing a bug report.
|
|
||||||
* Make sure that you use logging and error handling features to collect as much information as possible, if applicable.
|
|
||||||
- type: textarea
|
|
||||||
id: issue-description
|
|
||||||
attributes:
|
|
||||||
label: Issue Description
|
|
||||||
description: Please share a clear and concise description of the issue and optionally provide reproducibility information and output from AsmJit's logger.
|
|
||||||
placeholder: Description
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: dropdown
|
|
||||||
id: operating-system
|
|
||||||
attributes:
|
|
||||||
label: Operating System
|
|
||||||
multiple: true
|
|
||||||
options:
|
|
||||||
- Not specified / possibly all
|
|
||||||
- Windows
|
|
||||||
- Linux
|
|
||||||
- Mac
|
|
||||||
- Android
|
|
||||||
- Other
|
|
||||||
- type: dropdown
|
|
||||||
id: target-architecture
|
|
||||||
attributes:
|
|
||||||
label: Architecture
|
|
||||||
multiple: true
|
|
||||||
options:
|
|
||||||
- Not specified
|
|
||||||
- X86 / X86_64
|
|
||||||
- AArch32
|
|
||||||
- AArch64
|
|
||||||
- RISC-V
|
|
||||||
- Other
|
|
@ -1,18 +0,0 @@
|
|||||||
name: Feature Request
|
|
||||||
description: Request a new feature or enhancement
|
|
||||||
labels: [enhancement]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Before you hit the submit button:
|
|
||||||
* Please see our [Contribution Guidelines](https://github.com/asmjit/asmjit/blob/master/CONTRIBUTING.md).
|
|
||||||
* Make sure that you use a recent AsmJit (master branch) before filing a feature request.
|
|
||||||
- type: textarea
|
|
||||||
id: issue-description
|
|
||||||
attributes:
|
|
||||||
label: Issue Description
|
|
||||||
description: Please share a clear and concise description of a new feature or enhancement.
|
|
||||||
placeholder: Description
|
|
||||||
validations:
|
|
||||||
required: true
|
|
@ -1,18 +0,0 @@
|
|||||||
name: Help & Questions
|
|
||||||
description: Ask a question or get help
|
|
||||||
labels: [question]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Before you hit the submit button:
|
|
||||||
* Please see our [Contribution Guidelines](https://github.com/asmjit/asmjit/blob/master/CONTRIBUTING.md).
|
|
||||||
* [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) is usually faster to get answers.
|
|
||||||
* If you need a help, please include as much information as possible to make it clear what the intend is.
|
|
||||||
- type: textarea
|
|
||||||
id: issue-description
|
|
||||||
attributes:
|
|
||||||
label: Details
|
|
||||||
description: The description of the problem or question.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
@ -1,11 +0,0 @@
|
|||||||
name: Other Issues
|
|
||||||
description: Something that doesn't fit the other categories
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: issue-description
|
|
||||||
attributes:
|
|
||||||
label: Issue Description
|
|
||||||
description: Please share a clear and concise description of the issue.
|
|
||||||
placeholder: Description
|
|
||||||
validations:
|
|
||||||
required: true
|
|
46
deps/asmjit/.github/workflows/build-config.json
vendored
46
deps/asmjit/.github/workflows/build-config.json
vendored
@ -1,8 +1,7 @@
|
|||||||
{
|
{
|
||||||
"diagnostics": {
|
"diagnostics": {
|
||||||
"asan": { "definitions": ["ASMJIT_SANITIZE=address"] },
|
"asan": { "definitions": ["ASMJIT_SANITIZE=address"] },
|
||||||
"ubsan": { "definitions": ["ASMJIT_SANITIZE=undefined"] },
|
"ubsan": { "definitions": ["ASMJIT_SANITIZE=undefined"] }
|
||||||
"msan": { "definitions": ["ASMJIT_SANITIZE=memory"] }
|
|
||||||
},
|
},
|
||||||
|
|
||||||
"valgrind_arguments": [
|
"valgrind_arguments": [
|
||||||
@ -12,14 +11,37 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"tests": [
|
"tests": [
|
||||||
{ "optional": true, "cmd": ["asmjit_test_unit", "--quick"] },
|
{
|
||||||
{ "optional": true, "cmd": ["asmjit_test_assembler"] },
|
"cmd": ["asmjit_test_unit", "--quick"],
|
||||||
{ "optional": true, "cmd": ["asmjit_test_assembler", "--validate"] },
|
"optional": true
|
||||||
{ "optional": true, "cmd": ["asmjit_test_emitters"] },
|
},
|
||||||
{ "optional": true, "cmd": ["asmjit_test_execute"] },
|
{
|
||||||
{ "optional": true, "cmd": ["asmjit_test_compiler"] },
|
"cmd": ["asmjit_test_assembler"],
|
||||||
{ "optional": true, "cmd": ["asmjit_test_instinfo"] },
|
"optional": true
|
||||||
{ "optional": true, "cmd": ["asmjit_test_x86_sections"] },
|
},
|
||||||
{ "optional": true, "cmd": ["asmjit_test_perf", "--quick"] }
|
{
|
||||||
|
"cmd": ["asmjit_test_assembler", "--validate"],
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": ["asmjit_test_emitters"],
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": ["asmjit_test_compiler"],
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": ["asmjit_test_instinfo"],
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": ["asmjit_test_x86_sections"],
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": ["asmjit_test_perf", "--quick"],
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
262
deps/asmjit/.github/workflows/build.yml
vendored
262
deps/asmjit/.github/workflows/build.yml
vendored
@ -14,12 +14,12 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: "Setup node.js"
|
- name: "Setup node.js"
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: "*"
|
node-version: "16"
|
||||||
|
|
||||||
- name: "Check Enumerations"
|
- name: "Check Enumerations"
|
||||||
run: |
|
run: |
|
||||||
@ -31,163 +31,127 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- { title: "diag-analyze" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Debug" , diagnostics: "analyze-build" }
|
- { title: "linux-lib" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Debug" , problem_matcher: "cpp" }
|
||||||
- { title: "diag-asan" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", diagnostics: "asan", defs: "ASMJIT_TEST=1" }
|
- { title: "macos-lib" , os: "macos-latest" , cc: "clang" , arch: "x64", build_type: "Debug" , problem_matcher: "cpp" }
|
||||||
- { title: "diag-msan" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", diagnostics: "msan", defs: "ASMJIT_TEST=1" }
|
- { title: "windows-lib" , os: "windows-latest", cc: "vs2022" , arch: "x64", build_type: "Debug" , problem_matcher: "cpp" }
|
||||||
- { title: "diag-ubsan" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", diagnostics: "ubsan", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "diag-hardened" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", diagnostics: "hardened", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "diag-valgrind" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", diagnostics: "valgrind", defs: "ASMJIT_TEST=1" }
|
|
||||||
|
|
||||||
- { title: "no-deprecated" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_DEPRECATED=1" }
|
- { title: "diag-asan" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", diagnostics: "address" , defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "no-intrinsics" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_INTRINSICS=1" }
|
- { title: "diag-ubsan" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", diagnostics: "undefined", defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "no-logging" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_LOGGING=1" }
|
- { title: "diag-valgrind" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", diagnostics: "valgrind" , defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "no-logging-text" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_LOGGING=1,ASMJIT_NO_TEXT=1" }
|
- { title: "diag-scan-build" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Debug" , diagnostics: "scan-build" }
|
||||||
- { title: "no-builder" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_BUILDER=1" }
|
|
||||||
- { title: "no-compiler" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_COMPILER=1" }
|
|
||||||
- { title: "no-introspection", host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_COMPILER=1,ASMJIT_NO_INTROSPECTION=1" }
|
|
||||||
- { title: "no-jit" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_JIT=1" }
|
|
||||||
- { title: "no-validation" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_VALIDATION=1" }
|
|
||||||
- { title: "no-x86" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_X86=1" }
|
|
||||||
- { title: "no-aarch64" , host: "ubuntu-latest" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_AARCH64=1" }
|
|
||||||
|
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "gcc-7" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-deprecated" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_DEPRECATED=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "gcc-7" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
- { title: "no-intrinsics" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_INTRINSICS=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "gcc-7" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-logging" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_LOGGING=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "gcc-7" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
- { title: "no-logging-text" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_LOGGING=1,ASMJIT_NO_TEXT=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "gcc-8" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-builder" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_BUILDER=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "gcc-8" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
- { title: "no-compiler" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_COMPILER=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "gcc-8" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-jit" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_JIT=1" }
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "gcc-8" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
- { title: "no-introspection", os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_INTROSPECTION=1" }
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-9" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-validation" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_VALIDATION=1" }
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-9" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
- { title: "no-x86" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_X86=1" }
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-9" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
- { title: "no-aarch64" , os: "ubuntu-latest" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1,ASMJIT_NO_AARCH64=1" }
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-9" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-10" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-10" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-10" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-10" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-11" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-11" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-11" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-11" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-12" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-12" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-12" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-12" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-13" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "gcc-13" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-13" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "gcc-13" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "clang-10", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x86" , cc: "clang-10", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "clang-10", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-20.04" , arch: "x64" , cc: "clang-10", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-11", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-11", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-11", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-11", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-12", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-12", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-12", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-12", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-13", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-13", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-13", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-13", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-14", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-14", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-14", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-14", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-15", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-15", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-15", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-15", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-16", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-16", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-16", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-16", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-17", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-17", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-17", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-17", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-18", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x86" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-18", conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "linux" , host: "ubuntu-22.04" , arch: "x64" , cc: "clang-18", conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-12" , arch: "x64" , cc: "gcc-11" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-12" , arch: "x64" , cc: "gcc-11" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-12" , arch: "x64" , cc: "clang" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-12" , arch: "x64" , cc: "clang" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-14" , arch: "arm64" , cc: "clang" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "macos" , host: "macos-14" , arch: "arm64" , cc: "clang" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2019" , arch: "x86" , cc: "vs2019" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2019" , arch: "x86" , cc: "vs2019" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2019" , arch: "x64" , cc: "vs2019" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2019" , arch: "x64" , cc: "vs2019" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2022" , arch: "x86" , cc: "vs2022" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2022" , arch: "x86" , cc: "vs2022" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2022" , arch: "x64" , cc: "vs2022" , conf: "Debug" , defs: "ASMJIT_TEST=1" }
|
|
||||||
- { title: "windows" , host: "windows-2022" , arch: "x64" , cc: "vs2022" , conf: "Release", defs: "ASMJIT_TEST=1" }
|
|
||||||
|
|
||||||
- { title: "freebsd" , host: "macos-12" , arch: "x86-64" , cc: "clang" , conf: "Release", vm: "freebsd", vm_ver: "13.2", defs: "ASMJIT_TEST=1" }
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-7" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "netbsd" , host: "macos-12" , arch: "x86-64" , cc: "clang" , conf: "Release", vm: "netbsd" , vm_ver: "9.3" , defs: "ASMJIT_TEST=1" }
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-7" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "openbsd" , host: "macos-12" , arch: "x86-64" , cc: "clang" , conf: "Release", vm: "openbsd", vm_ver: "7.4" , defs: "ASMJIT_TEST=1" }
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-7" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
- { title: "openbsd" , host: "ubuntu-latest" , arch: "arm64" , cc: "clang" , conf: "Release", vm: "openbsd", vm_ver: "7.4" , defs: "ASMJIT_TEST=1" }
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-7" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-8" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-8" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-8" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "gcc-8" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-9" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-9" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-9" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-9" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-10" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-10" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-10" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-10" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-11" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-11" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-11" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-11" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-12" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-12" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-12" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "gcc-12" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "clang-10", arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "clang-10", arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "clang-10", arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-20.04" , cc: "clang-10", arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-11", arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-11", arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-11", arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-11", arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-12", arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-12", arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-12", arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-12", arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-13", arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-13", arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-13", arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-13", arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-14", arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-14", arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-14", arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "linux" , os: "ubuntu-22.04" , cc: "clang-14", arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "macos" , os: "macos-12" , cc: "gcc-11" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "macos" , os: "macos-12" , cc: "gcc-11" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "macos" , os: "macos-12" , cc: "clang" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "macos" , os: "macos-12" , cc: "clang" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2019" , cc: "vs2019" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2019" , cc: "vs2019" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2019" , cc: "vs2019" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2019" , cc: "vs2019" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2022" , cc: "vs2022" , arch: "x86", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2022" , cc: "vs2022" , arch: "x86", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2022" , cc: "vs2022" , arch: "x64", build_type: "Debug" , defs: "ASMJIT_TEST=1" }
|
||||||
|
- { title: "windows" , os: "windows-2022" , cc: "vs2022" , arch: "x64", build_type: "Release", defs: "ASMJIT_TEST=1" }
|
||||||
|
|
||||||
# arm/v7 VM image doesn't work on CI environment at the moment
|
- { host: "macos-12" , os: "freebsd", osver: "13.2", cc: "clang", arch: "x86-64", build_type: "Release", defs: "ASMJIT_TEST=ON" }
|
||||||
# - { title: "debian" , host: "ubuntu-latest" , arch: "arm/v7" , cc: "clang" , conf: "Release", vm: "debian:unstable", defs: "ASMJIT_TEST=1" }
|
- { host: "macos-12" , os: "netbsd" , osver: "9.3" , cc: "clang", arch: "x86-64", build_type: "Release", defs: "ASMJIT_TEST=ON" }
|
||||||
|
- { host: "macos-12" , os: "openbsd", osver: "7.3" , cc: "clang", arch: "x86-64", build_type: "Release", defs: "ASMJIT_TEST=ON" }
|
||||||
|
- { host: "ubuntu-latest" , os: "openbsd", osver: "7.3" , cc: "clang", arch: "arm64" , build_type: "Release", defs: "ASMJIT_TEST=ON" }
|
||||||
|
|
||||||
- { title: "debian" , host: "ubuntu-latest" , arch: "arm64" , cc: "clang" , conf: "Release", vm: "debian:unstable", defs: "ASMJIT_TEST=1" }
|
name: "${{matrix.title || format('{0}-{1}', matrix.os, matrix.osver)}} (${{matrix.cc}}, ${{matrix.arch}}, ${{matrix.build_type}})"
|
||||||
- { title: "debian" , host: "ubuntu-latest" , arch: "riscv64", cc: "clang" , conf: "Release", vm: "debian:unstable", defs: "ASMJIT_TEST=1" }
|
runs-on: "${{matrix.host || matrix.os}}"
|
||||||
- { title: "debian" , host: "ubuntu-latest" , arch: "ppc64le", cc: "clang" , conf: "Release", vm: "debian:unstable", defs: "ASMJIT_TEST=1" }
|
|
||||||
|
|
||||||
name: "${{matrix.title}}/${{matrix.arch}}, ${{matrix.cc}} ${{matrix.conf}}"
|
|
||||||
runs-on: "${{matrix.host}}"
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
path: "source"
|
path: "source"
|
||||||
|
|
||||||
- name: "Checkout Build Actions"
|
- name: "Checkout Build Actions"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: build-actions/build-actions
|
repository: build-actions/build-actions
|
||||||
path: "build-actions"
|
path: "build-actions"
|
||||||
|
|
||||||
- name: "Python"
|
- name: "Python"
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: "3.x"
|
python-version: "3.x"
|
||||||
|
|
||||||
- name: QEMU
|
- name: "Build & Test"
|
||||||
if: ${{matrix.vm && !matrix.vm_ver}}
|
if: ${{!matrix.host}}
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
with:
|
|
||||||
platforms: linux/${{matrix.arch}}
|
|
||||||
|
|
||||||
- name: "Build & Test - Native"
|
|
||||||
if: ${{!matrix.vm}}
|
|
||||||
run: python build-actions/action.py
|
run: python build-actions/action.py
|
||||||
|
--step=all
|
||||||
|
--compiler=${{matrix.cc}}
|
||||||
|
--architecture=${{matrix.arch}}
|
||||||
--source-dir=source
|
--source-dir=source
|
||||||
--config=source/.github/workflows/build-config.json
|
--config=source/.github/workflows/build-config.json
|
||||||
--compiler=${{matrix.cc}}
|
--build-type=${{matrix.build_type}}
|
||||||
--diagnostics=${{matrix.diagnostics}}
|
|
||||||
--architecture=${{matrix.arch}}
|
|
||||||
--problem-matcher=auto
|
|
||||||
--build-type=${{matrix.conf}}
|
|
||||||
--build-defs=${{matrix.defs}}
|
--build-defs=${{matrix.defs}}
|
||||||
|
|
||||||
- name: "Build & Test - Cross Platform Actions"
|
- name: "Build & Test in VM"
|
||||||
if: ${{matrix.vm && matrix.vm_ver}}
|
if: ${{matrix.host}}
|
||||||
uses: cross-platform-actions/action@master
|
uses: cross-platform-actions/action@master
|
||||||
with:
|
with:
|
||||||
operating_system: ${{matrix.vm}}
|
operating_system: ${{matrix.os}}
|
||||||
architecture: ${{matrix.arch}}
|
architecture: ${{matrix.arch}}
|
||||||
version: ${{matrix.vm_ver}}
|
version: ${{matrix.osver}}
|
||||||
sync_files: "runner-to-vm"
|
|
||||||
shutdown_vm: false
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
@ -199,31 +163,11 @@ jobs:
|
|||||||
export CI_NETBSD_USE_PKGIN
|
export CI_NETBSD_USE_PKGIN
|
||||||
|
|
||||||
sh ./build-actions/prepare-environment.sh
|
sh ./build-actions/prepare-environment.sh
|
||||||
python3 build-actions/action.py \
|
python3 build-actions/action.py \
|
||||||
--source-dir=source \
|
--step=all \
|
||||||
--config=source/.github/workflows/build-config.json \
|
--compiler=${{matrix.cc}} \
|
||||||
--compiler=${{matrix.cc}} \
|
--architecture=${{matrix.arch}} \
|
||||||
--diagnostics=${{matrix.diagnostics}} \
|
--source-dir=source \
|
||||||
--architecture=${{matrix.arch}} \
|
--config=source/.github/workflows/build-config.json \
|
||||||
--problem-matcher=auto \
|
--build-type=${{matrix.build_type}} \
|
||||||
--build-type=${{matrix.conf}} \
|
|
||||||
--build-defs=${{matrix.defs}}
|
--build-defs=${{matrix.defs}}
|
||||||
|
|
||||||
- name: "Build & Test - Docker + QEMU"
|
|
||||||
if: ${{matrix.vm && !matrix.vm_ver}}
|
|
||||||
run: |
|
|
||||||
docker run \
|
|
||||||
--rm \
|
|
||||||
-v $(pwd):/${{github.workspace}} \
|
|
||||||
-w ${{github.workspace}}/build-actions \
|
|
||||||
--platform linux/${{matrix.arch}} \
|
|
||||||
${{matrix.vm}} \
|
|
||||||
bash action.sh \
|
|
||||||
--source-dir=../source \
|
|
||||||
--config=../source/.github/workflows/build-config.json \
|
|
||||||
--compiler=${{matrix.cc}} \
|
|
||||||
--diagnostics=${{matrix.diagnostics}} \
|
|
||||||
--architecture=${{matrix.arch}} \
|
|
||||||
--problem-matcher=auto \
|
|
||||||
--build-type=${{matrix.conf}} \
|
|
||||||
--build-defs=${{matrix.defs}}
|
|
||||||
|
122
deps/asmjit/CMakeLists.txt
vendored
122
deps/asmjit/CMakeLists.txt
vendored
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||||
|
|
||||||
cmake_policy(PUSH)
|
cmake_policy(PUSH)
|
||||||
|
|
||||||
if (POLICY CMP0063)
|
if(POLICY CMP0063)
|
||||||
cmake_policy(SET CMP0063 NEW) # Honor visibility properties.
|
cmake_policy(SET CMP0063 NEW) # Honor visibility properties.
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (POLICY CMP0092)
|
if(POLICY CMP0092)
|
||||||
cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default.
|
cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default.
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -33,13 +33,15 @@ if (DEFINED ASMJIT_BUILD_STATIC)
|
|||||||
set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}")
|
set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AsmJit - Configuration - Build
|
# AsmJit - Configuration
|
||||||
# ==============================
|
# ======================
|
||||||
|
|
||||||
|
# AsmJit testing.
|
||||||
if (NOT DEFINED ASMJIT_TEST)
|
if (NOT DEFINED ASMJIT_TEST)
|
||||||
set(ASMJIT_TEST FALSE)
|
set(ASMJIT_TEST FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# AsmJit build options
|
||||||
if (NOT DEFINED ASMJIT_EMBED)
|
if (NOT DEFINED ASMJIT_EMBED)
|
||||||
set(ASMJIT_EMBED FALSE)
|
set(ASMJIT_EMBED FALSE)
|
||||||
endif()
|
endif()
|
||||||
@ -52,22 +54,15 @@ if (NOT DEFINED ASMJIT_SANITIZE)
|
|||||||
set(ASMJIT_SANITIZE FALSE)
|
set(ASMJIT_SANITIZE FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS)
|
|
||||||
set(ASMJIT_NO_CUSTOM_FLAGS FALSE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_NATVIS)
|
if (NOT DEFINED ASMJIT_NO_NATVIS)
|
||||||
set(ASMJIT_NO_NATVIS FALSE)
|
set(ASMJIT_NO_NATVIS FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# EMBED implies STATIC.
|
if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS)
|
||||||
if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
|
set(ASMJIT_NO_CUSTOM_FLAGS FALSE)
|
||||||
set(ASMJIT_STATIC TRUE)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AsmJit - Configuration - Backend
|
# AsmJit backends selection.
|
||||||
# ================================
|
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_X86)
|
if (NOT DEFINED ASMJIT_NO_X86)
|
||||||
set(ASMJIT_NO_X86 FALSE)
|
set(ASMJIT_NO_X86 FALSE)
|
||||||
endif()
|
endif()
|
||||||
@ -80,9 +75,7 @@ if (NOT DEFINED ASMJIT_NO_FOREIGN)
|
|||||||
set(ASMJIT_NO_FOREIGN FALSE)
|
set(ASMJIT_NO_FOREIGN FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AsmJit - Configuration - Features
|
# AsmJit features selection.
|
||||||
# =================================
|
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_DEPRECATED)
|
if (NOT DEFINED ASMJIT_NO_DEPRECATED)
|
||||||
set(ASMJIT_NO_DEPRECATED FALSE)
|
set(ASMJIT_NO_DEPRECATED FALSE)
|
||||||
endif()
|
endif()
|
||||||
@ -96,19 +89,19 @@ if (NOT DEFINED ASMJIT_NO_JIT)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_TEXT)
|
if (NOT DEFINED ASMJIT_NO_TEXT)
|
||||||
set(ASMJIT_NO_TEXT FALSE)
|
set(ASMJIT_NO_TEXT ${ASMJIT_NO_TEXT})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_LOGGING)
|
if (NOT DEFINED ASMJIT_NO_LOGGING)
|
||||||
set(ASMJIT_NO_LOGGING ${ASMJIT_NO_TEXT})
|
set(ASMJIT_NO_LOGGING FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_VALIDATION)
|
if (NOT DEFINED ASMJIT_NO_VALIDATION)
|
||||||
set(ASMJIT_NO_VALIDATION FALSE)
|
set(ASMJIT_NO_VALIDATION ${ASMJIT_NO_VALIDATION})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_INTROSPECTION)
|
if (NOT DEFINED ASMJIT_NO_INTROSPECTION)
|
||||||
set(ASMJIT_NO_INTROSPECTION FALSE)
|
set(ASMJIT_NO_INTROSPECTION ${ASMJIT_NO_INTROSPECTION})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_BUILDER)
|
if (NOT DEFINED ASMJIT_NO_BUILDER)
|
||||||
@ -116,17 +109,16 @@ if (NOT DEFINED ASMJIT_NO_BUILDER)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED ASMJIT_NO_COMPILER)
|
if (NOT DEFINED ASMJIT_NO_COMPILER)
|
||||||
if (ASMJIT_NO_BUILDER OR ASMJIT_NO_INTROSPECTION)
|
set(ASMJIT_NO_BUILDER ${ASMJIT_NO_BUILDER})
|
||||||
set(ASMJIT_NO_COMPILER TRUE)
|
|
||||||
else()
|
|
||||||
set(ASMJIT_NO_COMPILER FALSE)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AsmJit - Configuration - CMake Introspection
|
# EMBED implies STATIC.
|
||||||
# ============================================
|
if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
|
||||||
|
set(ASMJIT_STATIC TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
|
set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
|
||||||
|
|
||||||
set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications")
|
set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications")
|
||||||
set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)")
|
set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)")
|
||||||
set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static")
|
set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static")
|
||||||
@ -220,7 +212,11 @@ function(asmjit_add_target target target_type)
|
|||||||
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}")
|
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
target_compile_features(${target} PUBLIC cxx_std_11)
|
if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
|
||||||
|
set_property(TARGET ${target} PROPERTY CXX_STANDARD 11)
|
||||||
|
else()
|
||||||
|
target_compile_features(${target} PUBLIC cxx_std_11)
|
||||||
|
endif()
|
||||||
set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO)
|
set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO)
|
||||||
set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden)
|
set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden)
|
||||||
target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$<CONFIG:Debug>:${X_CFLAGS_DBG}> $<$<NOT:$<CONFIG:Debug>>:${X_CFLAGS_REL}>)
|
target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$<CONFIG:Debug>:${X_CFLAGS_DBG}> $<$<NOT:$<CONFIG:Debug>>:${X_CFLAGS_REL}>)
|
||||||
@ -233,6 +229,17 @@ endfunction()
|
|||||||
# AsmJit - Compiler Support
|
# AsmJit - Compiler Support
|
||||||
# =========================
|
# =========================
|
||||||
|
|
||||||
|
set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
|
||||||
|
set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
|
||||||
|
set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit.
|
||||||
|
set(ASMJIT_CFLAGS "") # Public compiler flags.
|
||||||
|
set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
|
||||||
|
set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
|
||||||
|
set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
|
||||||
|
set(ASMJIT_PRIVATE_LFLAGS "") # Private linker flags.
|
||||||
|
set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
|
||||||
|
set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
|
||||||
|
|
||||||
# We will have to keep this most likely forever as some users may still be using it.
|
# We will have to keep this most likely forever as some users may still be using it.
|
||||||
set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}")
|
set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}")
|
||||||
|
|
||||||
@ -275,7 +282,7 @@ endif()
|
|||||||
|
|
||||||
# Support for sanitizers.
|
# Support for sanitizers.
|
||||||
if (ASMJIT_SANITIZE)
|
if (ASMJIT_SANITIZE)
|
||||||
asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE})
|
ASMJIT_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE})
|
||||||
if (ASMJIT_SANITIZE_CFLAGS)
|
if (ASMJIT_SANITIZE_CFLAGS)
|
||||||
message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'")
|
message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'")
|
||||||
|
|
||||||
@ -356,21 +363,21 @@ else()
|
|||||||
set(ASMJIT_TARGET_TYPE "SHARED")
|
set(ASMJIT_TARGET_TYPE "SHARED")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(build_option # AsmJit build options.
|
foreach(build_option ASMJIT_STATIC
|
||||||
ASMJIT_STATIC
|
|
||||||
ASMJIT_NO_DEPRECATED
|
|
||||||
# AsmJit backends selection.
|
# AsmJit backends selection.
|
||||||
ASMJIT_NO_X86
|
ASMJIT_NO_X86
|
||||||
ASMJIT_NO_AARCH64
|
ASMJIT_NO_AARCH64
|
||||||
ASMJIT_NO_FOREIGN
|
ASMJIT_NO_FOREIGN
|
||||||
# AsmJit features selection.
|
# AsmJit features selection.
|
||||||
|
ASMJIT_NO_DEPRECATED
|
||||||
|
ASMJIT_NO_SHM_OPEN
|
||||||
ASMJIT_NO_JIT
|
ASMJIT_NO_JIT
|
||||||
ASMJIT_NO_TEXT
|
ASMJIT_NO_TEXT
|
||||||
ASMJIT_NO_LOGGING
|
ASMJIT_NO_LOGGING
|
||||||
ASMJIT_NO_INTROSPECTION
|
|
||||||
ASMJIT_NO_VALIDATION
|
|
||||||
ASMJIT_NO_BUILDER
|
ASMJIT_NO_BUILDER
|
||||||
ASMJIT_NO_COMPILER)
|
ASMJIT_NO_COMPILER
|
||||||
|
ASMJIT_NO_VALIDATION
|
||||||
|
ASMJIT_NO_INTROSPECTION)
|
||||||
if (${build_option})
|
if (${build_option})
|
||||||
List(APPEND ASMJIT_CFLAGS "-D${build_option}")
|
List(APPEND ASMJIT_CFLAGS "-D${build_option}")
|
||||||
List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}")
|
List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}")
|
||||||
@ -381,7 +388,7 @@ endforeach()
|
|||||||
# =======================
|
# =======================
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe")
|
if(CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe")
|
||||||
set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE)
|
set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@ -436,8 +443,6 @@ set(ASMJIT_SRC_LIST
|
|||||||
asmjit/core/globals.h
|
asmjit/core/globals.h
|
||||||
asmjit/core/inst.cpp
|
asmjit/core/inst.cpp
|
||||||
asmjit/core/inst.h
|
asmjit/core/inst.h
|
||||||
asmjit/core/instdb.cpp
|
|
||||||
asmjit/core/instdb_p.h
|
|
||||||
asmjit/core/jitallocator.cpp
|
asmjit/core/jitallocator.cpp
|
||||||
asmjit/core/jitallocator.h
|
asmjit/core/jitallocator.h
|
||||||
asmjit/core/jitruntime.cpp
|
asmjit/core/jitruntime.cpp
|
||||||
@ -557,7 +562,9 @@ foreach(src_file ${ASMJIT_SRC_LIST})
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
|
if (NOT ${CMAKE_VERSION} VERSION_LESS "3.8.0")
|
||||||
|
source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
|
||||||
|
endif()
|
||||||
|
|
||||||
# AsmJit - Summary
|
# AsmJit - Summary
|
||||||
# ================
|
# ================
|
||||||
@ -590,7 +597,7 @@ if (NOT ASMJIT_EMBED)
|
|||||||
$<BUILD_INTERFACE:${ASMJIT_INCLUDE_DIRS}>
|
$<BUILD_INTERFACE:${ASMJIT_INCLUDE_DIRS}>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||||
|
|
||||||
# Add asmjit::asmjit alias.
|
# Add blend2d::blend2d alias.
|
||||||
add_library(asmjit::asmjit ALIAS asmjit)
|
add_library(asmjit::asmjit ALIAS asmjit)
|
||||||
# TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now.
|
# TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now.
|
||||||
add_library(AsmJit::AsmJit ALIAS asmjit)
|
add_library(AsmJit::AsmJit ALIAS asmjit)
|
||||||
@ -655,7 +662,6 @@ if (NOT ASMJIT_EMBED)
|
|||||||
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
|
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
|
||||||
|
|
||||||
foreach(_target asmjit_test_emitters
|
foreach(_target asmjit_test_emitters
|
||||||
asmjit_test_execute
|
|
||||||
asmjit_test_x86_sections)
|
asmjit_test_x86_sections)
|
||||||
asmjit_add_target(${_target} TEST
|
asmjit_add_target(${_target} TEST
|
||||||
SOURCES test/${_target}.cpp
|
SOURCES test/${_target}.cpp
|
||||||
@ -676,29 +682,11 @@ if (NOT ASMJIT_EMBED)
|
|||||||
|
|
||||||
if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER))
|
if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER))
|
||||||
# Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit).
|
# Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit).
|
||||||
# Some compilers don't like passing -msse2 for 64-bit targets, and some compilers targeting non-x86
|
set(sse2_flags "")
|
||||||
# would pass "-msse2" compile flag check, but with a warning not detected by CMake. Thus, verify that
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
|
||||||
# our target is really 32-bit X86 and only use -msse2 or -arch:SSE2 flags when necessary.
|
asmjit_detect_cflags(sse2_flags "-arch:SSE2")
|
||||||
set(ASMJIT_SSE2_CFLAGS "")
|
else()
|
||||||
|
asmjit_detect_cflags(sse2_flags "-msse2")
|
||||||
check_cxx_source_compiles("
|
|
||||||
#if defined(_M_IX86) || defined(__X86__) || defined(__i386__)
|
|
||||||
int target_is_32_bit_x86() { return 1; }
|
|
||||||
#else
|
|
||||||
// Compile error...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return target_is_32_bit_x86();
|
|
||||||
}
|
|
||||||
" ASMJIT_TARGET_IS_32_BIT_X86)
|
|
||||||
|
|
||||||
if (ASMJIT_TARGET_IS_32_BIT_X86)
|
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
|
|
||||||
asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-arch:SSE2")
|
|
||||||
else()
|
|
||||||
asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-msse2")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
asmjit_add_target(asmjit_test_compiler TEST
|
asmjit_add_target(asmjit_test_compiler TEST
|
||||||
SOURCES test/asmjit_test_compiler.cpp
|
SOURCES test/asmjit_test_compiler.cpp
|
||||||
@ -706,7 +694,7 @@ if (NOT ASMJIT_EMBED)
|
|||||||
test/asmjit_test_compiler_a64.cpp
|
test/asmjit_test_compiler_a64.cpp
|
||||||
test/asmjit_test_compiler_x86.cpp
|
test/asmjit_test_compiler_x86.cpp
|
||||||
LIBRARIES asmjit::asmjit
|
LIBRARIES asmjit::asmjit
|
||||||
CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS}
|
CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${sse2_flags}
|
||||||
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
|
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
|
||||||
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
|
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
|
||||||
endif()
|
endif()
|
||||||
|
102
deps/asmjit/CONTRIBUTING.md
vendored
102
deps/asmjit/CONTRIBUTING.md
vendored
@ -1,102 +0,0 @@
|
|||||||
## How to Contribute to AsmJit
|
|
||||||
|
|
||||||
### Did you find a bug or something isn't working as expected?
|
|
||||||
|
|
||||||
* Please use [Issues](https://github.com/asmjit/asmjit/issues) page to report bugs or create a [pull request](https://github.com/asmjit/asmjit/pulls) if you have already fixed it.
|
|
||||||
|
|
||||||
* Make sure that when a bug is reported it provides as much information as possible to make it easy to either reproduce it locally or to at least guess where the problem could be. AsmJit is a low-level tool, which makes it very easy to emit code that would crash or not work as intended when executed. Always use AsmJit's [Logging](https://asmjit.com/doc/group__asmjit__logging.html) and [Error Handling](https://asmjit.com/doc/group__asmjit__error__handling.html) features first to analyze whether there is not a simple to catch bug in your own code.
|
|
||||||
|
|
||||||
* Don't be afraid to ask for help if you don't know how to solve a particular problem or in case it's unclear how to do it. The community would help if the problem is well described and has a solution. In general we always try to at least improve the documentation in case it doesn't provide enough information and users must ask for help.
|
|
||||||
|
|
||||||
### Asking questions
|
|
||||||
|
|
||||||
* We prefer GitHub issues to be used for reporting bugs or feature requests, but it's still okay to ask questions there as well. However, please consider joining our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) to ask questions; it has an active community that can quickly respond.
|
|
||||||
|
|
||||||
### Suggesting feature requests
|
|
||||||
|
|
||||||
* It's very likely that when using AsmJit you have found something that AsmJit doesn't provide, which would be handy to have as a built-in. The [Issues](https://github.com/asmjit/asmjit/issues) page can be used to submit feature requests, but please keep in mind that AsmJit is a relatively small project and not all requested features will be accepted, especially if they are non-trivial, time consuming to implement, or the scope of the feature doesn't match AsmJit goals.
|
|
||||||
|
|
||||||
* If you have already implemented the feature you are suggesting, please open a [pull request](https://github.com/asmjit/asmjit/pulls).
|
|
||||||
|
|
||||||
* Ports (requesting new AsmJit backends) can be reported as feature requests, but only by people that are willing to work on them as creating new ports takes a lot of time.
|
|
||||||
|
|
||||||
### Suggesting a documentation enhancement
|
|
||||||
|
|
||||||
* [AsmJit's documentation](https://asmjit.com/doc/index.html) is auto-generated from source code, so if you would like to improve it just open a [pull request](https://github.com/asmjit/asmjit/pulls) with your changes. The documentation uses [Doxygen](https://www.doxygen.nl/) as a front-end, so you can use `\ref` keyword to create links and other Doxygen keywords to enhance the documentation.
|
|
||||||
|
|
||||||
### Suggesting a website content enhancement
|
|
||||||
|
|
||||||
* [AsmJit's website](https://asmjit.com) is also generated, but not from public sources at the moment. If you did find an issue on the website you can either use contact information on the [support page](https://asmjit.com/support.html) or to discuss the change on our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im). Alternatively, opening a regular issue is also okay.
|
|
||||||
|
|
||||||
|
|
||||||
## Coding Style & Consistency
|
|
||||||
|
|
||||||
* If you decide to open a pull request, make sure that the code you submit uses the same convention as the rest of the code. We prefer keeping the code consistent.
|
|
||||||
|
|
||||||
* [.editorconfig](./.editorconfig) should help with basic settings.
|
|
||||||
|
|
||||||
* Initially, AsmJit coding style was based on Google C++ Style Guide, but it has diverged from it.
|
|
||||||
|
|
||||||
* Include guards use `<PATH_TO_SRC>_H_INCLUDED` format.
|
|
||||||
|
|
||||||
* `asmjit` namespace must be open by `ASMJIT_BEGIN_NAMESPACE` and closed by `ASMJIT_END_NAMESPACE`
|
|
||||||
|
|
||||||
* `asmjit::xxx` (backend specific) nested namespace must be open by `ASMJIT_BEGIN_SUB_NAMESPACE(xxx)` and closed by `ASMJIT_END_SUB_NAMESPACE`.
|
|
||||||
|
|
||||||
* Opening bracket is on the same line, like `struct Something {`, `if (condition) {`, etc...
|
|
||||||
|
|
||||||
* The code uses a soft limit of 120 characters per line (including documentation), but it's not enforced and it's okay to use more when it makes sense (for example defining tables, etc...).
|
|
||||||
|
|
||||||
* Since AsmJit doesn't use Exceptions nor RTTI the code cannot use containers provided by the C++ standard library. In general, we try to only use a bare minimum from the C++ standard library to make it viable to use AsmJit even in C code bases where JIT complier is implemented in C++ ([Erlang](https://www.erlang.org/) can be seen as a great example).
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
* AsmJit uses a minimalist unit testing framework to write unit tests to avoid third-party dependencies.
|
|
||||||
|
|
||||||
* At the moment tests are in the same file as the implementation and are only compiled when `ASMJIT_TEST` macro is defined.
|
|
||||||
|
|
||||||
* Use `-DASMJIT_TEST=1` when invoking [CMake](https://cmake.org/) to compile AsmJit tests.
|
|
||||||
|
|
||||||
* Unit tests are compiled to a single `asmjit_test_unit[.exe]` executable.
|
|
||||||
|
|
||||||
* Other tests have their own executables based on what is tested.
|
|
||||||
|
|
||||||
* Always add assembler tests when adding new instructions, see [asmjit_test_assembler_x64.cpp](./test/asmjit_test_assembler_x64.cpp) and [asmjit_test_assembler_a64.cpp](./test/asmjit_test_assembler_a64.cpp) for more details.
|
|
||||||
|
|
||||||
## Pull Request Messages
|
|
||||||
|
|
||||||
* If a change fixes a bug the message should should start with `[bug]`.
|
|
||||||
|
|
||||||
* If a change fixes or enhances documentation it should start with `[doc]`.
|
|
||||||
|
|
||||||
* If a change fixes or enhances our CI it should start with `[ci]`.
|
|
||||||
|
|
||||||
* If a change breaks ABI it must start with `[abi]`.
|
|
||||||
|
|
||||||
* Otherwise there is no suggested prefix.
|
|
||||||
|
|
||||||
## ABI Changes
|
|
||||||
|
|
||||||
* ABI changes happen, but they are usually accumulated and committed within a short time window to not break it often. In general we prefer to break ABI once a year, or once 6 months if there is something that has a high priority. There are no hard rules though.
|
|
||||||
|
|
||||||
* AsmJit uses an `inline namespace`, which should make it impossible to link to AsmJit library that is ABI incompatible. When ABI break happens both AsmJit version and ABI namespace are changed, see [asmjit/core/api-config.h](./src/asmjit/core/api-config.h) for more details.
|
|
||||||
|
|
||||||
* What is an ABI break?
|
|
||||||
|
|
||||||
* Modifying a public struct/class in a way that its functionality is altered and/or its size is changed
|
|
||||||
|
|
||||||
* Adding/removing virtual functions to/from classes, respectively
|
|
||||||
|
|
||||||
* Changing a signature of a public function or a class member function (for example adding a parameter).
|
|
||||||
|
|
||||||
* Changing the value of an enum or global constant (for example instructions are now sorted by name, so adding a new instruction breaks ABI)
|
|
||||||
|
|
||||||
* Possibly more, but these were the most common...
|
|
||||||
|
|
||||||
* What is not ABI break?
|
|
||||||
|
|
||||||
* Extending the functionality by using reserved members of a struct/class
|
|
||||||
|
|
||||||
* Adding new API including new structs and classes
|
|
||||||
|
|
||||||
* Changing anything that is internal and that doesn't leak to public headers
|
|
2
deps/asmjit/LICENSE.md
vendored
2
deps/asmjit/LICENSE.md
vendored
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2008-2024 The AsmJit Authors
|
Copyright (c) 2008-2020 The AsmJit Authors
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
45
deps/asmjit/README.md
vendored
45
deps/asmjit/README.md
vendored
@ -5,7 +5,7 @@ AsmJit is a lightweight library for machine code generation written in C++ langu
|
|||||||
|
|
||||||
* [Official Home Page (asmjit.com)](https://asmjit.com)
|
* [Official Home Page (asmjit.com)](https://asmjit.com)
|
||||||
* [Official Repository (asmjit/asmjit)](https://github.com/asmjit/asmjit)
|
* [Official Repository (asmjit/asmjit)](https://github.com/asmjit/asmjit)
|
||||||
* [Public Chat Channel](https://app.gitter.im/#/room/#asmjit:gitter.im)
|
* [Public Chat Channel](https://gitter.im/asmjit/asmjit)
|
||||||
* [Zlib License](./LICENSE.md)
|
* [Zlib License](./LICENSE.md)
|
||||||
|
|
||||||
See [asmjit.com](https://asmjit.com) page for more details, examples, and documentation.
|
See [asmjit.com](https://asmjit.com) page for more details, examples, and documentation.
|
||||||
@ -16,42 +16,39 @@ Documentation
|
|||||||
* [Documentation Index](https://asmjit.com/doc/index.html)
|
* [Documentation Index](https://asmjit.com/doc/index.html)
|
||||||
* [Build Instructions](https://asmjit.com/doc/group__asmjit__build.html)
|
* [Build Instructions](https://asmjit.com/doc/group__asmjit__build.html)
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
* See [CONTRIBUTING](./CONTRIBUTING.md) page for more details
|
|
||||||
|
|
||||||
Breaking Changes
|
Breaking Changes
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
Breaking the API is sometimes inevitable, what to do?
|
Breaking the API is sometimes inevitable, what to do?
|
||||||
|
|
||||||
* See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation
|
* See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation.
|
||||||
* See asmjit tests, they always compile and provide implementation of many use-cases:
|
* See asmjit tests, they always compile and provide implementation of many use-cases:
|
||||||
* [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters
|
* [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters.
|
||||||
* [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64)
|
* [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64).
|
||||||
* [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64)
|
* [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64).
|
||||||
* [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information
|
* [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information.
|
||||||
* [asmjit_test_x86_sections.cpp](./test/asmjit_test_x86_sections.cpp) - Multiple sections test.
|
* [asmjit_test_x86_sections.cpp](./test/asmjit_test_x86_sections.cpp) - Multiple sections test.
|
||||||
* Visit our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help
|
* Visit our [Official Chat](https://gitter.im/asmjit/asmjit) if you need a quick help.
|
||||||
|
|
||||||
Project Organization
|
Project Organization
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
* **`/`** - Project root
|
* **`/`** - Project root.
|
||||||
* **src** - Source code
|
* **src** - Source code.
|
||||||
* **asmjit** - Source code and headers (always point include path in here)
|
* **asmjit** - Source code and headers (always point include path in here).
|
||||||
* **core** - Core API, backend independent except relocations
|
* **core** - Core API, backend independent except relocations.
|
||||||
* **arm** - ARM specific API, used only by ARM and AArch64 backends
|
* **arm** - ARM specific API, used only by ARM and AArch64 backends.
|
||||||
* **x86** - X86 specific API, used only by X86 and X64 backends
|
* **x86** - X86 specific API, used only by X86 and X64 backends.
|
||||||
* **test** - Unit and integration tests (don't embed in your project)
|
* **test** - Unit and integration tests (don't embed in your project).
|
||||||
* **tools** - Tools used for configuring, documenting, and generating files
|
* **tools** - Tools used for configuring, documenting, and generating files.
|
||||||
|
|
||||||
Ports
|
TODO
|
||||||
-----
|
----
|
||||||
|
|
||||||
* [ ] 32-bit ARM/Thumb port (work in progress)
|
* [ ] Ports:
|
||||||
* [ ] RISC-V port (not in progress, help welcome)
|
* [ ] 32-bit ARM/Thumb port.
|
||||||
|
* [ ] 64-bit ARM (AArch64) port.
|
||||||
|
* [ ] RISC-V port.
|
||||||
|
|
||||||
Support
|
Support
|
||||||
-------
|
-------
|
||||||
|
26
deps/asmjit/db/LICENSE.md
vendored
26
deps/asmjit/db/LICENSE.md
vendored
@ -1,26 +0,0 @@
|
|||||||
AsmJit database is dual licensed under Zlib and Unlicense (public domain)
|
|
||||||
|
|
||||||
This is free and unencumbered software released into the public domain.
|
|
||||||
|
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
||||||
distribute this software, either in source code form or as a compiled
|
|
||||||
binary, for any purpose, commercial or non-commercial, and by any
|
|
||||||
means.
|
|
||||||
|
|
||||||
In jurisdictions that recognize copyright laws, the author or authors
|
|
||||||
of this software dedicate any and all copyright interest in the
|
|
||||||
software to the public domain. We make this dedication for the benefit
|
|
||||||
of the public at large and to the detriment of our heirs and
|
|
||||||
successors. We intend this dedication to be an overt act of
|
|
||||||
relinquishment in perpetuity of all present and future rights to this
|
|
||||||
software under copyright law.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
||||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
For more information, please refer to <http://unlicense.org>
|
|
12
deps/asmjit/db/README.md
vendored
12
deps/asmjit/db/README.md
vendored
@ -1,21 +1,15 @@
|
|||||||
AsmJit Instruction Database
|
AsmJit Instruction Database
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
This is a database of instructions that is used by AsmJit to generate its internal database and also assembler implementations. This project started initially as AsmDB, but was merged to AsmJit later to make the maintenance easier. The database was created in a way so that each instruction definition would only need a single line in JSON data file. The data is then processed by architecture specific data readers that make the data canonical and ready for processing.
|
This is a database of instructions that is used by AsmJit to generate its internal database and also assembler implementations. This project started initially as AsmDB, but was merged to AsmJit later to make the maintenance easier. The database was created in a way so that each instruction definition would only need a single line in JSON data. The data is then processed by architecture specific data readers that make the data canonical and ready for processing.
|
||||||
|
|
||||||
AsmJit database provides the following ISAs:
|
AsmJit database provides the following ISAs:
|
||||||
|
|
||||||
* `isa_x86.json` - provides X86 instruction data (both 32-bit and 64-bit)
|
* `isa_x86.json` - provides X86 instruction data (both 32-bit and 64-bit)
|
||||||
* `isa_aarch32.json` - provides AArch32 instruction data (A32/T16/T32 encoding)
|
* `isa_arm.json` - provides AArch32 instruction data (both ARM32 and THUMB)
|
||||||
* `isa_aarch64.json` - provides AArch64 instruction data (A64 encoding)
|
* `isa_a64.json` - provides AArch64 instruction data
|
||||||
* `isa_aarch64_sme.json` - provides AArch64 SME instruction data (work-in-progress)
|
|
||||||
|
|
||||||
To Be Documented
|
To Be Documented
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
This project will be refactored and documented in the future.
|
This project will be refactored and documented in the future.
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
AsmJit database is dual licensed under Zlib (AsmJit license) or public domain. The database can be used for any purpose, not just by AsmJit.
|
|
5
deps/asmjit/db/aarch64.js
vendored
5
deps/asmjit/db/aarch64.js
vendored
@ -1,7 +1,8 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
|
|
||||||
(function($scope, $as) {
|
(function($scope, $as) {
|
||||||
"use strict";
|
"use strict";
|
||||||
@ -35,7 +36,7 @@ arm.dbName = "isa_aarch64.json";
|
|||||||
|
|
||||||
// Can be used to assign the number of bits each part of the opcode occupies.
|
// Can be used to assign the number of bits each part of the opcode occupies.
|
||||||
// NOTE: THUMB instructions that use halfword must always specify the width
|
// NOTE: THUMB instructions that use halfword must always specify the width
|
||||||
// of all registers as many instructions accept only LO (r0..r7) registers.
|
// of all registers as many instructictions accept only LO (r0..r7) registers.
|
||||||
const FieldInfo = {
|
const FieldInfo = {
|
||||||
"P" : { "bits": 1 },
|
"P" : { "bits": 1 },
|
||||||
"U" : { "bits": 1 },
|
"U" : { "bits": 1 },
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
|
|
||||||
(function($scope, $as) {
|
(function($scope, $as) {
|
||||||
"use strict";
|
"use strict";
|
||||||
@ -28,14 +29,14 @@ const arm = $scope[$as] = dict();
|
|||||||
// Database
|
// Database
|
||||||
// ========
|
// ========
|
||||||
|
|
||||||
arm.dbName = "isa_aarch32.json";
|
arm.dbName = "isa_arm.json";
|
||||||
|
|
||||||
// asmdb.aarch32.Utils
|
// asmdb.arm.Utils
|
||||||
// ===================
|
// ===============
|
||||||
|
|
||||||
// Can be used to assign the number of bits each part of the opcode occupies.
|
// Can be used to assign the number of bits each part of the opcode occupies.
|
||||||
// NOTE: THUMB instructions that use halfword must always specify the width
|
// NOTE: THUMB instructions that use halfword must always specify the width
|
||||||
// of all registers as many instructions accept only LO (r0..r7) registers.
|
// of all registers as many instructictions accept only LO (r0..r7) registers.
|
||||||
const FieldInfo = {
|
const FieldInfo = {
|
||||||
"P" : { "bits": 1 },
|
"P" : { "bits": 1 },
|
||||||
"U" : { "bits": 1 },
|
"U" : { "bits": 1 },
|
||||||
@ -55,7 +56,6 @@ const FieldInfo = {
|
|||||||
"cmode" : { "bits": 4 },
|
"cmode" : { "bits": 4 },
|
||||||
"Cn" : { "bits": 4 },
|
"Cn" : { "bits": 4 },
|
||||||
"Cm" : { "bits": 4 },
|
"Cm" : { "bits": 4 },
|
||||||
|
|
||||||
"Rd" : { "bits": 4, "read": false, "write": true },
|
"Rd" : { "bits": 4, "read": false, "write": true },
|
||||||
"Rd2" : { "bits": 4, "read": false, "write": true },
|
"Rd2" : { "bits": 4, "read": false, "write": true },
|
||||||
"RdLo" : { "bits": 4, "read": false, "write": true },
|
"RdLo" : { "bits": 4, "read": false, "write": true },
|
||||||
@ -70,22 +70,17 @@ const FieldInfo = {
|
|||||||
"Rs" : { "bits": 4, "read": true , "write": false },
|
"Rs" : { "bits": 4, "read": true , "write": false },
|
||||||
"Rs2" : { "bits": 4, "read": true , "write": false },
|
"Rs2" : { "bits": 4, "read": true , "write": false },
|
||||||
"RsList": { "bits": 4, "read": true , "write": false , "list": true },
|
"RsList": { "bits": 4, "read": true , "write": false , "list": true },
|
||||||
|
|
||||||
"Sd" : { "bits": 4, "read": false, "write": true },
|
"Sd" : { "bits": 4, "read": false, "write": true },
|
||||||
"Sd2" : { "bits": 4, "read": false, "write": true },
|
"Sd2" : { "bits": 4, "read": false, "write": true },
|
||||||
"SdList": { "bits": 4, "read": false, "write": true , "list": true },
|
|
||||||
"Sx" : { "bits": 4, "read": true , "write": true },
|
"Sx" : { "bits": 4, "read": true , "write": true },
|
||||||
"Sn" : { "bits": 4, "read": true , "write": false },
|
"Sn" : { "bits": 4, "read": true , "write": false },
|
||||||
"Sm" : { "bits": 4, "read": true , "write": false },
|
"Sm" : { "bits": 4, "read": true , "write": false },
|
||||||
"Ss" : { "bits": 4, "read": true , "write": false },
|
"Ss" : { "bits": 4, "read": true , "write": false },
|
||||||
"Ss2" : { "bits": 4, "read": true , "write": false },
|
"Ss2" : { "bits": 4, "read": true , "write": false },
|
||||||
"SsList": { "bits": 4, "read": true , "write": false , "list": true },
|
|
||||||
|
|
||||||
"Dd" : { "bits": 4, "read": false, "write": true },
|
"Dd" : { "bits": 4, "read": false, "write": true },
|
||||||
"Dd2" : { "bits": 4, "read": false, "write": true },
|
"Dd2" : { "bits": 4, "read": false, "write": true },
|
||||||
"Dd3" : { "bits": 4, "read": false, "write": true },
|
"Dd3" : { "bits": 4, "read": false, "write": true },
|
||||||
"Dd4" : { "bits": 4, "read": false, "write": true },
|
"Dd4" : { "bits": 4, "read": false, "write": true },
|
||||||
"DdList": { "bits": 4, "read": false, "write": true , "list": true },
|
|
||||||
"Dx" : { "bits": 4, "read": true , "write": true },
|
"Dx" : { "bits": 4, "read": true , "write": true },
|
||||||
"Dx2" : { "bits": 4, "read": true , "write": true },
|
"Dx2" : { "bits": 4, "read": true , "write": true },
|
||||||
"Dn" : { "bits": 4, "read": true , "write": false },
|
"Dn" : { "bits": 4, "read": true , "write": false },
|
||||||
@ -97,18 +92,18 @@ const FieldInfo = {
|
|||||||
"Ds2" : { "bits": 4, "read": true , "write": false },
|
"Ds2" : { "bits": 4, "read": true , "write": false },
|
||||||
"Ds3" : { "bits": 4, "read": true , "write": false },
|
"Ds3" : { "bits": 4, "read": true , "write": false },
|
||||||
"Ds4" : { "bits": 4, "read": true , "write": false },
|
"Ds4" : { "bits": 4, "read": true , "write": false },
|
||||||
"DsList": { "bits": 4, "read": true , "write": false , "list": true },
|
|
||||||
|
|
||||||
"Vd" : { "bits": 4, "read": false, "write": true },
|
"Vd" : { "bits": 4, "read": false, "write": true },
|
||||||
"Vd2" : { "bits": 4, "read": false, "write": true },
|
"Vd2" : { "bits": 4, "read": false, "write": true },
|
||||||
"Vd3" : { "bits": 4, "read": false, "write": true },
|
"Vd3" : { "bits": 4, "read": false, "write": true },
|
||||||
"Vd4" : { "bits": 4, "read": false, "write": true },
|
"Vd4" : { "bits": 4, "read": false, "write": true },
|
||||||
|
"VdList": { "bits": 4, "read": false, "write": true , "list": true },
|
||||||
"Vx" : { "bits": 4, "read": true , "write": true },
|
"Vx" : { "bits": 4, "read": true , "write": true },
|
||||||
"Vx2" : { "bits": 4, "read": true , "write": true },
|
"Vx2" : { "bits": 4, "read": true , "write": true },
|
||||||
"Vn" : { "bits": 4, "read": true , "write": false },
|
"Vn" : { "bits": 4, "read": true , "write": false },
|
||||||
"Vm" : { "bits": 4, "read": true , "write": false },
|
"Vm" : { "bits": 4, "read": true , "write": false },
|
||||||
"Vs" : { "bits": 4, "read": true , "write": false },
|
"Vs" : { "bits": 4, "read": true , "write": false },
|
||||||
"Vs2" : { "bits": 4, "read": true , "write": false },
|
"Vs2" : { "bits": 4, "read": true , "write": false },
|
||||||
|
"VsList": { "bits": 4, "read": true , "write": false , "list": true }
|
||||||
};
|
};
|
||||||
|
|
||||||
arm.FieldInfo = FieldInfo;
|
arm.FieldInfo = FieldInfo;
|
||||||
@ -197,16 +192,10 @@ function decomposeOperand(s) {
|
|||||||
const elementSuffix = "[#i]";
|
const elementSuffix = "[#i]";
|
||||||
let element = null;
|
let element = null;
|
||||||
let consecutive = 0;
|
let consecutive = 0;
|
||||||
let userRegList = false;
|
|
||||||
|
|
||||||
if (s.endsWith("^")) {
|
|
||||||
userRegList = true;
|
|
||||||
s = s.substring(0, s.length - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s.endsWith(elementSuffix)) {
|
if (s.endsWith(elementSuffix)) {
|
||||||
element = "#i";
|
element = "#i";
|
||||||
s = s.substring(0, s.length - elementSuffix.length);
|
s = s.substr(0, s.length - elementSuffix.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.endsWith("++")) {
|
if (s.endsWith("++")) {
|
||||||
@ -230,8 +219,7 @@ function decomposeOperand(s) {
|
|||||||
data : s,
|
data : s,
|
||||||
element : element,
|
element : element,
|
||||||
restrict: restrict,
|
restrict: restrict,
|
||||||
consecutive: consecutive,
|
consecutive: consecutive
|
||||||
userRegList: true
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,8 +238,8 @@ function splitOpcodeFields(s) {
|
|||||||
return out.map((field) => { return field.trim(); });
|
return out.map((field) => { return field.trim(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
// asmdb.aarch32.Operand
|
// asmdb.arm.Operand
|
||||||
// =====================
|
// =================
|
||||||
|
|
||||||
// ARM operand.
|
// ARM operand.
|
||||||
class Operand extends base.Operand {
|
class Operand extends base.Operand {
|
||||||
@ -279,44 +267,17 @@ class Operand extends base.Operand {
|
|||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isRelative() {
|
|
||||||
if (this.type === "imm")
|
|
||||||
return this.name === "relA" || this.name === "relS" || this.name === "relZ";
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
arm.Operand = Operand;
|
arm.Operand = Operand;
|
||||||
|
|
||||||
// asmdb.aarch32.Instruction
|
// asmdb.arm.Instruction
|
||||||
// =========================
|
// =====================
|
||||||
|
|
||||||
function patternFromOperand(key) {
|
function patternFromOperand(key) {
|
||||||
return key;
|
return key;
|
||||||
// return key.replace(/\b(?:[RVDS](?:d|s|n|m|x|x2))\b/, "R");
|
// return key.replace(/\b(?:[RVDS](?:d|s|n|m|x|x2))\b/, "R");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite a memory operand expression (either base or index) to a simplified one, which is okay
|
|
||||||
// to be generated as C++ expression. In general, we want to simplify != to a more favorable code.
|
|
||||||
function simplifyMemoryExpression(e) {
|
|
||||||
if (e.type === "binary" && e.op === "!=" && e.right.type === "var") {
|
|
||||||
// Rewrite A != PC to A < PC
|
|
||||||
if (e.right.name === "PC") { e.op = "<"; }
|
|
||||||
|
|
||||||
// Rewrite A != HI to A < 8
|
|
||||||
if (e.right.name === "HI") { e.op = "<"; e.right = exp.Imm(8); }
|
|
||||||
|
|
||||||
// Rewrite A != XX to A < SP || A == LR
|
|
||||||
if (e.right.name === "XX") {
|
|
||||||
return exp.Or(exp.Lt(e.left, exp.Var("SP")),
|
|
||||||
exp.Eq(e.left.clone(), exp.Var("LR")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ARM instruction.
|
// ARM instruction.
|
||||||
class Instruction extends base.Instruction {
|
class Instruction extends base.Instruction {
|
||||||
constructor(db, data) {
|
constructor(db, data) {
|
||||||
@ -521,14 +482,13 @@ class Instruction extends base.Instruction {
|
|||||||
|
|
||||||
const m = part.match(/^([A-Za-z]\w*)/);
|
const m = part.match(/^([A-Za-z]\w*)/);
|
||||||
if (m.length < part.length) {
|
if (m.length < part.length) {
|
||||||
op.base.exp = simplifyMemoryExpression(exp.parse(part));
|
op.base.exp = exp.parse(part);
|
||||||
op.base.field = m[1];
|
op.base.field = m[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (part.startsWith("#")) {
|
else if (part.startsWith("#")) {
|
||||||
let p = part.substring(1);
|
let p = part.substring(1);
|
||||||
let u = "1";
|
let u = "1";
|
||||||
let alwaysNegative = false;
|
|
||||||
|
|
||||||
let offExp = null;
|
let offExp = null;
|
||||||
let offMul = 1;
|
let offMul = 1;
|
||||||
@ -538,11 +498,6 @@ class Instruction extends base.Instruction {
|
|||||||
p = p.substring(3);
|
p = p.substring(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.startsWith("-")) {
|
|
||||||
alwaysNegative = false;
|
|
||||||
p = p.substring(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const expMatch = p.match(/^([A-Za-z]\w*)==/);
|
const expMatch = p.match(/^([A-Za-z]\w*)==/);
|
||||||
if (expMatch) {
|
if (expMatch) {
|
||||||
offExp = exp.parse(p);
|
offExp = exp.parse(p);
|
||||||
@ -560,7 +515,6 @@ class Instruction extends base.Instruction {
|
|||||||
op.offset.u = u;
|
op.offset.u = u;
|
||||||
op.offset.exp = offExp;
|
op.offset.exp = offExp;
|
||||||
op.offset.mul = offMul;
|
op.offset.mul = offMul;
|
||||||
op.offset.negative = alwaysNegative;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let p = part;
|
let p = part;
|
||||||
@ -577,7 +531,7 @@ class Instruction extends base.Instruction {
|
|||||||
|
|
||||||
const m = p.match(/^([A-Za-z]\w*)/);
|
const m = p.match(/^([A-Za-z]\w*)/);
|
||||||
if (m.length < p.length) {
|
if (m.length < p.length) {
|
||||||
op.index.exp = simplifyMemoryExpression(exp.parse(p));
|
op.index.exp = exp.parse(p);
|
||||||
op.index.field = m[1];
|
op.index.field = m[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -904,8 +858,8 @@ class Instruction extends base.Instruction {
|
|||||||
}
|
}
|
||||||
arm.Instruction = Instruction;
|
arm.Instruction = Instruction;
|
||||||
|
|
||||||
// asmdb.aarch32.ISA
|
// asmdb.arm.ISA
|
||||||
// =================
|
// =============
|
||||||
|
|
||||||
function mergeGroupData(data, group) {
|
function mergeGroupData(data, group) {
|
||||||
for (let k in group) {
|
for (let k in group) {
|
||||||
@ -967,7 +921,7 @@ class ISA extends base.ISA {
|
|||||||
hasOwn.call(obj, "t16") ? "t16" : "";
|
hasOwn.call(obj, "t16") ? "t16" : "";
|
||||||
|
|
||||||
if (!encoding)
|
if (!encoding)
|
||||||
FAIL(`Instruction ${names.join("/")} doesn't encoding, it must provide either a32, t32, or t16 field`);
|
FAIL(`Instrution ${names.join("/")} doesn't encoding, it must provide either a32, t32, or t16 field`);
|
||||||
|
|
||||||
for (let j = 0; j < names.length; j++) {
|
for (let j = 0; j < names.length; j++) {
|
||||||
const inst = new Instruction(this, names[j], operands, encoding.toUpperCase(), obj[encoding], obj);
|
const inst = new Instruction(this, names[j], operands, encoding.toUpperCase(), obj[encoding], obj);
|
||||||
@ -984,4 +938,4 @@ class ISA extends base.ISA {
|
|||||||
arm.ISA = ISA;
|
arm.ISA = ISA;
|
||||||
|
|
||||||
}).apply(this, typeof module === "object" && module && module.exports
|
}).apply(this, typeof module === "object" && module && module.exports
|
||||||
? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "aarch32"]);
|
? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "arm"]);
|
18
deps/asmjit/db/base.js
vendored
18
deps/asmjit/db/base.js
vendored
@ -1,7 +1,7 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
(function($scope, $as) {
|
(function($scope, $as) {
|
||||||
"use strict";
|
"use strict";
|
||||||
@ -205,7 +205,7 @@ class Operand {
|
|||||||
|
|
||||||
toString() { return this.data; }
|
toString() { return this.data; }
|
||||||
|
|
||||||
isReg() { return !!this.reg && this.type !== "reg-list"; }
|
isReg() { return !!this.reg; }
|
||||||
isMem() { return !!this.mem; }
|
isMem() { return !!this.mem; }
|
||||||
isImm() { return !!this.imm; }
|
isImm() { return !!this.imm; }
|
||||||
isRel() { return !!this.rel; }
|
isRel() { return !!this.rel; }
|
||||||
@ -259,20 +259,6 @@ class Instruction {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
get operandCount() {
|
|
||||||
return this.operands.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
get minimumOperandCount() {
|
|
||||||
const count = this.operands.length;
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
if (this.operands[i].optional) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
_assignAttribute(key, value) {
|
_assignAttribute(key, value) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "ext":
|
case "ext":
|
||||||
|
165
deps/asmjit/db/exp.js
vendored
165
deps/asmjit/db/exp.js
vendored
@ -1,7 +1,7 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
(function($scope, $as) {
|
(function($scope, $as) {
|
||||||
"use strict";
|
"use strict";
|
||||||
@ -87,7 +87,6 @@ class ExpNode {
|
|||||||
|
|
||||||
info() { return null; }
|
info() { return null; }
|
||||||
clone() { throw new Error("ExpNode.clone() must be overridden"); }
|
clone() { throw new Error("ExpNode.clone() must be overridden"); }
|
||||||
evaluate(ctx) { throw new Error("ExpNode.evaluate() must be overridden"); }
|
|
||||||
toString(ctx) { throw new Error("ExpNode.toString() must be overridden"); }
|
toString(ctx) { throw new Error("ExpNode.toString() must be overridden"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +97,6 @@ class ImmNode extends ExpNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
clone() { return new ImmNode(this.imm); }
|
clone() { return new ImmNode(this.imm); }
|
||||||
evaluate(ctx) { return this.imm; }
|
|
||||||
toString(ctx) { return ctx ? ctx.stringifyImmediate(this.imm) : String(this.imm); }
|
toString(ctx) { return ctx ? ctx.stringifyImmediate(this.imm) : String(this.imm); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,8 +106,7 @@ class VarNode extends ExpNode {
|
|||||||
this.name = name || "";
|
this.name = name || "";
|
||||||
}
|
}
|
||||||
|
|
||||||
clone() { return new VarNode(this.name); }
|
clone() { return new VarNode(this.var); }
|
||||||
evaluate(ctx) { return ctx.variable(this.name); }
|
|
||||||
toString(ctx) { return ctx ? ctx.stringifyVariable(this.name) : String(this.name); }
|
toString(ctx) { return ctx ? ctx.stringifyVariable(this.name) : String(this.name); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,14 +117,7 @@ class CallNode extends ExpNode {
|
|||||||
this.args = args || [];
|
this.args = args || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
clone() {
|
clone() { return new CallNode(this.name, this.args.map(function(arg) { return arg.clone(); })); }
|
||||||
return new CallNode(this.name, this.args.map(function(arg) { return arg.clone(); }));
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate(ctx) {
|
|
||||||
const evaluatedArgs = this.args.map(function(arg) { return arg.evaluate(ctx); });
|
|
||||||
return ctx.function(this.name, evaluatedArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
toString(ctx) {
|
toString(ctx) {
|
||||||
if (this.name === "$bit") {
|
if (this.name === "$bit") {
|
||||||
@ -153,23 +143,8 @@ class UnaryNode extends ExpNode {
|
|||||||
this.child = child || null;
|
this.child = child || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
info() {
|
info() { return kUnaryOperators[this.op]; }
|
||||||
return kUnaryOperators[this.op];
|
clone() { return new UnaryNode(this.op, this.left ? this.left.clone() : null); }
|
||||||
}
|
|
||||||
|
|
||||||
clone() {
|
|
||||||
return new UnaryNode(this.op, this.left ? this.left.clone() : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate(ctx) {
|
|
||||||
const val = this.child.evaluate(ctx);
|
|
||||||
switch (this.op) {
|
|
||||||
case "-": return (-val);
|
|
||||||
case "~": return (~val);
|
|
||||||
case "!": return (val ? 0 : 1);
|
|
||||||
default : return ctx.unary(this.op, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toString(ctx) {
|
toString(ctx) {
|
||||||
return this.info().emit.replace(/@1/g, () => {
|
return this.info().emit.replace(/@1/g, () => {
|
||||||
@ -191,40 +166,8 @@ class BinaryNode extends ExpNode {
|
|||||||
this.right = right || null;
|
this.right = right || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
info() {
|
info() { return kBinaryOperators[this.op]; }
|
||||||
return kBinaryOperators[this.op];
|
clone() { return new BinaryNode(this.op, this.left ? this.left.clone() : null, this.right ? this.right.clone() : null); }
|
||||||
}
|
|
||||||
|
|
||||||
clone() {
|
|
||||||
return new BinaryNode(this.op, this.left ? this.left.clone() : null, this.right ? this.right.clone() : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate(ctx) {
|
|
||||||
const left = this.left.evaluate(ctx);
|
|
||||||
const right = this.right.evaluate(ctx);
|
|
||||||
|
|
||||||
switch (this.op) {
|
|
||||||
case "-" : return left - right;
|
|
||||||
case "+" : return left + right;
|
|
||||||
case "*" : return left * right;
|
|
||||||
case "/" : return (left / right)|0;
|
|
||||||
case "%" : return (left % right)|0;
|
|
||||||
case "&" : return left & right;
|
|
||||||
case "|" : return left | right;
|
|
||||||
case "^" : return left ^ right;
|
|
||||||
case "<<": return left << right;
|
|
||||||
case ">>": return left >> right;
|
|
||||||
case "==": return left == right ? 1 : 0;
|
|
||||||
case "!=": return left != right ? 1 : 0;
|
|
||||||
case "<" : return left < right ? 1 : 0;
|
|
||||||
case "<=": return left <= right ? 1 : 0;
|
|
||||||
case ">" : return left > right ? 1 : 0;
|
|
||||||
case ">=": return left >= right ? 1 : 0;
|
|
||||||
case "&&": return left && right ? 1 : 0;
|
|
||||||
case "||": return left || right ? 1 : 0;
|
|
||||||
default : return ctx.binary(this.op, left, right);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toString(ctx) {
|
toString(ctx) {
|
||||||
return this.info().emit.replace(/@[1-2]/g, (p) => {
|
return this.info().emit.replace(/@[1-2]/g, (p) => {
|
||||||
@ -241,6 +184,8 @@ function Call(name, args) { return new CallNode(name, args); }
|
|||||||
function Unary(op, child) { return new UnaryNode(op, child); }
|
function Unary(op, child) { return new UnaryNode(op, child); }
|
||||||
function Binary(op, left, right) { return new BinaryNode(op, left, right); }
|
function Binary(op, left, right) { return new BinaryNode(op, left, right); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
// TODO: Unused, remove?
|
||||||
function Negate(child) { return Unary("-", child); }
|
function Negate(child) { return Unary("-", child); }
|
||||||
function BitNot(child) { return Unary("~", child); }
|
function BitNot(child) { return Unary("~", child); }
|
||||||
|
|
||||||
@ -262,8 +207,7 @@ function Gt(left, right) { return Binary(">", left, right); }
|
|||||||
function Ge(left, right) { return Binary(">=", left, right); }
|
function Ge(left, right) { return Binary(">=", left, right); }
|
||||||
function And(left, right) { return Binary("&&", left, right); }
|
function And(left, right) { return Binary("&&", left, right); }
|
||||||
function Or(left, right) { return Binary("||", left, right); }
|
function Or(left, right) { return Binary("||", left, right); }
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
// Expression Tokenizer
|
// Expression Tokenizer
|
||||||
// --------------------
|
// --------------------
|
||||||
@ -312,44 +256,7 @@ function newToken(type, position, data, value) {
|
|||||||
const NoToken = newToken(kTokenNone, -1, "<end>", null);
|
const NoToken = newToken(kTokenNone, -1, "<end>", null);
|
||||||
|
|
||||||
// Must be reset before it can be used, use `RegExp.lastIndex`.
|
// Must be reset before it can be used, use `RegExp.lastIndex`.
|
||||||
const reNumValue = /(?:(?:\d*\.\d+|\d+)(?:[E|e][+|-]?\d+)?)/g;
|
const reValue = /(?:(?:\d*\.\d+|\d+)(?:[E|e][+|-]?\d+)?)/g;
|
||||||
|
|
||||||
function parseHex(source, from) {
|
|
||||||
let i = from;
|
|
||||||
let number = 0;
|
|
||||||
|
|
||||||
while (i < source.length) {
|
|
||||||
let c = source.charCodeAt(i);
|
|
||||||
let n = 0;
|
|
||||||
|
|
||||||
if (c >= '0'.charCodeAt(0) && c <= '9'.charCodeAt(0)) {
|
|
||||||
n = c - '0'.charCodeAt(0);
|
|
||||||
}
|
|
||||||
else if (c >= 'a'.charCodeAt(0) && c <= 'f'.charCodeAt(0)) {
|
|
||||||
n = c - 'a'.charCodeAt(0) + 10;
|
|
||||||
}
|
|
||||||
else if (c >= 'A'.charCodeAt(0) && c <= 'F'.charCodeAt(0)) {
|
|
||||||
n = c - 'A'.charCodeAt(0) + 10;
|
|
||||||
}
|
|
||||||
else if (c >= 'g'.charCodeAt(0) && c <= 'z'.charCodeAt(0) || c >= 'g'.charCodeAt(0) && c <= 'Z'.charCodeAt(0)) {
|
|
||||||
throwExpressionError(`Invalid hex number 0x${source.substring(from, i + 1)}`);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
number = (number << 4) | n;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i === from)
|
|
||||||
throwExpressionError(`Invalid number starting with 0x`);
|
|
||||||
|
|
||||||
return {
|
|
||||||
number: number,
|
|
||||||
end: i
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function tokenize(source) {
|
function tokenize(source) {
|
||||||
const len = source.length;
|
const len = source.length;
|
||||||
@ -361,33 +268,22 @@ function tokenize(source) {
|
|||||||
let c, cat; // Current character code and category.
|
let c, cat; // Current character code and category.
|
||||||
|
|
||||||
while (i < len) {
|
while (i < len) {
|
||||||
c = source.charCodeAt(i);
|
cat = Category(c = source.charCodeAt(i));
|
||||||
cat = Category(c);
|
|
||||||
|
|
||||||
if (cat === kCharSpace) {
|
if (cat === kCharSpace) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else if (cat === kCharDigit) {
|
else if (cat === kCharDigit) {
|
||||||
const n = tokens.length - 1;
|
const n = tokens.length - 1;
|
||||||
|
if (n >= 0 && tokens[n].data === "." && source[i - 1] === ".") {
|
||||||
// Hex number.
|
tokens.length = n;
|
||||||
if (c === '0'.charCodeAt(0) && i + 1 < len && source.charCodeAt(i + 1) === 'x'.charCodeAt(0)) {
|
i--;
|
||||||
const status = parseHex(source, i + 2);
|
|
||||||
tokens.push(newToken(kTokenValue, i, source.substring(i, status.end), status.number));
|
|
||||||
i = status.end;
|
|
||||||
}
|
}
|
||||||
else {
|
reValue.lastIndex = i;
|
||||||
if (n >= 0 && tokens[n].data === "." && source[i - 1] === ".") {
|
data = reValue.exec(source)[0];
|
||||||
tokens.length = n;
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
|
|
||||||
reNumValue.lastIndex = i;
|
tokens.push(newToken(kTokenValue, i, data, parseFloat(data)));
|
||||||
data = reNumValue.exec(source)[0];
|
i += data.length;
|
||||||
|
|
||||||
tokens.push(newToken(kTokenValue, i, data, parseFloat(data)));
|
|
||||||
i += data.length;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (cat === kCharAlpha) {
|
else if (cat === kCharAlpha) {
|
||||||
start = i;
|
start = i;
|
||||||
@ -727,29 +623,6 @@ $scope[$as] = {
|
|||||||
Call: Call,
|
Call: Call,
|
||||||
Unary: Unary,
|
Unary: Unary,
|
||||||
Binary: Binary,
|
Binary: Binary,
|
||||||
|
|
||||||
Negate: Negate,
|
|
||||||
BitNot: BitNot,
|
|
||||||
|
|
||||||
Add: Add,
|
|
||||||
Sub: Sub,
|
|
||||||
Mul: Mul,
|
|
||||||
Div: Div,
|
|
||||||
Mod: Mod,
|
|
||||||
Shl: Shl,
|
|
||||||
Shr: Shr,
|
|
||||||
BitAnd: BitAnd,
|
|
||||||
BitOr: BitOr,
|
|
||||||
BitXor: BitXor,
|
|
||||||
Eq: Eq,
|
|
||||||
Ne: Ne,
|
|
||||||
Lt: Lt,
|
|
||||||
Le: Le,
|
|
||||||
Gt: Gt,
|
|
||||||
Ge: Ge,
|
|
||||||
And: And,
|
|
||||||
Or: Or,
|
|
||||||
|
|
||||||
Visitor: Visitor,
|
Visitor: Visitor,
|
||||||
ExpressionError: ExpressionError,
|
ExpressionError: ExpressionError,
|
||||||
|
|
||||||
|
4
deps/asmjit/db/index.js
vendored
4
deps/asmjit/db/index.js
vendored
@ -1,11 +1,11 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
exports.base = require("./base.js");
|
exports.base = require("./base.js");
|
||||||
exports.aarch32 = require("./aarch32.js");
|
exports.arm = require("./arm.js");
|
||||||
exports.aarch64 = require("./aarch64.js");
|
exports.aarch64 = require("./aarch64.js");
|
||||||
exports.x86 = require("./x86.js");
|
exports.x86 = require("./x86.js");
|
||||||
|
380
deps/asmjit/db/isa_aarch64.json
vendored
380
deps/asmjit/db/isa_aarch64.json
vendored
@ -139,70 +139,70 @@
|
|||||||
{"inst": "ldaxr Xd, [Xn|SP]" , "op": "11001000|010|11111|1|11111|Rn|Rd"},
|
{"inst": "ldaxr Xd, [Xn|SP]" , "op": "11001000|010|11111|1|11111|Rn|Rd"},
|
||||||
{"inst": "ldaxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|1|11111|Rn|Rd"},
|
{"inst": "ldaxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|1|11111|Rn|Rd"},
|
||||||
{"inst": "ldaxrh Xd, [Xn|SP]" , "op": "01001000|010|11111|1|11111|Rn|Rd"},
|
{"inst": "ldaxrh Xd, [Xn|SP]" , "op": "01001000|010|11111|1|11111|Rn|Rd"},
|
||||||
{"inst": "ldnp Wd, Wd2, [Xn|SP, #offS*4]" , "op": "00101000|01|offS:7|Rd2|Rn|Rd"},
|
{"inst": "ldnp Wd, Wd2, [Xn|SP, #soff*4]" , "op": "00101000|01|soff:7|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldnp Xd, Xd2, [Xn|SP, #offS*8]" , "op": "10101000|01|offS:7|Rd2|Rn|Rd"},
|
{"inst": "ldnp Xd, Xd2, [Xn|SP, #soff*8]" , "op": "10101000|01|soff:7|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldp Wd, Wd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010100|!post|W|1|offS:7|Rd2|Rn|Rd"},
|
{"inst": "ldp Wd, Wd2, [Xn|SP, #soff*4]{@}{!}" , "op": "0010100|!post|W|1|soff:7|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldp Xd, Xd2, [Xn|SP, #offS*8]{@}{!}" , "op": "1010100|!post|W|1|offS:7|Rd2|Rn|Rd"},
|
{"inst": "ldp Xd, Xd2, [Xn|SP, #soff*8]{@}{!}" , "op": "1010100|!post|W|1|soff:7|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldpsw Xd, Xd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0110100|!post|W|1|offS:7|Rd2|Rn|Rd"},
|
{"inst": "ldpsw Xd, Xd2, [Xn|SP, #soff*4]{@}{!}" , "op": "0110100|!post|W|1|soff:7|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldr Wd, [Xn|SP, #offZ*4]" , "op": "10111001|01|offZ:12|Rn|Rd"},
|
{"inst": "ldr Wd, [Xn|SP, #zoff*4]" , "op": "10111001|01|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldr Xd, [Xn|SP, #offZ*8]" , "op": "11111001|01|offZ:12|Rn|Rd"},
|
{"inst": "ldr Xd, [Xn|SP, #zoff*8]" , "op": "11111001|01|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldr Wd, [Xn|SP, #offS*4]@" , "op": "10111000|010|offS:9|01|Rn|Rd"},
|
{"inst": "ldr Wd, [Xn|SP, #soff*4]@" , "op": "10111000|010|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldr Xd, [Xn|SP, #offS*8]@" , "op": "11111000|010|offS:9|01|Rn|Rd"},
|
{"inst": "ldr Xd, [Xn|SP, #soff*8]@" , "op": "11111000|010|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldr Wd, [Xn|SP, #offS*4]!" , "op": "10111000|010|offS:9|11|Rn|Rd"},
|
{"inst": "ldr Wd, [Xn|SP, #soff*4]!" , "op": "10111000|010|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldr Xd, [Xn|SP, #offS*8]!" , "op": "11111000|010|offS:9|11|Rn|Rd"},
|
{"inst": "ldr Xd, [Xn|SP, #soff*8]!" , "op": "11111000|010|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldr Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
|
{"inst": "ldr Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
|
||||||
{"inst": "ldr Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
|
{"inst": "ldr Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
|
||||||
{"inst": "ldr Wd, [PC, #offS*4]" , "op": "00011000|offS:19|Rd"},
|
{"inst": "ldr Wd, [PC, #soff*4]" , "op": "00011000|soff:19|Rd"},
|
||||||
{"inst": "ldr Xd, [PC, #offS*4]" , "op": "01011000|offS:19|Rd"},
|
{"inst": "ldr Xd, [PC, #soff*4]" , "op": "01011000|soff:19|Rd"},
|
||||||
{"inst": "ldrb Wd, [Xn|SP, #offZ]" , "op": "00111001|01|offZ:12|Rn|Rd"},
|
{"inst": "ldrb Wd, [Xn|SP, #zoff]" , "op": "00111001|01|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrb Wd, [Xn|SP, #offS]@" , "op": "00111000|010|offS:9|01|Rn|Rd"},
|
{"inst": "ldrb Wd, [Xn|SP, #soff]@" , "op": "00111000|010|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrb Wd, [Xn|SP, #offS]!" , "op": "00111000|010|offS:9|11|Rn|Rd"},
|
{"inst": "ldrb Wd, [Xn|SP, #soff]!" , "op": "00111000|010|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
{"inst": "ldrb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
||||||
{"inst": "ldrh Wd, [Xn|SP, #offZ*2]" , "op": "01111001|01|offZ:12|Rn|Rd"},
|
{"inst": "ldrh Wd, [Xn|SP, #zoff*2]" , "op": "01111001|01|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrh Wd, [Xn|SP, #offS*2]@" , "op": "01111000|010|offS:9|01|Rn|Rd"},
|
{"inst": "ldrh Wd, [Xn|SP, #soff*2]@" , "op": "01111000|010|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrh Wd, [Xn|SP, #offS*2]!" , "op": "01111000|010|offS:9|11|Rn|Rd"},
|
{"inst": "ldrh Wd, [Xn|SP, #soff*2]!" , "op": "01111000|010|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
{"inst": "ldrh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
||||||
{"inst": "ldrsb Wd, [Xn|SP, #offZ]" , "op": "00111001|11|offZ:12|Rn|Rd"},
|
{"inst": "ldrsb Wd, [Xn|SP, #zoff]" , "op": "00111001|11|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrsb Xd, [Xn|SP, #offZ]" , "op": "00111001|10|offZ:12|Rn|Rd"},
|
{"inst": "ldrsb Xd, [Xn|SP, #zoff]" , "op": "00111001|10|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrsb Wd, [Xn|SP, #offS]@" , "op": "00111000|110|offS:9|01|Rn|Rd"},
|
{"inst": "ldrsb Wd, [Xn|SP, #soff]@" , "op": "00111000|110|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrsb Xd, [Xn|SP, #offS]@" , "op": "00111000|100|offS:9|01|Rn|Rd"},
|
{"inst": "ldrsb Xd, [Xn|SP, #soff]@" , "op": "00111000|100|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrsb Wd, [Xn|SP, #offS]!" , "op": "00111000|110|offS:9|11|Rn|Rd"},
|
{"inst": "ldrsb Wd, [Xn|SP, #soff]!" , "op": "00111000|110|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrsb Xd, [Xn|SP, #offS]!" , "op": "00111000|100|offS:9|11|Rn|Rd"},
|
{"inst": "ldrsb Xd, [Xn|SP, #soff]!" , "op": "00111000|100|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrsb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
{"inst": "ldrsb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
||||||
{"inst": "ldrsb Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
{"inst": "ldrsb Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
|
||||||
{"inst": "ldrsh Wd, [Xn|SP, #offZ*2]" , "op": "01111001|11|offZ:12|Rn|Rd"},
|
{"inst": "ldrsh Wd, [Xn|SP, #zoff*2]" , "op": "01111001|11|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrsh Xd, [Xn|SP, #offZ*2]" , "op": "01111001|10|offZ:12|Rn|Rd"},
|
{"inst": "ldrsh Xd, [Xn|SP, #zoff*2]" , "op": "01111001|10|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrsh Wd, [Xn|SP, #offS*2]@" , "op": "01111000|110|offS:9|01|Rn|Rd"},
|
{"inst": "ldrsh Wd, [Xn|SP, #soff*2]@" , "op": "01111000|110|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrsh Xd, [Xn|SP, #offS*2]@" , "op": "01111000|100|offS:9|01|Rn|Rd"},
|
{"inst": "ldrsh Xd, [Xn|SP, #soff*2]@" , "op": "01111000|100|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrsh Wd, [Xn|SP, #offS*2]!" , "op": "01111000|110|offS:9|11|Rn|Rd"},
|
{"inst": "ldrsh Wd, [Xn|SP, #soff*2]!" , "op": "01111000|110|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrsh Xd, [Xn|SP, #offS*2]!" , "op": "01111000|100|offS:9|11|Rn|Rd"},
|
{"inst": "ldrsh Xd, [Xn|SP, #soff*2]!" , "op": "01111000|100|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrsh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
{"inst": "ldrsh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
||||||
{"inst": "ldrsh Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
{"inst": "ldrsh Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
|
||||||
{"inst": "ldrsw Xd, [Xn|SP, #offZ*4]" , "op": "10111001|10|offZ:12|Rn|Rd"},
|
{"inst": "ldrsw Xd, [Xn|SP, #zoff*4]" , "op": "10111001|10|zoff:12|Rn|Rd"},
|
||||||
{"inst": "ldrsw Xd, [Xn|SP, #offS*4]@" , "op": "10111000|100|offS:9|01|Rn|Rd"},
|
{"inst": "ldrsw Xd, [Xn|SP, #soff*4]@" , "op": "10111000|100|soff:9|01|Rn|Rd"},
|
||||||
{"inst": "ldrsw Xd, [Xn|SP, #offS*4]!" , "op": "10111000|100|offS:9|11|Rn|Rd"},
|
{"inst": "ldrsw Xd, [Xn|SP, #soff*4]!" , "op": "10111000|100|soff:9|11|Rn|Rd"},
|
||||||
{"inst": "ldrsw Xd, [PC, #offS*4]" , "op": "10011000|offS:19|Rd"},
|
{"inst": "ldrsw Xd, [PC, #soff*4]" , "op": "10011000|soff:19|Rd"},
|
||||||
{"inst": "ldrsw Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRW(iop, n)"},
|
{"inst": "ldrsw Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRW(iop, n)"},
|
||||||
{"inst": "ldtr Wd, [Xn|SP, #offS]" , "op": "10111000|010|offS:9|10|Rn|Rd"},
|
{"inst": "ldtr Wd, [Xn|SP, #soff]" , "op": "10111000|010|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtr Xd, [Xn|SP, #offS]" , "op": "11111000|010|offS:9|10|Rn|Rd"},
|
{"inst": "ldtr Xd, [Xn|SP, #soff]" , "op": "11111000|010|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrb Wd, [Xn|SP, #offS]" , "op": "00111000|010|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrb Wd, [Xn|SP, #soff]" , "op": "00111000|010|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrh Wd, [Xn|SP, #offS]" , "op": "01111000|010|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrh Wd, [Xn|SP, #soff]" , "op": "01111000|010|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrsb Wd, [Xn|SP, #offS]" , "op": "00111000|100|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrsb Wd, [Xn|SP, #soff]" , "op": "00111000|100|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrsb Xd, [Xn|SP, #offS]" , "op": "00111000|110|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrsb Xd, [Xn|SP, #soff]" , "op": "00111000|110|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrsh Wd, [Xn|SP, #offS]" , "op": "01111000|100|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrsh Wd, [Xn|SP, #soff]" , "op": "01111000|100|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrsh Xd, [Xn|SP, #offS]" , "op": "01111000|110|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrsh Xd, [Xn|SP, #soff]" , "op": "01111000|110|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldtrsw Xd, [Xn|SP, #offS]" , "op": "10111000|100|offS:9|10|Rn|Rd"},
|
{"inst": "ldtrsw Xd, [Xn|SP, #soff]" , "op": "10111000|100|soff:9|10|Rn|Rd"},
|
||||||
{"inst": "ldur Wd, [Xn|SP, #offS]" , "op": "10111000|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldur Wd, [Xn|SP, #soff]" , "op": "10111000|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldur Xd, [Xn|SP, #offS]" , "op": "11111000|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldur Xd, [Xn|SP, #soff]" , "op": "11111000|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldurb Wd, [Xn|SP, #offS]" , "op": "00111000|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldurb Wd, [Xn|SP, #soff]" , "op": "00111000|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldurh Wd, [Xn|SP, #offS]" , "op": "01111000|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldurh Wd, [Xn|SP, #soff]" , "op": "01111000|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldursb Wd, [Xn|SP, #offS]" , "op": "00111000|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldursb Wd, [Xn|SP, #soff]" , "op": "00111000|100|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldursb Xd, [Xn|SP, #offS]" , "op": "00111000|110|offS:9|00|Rn|Rd"},
|
{"inst": "ldursb Xd, [Xn|SP, #soff]" , "op": "00111000|110|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldursh Wd, [Xn|SP, #offS]" , "op": "01111000|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldursh Wd, [Xn|SP, #soff]" , "op": "01111000|100|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldursh Xd, [Xn|SP, #offS]" , "op": "01111000|110|offS:9|00|Rn|Rd"},
|
{"inst": "ldursh Xd, [Xn|SP, #soff]" , "op": "01111000|110|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldursw Xd, [Xn|SP, #offS]" , "op": "10111000|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldursw Xd, [Xn|SP, #soff]" , "op": "10111000|100|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldxp Wd, Wd2, [Xn|SP, #offS*4]" , "op": "10001000|011|11111|0|Rd2|Rn|Rd"},
|
{"inst": "ldxp Wd, Wd2, [Xn|SP, #soff*4]" , "op": "10001000|011|11111|0|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldxp Xd, Xd2, [Xn|SP, #offS*8]" , "op": "11001000|011|11111|0|Rd2|Rn|Rd"},
|
{"inst": "ldxp Xd, Xd2, [Xn|SP, #soff*8]" , "op": "11001000|011|11111|0|Rd2|Rn|Rd"},
|
||||||
{"inst": "ldxr Wd, [Xn|SP]" , "op": "10001000|010|11111|0|11111|Rn|Rd"},
|
{"inst": "ldxr Wd, [Xn|SP]" , "op": "10001000|010|11111|0|11111|Rn|Rd"},
|
||||||
{"inst": "ldxr Xd, [Xn|SP]" , "op": "11001000|010|11111|0|11111|Rn|Rd"},
|
{"inst": "ldxr Xd, [Xn|SP]" , "op": "11001000|010|11111|0|11111|Rn|Rd"},
|
||||||
{"inst": "ldxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|0|11111|Rn|Rd"},
|
{"inst": "ldxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|0|11111|Rn|Rd"},
|
||||||
@ -260,9 +260,9 @@
|
|||||||
{"inst": "orr Wd|WSP, Wn, #log_imm" , "op": "00110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 0)"},
|
{"inst": "orr Wd|WSP, Wn, #log_imm" , "op": "00110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 0)"},
|
||||||
{"inst": "orr Xd|SP, Xn, #log_imm" , "op": "10110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 1)"},
|
{"inst": "orr Xd|SP, Xn, #log_imm" , "op": "10110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 1)"},
|
||||||
{"inst": "prfm #prf_op, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*8}]" , "op": "11111000|101|Rm|option:3|n:1|10|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
{"inst": "prfm #prf_op, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*8}]" , "op": "11111000|101|Rm|option:3|n:1|10|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
||||||
{"inst": "prfm #prf_op, [Xn|SP, #offZ]" , "op": "11111001|10|offZ:12|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
{"inst": "prfm #prf_op, [Xn|SP, #zoff]" , "op": "11111001|10|zoff:12|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
||||||
{"inst": "prfm #prf_op, [PC, #offS*4]" , "op": "11011000|offS:19|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
{"inst": "prfm #prf_op, [PC, #soff*4]" , "op": "11011000|soff:19|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
||||||
{"inst": "prfum #prf_op, [Xn|SP, #offS]" , "op": "11111000|100|offS:9|00|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
{"inst": "prfum #prf_op, [Xn|SP, #soff]" , "op": "11111000|100|soff:9|00|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
|
||||||
{"inst": "pssbb" , "op": "11010101|000|00011|0011|0100|100|11111"},
|
{"inst": "pssbb" , "op": "11010101|000|00011|0011|0100|100|11111"},
|
||||||
{"inst": "rbit Wd, Wn" , "op": "01011010|110|00000|0|00000|Rn|Rd"},
|
{"inst": "rbit Wd, Wn" , "op": "01011010|110|00000|0|00000|Rn|Rd"},
|
||||||
{"inst": "rbit Xd, Xn" , "op": "11011010|110|00000|0|00000|Rn|Rd"},
|
{"inst": "rbit Xd, Xn" , "op": "11011010|110|00000|0|00000|Rn|Rd"},
|
||||||
@ -291,7 +291,7 @@
|
|||||||
{"inst": "sev" , "op": "11010101|000|00011|0010|0000|100|11111"},
|
{"inst": "sev" , "op": "11010101|000|00011|0010|0000|100|11111"},
|
||||||
{"inst": "sevl" , "op": "11010101|000|00011|0010|0000|101|11111"},
|
{"inst": "sevl" , "op": "11010101|000|00011|0010|0000|101|11111"},
|
||||||
{"inst": "smaddl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|0|Ra|Rn|Rd"},
|
{"inst": "smaddl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|0|Ra|Rn|Rd"},
|
||||||
{"inst": "smc #immZ" , "op": "11010100|000|immZ:16|00011"},
|
{"inst": "smc #zimm" , "op": "11010100|000|zimm:16|00011"},
|
||||||
{"inst": "smnegl Xd, Wn, Wm" , "op": "10011011|001|Rm|1|11111|Rn|Rd"},
|
{"inst": "smnegl Xd, Wn, Wm" , "op": "10011011|001|Rm|1|11111|Rn|Rd"},
|
||||||
{"inst": "smsubl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|1|Ra|Rn|Rd"},
|
{"inst": "smsubl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|1|Ra|Rn|Rd"},
|
||||||
{"inst": "smulh Xd, Xn, Xm" , "op": "10011011|010|Rm|0|11111|Rn|Rd"},
|
{"inst": "smulh Xd, Xn, Xm" , "op": "10011011|010|Rm|0|11111|Rn|Rd"},
|
||||||
@ -307,34 +307,34 @@
|
|||||||
{"inst": "stlxr Wd, Xs, [Xn|SP]" , "op": "11001000|000|Rd|1|11111|Rn|Rs"},
|
{"inst": "stlxr Wd, Xs, [Xn|SP]" , "op": "11001000|000|Rd|1|11111|Rn|Rs"},
|
||||||
{"inst": "stlxrb Wd, Ws, [Xn|SP]" , "op": "00001000|000|Rd|1|11111|Rn|Rs"},
|
{"inst": "stlxrb Wd, Ws, [Xn|SP]" , "op": "00001000|000|Rd|1|11111|Rn|Rs"},
|
||||||
{"inst": "stlxrh Wd, Xs, [Xn|SP]" , "op": "01001000|000|Rd|1|11111|Rn|Rs"},
|
{"inst": "stlxrh Wd, Xs, [Xn|SP]" , "op": "01001000|000|Rd|1|11111|Rn|Rs"},
|
||||||
{"inst": "stnp Ws, Ws2, [Xn|SP, #offS*4]" , "op": "00101000|00|offS:7|Rs2|Rn|Rs"},
|
{"inst": "stnp Ws, Ws2, [Xn|SP, #simm*4]" , "op": "00101000|00|simm:7|Rs2|Rn|Rs"},
|
||||||
{"inst": "stnp Xs, Xs2, [Xn|SP, #offS*8]" , "op": "10101000|00|offS:7|Rs2|Rn|Rs"},
|
{"inst": "stnp Xs, Xs2, [Xn|SP, #simm*8]" , "op": "10101000|00|simm:7|Rs2|Rn|Rs"},
|
||||||
{"inst": "stp Ws, Ws2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010100|!post|W|0|offS:7|Rs2|Rn|Rs"},
|
{"inst": "stp Ws, Ws2, [Xn|SP, #simm*4]{@}{!}" , "op": "0010100|!post|W|0|simm:7|Rs2|Rn|Rs"},
|
||||||
{"inst": "stp Xs, Xs2, [Xn|SP, #offS*8]{@}{!}" , "op": "1010100|!post|W|0|offS:7|Rs2|Rn|Rs"},
|
{"inst": "stp Xs, Xs2, [Xn|SP, #simm*8]{@}{!}" , "op": "1010100|!post|W|0|simm:7|Rs2|Rn|Rs"},
|
||||||
{"inst": "str Ws, [Xn|SP, #offZ*4]" , "op": "10111001|00|offZ:12|Rn|Rs"},
|
{"inst": "str Ws, [Xn|SP, #zoff*4]" , "op": "10111001|00|zoff:12|Rn|Rs"},
|
||||||
{"inst": "str Xs, [Xn|SP, #offZ*8]" , "op": "11111001|00|offZ:12|Rn|Rs"},
|
{"inst": "str Xs, [Xn|SP, #zoff*8]" , "op": "11111001|00|zoff:12|Rn|Rs"},
|
||||||
{"inst": "str Ws, [Xn|SP, #offS*4]@" , "op": "10111000|000|offS:9|01|Rn|Rs"},
|
{"inst": "str Ws, [Xn|SP, #soff*4]@" , "op": "10111000|000|soff:9|01|Rn|Rs"},
|
||||||
{"inst": "str Xs, [Xn|SP, #offS*8]@" , "op": "11111000|000|offS:9|01|Rn|Rs"},
|
{"inst": "str Xs, [Xn|SP, #soff*8]@" , "op": "11111000|000|soff:9|01|Rn|Rs"},
|
||||||
{"inst": "str Ws, [Xn|SP, #offS*4]!" , "op": "10111000|000|offS:9|11|Rn|Rs"},
|
{"inst": "str Ws, [Xn|SP, #soff*4]!" , "op": "10111000|000|soff:9|11|Rn|Rs"},
|
||||||
{"inst": "str Xs, [Xn|SP, #offS*8]!" , "op": "11111000|000|offS:9|11|Rn|Rs"},
|
{"inst": "str Xs, [Xn|SP, #soff*8]!" , "op": "11111000|000|soff:9|11|Rn|Rs"},
|
||||||
{"inst": "str Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
|
{"inst": "str Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
|
||||||
{"inst": "str Xs, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
|
{"inst": "str Xs, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
|
||||||
{"inst": "strb Ws, [Xn|SP, #offZ]" , "op": "00111001|00|offZ:12|Rn|Rs"},
|
{"inst": "strb Ws, [Xn|SP, #zoff]" , "op": "00111001|00|zoff:12|Rn|Rs"},
|
||||||
{"inst": "strb Ws, [Xn|SP, #offS]@" , "op": "00111000|000|offS:9|01|Rn|Rs"},
|
{"inst": "strb Ws, [Xn|SP, #soff]@" , "op": "00111000|000|soff:9|01|Rn|Rs"},
|
||||||
{"inst": "strb Ws, [Xn|SP, #offS]!" , "op": "00111000|000|offS:9|11|Rn|Rs"},
|
{"inst": "strb Ws, [Xn|SP, #soff]!" , "op": "00111000|000|soff:9|11|Rn|Rs"},
|
||||||
{"inst": "strb Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRB_STRB(iop, n)"},
|
{"inst": "strb Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRB_STRB(iop, n)"},
|
||||||
{"inst": "strh Ws, [Xn|SP, #offZ*2]" , "op": "01111001|00|offZ:12|Rn|Rs"},
|
{"inst": "strh Ws, [Xn|SP, #zoff*2]" , "op": "01111001|00|zoff:12|Rn|Rs"},
|
||||||
{"inst": "strh Ws, [Xn|SP, #offS*2]@" , "op": "01111000|000|offS:9|01|Rn|Rs"},
|
{"inst": "strh Ws, [Xn|SP, #soff*2]@" , "op": "01111000|000|soff:9|01|Rn|Rs"},
|
||||||
{"inst": "strh Ws, [Xn|SP, #offS*2]!" , "op": "01111000|000|offS:9|11|Rn|Rs"},
|
{"inst": "strh Ws, [Xn|SP, #soff*2]!" , "op": "01111000|000|soff:9|11|Rn|Rs"},
|
||||||
{"inst": "strh Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRH_STRH(iop, n)"},
|
{"inst": "strh Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRH_STRH(iop, n)"},
|
||||||
{"inst": "sttr Ws, [Xn|SP, #offS]" , "op": "10111000|000|offS:9|10|Rn|Rs"},
|
{"inst": "sttr Ws, [Xn|SP, #soff]" , "op": "10111000|000|soff:9|10|Rn|Rs"},
|
||||||
{"inst": "sttr Xs, [Xn|SP, #offS]" , "op": "11111000|000|offS:9|10|Rn|Rs"},
|
{"inst": "sttr Xs, [Xn|SP, #soff]" , "op": "11111000|000|soff:9|10|Rn|Rs"},
|
||||||
{"inst": "sttrb Ws, [Xn|SP, #offS]" , "op": "00111000|000|offS:9|10|Rn|Rs"},
|
{"inst": "sttrb Ws, [Xn|SP, #soff]" , "op": "00111000|000|soff:9|10|Rn|Rs"},
|
||||||
{"inst": "sttrh Ws, [Xn|SP, #offS]" , "op": "01111000|000|offS:9|10|Rn|Rs"},
|
{"inst": "sttrh Ws, [Xn|SP, #soff]" , "op": "01111000|000|soff:9|10|Rn|Rs"},
|
||||||
{"inst": "stur Ws, [Xn|SP, #offS]" , "op": "10111000|000|offS:9|00|Rn|Rs"},
|
{"inst": "stur Ws, [Xn|SP, #soff]" , "op": "10111000|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "stur Xs, [Xn|SP, #offS]" , "op": "11111000|000|offS:9|00|Rn|Rs"},
|
{"inst": "stur Xs, [Xn|SP, #soff]" , "op": "11111000|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "sturb Ws, [Xn|SP, #offS]" , "op": "00111000|000|offS:9|00|Rn|Rs"},
|
{"inst": "sturb Ws, [Xn|SP, #soff]" , "op": "00111000|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "sturh Ws, [Xn|SP, #offS]" , "op": "01111000|000|offS:9|00|Rn|Rs"},
|
{"inst": "sturh Ws, [Xn|SP, #soff]" , "op": "01111000|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "stxp Wd, Ws, Ws2, [Xn|SP]" , "op": "10001000|001|Rd|0|Rs2|Rn|Rs"},
|
{"inst": "stxp Wd, Ws, Ws2, [Xn|SP]" , "op": "10001000|001|Rd|0|Rs2|Rn|Rs"},
|
||||||
{"inst": "stxp Wd, Xs, Xs2, [Xn|SP]" , "op": "11001000|001|Rd|0|Rs2|Rn|Rs"},
|
{"inst": "stxp Wd, Xs, Xs2, [Xn|SP]" , "op": "11001000|001|Rd|0|Rs2|Rn|Rs"},
|
||||||
{"inst": "stxr Wd, Ws, [Xn|SP]" , "op": "10001000|000|Rd|0|11111|Rn|Rs"},
|
{"inst": "stxr Wd, Ws, [Xn|SP]" , "op": "10001000|000|Rd|0|11111|Rn|Rs"},
|
||||||
@ -353,7 +353,7 @@
|
|||||||
{"inst": "subs Xd, Xn|SP, Rm, {extend #n}" , "op": "11101011|00|1|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
{"inst": "subs Xd, Xn|SP, Rm, {extend #n}" , "op": "11101011|00|1|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
||||||
{"inst": "subs Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "01110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
{"inst": "subs Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "01110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
||||||
{"inst": "subs Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "11110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
{"inst": "subs Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "11110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
|
||||||
{"inst": "svc #immZ" , "op": "11010100|000|immZ:16|00001"},
|
{"inst": "svc #zimm" , "op": "11010100|000|zimm:16|00001"},
|
||||||
{"inst": "sxtb Wd, Wn" , "op": "00010011|000|00000|0|00111|Rn|Rd"},
|
{"inst": "sxtb Wd, Wn" , "op": "00010011|000|00000|0|00111|Rn|Rd"},
|
||||||
{"inst": "sxtb Xd, Wn" , "op": "10010011|010|00000|0|00111|Rn|Rd"},
|
{"inst": "sxtb Xd, Wn" , "op": "10010011|010|00000|0|00111|Rn|Rd"},
|
||||||
{"inst": "sxth Wd, Wn" , "op": "00010011|000|00000|0|01111|Rn|Rd"},
|
{"inst": "sxth Wd, Wn" , "op": "00010011|000|00000|0|01111|Rn|Rd"},
|
||||||
@ -431,20 +431,20 @@
|
|||||||
{"inst": "ctz Xd, Xn" , "op": "11011010|110|00000|0|00110|Rn|Rd"},
|
{"inst": "ctz Xd, Xn" , "op": "11011010|110|00000|0|00110|Rn|Rd"},
|
||||||
{"inst": "smax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11000|Rn|Rd"},
|
{"inst": "smax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11000|Rn|Rd"},
|
||||||
{"inst": "smax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11000|Rn|Rd"},
|
{"inst": "smax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11000|Rn|Rd"},
|
||||||
{"inst": "smax Wd, Wn, #immS" , "op": "00010001|110|000|immS:8|Rn|Rd"},
|
{"inst": "smax Wd, Wn, #simm" , "op": "00010001|110|000|simm:8|Rn|Rd"},
|
||||||
{"inst": "smax Xd, Xn, #immS" , "op": "10010001|110|000|immS:8|Rn|Rd"},
|
{"inst": "smax Xd, Xn, #simm" , "op": "10010001|110|000|simm:8|Rn|Rd"},
|
||||||
{"inst": "smin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11010|Rn|Rd"},
|
{"inst": "smin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11010|Rn|Rd"},
|
||||||
{"inst": "smin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11010|Rn|Rd"},
|
{"inst": "smin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11010|Rn|Rd"},
|
||||||
{"inst": "smin Wd, Wn, #immS" , "op": "00010001|110|010|immS:8|Rn|Rd"},
|
{"inst": "smin Wd, Wn, #simm" , "op": "00010001|110|010|simm:8|Rn|Rd"},
|
||||||
{"inst": "smin Xd, Xn, #immS" , "op": "10010001|110|010|immS:8|Rn|Rd"},
|
{"inst": "smin Xd, Xn, #simm" , "op": "10010001|110|010|simm:8|Rn|Rd"},
|
||||||
{"inst": "umax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11001|Rn|Rd"},
|
{"inst": "umax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11001|Rn|Rd"},
|
||||||
{"inst": "umax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11001|Rn|Rd"},
|
{"inst": "umax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11001|Rn|Rd"},
|
||||||
{"inst": "umax Wd, Wn, #immZ" , "op": "00010001|110|001|immZ:8|Rn|Rd"},
|
{"inst": "umax Wd, Wn, #simm" , "op": "00010001|110|001|simm:8|Rn|Rd"},
|
||||||
{"inst": "umax Xd, Xn, #immZ" , "op": "10010001|110|001|immZ:8|Rn|Rd"},
|
{"inst": "umax Xd, Xn, #simm" , "op": "10010001|110|001|simm:8|Rn|Rd"},
|
||||||
{"inst": "umin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11011|Rn|Rd"},
|
{"inst": "umin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11011|Rn|Rd"},
|
||||||
{"inst": "umin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11011|Rn|Rd"},
|
{"inst": "umin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11011|Rn|Rd"},
|
||||||
{"inst": "umin Wd, Wn, #immZ" , "op": "00010001|110|011|immZ:8|Rn|Rd"},
|
{"inst": "umin Wd, Wn, #simm" , "op": "00010001|110|011|simm:8|Rn|Rd"},
|
||||||
{"inst": "umin Xd, Xn, #immZ" , "op": "10010001|110|011|immZ:8|Rn|Rd"}
|
{"inst": "umin Xd, Xn, #simm" , "op": "10010001|110|011|simm:8|Rn|Rd"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "D128", "data": [
|
{"category": "GP GP_EXT", "ext": "D128", "data": [
|
||||||
@ -510,21 +510,21 @@
|
|||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "LRCPC2", "data": [
|
{"category": "GP GP_EXT", "ext": "LRCPC2", "data": [
|
||||||
{"inst": "ldapur Wd, [Xn|SP, #offS]" , "op": "10011001|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldapur Wd, [Xn|SP, #soff]" , "op": "10011001|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapur Xd, [Xn|SP, #offS]" , "op": "11011001|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldapur Xd, [Xn|SP, #soff]" , "op": "11011001|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapurb Wd, [Xn|SP, #offS]" , "op": "00011001|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldapurb Wd, [Xn|SP, #soff]" , "op": "00011001|010|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapurh Wd, [Xn|SP, #offS]" , "op": "01011001|010|offS:9|00|Rn|Rd"},
|
{"inst": "ldapurh Wd, [Xn|SP, #soff]" , "op": "01011001|010|soff:9|00|Rn|Rd"},
|
||||||
|
|
||||||
{"inst": "ldapursb Wd, [Xn|SP, #offS]" , "op": "00011001|110|offS:9|00|Rn|Rd"},
|
{"inst": "ldapursb Wd, [Xn|SP, #soff]" , "op": "00011001|110|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapursb Xd, [Xn|SP, #offS]" , "op": "00011001|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldapursb Xd, [Xn|SP, #soff]" , "op": "00011001|100|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapursh Wd, [Xn|SP, #offS]" , "op": "01011001|110|offS:9|00|Rn|Rd"},
|
{"inst": "ldapursh Wd, [Xn|SP, #soff]" , "op": "01011001|110|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapursh Xd, [Xn|SP, #offS]" , "op": "01011001|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldapursh Xd, [Xn|SP, #soff]" , "op": "01011001|100|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "ldapursw Xd, [Xn|SP, #offS]" , "op": "10011001|100|offS:9|00|Rn|Rd"},
|
{"inst": "ldapursw Xd, [Xn|SP, #soff]" , "op": "10011001|100|soff:9|00|Rn|Rd"},
|
||||||
|
|
||||||
{"inst": "stlur Ws, [Xn|SP, #offS]" , "op": "10011001|000|offS:9|00|Rn|Rs"},
|
{"inst": "stlur Ws, [Xn|SP, #soff]" , "op": "10011001|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "stlur Xs, [Xn|SP, #offS]" , "op": "11011001|000|offS:9|00|Rn|Rs"},
|
{"inst": "stlur Xs, [Xn|SP, #soff]" , "op": "11011001|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "stlurb Ws, [Xn|SP, #offS]" , "op": "00011001|000|offS:9|00|Rn|Rs"},
|
{"inst": "stlurb Ws, [Xn|SP, #soff]" , "op": "00011001|000|soff:9|00|Rn|Rs"},
|
||||||
{"inst": "stlurh Ws, [Xn|SP, #offS]" , "op": "01011001|000|offS:9|00|Rn|Rs"}
|
{"inst": "stlurh Ws, [Xn|SP, #soff]" , "op": "01011001|000|soff:9|00|Rn|Rs"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "LRCPC3", "data": [
|
{"category": "GP GP_EXT", "ext": "LRCPC3", "data": [
|
||||||
@ -981,12 +981,12 @@
|
|||||||
{"inst": "cmpp Xn|SP, Xm|SP" , "op": "10111010|110|Rm|000000|Rn|11111"},
|
{"inst": "cmpp Xn|SP, Xm|SP" , "op": "10111010|110|Rm|000000|Rn|11111"},
|
||||||
{"inst": "gmi Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000101|Rn|Rd"},
|
{"inst": "gmi Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000101|Rn|Rd"},
|
||||||
{"inst": "irg Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000100|Rn|Rd"},
|
{"inst": "irg Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000100|Rn|Rd"},
|
||||||
{"inst": "ldg Xd, [Xn|SP, #offS*16]" , "op": "11011001|011|offS:9|00|Rn|Rd"},
|
{"inst": "ldg Xd, [Xn|SP, #soff*16]" , "op": "11011001|011|soff:9|00|Rn|Rd"},
|
||||||
{"inst": "st2g Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|101|offS:9|!post|W|Rn|Rs"},
|
{"inst": "st2g Xs|SP, [Xn|SP, #soff*16]{@}{!}" , "op": "11011001|101|soff:9|!post|W|Rn|Rs"},
|
||||||
{"inst": "stg Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|001|offS:9|!post|W|Rn|Rs"},
|
{"inst": "stg Xs|SP, [Xn|SP, #soff*16]{@}{!}" , "op": "11011001|001|soff:9|!post|W|Rn|Rs"},
|
||||||
{"inst": "stgp Xs, Xs2, [Xn|SP, #offS*16]{@}{!}" , "op": "0110100|!post|W|0|offS:7|Rs2|Rn|Rs"},
|
{"inst": "stgp Xs, Xs2, [Xn|SP, #soff*16]{@}{!}" , "op": "0110100|!post|W|0|soff:7|Rs2|Rn|Rs"},
|
||||||
{"inst": "stz2g Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|111|offS:9|!post|W|Rn|Rs"},
|
{"inst": "stz2g Xs|SP, [Xn|SP, #soff*16]{@}{!}" , "op": "11011001|111|soff:9|!post|W|Rn|Rs"},
|
||||||
{"inst": "stzg Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|011|offS:9|!post|W|Rn|Rs"},
|
{"inst": "stzg Xs|SP, [Xn|SP, #soff*16]{@}{!}" , "op": "11011001|011|soff:9|!post|W|Rn|Rs"},
|
||||||
{"inst": "subg Xd|SP, Xn|SP, #imm1, #imm2" , "op": "11010001|10|imm1:6|00|imm2:4|Rn|Rd"},
|
{"inst": "subg Xd|SP, Xn|SP, #imm1, #imm2" , "op": "11010001|10|imm1:6|00|imm2:4|Rn|Rd"},
|
||||||
{"inst": "subp Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd"},
|
{"inst": "subp Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd"},
|
||||||
{"inst": "subps Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd" , "io": "N=W Z=W C=W V=W"}
|
{"inst": "subps Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd" , "io": "N=W Z=W C=W V=W"}
|
||||||
@ -1023,8 +1023,8 @@
|
|||||||
{"inst": "brabz Xn" , "op": "11010110|000|11111|0000|11|Rn|11111" , "control": "call"},
|
{"inst": "brabz Xn" , "op": "11010110|000|11111|0000|11|Rn|11111" , "control": "call"},
|
||||||
{"inst": "eretaa" , "op": "11010110|100|11111|0000|10|11111|11111" , "control": "return"},
|
{"inst": "eretaa" , "op": "11010110|100|11111|0000|10|11111|11111" , "control": "return"},
|
||||||
{"inst": "eretab" , "op": "11010110|100|11111|0000|11|11111|11111" , "control": "return"},
|
{"inst": "eretab" , "op": "11010110|100|11111|0000|11|11111|11111" , "control": "return"},
|
||||||
{"inst": "ldraa Xd, [Xn|SP, #offS]{!}" , "op": "11111000|0|offS:1|1|offS:9|W1|Rn|Rd"},
|
{"inst": "ldraa Xd, [Xn|SP, #soff]{!}" , "op": "11111000|0|soff:1|1|soff:9|W1|Rn|Rd"},
|
||||||
{"inst": "ldrab Xd, [Xn|SP, #offS]{!}" , "op": "11111000|1|offS:1|1|offS:9|W1|Rn|Rd"},
|
{"inst": "ldrab Xd, [Xn|SP, #soff]{!}" , "op": "11111000|1|soff:1|1|soff:9|W1|Rn|Rd"},
|
||||||
{"inst": "pacda Xd, Xn|SP" , "op": "11011010|110|00001|0|00010|Rn|Rd"},
|
{"inst": "pacda Xd, Xn|SP" , "op": "11011010|110|00001|0|00010|Rn|Rd"},
|
||||||
{"inst": "pacdb Xd, Xn|SP" , "op": "11011010|110|00001|0|00011|Rn|Rd"},
|
{"inst": "pacdb Xd, Xn|SP" , "op": "11011010|110|00001|0|00011|Rn|Rd"},
|
||||||
{"inst": "pacdza Xd" , "op": "11011010|110|00001|0|01010|11111|Rd"},
|
{"inst": "pacdza Xd" , "op": "11011010|110|00001|0|01010|11111|Rd"},
|
||||||
@ -1768,40 +1768,40 @@
|
|||||||
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|111|Rm |1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
|
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|111|Rm |1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
|
||||||
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "00001101|111|11111|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
|
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "00001101|111|11111|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
|
||||||
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "01001101|111|11111|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
|
{"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "01001101|111|11111|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
|
||||||
{"inst": "ldnp Sd, Sd2, [Xn|SP, #offS*4]" , "op": "00101100|01|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldnp Sd, Sd2, [Xn|SP, #soff*4]" , "op": "00101100|01|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldnp Dd, Dd2, [Xn|SP, #offS*8]" , "op": "01101100|01|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldnp Dd, Dd2, [Xn|SP, #soff*8]" , "op": "01101100|01|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldnp Qd, Qd2, [Xn|SP, #offS*16]" , "op": "10101100|01|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldnp Qd, Qd2, [Xn|SP, #soff*16]" , "op": "10101100|01|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldp Sd, Sd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010110|!post|W|1|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldp Sd, Sd2, [Xn|SP, #soff*4]{@}{!}" , "op": "0010110|!post|W|1|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldp Dd, Dd2, [Xn|SP, #offS*8]{@}{!}" , "op": "0110110|!post|W|1|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldp Dd, Dd2, [Xn|SP, #soff*8]{@}{!}" , "op": "0110110|!post|W|1|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldp Qd, Qd2, [Xn|SP, #offS*16]{@}{!}" , "op": "1010110|!post|W|1|offS:7|Vd2|Vn|Vd"},
|
{"inst": "ldp Qd, Qd2, [Xn|SP, #soff*16]{@}{!}" , "op": "1010110|!post|W|1|soff:7|Vd2|Vn|Vd"},
|
||||||
{"inst": "ldr Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
{"inst": "ldr Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
||||||
{"inst": "ldr Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
{"inst": "ldr Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
||||||
{"inst": "ldr Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
{"inst": "ldr Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
||||||
{"inst": "ldr Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
{"inst": "ldr Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|011|Rm|option:3|n:1|10|Rn|Vd"},
|
||||||
{"inst": "ldr Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|111|Rm|option:3|n:1|10|Rn|Vd"},
|
{"inst": "ldr Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|111|Rm|option:3|n:1|10|Rn|Vd"},
|
||||||
{"inst": "ldr Sd, [PC, #offS*4]" , "op": "00011100|offS:19|Vd"},
|
{"inst": "ldr Sd, [PC, #soff*4]" , "op": "00011100|soff:19|Vd"},
|
||||||
{"inst": "ldr Dd, [PC, #offS*4]" , "op": "01011100|offS:19|Vd"},
|
{"inst": "ldr Dd, [PC, #soff*4]" , "op": "01011100|soff:19|Vd"},
|
||||||
{"inst": "ldr Qd, [PC, #offS*4]" , "op": "10011100|offS:19|Vd"},
|
{"inst": "ldr Qd, [PC, #soff*4]" , "op": "10011100|soff:19|Vd"},
|
||||||
{"inst": "ldr Bd, [Xn|SP, #offZ]" , "op": "00111101|01|offZ:12|Rn|Vd"},
|
{"inst": "ldr Bd, [Xn|SP, #zoff]" , "op": "00111101|01|zoff:12|Rn|Vd"},
|
||||||
{"inst": "ldr Hd, [Xn|SP, #offZ*2]" , "op": "01111101|01|offZ:12|Rn|Vd"},
|
{"inst": "ldr Hd, [Xn|SP, #zoff*2]" , "op": "01111101|01|zoff:12|Rn|Vd"},
|
||||||
{"inst": "ldr Sd, [Xn|SP, #offZ*4]" , "op": "10111101|01|offZ:12|Rn|Vd"},
|
{"inst": "ldr Sd, [Xn|SP, #zoff*4]" , "op": "10111101|01|zoff:12|Rn|Vd"},
|
||||||
{"inst": "ldr Dd, [Xn|SP, #offZ*8]" , "op": "11111101|01|offZ:12|Rn|Vd"},
|
{"inst": "ldr Dd, [Xn|SP, #zoff*8]" , "op": "11111101|01|zoff:12|Rn|Vd"},
|
||||||
{"inst": "ldr Qd, [Xn|SP, #offZ*16]" , "op": "00111101|11|offZ:12|Rn|Vd"},
|
{"inst": "ldr Qd, [Xn|SP, #zoff*16]" , "op": "00111101|11|zoff:12|Rn|Vd"},
|
||||||
{"inst": "ldr Bd, [Xn|SP, #offS]!" , "op": "00111100|010|offS:9|11|Rn|Vd"},
|
{"inst": "ldr Bd, [Xn|SP, #soff]!" , "op": "00111100|010|soff:9|11|Rn|Vd"},
|
||||||
{"inst": "ldr Hd, [Xn|SP, #offS*2]!" , "op": "01111100|010|offS:9|11|Rn|Vd"},
|
{"inst": "ldr Hd, [Xn|SP, #soff*2]!" , "op": "01111100|010|soff:9|11|Rn|Vd"},
|
||||||
{"inst": "ldr Sd, [Xn|SP, #offS*4]!" , "op": "10111100|010|offS:9|11|Rn|Vd"},
|
{"inst": "ldr Sd, [Xn|SP, #soff*4]!" , "op": "10111100|010|soff:9|11|Rn|Vd"},
|
||||||
{"inst": "ldr Dd, [Xn|SP, #offS*8]!" , "op": "11111100|010|offS:9|11|Rn|Vd"},
|
{"inst": "ldr Dd, [Xn|SP, #soff*8]!" , "op": "11111100|010|soff:9|11|Rn|Vd"},
|
||||||
{"inst": "ldr Qd, [Xn|SP, #offS*16]!" , "op": "00111100|110|offS:9|11|Rn|Vd"},
|
{"inst": "ldr Qd, [Xn|SP, #soff*16]!" , "op": "00111100|110|soff:9|11|Rn|Vd"},
|
||||||
{"inst": "ldr Bd, [Xn|SP, #offS]@" , "op": "00111100|010|offS:9|01|Rn|Vd"},
|
{"inst": "ldr Bd, [Xn|SP, #soff]@" , "op": "00111100|010|soff:9|01|Rn|Vd"},
|
||||||
{"inst": "ldr Hd, [Xn|SP, #offS*2]@" , "op": "01111100|010|offS:9|01|Rn|Vd"},
|
{"inst": "ldr Hd, [Xn|SP, #soff*2]@" , "op": "01111100|010|soff:9|01|Rn|Vd"},
|
||||||
{"inst": "ldr Sd, [Xn|SP, #offS*4]@" , "op": "10111100|010|offS:9|01|Rn|Vd"},
|
{"inst": "ldr Sd, [Xn|SP, #soff*4]@" , "op": "10111100|010|soff:9|01|Rn|Vd"},
|
||||||
{"inst": "ldr Dd, [Xn|SP, #offS*8]@" , "op": "11111100|010|offS:9|01|Rn|Vd"},
|
{"inst": "ldr Dd, [Xn|SP, #soff*8]@" , "op": "11111100|010|soff:9|01|Rn|Vd"},
|
||||||
{"inst": "ldr Qd, [Xn|SP, #offS*16]@" , "op": "00111100|110|offS:9|01|Rn|Vd"},
|
{"inst": "ldr Qd, [Xn|SP, #soff*16]@" , "op": "00111100|110|soff:9|01|Rn|Vd"},
|
||||||
{"inst": "ldur Bd, [Xn|SP, #offS]" , "op": "00111100|010|offS:9|00|Rn|Vd"},
|
{"inst": "ldur Bd, [Xn|SP, #soff]" , "op": "00111100|010|soff:9|00|Rn|Vd"},
|
||||||
{"inst": "ldur Hd, [Xn|SP, #offS]" , "op": "01111100|010|offS:9|00|Rn|Vd"},
|
{"inst": "ldur Hd, [Xn|SP, #soff]" , "op": "01111100|010|soff:9|00|Rn|Vd"},
|
||||||
{"inst": "ldur Sd, [Xn|SP, #offS]" , "op": "10111100|010|offS:9|00|Rn|Vd"},
|
{"inst": "ldur Sd, [Xn|SP, #soff]" , "op": "10111100|010|soff:9|00|Rn|Vd"},
|
||||||
{"inst": "ldur Dd, [Xn|SP, #offS]" , "op": "11111100|010|offS:9|00|Rn|Vd"},
|
{"inst": "ldur Dd, [Xn|SP, #soff]" , "op": "11111100|010|soff:9|00|Rn|Vd"},
|
||||||
{"inst": "ldur Qd, [Xn|SP, #offS]" , "op": "00111100|110|offS:9|00|Rn|Vd"},
|
{"inst": "ldur Qd, [Xn|SP, #soff]" , "op": "00111100|110|soff:9|00|Rn|Vd"},
|
||||||
{"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "8B 4H 2S"},
|
{"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "8B 4H 2S"},
|
||||||
{"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "16B 8H 4S"},
|
{"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "16B 8H 4S"},
|
||||||
{"inst": "mla Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"},
|
{"inst": "mla Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"},
|
||||||
@ -1934,18 +1934,18 @@
|
|||||||
{"inst": "sminv Hd, Vn.4H" , "op": "00001110|01|11000|11010|10|Vn|Vd"},
|
{"inst": "sminv Hd, Vn.4H" , "op": "00001110|01|11000|11010|10|Vn|Vd"},
|
||||||
{"inst": "sminv Hd, Vn.8H" , "op": "01001110|01|11000|11010|10|Vn|Vd"},
|
{"inst": "sminv Hd, Vn.8H" , "op": "01001110|01|11000|11010|10|Vn|Vd"},
|
||||||
{"inst": "sminv Sd, Vn.4S" , "op": "01001110|10|11000|11010|10|Vn|Vd"},
|
{"inst": "sminv Sd, Vn.4S" , "op": "01001110|10|11000|11010|10|Vn|Vd"},
|
||||||
{"inst": "smlal Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10000|0|Vn|Vx" , "t": "8H.8B 4S.4H 2D.2S"},
|
{"inst": "smlal Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10000|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
|
||||||
{"inst": "smlal2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10000|0|Vn|Vx" , "t": "8H.16B 4S.8H 2D.4S"},
|
{"inst": "smlal2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10000|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
|
||||||
{"inst": "smlal Vx.4S, Vn.4H, Vm.H[#dx]" , "op": "00001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vx"},
|
{"inst": "smlal Vd.4S, Vn.4H, Vm.H[#dx]" , "op": "00001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vd"},
|
||||||
{"inst": "smlal2 Vx.4S, Vn.8H, Vm.H[#dx]" , "op": "01001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vx"},
|
{"inst": "smlal2 Vd.4S, Vn.8H, Vm.H[#dx]" , "op": "01001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vd"},
|
||||||
{"inst": "smlal Vx.2D, Vn.2S, Vm.S[#dx]" , "op": "00001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vx"},
|
{"inst": "smlal Vd.2D, Vn.2S, Vm.S[#dx]" , "op": "00001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vd"},
|
||||||
{"inst": "smlal2 Vx.2D, Vn.4S, Vm.S[#dx]" , "op": "01001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vx"},
|
{"inst": "smlal2 Vd.2D, Vn.4S, Vm.S[#dx]" , "op": "01001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vd"},
|
||||||
{"inst": "smlsl Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10100|0|Vn|Vx" , "t": "8H.8B 4S.4H 2D.2S"},
|
{"inst": "smlsl Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10100|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
|
||||||
{"inst": "smlsl2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10100|0|Vn|Vx" , "t": "8H.16B 4S.8H 2D.4S"},
|
{"inst": "smlsl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10100|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
|
||||||
{"inst": "smlsl Vx.4S, Vn.4H, Vm.H[#dx]" , "op": "00001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vx"},
|
{"inst": "smlsl Vd.4S, Vn.4H, Vm.H[#dx]" , "op": "00001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vd"},
|
||||||
{"inst": "smlsl2 Vx.4S, Vn.8H, Vm.H[#dx]" , "op": "01001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vx"},
|
{"inst": "smlsl2 Vd.4S, Vn.8H, Vm.H[#dx]" , "op": "01001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vd"},
|
||||||
{"inst": "smlsl Vx.2D, Vn.2S, Vm.S[#dx]" , "op": "00001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vx"},
|
{"inst": "smlsl Vd.2D, Vn.2S, Vm.S[#dx]" , "op": "00001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vd"},
|
||||||
{"inst": "smlsl2 Vx.2D, Vn.4S, Vm.S[#dx]" , "op": "01001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vx"},
|
{"inst": "smlsl2 Vd.2D, Vn.4S, Vm.S[#dx]" , "op": "01001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vd"},
|
||||||
{"inst": "smov Wd, Vn.B[#idx]" , "op": "00001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
|
{"inst": "smov Wd, Vn.B[#idx]" , "op": "00001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
|
||||||
{"inst": "smov Wd, Vn.H[#idx]" , "op": "00001110|00|0|idx:3| 10|00101|1|Vn|Rd"},
|
{"inst": "smov Wd, Vn.H[#idx]" , "op": "00001110|00|0|idx:3| 10|00101|1|Vn|Rd"},
|
||||||
{"inst": "smov Xd, Vn.B[#idx]" , "op": "01001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
|
{"inst": "smov Xd, Vn.B[#idx]" , "op": "01001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
|
||||||
@ -2216,37 +2216,37 @@
|
|||||||
{"inst": "st4 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
|
{"inst": "st4 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
|
||||||
{"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "00001100|100|11111|0000|sz|Rn|Vs" , "t": "8B 4H 2S"},
|
{"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "00001100|100|11111|0000|sz|Rn|Vs" , "t": "8B 4H 2S"},
|
||||||
{"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==64]@" , "op": "01001100|100|11111|0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
|
{"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==64]@" , "op": "01001100|100|11111|0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
|
||||||
{"inst": "stnp Sd, Sd2, [Xn|SP, #offS*4]" , "op": "00101100|00|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stnp Sd, Sd2, [Xn|SP, #soff*4]" , "op": "00101100|00|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "stnp Dd, Dd2, [Xn|SP, #offS*8]" , "op": "01101100|00|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stnp Dd, Dd2, [Xn|SP, #soff*8]" , "op": "01101100|00|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "stnp Qd, Qd2, [Xn|SP, #offS*16]" , "op": "10101100|00|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stnp Qd, Qd2, [Xn|SP, #soff*16]" , "op": "10101100|00|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "stp Sd, Sd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010110|!post|W|0|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stp Sd, Sd2, [Xn|SP, #soff*4]{@}{!}" , "op": "0010110|!post|W|0|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "stp Dd, Dd2, [Xn|SP, #offS*8]{@}{!}" , "op": "0110110|!post|W|0|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stp Dd, Dd2, [Xn|SP, #soff*8]{@}{!}" , "op": "0110110|!post|W|0|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "stp Qd, Qd2, [Xn|SP, #offS*16]{@}{!}" , "op": "1010110|!post|W|0|offS:7|Vs2|Vn|Vs"},
|
{"inst": "stp Qd, Qd2, [Xn|SP, #soff*16]{@}{!}" , "op": "1010110|!post|W|0|soff:7|Vs2|Vn|Vs"},
|
||||||
{"inst": "str Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
{"inst": "str Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
||||||
{"inst": "str Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
{"inst": "str Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
||||||
{"inst": "str Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
{"inst": "str Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
||||||
{"inst": "str Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
{"inst": "str Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|001|Rm|option:3|n:1|10|Rn|Vs"},
|
||||||
{"inst": "str Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|101|Rm|option:3|n:1|10|Rn|Vs"},
|
{"inst": "str Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|101|Rm|option:3|n:1|10|Rn|Vs"},
|
||||||
{"inst": "str Bd, [Xn|SP, #offZ]" , "op": "00111101|00|offZ:12|Rn|Vs"},
|
{"inst": "str Bd, [Xn|SP, #zoff]" , "op": "00111101|00|zoff:12|Rn|Vs"},
|
||||||
{"inst": "str Hd, [Xn|SP, #offZ*2]" , "op": "01111101|00|offZ:12|Rn|Vs"},
|
{"inst": "str Hd, [Xn|SP, #zoff*2]" , "op": "01111101|00|zoff:12|Rn|Vs"},
|
||||||
{"inst": "str Sd, [Xn|SP, #offZ*4]" , "op": "10111101|00|offZ:12|Rn|Vs"},
|
{"inst": "str Sd, [Xn|SP, #zoff*4]" , "op": "10111101|00|zoff:12|Rn|Vs"},
|
||||||
{"inst": "str Dd, [Xn|SP, #offZ*8]" , "op": "11111101|00|offZ:12|Rn|Vs"},
|
{"inst": "str Dd, [Xn|SP, #zoff*8]" , "op": "11111101|00|zoff:12|Rn|Vs"},
|
||||||
{"inst": "str Qd, [Xn|SP, #offZ*16]" , "op": "00111101|10|offZ:12|Rn|Vs"},
|
{"inst": "str Qd, [Xn|SP, #zoff*16]" , "op": "00111101|10|zoff:12|Rn|Vs"},
|
||||||
{"inst": "str Bd, [Xn|SP, #offS]!" , "op": "00111100|000|offS:9|11|Rn|Vs"},
|
{"inst": "str Bd, [Xn|SP, #soff]!" , "op": "00111100|000|soff:9|11|Rn|Vs"},
|
||||||
{"inst": "str Hd, [Xn|SP, #offS*2]!" , "op": "01111100|000|offS:9|11|Rn|Vs"},
|
{"inst": "str Hd, [Xn|SP, #soff*2]!" , "op": "01111100|000|soff:9|11|Rn|Vs"},
|
||||||
{"inst": "str Sd, [Xn|SP, #offS*4]!" , "op": "10111100|000|offS:9|11|Rn|Vs"},
|
{"inst": "str Sd, [Xn|SP, #soff*4]!" , "op": "10111100|000|soff:9|11|Rn|Vs"},
|
||||||
{"inst": "str Dd, [Xn|SP, #offS*8]!" , "op": "11111100|000|offS:9|11|Rn|Vs"},
|
{"inst": "str Dd, [Xn|SP, #soff*8]!" , "op": "11111100|000|soff:9|11|Rn|Vs"},
|
||||||
{"inst": "str Qd, [Xn|SP, #offS*16]!" , "op": "00111100|100|offS:9|11|Rn|Vs"},
|
{"inst": "str Qd, [Xn|SP, #soff*16]!" , "op": "00111100|100|soff:9|11|Rn|Vs"},
|
||||||
{"inst": "str Bd, [Xn|SP, #offS]@" , "op": "00111100|000|offS:9|01|Rn|Vs"},
|
{"inst": "str Bd, [Xn|SP, #soff]@" , "op": "00111100|000|soff:9|01|Rn|Vs"},
|
||||||
{"inst": "str Hd, [Xn|SP, #offS*2]@" , "op": "01111100|000|offS:9|01|Rn|Vs"},
|
{"inst": "str Hd, [Xn|SP, #soff*2]@" , "op": "01111100|000|soff:9|01|Rn|Vs"},
|
||||||
{"inst": "str Sd, [Xn|SP, #offS*4]@" , "op": "10111100|000|offS:9|01|Rn|Vs"},
|
{"inst": "str Sd, [Xn|SP, #soff*4]@" , "op": "10111100|000|soff:9|01|Rn|Vs"},
|
||||||
{"inst": "str Dd, [Xn|SP, #offS*8]@" , "op": "11111100|000|offS:9|01|Rn|Vs"},
|
{"inst": "str Dd, [Xn|SP, #soff*8]@" , "op": "11111100|000|soff:9|01|Rn|Vs"},
|
||||||
{"inst": "str Qd, [Xn|SP, #offS*16]@" , "op": "00111100|100|offS:9|01|Rn|Vs"},
|
{"inst": "str Qd, [Xn|SP, #soff*16]@" , "op": "00111100|100|soff:9|01|Rn|Vs"},
|
||||||
{"inst": "stur Bd, [Xn|SP, #offS]" , "op": "00111100|000|offS:9|00|Rn|Vs"},
|
{"inst": "stur Bd, [Xn|SP, #soff]" , "op": "00111100|000|soff:9|00|Rn|Vs"},
|
||||||
{"inst": "stur Hd, [Xn|SP, #offS]" , "op": "01111100|000|offS:9|00|Rn|Vs"},
|
{"inst": "stur Hd, [Xn|SP, #soff]" , "op": "01111100|000|soff:9|00|Rn|Vs"},
|
||||||
{"inst": "stur Sd, [Xn|SP, #offS]" , "op": "10111100|000|offS:9|00|Rn|Vs"},
|
{"inst": "stur Sd, [Xn|SP, #soff]" , "op": "10111100|000|soff:9|00|Rn|Vs"},
|
||||||
{"inst": "stur Dd, [Xn|SP, #offS]" , "op": "11111100|000|offS:9|00|Rn|Vs"},
|
{"inst": "stur Dd, [Xn|SP, #soff]" , "op": "11111100|000|soff:9|00|Rn|Vs"},
|
||||||
{"inst": "stur Qd, [Xn|SP, #offS]" , "op": "00111100|100|offS:9|00|Rn|Vs"},
|
{"inst": "stur Qd, [Xn|SP, #soff]" , "op": "00111100|100|soff:9|00|Rn|Vs"},
|
||||||
{"inst": "sub Dd, Dn, Dm" , "op": "01111110|11|1|Vm|10000|1|Vn|Vd"},
|
{"inst": "sub Dd, Dn, Dm" , "op": "01111110|11|1|Vm|10000|1|Vn|Vd"},
|
||||||
{"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "8B 4H 2S"},
|
{"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "8B 4H 2S"},
|
||||||
{"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
|
{"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
|
||||||
@ -2810,17 +2810,17 @@
|
|||||||
|
|
||||||
{"category": "ASIMD", "ext": "ASIMD LRCPC3", "data": [
|
{"category": "ASIMD", "ext": "ASIMD LRCPC3", "data": [
|
||||||
{"inst": "ldap1 Vd.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00001|10000|1|Rn|Vd"},
|
{"inst": "ldap1 Vd.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00001|10000|1|Rn|Vd"},
|
||||||
{"inst": "ldapur Bd, [Xn|SP, #offS]" , "op": "00011101|010|offS:9|10|Rn|Vd"},
|
{"inst": "ldapur Bd, [Xn|SP, #soff]" , "op": "00011101|010|soff:9|10|Rn|Vd"},
|
||||||
{"inst": "ldapur Hd, [Xn|SP, #offS]" , "op": "01011101|010|offS:9|10|Rn|Vd"},
|
{"inst": "ldapur Hd, [Xn|SP, #soff]" , "op": "01011101|010|soff:9|10|Rn|Vd"},
|
||||||
{"inst": "ldapur Sd, [Xn|SP, #offS]" , "op": "10011101|010|offS:9|10|Rn|Vd"},
|
{"inst": "ldapur Sd, [Xn|SP, #soff]" , "op": "10011101|010|soff:9|10|Rn|Vd"},
|
||||||
{"inst": "ldapur Dd, [Xn|SP, #offS]" , "op": "11011101|010|offS:9|10|Rn|Vd"},
|
{"inst": "ldapur Dd, [Xn|SP, #soff]" , "op": "11011101|010|soff:9|10|Rn|Vd"},
|
||||||
{"inst": "ldapur Qd, [Xn|SP, #offS]" , "op": "00011101|110|offS:9|10|Rn|Vd"},
|
{"inst": "ldapur Qd, [Xn|SP, #soff]" , "op": "00011101|110|soff:9|10|Rn|Vd"},
|
||||||
{"inst": "stl1 Vs.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00001|10000|1|Rn|Vs"},
|
{"inst": "stl1 Vs.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00001|10000|1|Rn|Vs"},
|
||||||
{"inst": "stlur Bs, [Xn|SP, #offS]" , "op": "00011101|000|offS:9|10|Rn|Vs"},
|
{"inst": "stlur Bs, [Xn|SP, #soff]" , "op": "00011101|000|soff:9|10|Rn|Vs"},
|
||||||
{"inst": "stlur Hs, [Xn|SP, #offS]" , "op": "01011101|000|offS:9|10|Rn|Vs"},
|
{"inst": "stlur Hs, [Xn|SP, #soff]" , "op": "01011101|000|soff:9|10|Rn|Vs"},
|
||||||
{"inst": "stlur Ss, [Xn|SP, #offS]" , "op": "10011101|000|offS:9|10|Rn|Vs"},
|
{"inst": "stlur Ss, [Xn|SP, #soff]" , "op": "10011101|000|soff:9|10|Rn|Vs"},
|
||||||
{"inst": "stlur Ds, [Xn|SP, #offS]" , "op": "11011101|000|offS:9|10|Rn|Vs"},
|
{"inst": "stlur Ds, [Xn|SP, #soff]" , "op": "11011101|000|soff:9|10|Rn|Vs"},
|
||||||
{"inst": "stlur Qs, [Xn|SP, #offS]" , "op": "00011101|100|offS:9|10|Rn|Vs"}
|
{"inst": "stlur Qs, [Xn|SP, #soff]" , "op": "00011101|100|soff:9|10|Rn|Vs"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "ASIMD", "ext": "RDM", "data": [
|
{"category": "ASIMD", "ext": "RDM", "data": [
|
||||||
|
File diff suppressed because it is too large
Load Diff
886
deps/asmjit/db/isa_x86.json
vendored
886
deps/asmjit/db/isa_x86.json
vendored
@ -341,13 +341,13 @@
|
|||||||
{"inst": "or x:ax, iw/uw" , "op": "66 0D iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
{"inst": "or x:ax, iw/uw" , "op": "66 0D iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
||||||
{"inst": "or X:eax, id/ud" , "op": "0D id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
{"inst": "or X:eax, id/ud" , "op": "0D id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
||||||
{"inst": "or X:rax, id" , "op": "REX.W 0D id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
{"inst": "or X:rax, id" , "op": "REX.W 0D id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0", "altForm": true},
|
||||||
{"inst": "[lock|xacqrel] or x:r8/m8, ib/ub" , "op": "M: 80 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or x:r8/m8, ib/ub" , "op": "M: 80 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or x:r16/m16, iw/uw" , "op": "M: 66 81 /1 iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or x:r16/m16, iw/uw" , "op": "M: 66 81 /1 iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or X:r32/m32, id/ud" , "op": "M: 81 /1 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or X:r32/m32, id/ud" , "op": "M: 81 /1 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or X:r64/m64, id" , "op": "M: REX.W 81 /1 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or X:r64/m64, id" , "op": "M: REX.W 81 /1 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or x:r16/m16, ib" , "op": "M: 66 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or x:r16/m16, ib" , "op": "M: 66 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or X:r32/m32, ib" , "op": "M: 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or X:r32/m32, ib" , "op": "M: 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or X:r64/m64, ib" , "op": "M: REX.W 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or X:r64/m64, ib" , "op": "M: REX.W 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or x:~r8/m8, ~r8" , "op": "MR: 08 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or x:~r8/m8, ~r8" , "op": "MR: 08 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or x:~r16/m16, ~r16" , "op": "MR: 66 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or x:~r16/m16, ~r16" , "op": "MR: 66 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
{"inst": "[lock|xacqrel] or X:~r32/m32, ~r32" , "op": "MR: 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
{"inst": "[lock|xacqrel] or X:~r32/m32, ~r32" , "op": "MR: 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
|
||||||
@ -624,405 +624,200 @@
|
|||||||
{"inst": "[rep] outs R:dx, R:m32(ds:zsi)" , "op": "6F"}
|
{"inst": "[rep] outs R:dx, R:m32(ds:zsi)" , "op": "6F"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "I486", "data": [
|
{"category": "GP GP_EXT", "data": [
|
||||||
{"inst": "[lock|xacqrel] cmpxchg x:r8/m8, r8, <al>" , "op": "MR: 0F B0 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "aadd X:m32, r32" , "op": "MR: 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
{"inst": "[lock|xacqrel] cmpxchg x:r16/m16, r16, <ax>" , "op": "MR: 66 0F B1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "aadd X:m64, r64" , "op": "MR: REX.W 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
{"inst": "[lock|xacqrel] cmpxchg X:r32/m32, r32, <eax>" , "op": "MR: 0F B1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "aand X:m32, r32" , "op": "MR: 66 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
{"inst": "[lock|xacqrel] cmpxchg X:r64/m64, r64, <rax>" , "op": "MR: REX.W 0F B1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "aand X:m64, r64" , "op": "MR: REX.W 66 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
{"inst": "cpuid X:<eax>, W:<ebx>, X:<ecx>, W:<edx>" , "op": "0F A2" , "volatile": true},
|
{"inst": "adcx X:~r32, ~r32/m32" , "op": "RM: 66 0F 38 F6 /r" , "ext": "ADX" , "io": "CF=X"},
|
||||||
{"inst": "[lock|xacqrel] xadd x:r8/m8, x:r8" , "op": "MR: 0F C0 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "adcx X:~r64, ~r64/m64" , "op": "RM: REX.W 66 0F 38 F6 /r" , "ext": "ADX" , "io": "CF=X"},
|
||||||
{"inst": "[lock|xacqrel] xadd x:r16/m16, x:r16" , "op": "MR: 66 0F C1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "adox X:~r32, ~r32/m32" , "op": "RM: F3 0F 38 F6 /r" , "ext": "ADX" , "io": "OF=X"},
|
||||||
{"inst": "[lock|xacqrel] xadd X:r32/m32, X:r32" , "op": "MR: 0F C1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "adox X:~r64, ~r64/m64" , "op": "RM: REX.W F3 0F 38 F6 /r" , "ext": "ADX" , "io": "OF=X"},
|
||||||
{"inst": "[lock|xacqrel] xadd X:r64/m64, X:r64" , "op": "MR: REX.W 0F C1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"}
|
{"inst": "andn W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.0F38.W0 F2 /r" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
|
||||||
|
{"inst": "andn W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.0F38.W1 F2 /r" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
|
||||||
|
{"inst": "aor X:m32, r32" , "op": "MR: F2 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
|
{"inst": "aor X:m64, r64" , "op": "MR: REX.W F2 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
|
{"inst": "axor X:m32, r32" , "op": "MR: F3 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
|
{"inst": "axor X:m64, r64" , "op": "MR: REX.W F3 0F 38 FC /r" , "ext": "RAO_INT"},
|
||||||
|
{"inst": "bextr W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.0F38.W0 F7 /r" , "ext": "BMI" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
|
||||||
|
{"inst": "bextr W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.0F38.W1 F7 /r" , "ext": "BMI" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
|
||||||
|
{"inst": "blsi W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /3" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "blsi W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /3" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "blsmsk W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /2" , "ext": "BMI" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
|
||||||
|
{"inst": "blsmsk W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /2" , "ext": "BMI" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
|
||||||
|
{"inst": "blsr W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /1" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "blsr W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /1" , "ext": "BMI" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "bzhi W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.0F38.W0 F5 /r" , "ext": "BMI2" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "bzhi W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.0F38.W1 F5 /r" , "ext": "BMI2" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "cldemote R:mem" , "op": "0F 1C /0" , "ext": "CLDEMOTE"},
|
||||||
|
{"inst": "clflush R:mem" , "op": "0F AE /7" , "ext": "CLFLUSH"},
|
||||||
|
{"inst": "clflushopt R:mem" , "op": "66 0F AE /7" , "ext": "CLFLUSHOPT"},
|
||||||
|
{"inst": "clwb R:mem" , "op": "66 0F AE /6" , "ext": "CLWB"},
|
||||||
|
{"inst": "clzero R:<m512(ds:zax)>" , "op": "0F 01 FC" , "ext": "CLZERO"},
|
||||||
|
{"inst": "cmovo x:r16, r16/m16" , "op": "RM: 66 0F 40 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovo X:r32, r32/m32" , "op": "RM: 0F 40 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovo X:r64, r64/m64" , "op": "RM: REX.W 0F 40 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovno x:r16, r16/m16" , "op": "RM: 66 0F 41 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovno X:r32, r32/m32" , "op": "RM: 0F 41 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovno X:r64, r64/m64" , "op": "RM: REX.W 0F 41 /r" , "ext": "CMOV" , "io": "OF=R"},
|
||||||
|
{"inst": "cmovb|cmovnae|cmovc x:r16, r16/m16" , "op": "RM: 66 0F 42 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmovb|cmovnae|cmovc X:r32, r32/m32" , "op": "RM: 0F 42 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmovb|cmovnae|cmovc X:r64, r64/m64" , "op": "RM: REX.W 0F 42 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmovae|cmovnb|cmovnc x:r16, r16/m16" , "op": "RM: 66 0F 43 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmovae|cmovnb|cmovnc X:r32, r32/m32" , "op": "RM: 0F 43 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmovae|cmovnb|cmovnc X:r64, r64/m64" , "op": "RM: REX.W 0F 43 /r" , "ext": "CMOV" , "io": "CF=R"},
|
||||||
|
{"inst": "cmove|cmovz x:r16, r16/m16" , "op": "RM: 66 0F 44 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmove|cmovz X:r32, r32/m32" , "op": "RM: 0F 44 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmove|cmovz X:r64, r64/m64" , "op": "RM: REX.W 0F 44 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmovne|cmovnz x:r16, r16/m16" , "op": "RM: 66 0F 45 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmovne|cmovnz X:r32, r32/m32" , "op": "RM: 0F 45 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmovne|cmovnz X:r64, r64/m64" , "op": "RM: REX.W 0F 45 /r" , "ext": "CMOV" , "io": "ZF=R"},
|
||||||
|
{"inst": "cmovbe|cmovna x:r16, r16/m16" , "op": "RM: 66 0F 46 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmovbe|cmovna X:r32, r32/m32" , "op": "RM: 0F 46 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmovbe|cmovna X:r64, r64/m64" , "op": "RM: REX.W 0F 46 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmova|cmovnbe x:r16, r16/m16" , "op": "RM: 66 0F 47 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmova|cmovnbe X:r32, r32/m32" , "op": "RM: 0F 47 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmova|cmovnbe X:r64, r64/m64" , "op": "RM: REX.W 0F 47 /r" , "ext": "CMOV" , "io": "CF=R ZF=R"},
|
||||||
|
{"inst": "cmovs x:r16, r16/m16" , "op": "RM: 66 0F 48 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovs X:r32, r32/m32" , "op": "RM: 0F 48 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovs X:r64, r64/m64" , "op": "RM: REX.W 0F 48 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovns x:r16, r16/m16" , "op": "RM: 66 0F 49 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovns X:r32, r32/m32" , "op": "RM: 0F 49 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovns X:r64, r64/m64" , "op": "RM: REX.W 0F 49 /r" , "ext": "CMOV" , "io": "SF=R"},
|
||||||
|
{"inst": "cmovp|cmovpe x:r16, r16/m16" , "op": "RM: 66 0F 4A /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovp|cmovpe X:r32, r32/m32" , "op": "RM: 0F 4A /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovp|cmovpe X:r64, r64/m64" , "op": "RM: REX.W 0F 4A /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovnp|cmovpo x:r16, r16/m16" , "op": "RM: 66 0F 4B /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovnp|cmovpo X:r32, r32/m32" , "op": "RM: 0F 4B /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovnp|cmovpo X:r64, r64/m64" , "op": "RM: REX.W 0F 4B /r" , "ext": "CMOV" , "io": "PF=R"},
|
||||||
|
{"inst": "cmovl|cmovnge x:r16, r16/m16" , "op": "RM: 66 0F 4C /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovl|cmovnge X:r32, r32/m32" , "op": "RM: 0F 4C /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovl|cmovnge X:r64, r64/m64" , "op": "RM: REX.W 0F 4C /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovge|cmovnl x:r16, r16/m16" , "op": "RM: 66 0F 4D /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovge|cmovnl X:r32, r32/m32" , "op": "RM: 0F 4D /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovge|cmovnl X:r64, r64/m64" , "op": "RM: REX.W 0F 4D /r" , "ext": "CMOV" , "io": "SF=R OF=R"},
|
||||||
|
{"inst": "cmovle|cmovng x:r16, r16/m16" , "op": "RM: 66 0F 4E /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmovle|cmovng X:r32, r32/m32" , "op": "RM: 0F 4E /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmovle|cmovng X:r64, r64/m64" , "op": "RM: REX.W 0F 4E /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmovg|cmovnle x:r16, r16/m16" , "op": "RM: 66 0F 4F /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmovg|cmovnle X:r32, r32/m32" , "op": "RM: 0F 4F /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmovg|cmovnle X:r64, r64/m64" , "op": "RM: REX.W 0F 4F /r" , "ext": "CMOV" , "io": "ZF=R SF=R OF=R"},
|
||||||
|
{"inst": "cmpbexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E6 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpbexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E6 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpbxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E2 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpbxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E2 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmplexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EE /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmplexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EE /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmplxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EC /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmplxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EC /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnbexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E7 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnbexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E7 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnbxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E3 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnbxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E3 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnlexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EF /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnlexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EF /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnlxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 ED /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnlxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 ED /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnoxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E1 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnoxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E1 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnpxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EB /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnpxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EB /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnsxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E9 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnsxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E9 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnzxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E5 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpnzxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E5 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpoxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E0 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpoxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E0 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmppxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EA /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmppxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EA /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpsxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E8 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpsxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E8 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg x:r8/m8, r8, <al>" , "op": "MR: 0F B0 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg x:r16/m16, r16, <ax>" , "op": "MR: 66 0F B1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg X:r32/m32, r32, <eax>" , "op": "MR: 0F B1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg X:r64/m64, r64, <rax>" , "op": "MR: REX.W 0F B1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg8b X:m64,X:<edx>,X:<eax>,<ecx>,<ebx>" , "op": "0F C7 /1" , "ext": "CMPXCHG8B" , "io": "ZF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] cmpxchg16b X:m128,X:<rdx>,X:<rax>,<rcx>,<rbx>","op": "REX.W 0F C7 /1" , "ext": "CMPXCHG16B" , "io": "ZF=W"},
|
||||||
|
{"inst": "cmpzxadd X:m32, X:r32, R:r32" , "op": "VEX.128.66.0F38.W0 E4 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cmpzxadd X:m64, X:r64, R:r64" , "op": "VEX.128.66.0F38.W1 E4 /r" , "ext": "CMPCCXADD" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
||||||
|
{"inst": "cpuid X:<eax>, W:<ebx>, X:<ecx>, W:<edx>" , "op": "0F A2" , "ext": "I486" , "volatile": true},
|
||||||
|
{"inst": "lahf w:<ah>" , "op": "9F" , "ext": "LAHFSAHF" , "io": "SF=R ZF=R AF=R PF=R CF=R"},
|
||||||
|
{"inst": "lfence" , "op": "0F AE E8" , "ext": "SSE2"},
|
||||||
|
{"inst": "lzcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F BD /r" , "ext": "LZCNT" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "lzcnt W:r32, r32/m32" , "op": "RM: F3 0F BD /r" , "ext": "LZCNT" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "lzcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F BD /r" , "ext": "LZCNT" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "mcommit" , "op": "F3 0F 01 FA" , "ext": "MCOMMIT" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "mfence" , "op": "0F AE F0" , "ext": "SSE2"},
|
||||||
|
{"inst": "movbe w:r16, m16" , "op": "RM: 66 0F 38 F0 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movbe W:r32, m32" , "op": "RM: 0F 38 F0 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movbe W:r64, m64" , "op": "RM: REX.W 0F 38 F0 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movbe W:m16, r16" , "op": "MR: 66 0F 38 F1 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movbe W:m32, r32" , "op": "MR: 0F 38 F1 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movbe W:m64, r64" , "op": "MR: REX.W 0F 38 F1 /r" , "ext": "MOVBE"},
|
||||||
|
{"inst": "movdiri W:m32, r32" , "op": "MR: 0F 38 F9 /r" , "ext": "MOVDIRI"},
|
||||||
|
{"inst": "movdiri W:m64, r64" , "op": "MR: REX.W 0F 38 F9 /r" , "ext": "MOVDIRI"},
|
||||||
|
{"inst": "movdir64b W:m512(es:r32), m512" , "op": "RM: 66 0F 38 F8 /r" , "ext": "MOVDIR64B"},
|
||||||
|
{"inst": "movdir64b W:m512(es:r64), m512" , "op": "RM: 66 0F 38 F8 /r" , "ext": "MOVDIR64B"},
|
||||||
|
{"inst": "movnti W:m32, r32" , "op": "MR: 0F C3 /r" , "ext": "SSE2"},
|
||||||
|
{"inst": "movnti W:m64, r64" , "op": "MR: REX.W 0F C3 /r" , "ext": "SSE2"},
|
||||||
|
{"inst": "mulx W:r32, W:r32, ~r32/m32, ~<edx>" , "op": "RVM: VEX.LZ.F2.0F38.W0 F6 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "mulx W:r64, W:r64, ~r64/m64, ~<rdx>" , "op": "RVM: VEX.LZ.F2.0F38.W1 F6 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "pdep W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.F2.0F38.W0 F5 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "pdep W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.F2.0F38.W1 F5 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "pext W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.F3.0F38.W0 F5 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "pext W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.F3.0F38.W1 F5 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "popcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F B8 /r" , "ext": "POPCNT" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
|
||||||
|
{"inst": "popcnt W:r32, r32/m32" , "op": "RM: F3 0F B8 /r" , "ext": "POPCNT" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
|
||||||
|
{"inst": "popcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F B8 /r" , "ext": "POPCNT" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
|
||||||
|
{"inst": "prefetch R:mem" , "op": "0F 0D /0" , "ext": "3DNOW"},
|
||||||
|
{"inst": "prefetchit0 R:mem" , "op": "0F 18 /7" , "ext": "PREFETCHI" , "arch": "X64"},
|
||||||
|
{"inst": "prefetchit1 R:mem" , "op": "0F 18 /6" , "ext": "PREFETCHI" , "arch": "X64"},
|
||||||
|
{"inst": "prefetchnta R:mem" , "op": "0F 18 /0" , "ext": "SSE"},
|
||||||
|
{"inst": "prefetcht0 R:mem" , "op": "0F 18 /1" , "ext": "SSE"},
|
||||||
|
{"inst": "prefetcht1 R:mem" , "op": "0F 18 /2" , "ext": "SSE"},
|
||||||
|
{"inst": "prefetcht2 R:mem" , "op": "0F 18 /3" , "ext": "SSE"},
|
||||||
|
{"inst": "prefetchw R:mem" , "op": "0F 0D /1" , "ext": "PREFETCHW" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
|
||||||
|
{"inst": "prefetchwt1 R:mem" , "op": "0F 0D /2" , "ext": "PREFETCHWT1", "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
|
||||||
|
{"inst": "ptwrite R:r32/m32" , "op": "F3 0F AE /4" , "ext": "PTWRITE"},
|
||||||
|
{"inst": "ptwrite R:r64/m64" , "op": "REX.W F3 0F AE /4" , "ext": "PTWRITE"},
|
||||||
|
{"inst": "rdpid W:r32" , "op": "R: F3 0F C7 /7" , "ext": "RDPID" , "arch": "X86"},
|
||||||
|
{"inst": "rdpid W:r64" , "op": "R: F3 0F C7 /7" , "ext": "RDPID" , "arch": "X64"},
|
||||||
|
{"inst": "rdpkru W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 EE" , "ext": "OSPKE"},
|
||||||
|
{"inst": "rdpru W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 FD" , "ext": "RDPRU"},
|
||||||
|
{"inst": "rdrand w:r16" , "op": "66 0F C7 /6" , "ext": "RDRAND" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdrand W:r32" , "op": "0F C7 /6" , "ext": "RDRAND" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdrand W:r64" , "op": "REX.W 0F C7 /6" , "ext": "RDRAND" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdseed w:r16" , "op": "66 0F C7 /7" , "ext": "RDSEED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdseed W:r32" , "op": "0F C7 /7" , "ext": "RDSEED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdseed W:r64" , "op": "REX.W 0F C7 /7" , "ext": "RDSEED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "rdtsc W:<edx>, W:<eax>" , "op": "0F 31" , "ext": "RDTSC"},
|
||||||
|
{"inst": "rdtscp W:<edx>, W:<eax>, W:<ecx>" , "op": "0F 01 F9" , "ext": "RDTSCP"},
|
||||||
|
{"inst": "rorx W:r32, r32/m32, ib/ub" , "op": "RM: VEX.LZ.F2.0F3A.W0 F0 /r ib" , "ext": "BMI2"},
|
||||||
|
{"inst": "rorx W:r64, r64/m64, ib/ub" , "op": "RM: VEX.LZ.F2.0F3A.W1 F0 /r ib" , "ext": "BMI2"},
|
||||||
|
{"inst": "sahf R:<ah>" , "op": "9E" , "ext": "LAHFSAHF" , "io": "SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "sarx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.F3.0F38.W0 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "sarx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.F3.0F38.W1 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "serialize" , "op": "0F 01 E8" , "ext": "SERIALIZE"},
|
||||||
|
{"inst": "sfence" , "op": "0F AE F8" , "ext": "SSE"},
|
||||||
|
{"inst": "shlx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.66.0F38.W0 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "shlx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.66.0F38.W1 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "shrx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.F2.0F38.W0 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "shrx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.F2.0F38.W1 F7 /r" , "ext": "BMI2"},
|
||||||
|
{"inst": "tzcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F BC /r" , "ext": "BMI" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "tzcnt W:r32, r32/m32" , "op": "RM: F3 0F BC /r" , "ext": "BMI" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "tzcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F BC /r" , "ext": "BMI" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] xadd x:r8/m8, x:r8" , "op": "MR: 0F C0 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] xadd x:r16/m16, x:r16" , "op": "MR: 66 0F C1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] xadd X:r32/m32, X:r32" , "op": "MR: 0F C1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
|
{"inst": "[lock|xacqrel] xadd X:r64/m64, X:r64" , "op": "MR: REX.W 0F C1 /r" , "ext": "I486" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "3DNOW", "volatile": true, "data": [
|
{"category": "GP GP_EXT CRYPTO_HASH", "data": [
|
||||||
{"inst": "prefetch R:mem" , "op": "0F 0D /0"}
|
{"inst": "crc32 X:r32, r8/m8" , "op": "RM: F2 0F 38 F0 /r" , "ext": "SSE4_2"},
|
||||||
]},
|
{"inst": "crc32 X:r32, r16/m16" , "op": "RM: 66 F2 0F 38 F1 /r" , "ext": "SSE4_2"},
|
||||||
|
{"inst": "crc32 X:r32, r32/m32" , "op": "RM: F2 0F 38 F1 /r" , "ext": "SSE4_2"},
|
||||||
{"category": "GP GP_EXT", "ext": "ADX", "data": [
|
{"inst": "crc32 X:r64, r8/m8" , "op": "RM: REX.W F2 0F 38 F0 /r" , "ext": "SSE4_2"},
|
||||||
{"inst": "adcx X:~r32, ~r32/m32" , "op": "RM: 66 0F 38 F6 /r" , "io": "CF=X"},
|
{"inst": "crc32 X:r64, r64/m64" , "op": "RM: REX.W F2 0F 38 F1 /r" , "ext": "SSE4_2"}
|
||||||
{"inst": "adcx X:~r64, ~r64/m64" , "op": "RM: REX.W 66 0F 38 F6 /r" , "io": "CF=X"},
|
|
||||||
{"inst": "adox X:~r32, ~r32/m32" , "op": "RM: F3 0F 38 F6 /r" , "io": "OF=X"},
|
|
||||||
{"inst": "adox X:~r64, ~r64/m64" , "op": "RM: REX.W F3 0F 38 F6 /r" , "io": "OF=X"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "BMI", "data": [
|
|
||||||
{"inst": "andn W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.0F38.W0 F2 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
|
|
||||||
{"inst": "andn W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.0F38.W1 F2 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
|
|
||||||
{"inst": "bextr W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.0F38.W0 F7 /r" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
|
|
||||||
{"inst": "bextr W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.0F38.W1 F7 /r" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
|
|
||||||
{"inst": "blsi W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /3" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "blsi W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /3" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "blsmsk W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /2" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
|
|
||||||
{"inst": "blsmsk W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /2" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
|
|
||||||
{"inst": "blsr W:r32, r32/m32" , "op": "VM: VEX.LZ.0F38.W0 F3 /1" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "blsr W:r64, r64/m64" , "op": "VM: VEX.LZ.0F38.W1 F3 /1" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "tzcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F BC /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "tzcnt W:r32, r32/m32" , "op": "RM: F3 0F BC /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "tzcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F BC /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "BMI2", "data": [
|
|
||||||
{"inst": "bzhi W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.0F38.W0 F5 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "bzhi W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.0F38.W1 F5 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "mulx W:r32, W:r32, ~r32/m32, ~<edx>" , "op": "RVM: VEX.LZ.F2.0F38.W0 F6 /r"},
|
|
||||||
{"inst": "mulx W:r64, W:r64, ~r64/m64, ~<rdx>" , "op": "RVM: VEX.LZ.F2.0F38.W1 F6 /r"},
|
|
||||||
{"inst": "pdep W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.F2.0F38.W0 F5 /r"},
|
|
||||||
{"inst": "pdep W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.F2.0F38.W1 F5 /r"},
|
|
||||||
{"inst": "pext W:r32, r32, r32/m32" , "op": "RVM: VEX.LZ.F3.0F38.W0 F5 /r"},
|
|
||||||
{"inst": "pext W:r64, r64, r64/m64" , "op": "RVM: VEX.LZ.F3.0F38.W1 F5 /r"},
|
|
||||||
{"inst": "rorx W:r32, r32/m32, ib/ub" , "op": "RM: VEX.LZ.F2.0F3A.W0 F0 /r ib"},
|
|
||||||
{"inst": "rorx W:r64, r64/m64, ib/ub" , "op": "RM: VEX.LZ.F2.0F3A.W1 F0 /r ib"},
|
|
||||||
{"inst": "sarx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.F3.0F38.W0 F7 /r"},
|
|
||||||
{"inst": "sarx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.F3.0F38.W1 F7 /r"},
|
|
||||||
{"inst": "shlx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.66.0F38.W0 F7 /r"},
|
|
||||||
{"inst": "shlx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.66.0F38.W1 F7 /r"},
|
|
||||||
{"inst": "shrx W:r32, r32/m32, r32" , "op": "RMV: VEX.LZ.F2.0F38.W0 F7 /r"},
|
|
||||||
{"inst": "shrx W:r64, r64/m64, r64" , "op": "RMV: VEX.LZ.F2.0F38.W1 F7 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CET_SS", "volatile": true, "data": [
|
|
||||||
{"inst": "incsspd r32" , "op": "F3 0F AE /5"},
|
|
||||||
{"inst": "incsspq r64" , "op": "REX.W F3 0F AE /5"},
|
|
||||||
{"inst": "rdsspd W:r32" , "op": "F3 0F 1E /1"},
|
|
||||||
{"inst": "rdsspq W:r64" , "op": "REX.W F3 0F 1E /1"},
|
|
||||||
{"inst": "rstorssp R:m64" , "op": "F3 0F 01 /5" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "saveprevssp" , "op": "F3 0F 01 EA" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CLDEMOTE", "data": [
|
|
||||||
{"inst": "cldemote R:mem" , "op": "0F 1C /0"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CLFLUSH", "data": [
|
|
||||||
{"inst": "clflush R:mem" , "op": "0F AE /7"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CLFLUSHOPT", "data": [
|
|
||||||
{"inst": "clflushopt R:mem" , "op": "66 0F AE /7"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CLWB", "data": [
|
|
||||||
{"inst": "clwb R:mem" , "op": "66 0F AE /6"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CLZERO", "data": [
|
|
||||||
{"inst": "clzero R:<m512(ds:zax)>" , "op": "0F 01 FC"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CMOV", "data": [
|
|
||||||
{"inst": "cmovo x:r16, r16/m16" , "op": "RM: 66 0F 40 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovo X:r32, r32/m32" , "op": "RM: 0F 40 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovo X:r64, r64/m64" , "op": "RM: REX.W 0F 40 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovno x:r16, r16/m16" , "op": "RM: 66 0F 41 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovno X:r32, r32/m32" , "op": "RM: 0F 41 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovno X:r64, r64/m64" , "op": "RM: REX.W 0F 41 /r" , "io": "OF=R"},
|
|
||||||
{"inst": "cmovb|cmovnae|cmovc x:r16, r16/m16" , "op": "RM: 66 0F 42 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmovb|cmovnae|cmovc X:r32, r32/m32" , "op": "RM: 0F 42 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmovb|cmovnae|cmovc X:r64, r64/m64" , "op": "RM: REX.W 0F 42 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmovae|cmovnb|cmovnc x:r16, r16/m16" , "op": "RM: 66 0F 43 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmovae|cmovnb|cmovnc X:r32, r32/m32" , "op": "RM: 0F 43 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmovae|cmovnb|cmovnc X:r64, r64/m64" , "op": "RM: REX.W 0F 43 /r" , "io": "CF=R"},
|
|
||||||
{"inst": "cmove|cmovz x:r16, r16/m16" , "op": "RM: 66 0F 44 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmove|cmovz X:r32, r32/m32" , "op": "RM: 0F 44 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmove|cmovz X:r64, r64/m64" , "op": "RM: REX.W 0F 44 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmovne|cmovnz x:r16, r16/m16" , "op": "RM: 66 0F 45 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmovne|cmovnz X:r32, r32/m32" , "op": "RM: 0F 45 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmovne|cmovnz X:r64, r64/m64" , "op": "RM: REX.W 0F 45 /r" , "io": "ZF=R"},
|
|
||||||
{"inst": "cmovbe|cmovna x:r16, r16/m16" , "op": "RM: 66 0F 46 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmovbe|cmovna X:r32, r32/m32" , "op": "RM: 0F 46 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmovbe|cmovna X:r64, r64/m64" , "op": "RM: REX.W 0F 46 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmova|cmovnbe x:r16, r16/m16" , "op": "RM: 66 0F 47 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmova|cmovnbe X:r32, r32/m32" , "op": "RM: 0F 47 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmova|cmovnbe X:r64, r64/m64" , "op": "RM: REX.W 0F 47 /r" , "io": "CF=R ZF=R"},
|
|
||||||
{"inst": "cmovs x:r16, r16/m16" , "op": "RM: 66 0F 48 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovs X:r32, r32/m32" , "op": "RM: 0F 48 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovs X:r64, r64/m64" , "op": "RM: REX.W 0F 48 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovns x:r16, r16/m16" , "op": "RM: 66 0F 49 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovns X:r32, r32/m32" , "op": "RM: 0F 49 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovns X:r64, r64/m64" , "op": "RM: REX.W 0F 49 /r" , "io": "SF=R"},
|
|
||||||
{"inst": "cmovp|cmovpe x:r16, r16/m16" , "op": "RM: 66 0F 4A /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovp|cmovpe X:r32, r32/m32" , "op": "RM: 0F 4A /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovp|cmovpe X:r64, r64/m64" , "op": "RM: REX.W 0F 4A /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovnp|cmovpo x:r16, r16/m16" , "op": "RM: 66 0F 4B /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovnp|cmovpo X:r32, r32/m32" , "op": "RM: 0F 4B /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovnp|cmovpo X:r64, r64/m64" , "op": "RM: REX.W 0F 4B /r" , "io": "PF=R"},
|
|
||||||
{"inst": "cmovl|cmovnge x:r16, r16/m16" , "op": "RM: 66 0F 4C /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovl|cmovnge X:r32, r32/m32" , "op": "RM: 0F 4C /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovl|cmovnge X:r64, r64/m64" , "op": "RM: REX.W 0F 4C /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovge|cmovnl x:r16, r16/m16" , "op": "RM: 66 0F 4D /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovge|cmovnl X:r32, r32/m32" , "op": "RM: 0F 4D /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovge|cmovnl X:r64, r64/m64" , "op": "RM: REX.W 0F 4D /r" , "io": "SF=R OF=R"},
|
|
||||||
{"inst": "cmovle|cmovng x:r16, r16/m16" , "op": "RM: 66 0F 4E /r" , "io": "ZF=R SF=R OF=R"},
|
|
||||||
{"inst": "cmovle|cmovng X:r32, r32/m32" , "op": "RM: 0F 4E /r" , "io": "ZF=R SF=R OF=R"},
|
|
||||||
{"inst": "cmovle|cmovng X:r64, r64/m64" , "op": "RM: REX.W 0F 4E /r" , "io": "ZF=R SF=R OF=R"},
|
|
||||||
{"inst": "cmovg|cmovnle x:r16, r16/m16" , "op": "RM: 66 0F 4F /r" , "io": "ZF=R SF=R OF=R"},
|
|
||||||
{"inst": "cmovg|cmovnle X:r32, r32/m32" , "op": "RM: 0F 4F /r" , "io": "ZF=R SF=R OF=R"},
|
|
||||||
{"inst": "cmovg|cmovnle X:r64, r64/m64" , "op": "RM: REX.W 0F 4F /r" , "io": "ZF=R SF=R OF=R"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CMPCCXADD", "data": [
|
|
||||||
{"inst": "cmpbexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E6 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpbexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E6 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpbxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E2 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpbxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E2 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmplexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EE /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmplexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EE /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmplxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EC /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmplxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EC /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnbexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E7 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnbexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E7 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnbxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E3 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnbxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E3 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnlexadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EF /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnlexadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EF /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnlxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 ED /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnlxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 ED /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnoxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E1 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnoxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E1 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnpxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EB /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnpxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EB /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnsxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E9 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnsxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E9 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnzxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E5 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpnzxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E5 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpoxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E0 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpoxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E0 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmppxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 EA /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmppxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 EA /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpsxadd X:m32, X:r32, R:r32" , "op": "MVR: VEX.128.66.0F38.W0 E8 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpsxadd X:m64, X:r64, R:r64" , "op": "MVR: VEX.128.66.0F38.W1 E8 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpzxadd X:m32, X:r32, R:r32" , "op": "VEX.128.66.0F38.W0 E4 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
|
|
||||||
{"inst": "cmpzxadd X:m64, X:r64, R:r64" , "op": "VEX.128.66.0F38.W1 E4 /r" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CMPXCHG8B", "data": [
|
|
||||||
{"inst": "[lock|xacqrel] cmpxchg8b X:m64,X:<edx>,X:<eax>,<ecx>,<ebx>" , "op": "0F C7 /1" , "io": "ZF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CMPXCHG16B", "data": [
|
|
||||||
{"inst": "[lock|xacqrel] cmpxchg16b X:m128,X:<rdx>,X:<rax>,<rcx>,<rbx>","op": "REX.W 0F C7 /1" , "io": "ZF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "FSGSBASE", "arch": "X64", "volatile": true, "data": [
|
|
||||||
{"inst": "rdfsbase W:r32" , "op": "F3 0F AE /0"},
|
|
||||||
{"inst": "rdfsbase W:r64" , "op": "REX.W F3 0F AE /0"},
|
|
||||||
{"inst": "rdgsbase W:r32" , "op": "F3 0F AE /1"},
|
|
||||||
{"inst": "rdgsbase W:r64" , "op": "REX.W F3 0F AE /1"},
|
|
||||||
{"inst": "wrfsbase R:r32" , "op": "F3 0F AE /2"},
|
|
||||||
{"inst": "wrfsbase R:r64" , "op": "REX.W F3 0F AE /2"},
|
|
||||||
{"inst": "wrgsbase R:r32" , "op": "F3 0F AE /3"},
|
|
||||||
{"inst": "wrgsbase R:r64" , "op": "REX.W F3 0F AE /3"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "FXSR", "volatile": true, "data": [
|
|
||||||
{"inst": "fxrstor R:mem" , "op": "0F AE /1" , "io": "C0=W C1=W C2=W C3=W"},
|
|
||||||
{"inst": "fxrstor64 R:mem" , "op": "REX.W 0F AE /1" , "io": "C0=W C1=W C2=W C3=W"},
|
|
||||||
{"inst": "fxsave W:mem" , "op": "0F AE /0" , "io": "C0=R C1=R C2=R C3=R"},
|
|
||||||
{"inst": "fxsave64 W:mem" , "op": "REX.W 0F AE /0" , "io": "C0=R C1=R C2=R C3=R"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "LAHFSAHF", "data": [
|
|
||||||
{"inst": "lahf w:<ah>" , "op": "9F" , "io": "SF=R ZF=R AF=R PF=R CF=R"},
|
|
||||||
{"inst": "sahf R:<ah>" , "op": "9E" , "io": "SF=W ZF=W AF=W PF=W CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "LWP", "volatile": true, "data": [
|
|
||||||
{"inst": "llwpcb R:r32" , "op": "XOP.L0.P0.M09.W0 12 /0"},
|
|
||||||
{"inst": "llwpcb R:r64" , "op": "XOP.L0.P0.M09.W1 12 /0"},
|
|
||||||
{"inst": "lwpins R:r32, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W0 12 /0 id"},
|
|
||||||
{"inst": "lwpins R:r64, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W1 12 /0 id"},
|
|
||||||
{"inst": "lwpval R:r32, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W0 12 /1 id"},
|
|
||||||
{"inst": "lwpval R:r64, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W1 12 /1 id"},
|
|
||||||
{"inst": "slwpcb W:r32" , "op": "XOP.L0.P0.M09.W0 12 /1"},
|
|
||||||
{"inst": "slwpcb W:r64" , "op": "XOP.L0.P0.M09.W1 12 /1"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "LZCNT", "data": [
|
|
||||||
{"inst": "lzcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F BD /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "lzcnt W:r32, r32/m32" , "op": "RM: F3 0F BD /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
|
|
||||||
{"inst": "lzcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F BD /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MONITORX", "volatile": true, "data": [
|
|
||||||
{"inst": "monitorx R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 FA"},
|
|
||||||
{"inst": "mwaitx R:<eax>, R:<ecx>, R:<ebx>" , "op": "0F 01 FB"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MCOMMIT", "data": [
|
|
||||||
{"inst": "mcommit" , "op": "F3 0F 01 FA" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MOVBE", "data": [
|
|
||||||
{"inst": "movbe w:r16, m16" , "op": "RM: 66 0F 38 F0 /r"},
|
|
||||||
{"inst": "movbe W:r32, m32" , "op": "RM: 0F 38 F0 /r"},
|
|
||||||
{"inst": "movbe W:r64, m64" , "op": "RM: REX.W 0F 38 F0 /r"},
|
|
||||||
{"inst": "movbe W:m16, r16" , "op": "MR: 66 0F 38 F1 /r"},
|
|
||||||
{"inst": "movbe W:m32, r32" , "op": "MR: 0F 38 F1 /r"},
|
|
||||||
{"inst": "movbe W:m64, r64" , "op": "MR: REX.W 0F 38 F1 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MOVDIRI", "data": [
|
|
||||||
{"inst": "movdiri W:m32, r32" , "op": "MR: 0F 38 F9 /r"},
|
|
||||||
{"inst": "movdiri W:m64, r64" , "op": "MR: REX.W 0F 38 F9 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MOVDIR64B", "data": [
|
|
||||||
{"inst": "movdir64b W:m512(es:r32), m512" , "op": "RM: 66 0F 38 F8 /r"},
|
|
||||||
{"inst": "movdir64b W:m512(es:r64), m512" , "op": "RM: 66 0F 38 F8 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "PCONFIG", "volatile": true, "data": [
|
|
||||||
{"inst": "pconfig" , "op": "0F 01 C5"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "POPCNT", "data": [
|
|
||||||
{"inst": "popcnt w:r16, r16/m16" , "op": "RM: 66 F3 0F B8 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
|
|
||||||
{"inst": "popcnt W:r32, r32/m32" , "op": "RM: F3 0F B8 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
|
|
||||||
{"inst": "popcnt W:r64, r64/m64" , "op": "RM: REX.W F3 0F B8 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "OSPKE", "data": [
|
|
||||||
{"inst": "rdpkru W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 EE"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "PREFETCHI", "arch": "X64", "volatile": true, "data": [
|
|
||||||
{"inst": "prefetchit0 R:mem" , "op": "0F 18 /7"},
|
|
||||||
{"inst": "prefetchit1 R:mem" , "op": "0F 18 /6"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "PREFETCHW", "volatile": true, "data": [
|
|
||||||
{"inst": "prefetchw R:mem" , "op": "0F 0D /1" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "PREFETCHWT1", "volatile": true, "data": [
|
|
||||||
{"inst": "prefetchwt1 R:mem" , "op": "0F 0D /2" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "PTWRITE", "volatile": true, "data": [
|
|
||||||
{"inst": "ptwrite R:r32/m32" , "op": "F3 0F AE /4"},
|
|
||||||
{"inst": "ptwrite R:r64/m64" , "op": "REX.W F3 0F AE /4"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RAO_INT", "volatile": true, "data": [
|
|
||||||
{"inst": "aadd X:m32, r32" , "op": "MR: 0F 38 FC /r"},
|
|
||||||
{"inst": "aadd X:m64, r64" , "op": "MR: REX.W 0F 38 FC /r"},
|
|
||||||
{"inst": "aand X:m32, r32" , "op": "MR: 66 0F 38 FC /r"},
|
|
||||||
{"inst": "aand X:m64, r64" , "op": "MR: REX.W 66 0F 38 FC /r"},
|
|
||||||
{"inst": "aor X:m32, r32" , "op": "MR: F2 0F 38 FC /r"},
|
|
||||||
{"inst": "aor X:m64, r64" , "op": "MR: REX.W F2 0F 38 FC /r"},
|
|
||||||
{"inst": "axor X:m32, r32" , "op": "MR: F3 0F 38 FC /r"},
|
|
||||||
{"inst": "axor X:m64, r64" , "op": "MR: REX.W F3 0F 38 FC /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDPID", "data": [
|
|
||||||
{"inst": "rdpid W:r32" , "op": "R: F3 0F C7 /7" , "arch": "X86"},
|
|
||||||
{"inst": "rdpid W:r64" , "op": "R: F3 0F C7 /7" , "arch": "X64"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDPRU", "data": [
|
|
||||||
{"inst": "rdpru W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 FD"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDRAND", "data": [
|
|
||||||
{"inst": "rdrand w:r16" , "op": "66 0F C7 /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "rdrand W:r32" , "op": "0F C7 /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "rdrand W:r64" , "op": "REX.W 0F C7 /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDSEED", "data": [
|
|
||||||
{"inst": "rdseed w:r16" , "op": "66 0F C7 /7" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "rdseed W:r32" , "op": "0F C7 /7" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "rdseed W:r64" , "op": "REX.W 0F C7 /7" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDTSC", "data": [
|
|
||||||
{"inst": "rdtsc W:<edx>, W:<eax>" , "op": "0F 31"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RDTSCP", "data": [
|
|
||||||
{"inst": "rdtscp W:<edx>, W:<eax>, W:<ecx>" , "op": "0F 01 F9"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "RTM", "volatile": true, "data": [
|
|
||||||
{"inst": "xabort ib/ub" , "op": "C6 /7 ib"},
|
|
||||||
{"inst": "xbegin rel16" , "op": "66 C7 /7 cw"},
|
|
||||||
{"inst": "xbegin rel32" , "op": "C7 /7 cd"},
|
|
||||||
{"inst": "xend" , "op": "0F 01 D5"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "SERIALIZE", "volatile": true, "data": [
|
|
||||||
{"inst": "serialize" , "op": "0F 01 E8"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "SSE", "volatile": true, "data": [
|
|
||||||
{"inst": "prefetchnta R:mem" , "op": "0F 18 /0"},
|
|
||||||
{"inst": "prefetcht0 R:mem" , "op": "0F 18 /1"},
|
|
||||||
{"inst": "prefetcht1 R:mem" , "op": "0F 18 /2"},
|
|
||||||
{"inst": "prefetcht2 R:mem" , "op": "0F 18 /3"},
|
|
||||||
{"inst": "sfence" , "op": "0F AE F8"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "SSE2", "volatile": true, "data": [
|
|
||||||
{"inst": "lfence" , "op": "0F AE E8"},
|
|
||||||
{"inst": "mfence" , "op": "0F AE F0"},
|
|
||||||
{"inst": "movnti W:m32, r32" , "op": "MR: 0F C3 /r"},
|
|
||||||
{"inst": "movnti W:m64, r64" , "op": "MR: REX.W 0F C3 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT CRYPTO_HASH", "ext": "SSE4_2", "data": [
|
|
||||||
{"inst": "crc32 X:r32, r8/m8" , "op": "RM: F2 0F 38 F0 /r"},
|
|
||||||
{"inst": "crc32 X:r32, r16/m16" , "op": "RM: 66 F2 0F 38 F1 /r"},
|
|
||||||
{"inst": "crc32 X:r32, r32/m32" , "op": "RM: F2 0F 38 F1 /r"},
|
|
||||||
{"inst": "crc32 X:r64, r8/m8" , "op": "RM: REX.W F2 0F 38 F0 /r"},
|
|
||||||
{"inst": "crc32 X:r64, r64/m64" , "op": "RM: REX.W F2 0F 38 F1 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "TSE", "arch": "X64", "volatile": true, "data": [
|
|
||||||
{"inst": "pbndkb W:<rax>, R:<mem(ds:rbx)>, W:<mem(ds:rcx)>" , "op": "0F 01 C7" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "TSX", "volatile": true, "data": [
|
|
||||||
{"inst": "xtest" , "op": "0F 01 D6" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "TSXLDTRK", "volatile": true, "data": [
|
|
||||||
{"inst": "xresldtrk" , "op": "F2 0F 01 E9"},
|
|
||||||
{"inst": "xsusldtrk" , "op": "F2 0F 01 E8"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "UINTR", "arch": "X64", "volatile": true, "data": [
|
|
||||||
{"inst": "uiret" , "op": "F3 0F 01 EC"},
|
|
||||||
{"inst": "clui" , "op": "F3 0F 01 EE"},
|
|
||||||
{"inst": "stui" , "op": "F3 0F 01 EF"},
|
|
||||||
{"inst": "testui" , "op": "F3 0F 01 ED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "senduipi R:r64" , "op": "R: F3 0F C7 /6"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "WAITPKG", "volatile": true, "data": [
|
|
||||||
{"inst": "tpause R:r32, <edx>, <eax>" , "op": "66 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "umonitor R:mem(ds:r32)" , "op": "F3 0F AE /6" , "arch": "X86"},
|
|
||||||
{"inst": "umonitor R:mem(ds:r64)" , "op": "F3 0F AE /6" , "arch": "X64"},
|
|
||||||
{"inst": "umwait R:r32, <edx>, <eax>" , "op": "F2 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "XSAVE", "volatile": true, "data": [
|
|
||||||
{"inst": "xgetbv W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 D0" , "io": "XCR=R"},
|
|
||||||
{"inst": "xrstor R:mem, <edx>, <eax>" , "op": "0F AE /5" , "io": "XCR=R"},
|
|
||||||
{"inst": "xrstor64 R:mem, <edx>, <eax>" , "op": "REX.W 0F AE /5" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsave W:mem, <edx>, <eax>" , "op": "0F AE /4" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsave64 W:mem, <edx>, <eax>" , "op": "REX.W 0F AE /4" , "io": "XCR=R"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "XSAVEC", "volatile": true, "data": [
|
|
||||||
{"inst": "xsavec W:mem, <edx>, <eax>" , "op": "0F C7 /4" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsavec64 W:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /4" , "io": "XCR=R"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "XSAVEOPT", "volatile": true, "data": [
|
|
||||||
{"inst": "xsaveopt W:mem, <edx>, <eax>" , "op": "0F AE /6" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsaveopt64 W:mem, <edx>, <eax>" , "op": "REX.W 0F AE /6" , "io": "XCR=R"}
|
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP", "volatile": true, "data": [
|
{"category": "GP", "volatile": true, "data": [
|
||||||
@ -1068,35 +863,21 @@
|
|||||||
{"inst": "xlatb" , "op": "D7"}
|
{"inst": "xlatb" , "op": "D7"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP", "deprecated": true, "arch": "X86", "data": [
|
{"category": "GP", "deprecated": true, "data": [
|
||||||
{"inst": "aaa x:<ax>" , "op": "37" , "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
|
{"inst": "aaa x:<ax>" , "op": "37" , "arch": "X86", "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
|
||||||
{"inst": "aas x:<ax>" , "op": "3F" , "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
|
{"inst": "aas x:<ax>" , "op": "3F" , "arch": "X86", "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
|
||||||
{"inst": "aad x:<ax>, ib/ub" , "op": "D5 ib" , "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
|
{"inst": "aad x:<ax>, ib/ub" , "op": "D5 ib" , "arch": "X86", "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
|
||||||
{"inst": "aam x:<ax>, ib/ub" , "op": "D4 ib" , "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
|
{"inst": "aam x:<ax>, ib/ub" , "op": "D4 ib" , "arch": "X86", "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
|
||||||
{"inst": "arpl x:r16/m16, R:r16" , "op": "MR: 63 /r" , "io": "ZF=W"},
|
{"inst": "arpl x:r16/m16, R:r16" , "op": "MR: 63 /r" , "arch": "X86", "io": "ZF=W"},
|
||||||
{"inst": "bound R:r16, R:m32" , "op": "RM: 66 62 /r"},
|
{"inst": "bound R:r16, R:m32" , "op": "RM: 66 62 /r" , "arch": "X86"},
|
||||||
{"inst": "bound R:r32, R:m64" , "op": "RM: 62 /r"},
|
{"inst": "bound R:r32, R:m64" , "op": "RM: 62 /r" , "arch": "X86"},
|
||||||
{"inst": "daa x:<ax>" , "op": "27" , "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "daa x:<ax>" , "op": "27" , "arch": "X86", "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
{"inst": "das x:<ax>" , "op": "2F" , "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
|
{"inst": "das x:<ax>" , "op": "2F" , "arch": "X86", "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
|
||||||
{"inst": "into" , "op": "CE" , "io": "OF=R"},
|
{"inst": "into" , "op": "CE" , "arch": "X86", "io": "OF=R"},
|
||||||
{"inst": "popa" , "op": "66 61"},
|
{"inst": "popa" , "op": "66 61" , "arch": "X86"},
|
||||||
{"inst": "popad" , "op": "61"},
|
{"inst": "popad" , "op": "61" , "arch": "X86"},
|
||||||
{"inst": "pusha" , "op": "66 60"},
|
{"inst": "pusha" , "op": "66 60" , "arch": "X86"},
|
||||||
{"inst": "pushad" , "op": "60"}
|
{"inst": "pushad" , "op": "60" , "arch": "X86"}
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MPX", "deprecated": true, "data": [
|
|
||||||
{"inst": "bndcl R:bnd, r32/m32" , "op": "RM: F3 0F 1A /r" , "arch": "X86"},
|
|
||||||
{"inst": "bndcl R:bnd, r64/m64" , "op": "RM: F3 0F 1A /r" , "arch": "X64"},
|
|
||||||
{"inst": "bndcn R:bnd, r32/m32" , "op": "RM: F2 0F 1B /r" , "arch": "X86"},
|
|
||||||
{"inst": "bndcn R:bnd, r64/m64" , "op": "RM: F2 0F 1B /r" , "arch": "X64"},
|
|
||||||
{"inst": "bndcu R:bnd, r32/m32" , "op": "RM: F2 0F 1A /r" , "arch": "X86"},
|
|
||||||
{"inst": "bndcu R:bnd, r64/m64" , "op": "RM: F2 0F 1A /r" , "arch": "X64"},
|
|
||||||
{"inst": "bndldx W:bnd, mib" , "op": "RM: 0F 1A /r"},
|
|
||||||
{"inst": "bndmk W:bnd, mem" , "op": "RM: F3 0F 1B /r"},
|
|
||||||
{"inst": "bndmov W:bnd, bnd/mem" , "op": "RM: 66 0F 1A /r"},
|
|
||||||
{"inst": "bndmov W:bnd/mem, bnd" , "op": "MR: 66 0F 1B /r"},
|
|
||||||
{"inst": "bndstx W:mib, bnd" , "op": "MR: 0F 1B /r"}
|
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "TBM", "deprecated": true, "data": [
|
{"category": "GP GP_EXT", "ext": "TBM", "deprecated": true, "data": [
|
||||||
@ -1120,84 +901,141 @@
|
|||||||
{"inst": "t1mskc W:r64, r64/m64" , "op": "VM: XOP.LZ.M09.W1 01 /7"}
|
{"inst": "t1mskc W:r64, r64/m64" , "op": "VM: XOP.LZ.M09.W1 01 /7"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "MPX", "deprecated": true, "data": [
|
||||||
|
{"inst": "bndcl R:bnd, r32/m32" , "op": "RM: F3 0F 1A /r" , "arch": "X86"},
|
||||||
|
{"inst": "bndcl R:bnd, r64/m64" , "op": "RM: F3 0F 1A /r" , "arch": "X64"},
|
||||||
|
{"inst": "bndcn R:bnd, r32/m32" , "op": "RM: F2 0F 1B /r" , "arch": "X86"},
|
||||||
|
{"inst": "bndcn R:bnd, r64/m64" , "op": "RM: F2 0F 1B /r" , "arch": "X64"},
|
||||||
|
{"inst": "bndcu R:bnd, r32/m32" , "op": "RM: F2 0F 1A /r" , "arch": "X86"},
|
||||||
|
{"inst": "bndcu R:bnd, r64/m64" , "op": "RM: F2 0F 1A /r" , "arch": "X64"},
|
||||||
|
{"inst": "bndldx W:bnd, mib" , "op": "RM: 0F 1A /r"},
|
||||||
|
{"inst": "bndmk W:bnd, mem" , "op": "RM: F3 0F 1B /r"},
|
||||||
|
{"inst": "bndmov W:bnd, bnd/mem" , "op": "RM: 66 0F 1A /r"},
|
||||||
|
{"inst": "bndmov W:bnd/mem, bnd" , "op": "MR: 66 0F 1B /r"},
|
||||||
|
{"inst": "bndstx W:mib, bnd" , "op": "MR: 0F 1B /r"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "volatile": true, "data": [
|
||||||
|
{"inst": "fxrstor R:mem" , "op": "0F AE /1" , "ext": "FXSR" , "io": "C0=W C1=W C2=W C3=W"},
|
||||||
|
{"inst": "fxrstor64 R:mem" , "op": "REX.W 0F AE /1" , "ext": "FXSR" , "io": "C0=W C1=W C2=W C3=W"},
|
||||||
|
{"inst": "fxsave W:mem" , "op": "0F AE /0" , "ext": "FXSR" , "io": "C0=R C1=R C2=R C3=R"},
|
||||||
|
{"inst": "fxsave64 W:mem" , "op": "REX.W 0F AE /0" , "ext": "FXSR" , "io": "C0=R C1=R C2=R C3=R"},
|
||||||
|
{"inst": "xgetbv W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 D0" , "ext": "XSAVE" , "io": "XCR=R"},
|
||||||
|
{"inst": "xrstor R:mem, <edx>, <eax>" , "op": "0F AE /5" , "ext": "XSAVE" , "io": "XCR=R"},
|
||||||
|
{"inst": "xrstor64 R:mem, <edx>, <eax>" , "op": "REX.W 0F AE /5" , "ext": "XSAVE" , "io": "XCR=R"},
|
||||||
|
{"inst": "xsave W:mem, <edx>, <eax>" , "op": "0F AE /4" , "ext": "XSAVE" , "io": "XCR=R"},
|
||||||
|
{"inst": "xsave64 W:mem, <edx>, <eax>" , "op": "REX.W 0F AE /4" , "ext": "XSAVE" , "io": "XCR=R"},
|
||||||
|
{"inst": "xsavec W:mem, <edx>, <eax>" , "op": "0F C7 /4" , "ext": "XSAVEC" , "io": "XCR=R"},
|
||||||
|
{"inst": "xsavec64 W:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /4" , "ext": "XSAVEC" , "io": "XCR=R"},
|
||||||
|
{"inst": "xsaveopt W:mem, <edx>, <eax>" , "op": "0F AE /6" , "ext": "XSAVEOPT", "io": "XCR=R"},
|
||||||
|
{"inst": "xsaveopt64 W:mem, <edx>, <eax>" , "op": "REX.W 0F AE /6" , "ext": "XSAVEOPT", "io": "XCR=R"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "volatile": true, "data": [
|
||||||
|
{"inst": "incsspd r32" , "op": "F3 0F AE /5" , "ext": "CET_SS"},
|
||||||
|
{"inst": "incsspq r64" , "op": "REX.W F3 0F AE /5" , "ext": "CET_SS"},
|
||||||
|
{"inst": "monitorx R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 FA" , "ext": "MONITORX"},
|
||||||
|
{"inst": "mwaitx R:<eax>, R:<ecx>, R:<ebx>" , "op": "0F 01 FB" , "ext": "MONITORX"},
|
||||||
|
{"inst": "rdsspd W:r32" , "op": "F3 0F 1E /1" , "ext": "CET_SS"},
|
||||||
|
{"inst": "rdsspq W:r64" , "op": "REX.W F3 0F 1E /1" , "ext": "CET_SS"},
|
||||||
|
{"inst": "rstorssp R:m64" , "op": "F3 0F 01 /5" , "ext": "CET_SS" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "saveprevssp" , "op": "F3 0F 01 EA" , "ext": "CET_SS" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "tpause R:r32, <edx>, <eax>" , "op": "66 0F AE /6" , "ext": "WAITPKG" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "umonitor R:mem(ds:r32)" , "op": "F3 0F AE /6" , "ext": "WAITPKG" , "arch": "X86"},
|
||||||
|
{"inst": "umonitor R:mem(ds:r64)" , "op": "F3 0F AE /6" , "ext": "WAITPKG" , "arch": "X64"},
|
||||||
|
{"inst": "umwait R:r32, <edx>, <eax>" , "op": "F2 0F AE /6" , "ext": "WAITPKG" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "LWP", "volatile": true, "data": [
|
||||||
|
{"inst": "llwpcb R:r32" , "op": "XOP.L0.P0.M09.W0 12 /0"},
|
||||||
|
{"inst": "llwpcb R:r64" , "op": "XOP.L0.P0.M09.W1 12 /0"},
|
||||||
|
{"inst": "lwpins R:r32, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W0 12 /0 id"},
|
||||||
|
{"inst": "lwpins R:r64, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W1 12 /0 id"},
|
||||||
|
{"inst": "lwpval R:r32, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W0 12 /1 id"},
|
||||||
|
{"inst": "lwpval R:r64, R:r32/m32, id/ud" , "op": "VM: XOP.L0.P0.M0A.W1 12 /1 id"},
|
||||||
|
{"inst": "slwpcb W:r32" , "op": "XOP.L0.P0.M09.W0 12 /1"},
|
||||||
|
{"inst": "slwpcb W:r64" , "op": "XOP.L0.P0.M09.W1 12 /1"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "FSGSBASE", "arch": "X64", "volatile": true, "data": [
|
||||||
|
{"inst": "rdfsbase W:r32" , "op": "F3 0F AE /0"},
|
||||||
|
{"inst": "rdfsbase W:r64" , "op": "REX.W F3 0F AE /0"},
|
||||||
|
{"inst": "rdgsbase W:r32" , "op": "F3 0F AE /1"},
|
||||||
|
{"inst": "rdgsbase W:r64" , "op": "REX.W F3 0F AE /1"},
|
||||||
|
{"inst": "wrfsbase R:r32" , "op": "F3 0F AE /2"},
|
||||||
|
{"inst": "wrfsbase R:r64" , "op": "REX.W F3 0F AE /2"},
|
||||||
|
{"inst": "wrgsbase R:r32" , "op": "F3 0F AE /3"},
|
||||||
|
{"inst": "wrgsbase R:r64" , "op": "REX.W F3 0F AE /3"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "UINTR", "arch": "X64", "volatile": true, "data": [
|
||||||
|
{"inst": "uiret" , "op": "F3 0F 01 EC"},
|
||||||
|
{"inst": "clui" , "op": "F3 0F 01 EE"},
|
||||||
|
{"inst": "stui" , "op": "F3 0F 01 EF"},
|
||||||
|
{"inst": "testui" , "op": "F3 0F 01 ED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
|
{"inst": "senduipi R:r64" , "op": "R: F3 0F C7 /6"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "PCONFIG", "volatile": true, "data": [
|
||||||
|
{"inst": "pconfig" , "op": "0F 01 C5"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "ext": "TSE", "arch": "X64", "volatile": true, "data": [
|
||||||
|
{"inst": "pbndkb" , "op": "0F 01 C7"}
|
||||||
|
]},
|
||||||
|
|
||||||
|
{"category": "GP GP_EXT", "volatile": true, "data": [
|
||||||
|
{"inst": "xabort ib/ub" , "op": "C6 /7 ib" , "ext": "RTM"},
|
||||||
|
{"inst": "xbegin rel16" , "op": "66 C7 /7 cw" , "ext": "RTM"},
|
||||||
|
{"inst": "xbegin rel32" , "op": "C7 /7 cd" , "ext": "RTM"},
|
||||||
|
{"inst": "xend" , "op": "0F 01 D5" , "ext": "RTM"},
|
||||||
|
{"inst": "xresldtrk" , "op": "F2 0F 01 E9" , "ext": "TSXLDTRK"},
|
||||||
|
{"inst": "xsusldtrk" , "op": "F2 0F 01 E8" , "ext": "TSXLDTRK"},
|
||||||
|
{"inst": "xtest" , "op": "0F 01 D6" , "ext": "TSX" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
|
||||||
|
]},
|
||||||
|
|
||||||
{"category": "GP", "volatile": true, "privilege": "L0", "data": [
|
{"category": "GP", "volatile": true, "privilege": "L0", "data": [
|
||||||
|
{"inst": "clrssbsy R:m64" , "op": "F3 0F AE /6" , "ext": "CET_SS" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
||||||
{"inst": "clts" , "op": "0F 06"},
|
{"inst": "clts" , "op": "0F 06"},
|
||||||
|
{"inst": "endbr32" , "op": "F3 0F 1E FB" , "ext": "CET_IBT"},
|
||||||
|
{"inst": "endbr64" , "op": "F3 0F 1E FA" , "ext": "CET_IBT"},
|
||||||
|
{"inst": "getsec <eax>" , "op": "0F 37" , "ext": "SMX"},
|
||||||
{"inst": "hlt" , "op": "F4"},
|
{"inst": "hlt" , "op": "F4"},
|
||||||
|
{"inst": "hreset ib/ub, W:<eax>" , "op": "F3 0F 3A F0 /0 ib" , "ext": "HRESET"},
|
||||||
|
{"inst": "invd" , "op": "0F 08" , "ext": "I486" },
|
||||||
|
{"inst": "invlpg R:mem" , "op": "0F 01 /7" , "ext": "I486"},
|
||||||
|
{"inst": "invpcid R:r32, R:m128" , "op": "RM: 66 0F 38 82 /r" , "ext": "I486" , "arch": "X86"},
|
||||||
|
{"inst": "invpcid R:r64, R:m128" , "op": "RM: 66 0F 38 82 /r" , "ext": "I486" , "arch": "X64"},
|
||||||
{"inst": "lgdt R:mem" , "op": "0F 01 /2"},
|
{"inst": "lgdt R:mem" , "op": "0F 01 /2"},
|
||||||
{"inst": "lidt R:mem" , "op": "0F 01 /3"},
|
{"inst": "lidt R:mem" , "op": "0F 01 /3"},
|
||||||
{"inst": "lldt R:r16/m16" , "op": "0F 00 /2"},
|
{"inst": "lldt R:r16/m16" , "op": "0F 00 /2"},
|
||||||
{"inst": "lmsw R:r16/m16" , "op": "0F 01 /6"},
|
{"inst": "lmsw R:r16/m16" , "op": "0F 01 /6"},
|
||||||
{"inst": "ltr R:r16/m16" , "op": "0F 00 /3"},
|
{"inst": "ltr R:r16/m16" , "op": "0F 00 /3"},
|
||||||
|
{"inst": "monitor R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 C8" , "ext": "MONITOR"},
|
||||||
|
{"inst": "mwait R:<eax>, R:<ecx>" , "op": "0F 01 C9" , "ext": "MONITOR"},
|
||||||
{"inst": "rdpmc W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 33"},
|
{"inst": "rdpmc W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 33"},
|
||||||
|
{"inst": "rdmsr W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 32" , "ext": "MSR" , "io": "MSR=R"},
|
||||||
|
{"inst": "rdmsrlist R:<mem(ds:rsi)>, W:<mem(ds:rdi)>, X:<rcx>" , "op": "F2 0F 01 C6" , "ext": "MSRLIST" , "arch": "X64", "io": "MSR=R"},
|
||||||
|
{"inst": "setssbsy" , "op": "F3 0F 01 E8" , "ext": "CET_SS"},
|
||||||
{"inst": "swapgs" , "op": "0F 01 F8" , "arch": "X64"},
|
{"inst": "swapgs" , "op": "0F 01 F8" , "arch": "X64"},
|
||||||
{"inst": "sysexit" , "op": "0F 35"},
|
{"inst": "sysexit" , "op": "0F 35"},
|
||||||
{"inst": "sysexitq" , "op": "REX.W 0F 35"},
|
{"inst": "sysexitq" , "op": "REX.W 0F 35"},
|
||||||
{"inst": "sysret" , "op": "0F 07" , "arch": "X64"},
|
{"inst": "sysret" , "op": "0F 07" , "arch": "X64"},
|
||||||
{"inst": "sysretq" , "op": "REX.W 0F 07" , "arch": "X64"}
|
{"inst": "sysretq" , "op": "REX.W 0F 07" , "arch": "X64"},
|
||||||
]},
|
{"inst": "wbinvd" , "op": "0F 09" , "ext": "I486"},
|
||||||
|
{"inst": "wbnoinvd" , "op": "F3 0F 09" , "ext": "WBNOINVD"},
|
||||||
{"category": "GP", "ext": "I486", "volatile": true, "privilege": "L0", "data": [
|
{"inst": "wrmsrns R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 01 C6" , "ext": "WRMSRNS" , "io": "MSR=W"},
|
||||||
{"inst": "invd" , "op": "0F 08"},
|
{"inst": "wrmsr R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 30" , "ext": "MSR" , "io": "MSR=W"},
|
||||||
{"inst": "invlpg R:mem" , "op": "0F 01 /7"},
|
{"inst": "wrmsrlist R:<mem(ds:rsi)>, R:<mem(ds:rdi)>, X:<rcx>" , "op": "F3 0F 01 C6" , "ext": "MSRLIST" , "arch": "X64", "io": "MSR=W"},
|
||||||
{"inst": "invpcid R:r32, R:m128" , "op": "RM: 66 0F 38 82 /r" , "arch": "X86"},
|
{"inst": "wrssd W:r32/m32, r32" , "op": "MR: 0F 38 F6 /r" , "ext": "CET_SS"},
|
||||||
{"inst": "invpcid R:r64, R:m128" , "op": "RM: 66 0F 38 82 /r" , "arch": "X64"},
|
{"inst": "wrssq W:r64/m64, r64" , "op": "MR: REX.W 0F 38 F6 /r" , "ext": "CET_SS"},
|
||||||
{"inst": "wbinvd" , "op": "0F 09"}
|
{"inst": "xrstors R:mem, <edx>, <eax>" , "op": "0F C7 /3" , "ext": "XSAVES" , "io": "XCR=R"},
|
||||||
]},
|
{"inst": "xrstors64 R:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /3" , "ext": "XSAVES" , "io": "XCR=R"},
|
||||||
|
{"inst": "wrussd W:r32/m32, r32" , "op": "MR: 66 0F 38 F5 /r" , "ext": "CET_SS"},
|
||||||
{"category": "GP GP_EXT", "ext": "CET_IBT", "volatile": true, "privilege": "L0", "data": [
|
{"inst": "wrussq W:r64/m64, r64" , "op": "MR: REX.W 66 0F 38 F5 /r" , "ext": "CET_SS"},
|
||||||
{"inst": "endbr32" , "op": "F3 0F 1E FB"},
|
{"inst": "xsaves W:mem, <edx>, <eax>" , "op": "0F C7 /5" , "ext": "XSAVES" , "io": "XCR=R"},
|
||||||
{"inst": "endbr64" , "op": "F3 0F 1E FA"}
|
{"inst": "xsaves64 W:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /5" , "ext": "XSAVES" , "io": "XCR=R"},
|
||||||
]},
|
{"inst": "xsetbv R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 01 D1" , "ext": "XSAVE" , "io": "XCR=W"}
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "CET_SS", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "clrssbsy R:m64" , "op": "F3 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
|
|
||||||
{"inst": "setssbsy" , "op": "F3 0F 01 E8"},
|
|
||||||
{"inst": "wrssd W:r32/m32, r32" , "op": "MR: 0F 38 F6 /r"},
|
|
||||||
{"inst": "wrssq W:r64/m64, r64" , "op": "MR: REX.W 0F 38 F6 /r"},
|
|
||||||
{"inst": "wrussd W:r32/m32, r32" , "op": "MR: 66 0F 38 F5 /r"},
|
|
||||||
{"inst": "wrussq W:r64/m64, r64" , "op": "MR: REX.W 66 0F 38 F5 /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "HRESET", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "hreset ib/ub, W:<eax>" , "op": "F3 0F 3A F0 /0 ib"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MONITOR", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "monitor R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 C8"},
|
|
||||||
{"inst": "mwait R:<eax>, R:<ecx>" , "op": "0F 01 C9"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MSR", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "rdmsr W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 32" , "io": "MSR=R"},
|
|
||||||
{"inst": "wrmsr R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 30" , "io": "MSR=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "MSRLIST", "arch": "X64", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "rdmsrlist R:<mem(ds:rsi)>, W:<mem(ds:rdi)>, X:<rcx>" , "op": "F2 0F 01 C6" , "io": "MSR=R"},
|
|
||||||
{"inst": "wrmsrlist R:<mem(ds:rsi)>, R:<mem(ds:rdi)>, X:<rcx>" , "op": "F3 0F 01 C6" , "io": "MSR=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "SMX", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "getsec <eax>" , "op": "0F 37"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "WBNOINVD", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "wbnoinvd" , "op": "F3 0F 09"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "WRMSRNS", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "wrmsrns R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 01 C6" , "io": "MSR=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "XSAVE", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "xsetbv R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 01 D1" , "io": "XCR=W"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "GP GP_EXT", "ext": "XSAVES", "volatile": true, "privilege": "L0", "data": [
|
|
||||||
{"inst": "xrstors R:mem, <edx>, <eax>" , "op": "0F C7 /3" , "io": "XCR=R"},
|
|
||||||
{"inst": "xrstors64 R:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /3" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsaves W:mem, <edx>, <eax>" , "op": "0F C7 /5" , "io": "XCR=R"},
|
|
||||||
{"inst": "xsaves64 W:mem, <edx>, <eax>" , "op": "REX.W 0F C7 /5" , "io": "XCR=R"}
|
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "VIRTUALIZATION", "volatile": true, "data": [
|
{"category": "VIRTUALIZATION", "volatile": true, "data": [
|
||||||
@ -1270,6 +1108,14 @@
|
|||||||
{"inst": "fbstp W:m80bcd" , "op": "DF /6" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
{"inst": "fbstp W:m80bcd" , "op": "DF /6" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
||||||
{"inst": "fchs" , "op": "D9 E0" , "io": "C0=U C1=0 C2=U C3=U"},
|
{"inst": "fchs" , "op": "D9 E0" , "io": "C0=U C1=0 C2=U C3=U"},
|
||||||
{"inst": "fclex" , "op": "9B DB E2" , "io": "C0=U C1=U C2=U C3=U"},
|
{"inst": "fclex" , "op": "9B DB E2" , "io": "C0=U C1=U C2=U C3=U"},
|
||||||
|
{"inst": "fcmovb st(i)" , "op": "DA C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" , "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovbe st(i)" , "op": "DA D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R", "ext": "CMOV"},
|
||||||
|
{"inst": "fcmove st(i)" , "op": "DA C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" , "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovnb st(i)" , "op": "DB C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" , "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovnbe st(i)" , "op": "DB D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R", "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovne st(i)" , "op": "DB C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" , "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovnu st(i)" , "op": "DB D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" , "ext": "CMOV"},
|
||||||
|
{"inst": "fcmovu st(i)" , "op": "DA D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" , "ext": "CMOV"},
|
||||||
{"inst": "fcom" , "op": "D8 D1" , "io": "C0=W C1=0 C2=W C3=W"},
|
{"inst": "fcom" , "op": "D8 D1" , "io": "C0=W C1=0 C2=W C3=W"},
|
||||||
{"inst": "fcom R:m32fp" , "op": "D8 /2" , "io": "C0=W C1=0 C2=W C3=W"},
|
{"inst": "fcom R:m32fp" , "op": "D8 /2" , "io": "C0=W C1=0 C2=W C3=W"},
|
||||||
{"inst": "fcom R:m64fp" , "op": "DC /2" , "io": "C0=W C1=0 C2=W C3=W"},
|
{"inst": "fcom R:m64fp" , "op": "DC /2" , "io": "C0=W C1=0 C2=W C3=W"},
|
||||||
@ -1318,6 +1164,9 @@
|
|||||||
{"inst": "fistp W:m16int" , "op": "DF /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
{"inst": "fistp W:m16int" , "op": "DF /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
||||||
{"inst": "fistp W:m32int" , "op": "DB /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
{"inst": "fistp W:m32int" , "op": "DB /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
||||||
{"inst": "fistp W:m64int" , "op": "DF /7" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
{"inst": "fistp W:m64int" , "op": "DF /7" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
|
||||||
|
{"inst": "fisttp W:m16int" , "op": "DF /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop", "ext": "SSE3"},
|
||||||
|
{"inst": "fisttp W:m32int" , "op": "DB /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop", "ext": "SSE3"},
|
||||||
|
{"inst": "fisttp W:m64int" , "op": "DD /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop", "ext": "SSE3"},
|
||||||
{"inst": "fisub R:m16int" , "op": "DE /4" , "io": "C0=U C1=W C2=U C3=U"},
|
{"inst": "fisub R:m16int" , "op": "DE /4" , "io": "C0=U C1=W C2=U C3=U"},
|
||||||
{"inst": "fisub R:m32int" , "op": "DA /4" , "io": "C0=U C1=W C2=U C3=U"},
|
{"inst": "fisub R:m32int" , "op": "DA /4" , "io": "C0=U C1=W C2=U C3=U"},
|
||||||
{"inst": "fisubr R:m16int" , "op": "DE /5" , "io": "C0=U C1=W C2=U C3=U"},
|
{"inst": "fisubr R:m16int" , "op": "DE /5" , "io": "C0=U C1=W C2=U C3=U"},
|
||||||
@ -1400,23 +1249,6 @@
|
|||||||
{"inst": "fyl2xp1" , "op": "D9 F9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"}
|
{"inst": "fyl2xp1" , "op": "D9 F9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "FPU", "ext": "FPU CMOV", "data": [
|
|
||||||
{"inst": "fcmovb st(i)" , "op": "DA C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" },
|
|
||||||
{"inst": "fcmovbe st(i)" , "op": "DA D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R"},
|
|
||||||
{"inst": "fcmove st(i)" , "op": "DA C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" },
|
|
||||||
{"inst": "fcmovnb st(i)" , "op": "DB C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" },
|
|
||||||
{"inst": "fcmovnbe st(i)" , "op": "DB D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R"},
|
|
||||||
{"inst": "fcmovne st(i)" , "op": "DB C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" },
|
|
||||||
{"inst": "fcmovnu st(i)" , "op": "DB D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" },
|
|
||||||
{"inst": "fcmovu st(i)" , "op": "DA D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" }
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "FPU", "ext": "FPU SSE3", "data": [
|
|
||||||
{"inst": "fisttp W:m16int" , "op": "DF /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"},
|
|
||||||
{"inst": "fisttp W:m32int" , "op": "DB /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"},
|
|
||||||
{"inst": "fisttp W:m64int" , "op": "DD /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "MMX STATE", "deprecated": true, "volatile": true, "data": [
|
{"category": "MMX STATE", "deprecated": true, "volatile": true, "data": [
|
||||||
{"inst": "emms" , "op": "0F 77" , "ext": "MMX"},
|
{"inst": "emms" , "op": "0F 77" , "ext": "MMX"},
|
||||||
{"inst": "femms" , "op": "0F 0E" , "ext": "3DNOW"}
|
{"inst": "femms" , "op": "0F 0E" , "ext": "3DNOW"}
|
||||||
@ -1817,7 +1649,7 @@
|
|||||||
{"inst": "movntdqa W:xmm, m128" , "op": "RM: 66 0F 38 2A /r"},
|
{"inst": "movntdqa W:xmm, m128" , "op": "RM: 66 0F 38 2A /r"},
|
||||||
{"inst": "mpsadbw X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 42 /r ib"},
|
{"inst": "mpsadbw X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 42 /r ib"},
|
||||||
{"inst": "packusdw X:xmm, xmm/m128" , "op": "RM: 66 0F 38 2B /r"},
|
{"inst": "packusdw X:xmm, xmm/m128" , "op": "RM: 66 0F 38 2B /r"},
|
||||||
{"inst": "pblendvb X:xmm, xmm/m128, <xmm0>" , "op": "RM: 66 0F 38 10 /r"},
|
{"inst": "pblendvb X:xmm, xmm/m128, <xmm0>" , "op": "RM: 66 0F E0 /r"},
|
||||||
{"inst": "pblendw X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 0E /r ib"},
|
{"inst": "pblendw X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 0E /r ib"},
|
||||||
{"inst": "pcmpeqq X:~xmm, ~xmm/m128" , "op": "RM: 66 0F 38 29 /r"},
|
{"inst": "pcmpeqq X:~xmm, ~xmm/m128" , "op": "RM: 66 0F 38 29 /r"},
|
||||||
{"inst": "pextrb W:r32[7:0]/m8, xmm, ib/ub" , "op": "MR: 66 0F 3A 14 /r ib"},
|
{"inst": "pextrb W:r32[7:0]/m8, xmm, ib/ub" , "op": "MR: 66 0F 3A 14 /r ib"},
|
||||||
@ -1875,6 +1707,10 @@
|
|||||||
{"inst": "insertq X:xmm, xmm, ib/ub, ib/ub" , "op": "RM: F2 0F 78 /r ib ib"}
|
{"inst": "insertq X:xmm, xmm, ib/ub, ib/ub" , "op": "RM: F2 0F 78 /r ib ib"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
|
{"category": "SSE SIMD", "ext": "PCLMULQDQ", "data": [
|
||||||
|
{"inst": "pclmulqdq X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 44 /r ib"}
|
||||||
|
]},
|
||||||
|
|
||||||
{"category": "SSE SIMD CRYPTO_HASH", "ext": "AESNI", "data": [
|
{"category": "SSE SIMD CRYPTO_HASH", "ext": "AESNI", "data": [
|
||||||
{"inst": "aesdec X:xmm, xmm/m128" , "op": "RM: 66 0F 38 DE /r"},
|
{"inst": "aesdec X:xmm, xmm/m128" , "op": "RM: 66 0F 38 DE /r"},
|
||||||
{"inst": "aesdeclast X:xmm, xmm/m128" , "op": "RM: 66 0F 38 DF /r"},
|
{"inst": "aesdeclast X:xmm, xmm/m128" , "op": "RM: 66 0F 38 DF /r"},
|
||||||
@ -1884,16 +1720,6 @@
|
|||||||
{"inst": "aeskeygenassist W:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A DF /r ib"}
|
{"inst": "aeskeygenassist W:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A DF /r ib"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "SSE SIMD", "ext": "GFNI", "data": [
|
|
||||||
{"inst": "gf2p8affineinvqb X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A CF /r ib"},
|
|
||||||
{"inst": "gf2p8affineqb X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A CE /r ib"},
|
|
||||||
{"inst": "gf2p8mulb X:xmm, xmm/m128" , "op": "RM: 66 0F 38 CF /r"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "SSE SIMD", "ext": "PCLMULQDQ", "data": [
|
|
||||||
{"inst": "pclmulqdq X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A 44 /r ib"}
|
|
||||||
]},
|
|
||||||
|
|
||||||
{"category": "SSE SIMD CRYPTO_HASH", "ext": "SHA", "data": [
|
{"category": "SSE SIMD CRYPTO_HASH", "ext": "SHA", "data": [
|
||||||
{"inst": "sha1msg1 xmm, xmm/m128" , "op": "RM: 0F 38 C9 /r"},
|
{"inst": "sha1msg1 xmm, xmm/m128" , "op": "RM: 0F 38 C9 /r"},
|
||||||
{"inst": "sha1msg2 xmm, xmm/m128" , "op": "RM: 0F 38 CA /r"},
|
{"inst": "sha1msg2 xmm, xmm/m128" , "op": "RM: 0F 38 CA /r"},
|
||||||
@ -1904,6 +1730,12 @@
|
|||||||
{"inst": "sha256rnds2 xmm, xmm/m128, <xmm0>" , "op": "RM: 0F 38 CB /r"}
|
{"inst": "sha256rnds2 xmm, xmm/m128, <xmm0>" , "op": "RM: 0F 38 CB /r"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
|
{"category": "SSE SIMD", "ext": "GFNI", "data": [
|
||||||
|
{"inst": "gf2p8affineinvqb X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A CF /r ib"},
|
||||||
|
{"inst": "gf2p8affineqb X:xmm, xmm/m128, ib/ub" , "op": "RM: 66 0F 3A CE /r ib"},
|
||||||
|
{"inst": "gf2p8mulb X:xmm, xmm/m128" , "op": "RM: 66 0F 38 CF /r"}
|
||||||
|
]},
|
||||||
|
|
||||||
{"category": "AVX STATE", "ext": "AVX", "data": [
|
{"category": "AVX STATE", "ext": "AVX", "data": [
|
||||||
{"inst": "vldmxcsr R:m32" , "op": "VEX.LZ.0F.WIG AE /2", "io": "MXCSR=W"},
|
{"inst": "vldmxcsr R:m32" , "op": "VEX.LZ.0F.WIG AE /2", "io": "MXCSR=W"},
|
||||||
{"inst": "vstmxcsr W:m32" , "op": "VEX.LZ.0F.WIG AE /3", "io": "MXCSR=R"},
|
{"inst": "vstmxcsr W:m32" , "op": "VEX.LZ.0F.WIG AE /3", "io": "MXCSR=R"},
|
||||||
@ -2794,7 +2626,7 @@
|
|||||||
{"category": "AVX SIMD", "ext": "AVX SM3", "data": [
|
{"category": "AVX SIMD", "ext": "AVX SM3", "data": [
|
||||||
{"inst": "vsm3msg1 X:xmm, xmm, xmm/m128" , "op": "RVM: VEX.128.NP.0F38.W0 DA /r"},
|
{"inst": "vsm3msg1 X:xmm, xmm, xmm/m128" , "op": "RVM: VEX.128.NP.0F38.W0 DA /r"},
|
||||||
{"inst": "vsm3msg2 X:xmm, xmm, xmm/m128" , "op": "RVM: VEX.128.66.0F38.W0 DA /r"},
|
{"inst": "vsm3msg2 X:xmm, xmm, xmm/m128" , "op": "RVM: VEX.128.66.0F38.W0 DA /r"},
|
||||||
{"inst": "vsm3rnds2 X:xmm, xmm, xmm/m128, ib/ub" , "op": "RVM: VEX.128.66.0F3A.W0 DE /r ib"}
|
{"inst": "vsm3rnds2 X:xmm, xmm, xmm/m128, ib/ub" , "op": "RVM: VEX.128.66.0F3A.W0 DE /r /ib"}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
{"category": "AVX SIMD", "ext": "AVX SM4", "data": [
|
{"category": "AVX SIMD", "ext": "AVX SM4", "data": [
|
||||||
|
2
deps/asmjit/db/x86.js
vendored
2
deps/asmjit/db/x86.js
vendored
@ -1,7 +1,7 @@
|
|||||||
// This file is part of AsmJit project <https://asmjit.com>
|
// This file is part of AsmJit project <https://asmjit.com>
|
||||||
//
|
//
|
||||||
// See asmjit.h or LICENSE.md for license and copyright information
|
// See asmjit.h or LICENSE.md for license and copyright information
|
||||||
// SPDX-License-Identifier: (Zlib or Unlicense)
|
// SPDX-License-Identifier: Zlib
|
||||||
|
|
||||||
(function($scope, $as) {
|
(function($scope, $as) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
20
deps/asmjit/src/asmjit/a64.h
vendored
20
deps/asmjit/src/asmjit/a64.h
vendored
@ -26,16 +26,16 @@
|
|||||||
//!
|
//!
|
||||||
//! ### Register Operands
|
//! ### Register Operands
|
||||||
//!
|
//!
|
||||||
//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers.
|
//! - \ref arm::Reg - Base class for any AArch32/AArch64 register.
|
||||||
//! - \ref a64::Gp - General purpose register (AArch64):
|
//! - \ref arm::Gp - General purpose register:
|
||||||
//! - \ref a64::GpW - 32-bit general purpose register (AArch64).
|
//! - \ref arm::GpW - 32-bit register.
|
||||||
//! - \ref a64::GpX - 64-bit general purpose register (AArch64).
|
//! - \ref arm::GpX - 64-bit register.
|
||||||
//! - \ref a64::Vec - Vector (SIMD) register:
|
//! - \ref arm::Vec - Vector (SIMD) register:
|
||||||
//! - \ref a64::VecB - 8-bit SIMD register.
|
//! - \ref arm::VecB - 8-bit SIMD register.
|
||||||
//! - \ref a64::VecH - 16-bit SIMD register.
|
//! - \ref arm::VecH - 16-bit SIMD register.
|
||||||
//! - \ref a64::VecS - 32-bit SIMD register.
|
//! - \ref arm::VecS - 32-bit SIMD register.
|
||||||
//! - \ref a64::VecD - 64-bit SIMD register.
|
//! - \ref arm::VecD - 64-bit SIMD register.
|
||||||
//! - \ref a64::VecV - 128-bit SIMD register.
|
//! - \ref arm::VecV - 128-bit SIMD register.
|
||||||
//!
|
//!
|
||||||
//! ### Memory Operands
|
//! ### Memory Operands
|
||||||
//!
|
//!
|
||||||
|
36
deps/asmjit/src/asmjit/arm.h
vendored
36
deps/asmjit/src/asmjit/arm.h
vendored
@ -18,16 +18,14 @@
|
|||||||
//!
|
//!
|
||||||
//! ### Emitters
|
//! ### Emitters
|
||||||
//!
|
//!
|
||||||
//! - AArch32
|
|
||||||
//! - \ref a32::Assembler - AArch32 assembler (must read, provides examples).
|
|
||||||
//! - \ref a32::Builder - AArch32 builder.
|
|
||||||
//! - \ref a32::Compiler - AArch32 compiler.
|
|
||||||
//! - \ref a32::Emitter - AArch32 emitter (abstract).
|
|
||||||
//!
|
|
||||||
//! - AArch64
|
//! - AArch64
|
||||||
|
//! - \ref a32::Assembler - AArch32 assembler (must read, provides examples).
|
||||||
//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
|
//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
|
||||||
|
//! - \ref a32::Builder - AArch32 builder.
|
||||||
//! - \ref a64::Builder - AArch64 builder.
|
//! - \ref a64::Builder - AArch64 builder.
|
||||||
|
//! - \ref a32::Compiler - AArch32 compiler.
|
||||||
//! - \ref a64::Compiler - AArch64 compiler.
|
//! - \ref a64::Compiler - AArch64 compiler.
|
||||||
|
//! - \ref a32::Emitter - AArch32 emitter (abstract).
|
||||||
//! - \ref a64::Emitter - AArch64 emitter (abstract).
|
//! - \ref a64::Emitter - AArch64 emitter (abstract).
|
||||||
//!
|
//!
|
||||||
//! ### Supported Instructions
|
//! ### Supported Instructions
|
||||||
@ -48,22 +46,16 @@
|
|||||||
//!
|
//!
|
||||||
//! ### Register Operands
|
//! ### Register Operands
|
||||||
//!
|
//!
|
||||||
//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers.
|
//! - \ref arm::Reg - Base class for any AArch32/AArch64 register.
|
||||||
//! - \ref a32::Gp - 32-bit general purpose register used by AArch32:
|
//! - \ref arm::Gp - General purpose register:
|
||||||
//! - \ref a64::Gp - 32-bit or 64-bit general purpose register used by AArch64:
|
//! - \ref arm::GpW - 32-bit register.
|
||||||
//! - \ref a64::GpW - 32-bit register (AArch64).
|
//! - \ref arm::GpX - 64-bit register (AArch64 only).
|
||||||
//! - \ref a64::GpX - 64-bit register (AArch64).
|
//! - \ref arm::Vec - Vector (SIMD) register:
|
||||||
//! - \ref arm::BaseVec - Base vector (SIMD) register.
|
//! - \ref arm::VecB - 8-bit SIMD register (AArch64 only).
|
||||||
//! - \ref a32::Vec - Vector (SIMD) register (AArch32):
|
//! - \ref arm::VecH - 16-bit SIMD register (AArch64 only).
|
||||||
//! - \ref a32::VecS - 32-bit SIMD register (AArch32).
|
//! - \ref arm::VecS - 32-bit SIMD register.
|
||||||
//! - \ref a32::VecD - 64-bit SIMD register (AArch32).
|
//! - \ref arm::VecD - 64-bit SIMD register.
|
||||||
//! - \ref a32::VecV - 128-bit SIMD register (AArch32).
|
//! - \ref arm::VecV - 128-bit SIMD register.
|
||||||
//! - \ref a64::Vec - Vector (SIMD) register (AArch64):
|
|
||||||
//! - \ref a64::VecB - 8-bit SIMD register (AArch64).
|
|
||||||
//! - \ref a64::VecH - 16-bit SIMD register (AArch64).
|
|
||||||
//! - \ref a64::VecS - 32-bit SIMD register (AArch64).
|
|
||||||
//! - \ref a64::VecD - 64-bit SIMD register (AArch64).
|
|
||||||
//! - \ref a64::VecV - 128-bit SIMD register (AArch64).
|
|
||||||
//!
|
//!
|
||||||
//! ### Memory Operands
|
//! ### Memory Operands
|
||||||
//!
|
//!
|
||||||
|
210
deps/asmjit/src/asmjit/arm/a64assembler.cpp
vendored
210
deps/asmjit/src/asmjit/arm/a64assembler.cpp
vendored
@ -21,16 +21,12 @@
|
|||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
||||||
|
|
||||||
// a64::Assembler - Utils
|
|
||||||
// ======================
|
|
||||||
|
|
||||||
static ASMJIT_FORCE_INLINE constexpr uint32_t diff(RegType a, RegType b) noexcept { return uint32_t(a) - uint32_t(b); }
|
|
||||||
static ASMJIT_FORCE_INLINE constexpr uint32_t diff(VecElementType elementType, VecElementType baseType) noexcept { return uint32_t(elementType) - uint32_t(baseType); }
|
|
||||||
|
|
||||||
// a64::Assembler - Cond
|
// a64::Assembler - Cond
|
||||||
// =====================
|
// =====================
|
||||||
|
|
||||||
static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept { return (uint32_t(cond) - 2u) & 0xFu; }
|
static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept {
|
||||||
|
return (uint32_t(cond) - 2u) & 0xFu;
|
||||||
|
}
|
||||||
|
|
||||||
// a64::Assembler - Bits
|
// a64::Assembler - Bits
|
||||||
// =====================
|
// =====================
|
||||||
@ -53,6 +49,10 @@ static constexpr uint32_t kWX = InstDB::kWX;
|
|||||||
static const uint8_t armShiftOpToLdStOptMap[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
|
static const uint8_t armShiftOpToLdStOptMap[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
|
||||||
#undef VALUE
|
#undef VALUE
|
||||||
|
|
||||||
|
static inline constexpr uint32_t diff(RegType a, RegType b) noexcept {
|
||||||
|
return uint32_t(a) - uint32_t(b);
|
||||||
|
}
|
||||||
|
|
||||||
// asmjit::a64::Assembler - SizeOp
|
// asmjit::a64::Assembler - SizeOp
|
||||||
// ===============================
|
// ===============================
|
||||||
|
|
||||||
@ -118,25 +118,25 @@ struct SizeOpTable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define VALUE_BIN(x) { \
|
#define VALUE_BIN(x) { \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00 : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00 : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00Q : \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00Q : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : SizeOp::kInvalid \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : SizeOp::kInvalid \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VALUE_ANY(x) { \
|
#define VALUE_ANY(x) { \
|
||||||
x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00S : \
|
x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00S : \
|
||||||
x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k01S : \
|
x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k01S : \
|
||||||
x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k10S : \
|
x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k10S : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k11S : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k11S : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01 : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01 : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01Q : \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01Q : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10 : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10 : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10Q : \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10Q : \
|
||||||
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11S : \
|
x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11S : \
|
||||||
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11Q : SizeOp::kInvalid \
|
x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11Q : SizeOp::kInvalid \
|
||||||
}
|
}
|
||||||
|
|
||||||
static const SizeOpTable sizeOpTable[SizeOpTable::kCount] = {
|
static const SizeOpTable sizeOpTable[SizeOpTable::kCount] = {
|
||||||
@ -254,16 +254,16 @@ static const Operand_& significantSimdOp(const Operand_& o0, const Operand_& o1,
|
|||||||
return !(instFlags & InstDB::kInstFlagLong) ? o0 : o1;
|
return !(instFlags & InstDB::kInstFlagLong) ? o0 : o1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, VecElementType elementType) noexcept {
|
static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, uint32_t elementType) noexcept {
|
||||||
// Instruction data or Assembler is wrong if this triggers an assertion failure.
|
// Instruction data or Assembler is wrong if this triggers an assertion failure.
|
||||||
ASMJIT_ASSERT(vecOpType < InstDB::kVO_Count);
|
ASMJIT_ASSERT(vecOpType < InstDB::kVO_Count);
|
||||||
// ElementType uses 3 bits in the operand signature, it should never overflow.
|
// ElementType uses 3 bits in the operand signature, it should never overflow.
|
||||||
ASMJIT_ASSERT(uint32_t(elementType) <= 0x7u);
|
ASMJIT_ASSERT(elementType <= 0x7u);
|
||||||
|
|
||||||
const SizeOpMap& map = sizeOpMap[vecOpType];
|
const SizeOpMap& map = sizeOpMap[vecOpType];
|
||||||
const SizeOpTable& table = sizeOpTable[map.tableId];
|
const SizeOpTable& table = sizeOpTable[map.tableId];
|
||||||
|
|
||||||
size_t index = (Support::min<uint32_t>(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | uint32_t(elementType);
|
size_t index = (Support::min<uint32_t>(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | elementType;
|
||||||
SizeOp op = table.array[index];
|
SizeOp op = table.array[index];
|
||||||
SizeOp modifiedOp { uint8_t(op.value & map.sizeOpMask) };
|
SizeOp modifiedOp { uint8_t(op.value & map.sizeOpMask) };
|
||||||
|
|
||||||
@ -467,7 +467,7 @@ static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t instFlags) noexcept {
|
static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t instFlags) noexcept {
|
||||||
return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();
|
return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Memory must be either:
|
// Memory must be either:
|
||||||
@ -537,7 +537,7 @@ static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint
|
|||||||
else {
|
else {
|
||||||
// Vector operation [HSD].
|
// Vector operation [HSD].
|
||||||
uint32_t q = diff(reg.type(), RegType::kARM_VecD);
|
uint32_t q = diff(reg.type(), RegType::kARM_VecD);
|
||||||
uint32_t sz = diff(reg.elementType(), VecElementType::kH);
|
uint32_t sz = reg.elementType() - Vec::kElementTypeH;
|
||||||
|
|
||||||
if (q > 1u || sz > 2u || !Support::bitTest(szBits[vHf].sizeMask, sz))
|
if (q > 1u || sz > 2u || !Support::bitTest(szBits[vHf].sizeMask, sz))
|
||||||
return false;
|
return false;
|
||||||
@ -716,6 +716,8 @@ static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const
|
|||||||
|
|
||||||
Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
|
Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
|
||||||
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
||||||
|
assignEmitterFuncs(this);
|
||||||
|
|
||||||
if (code)
|
if (code)
|
||||||
code->attach(this);
|
code->attach(this);
|
||||||
}
|
}
|
||||||
@ -801,7 +803,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co
|
|||||||
Operand_ opArray[Globals::kMaxOpCount];
|
Operand_ opArray[Globals::kMaxOpCount];
|
||||||
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
||||||
|
|
||||||
err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
|
err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
|
||||||
if (ASMJIT_UNLIKELY(err))
|
if (ASMJIT_UNLIKELY(err))
|
||||||
goto Failed;
|
goto Failed;
|
||||||
}
|
}
|
||||||
@ -2239,86 +2241,6 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// [Base - Prefetch]
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
case InstDB::kEncodingBasePrfm: {
|
|
||||||
const InstDB::EncodingData::BasePrfm& opData = InstDB::EncodingData::basePrfm[encodingIndex];
|
|
||||||
|
|
||||||
if (isign4 == ENC_OPS2(Imm, Mem)) {
|
|
||||||
const Mem& m = o1.as<Mem>();
|
|
||||||
rmRel = &m;
|
|
||||||
|
|
||||||
uint32_t immShift = 3u;
|
|
||||||
|
|
||||||
if (o0.as<Imm>().valueAs<uint64_t>() > 0x1Fu)
|
|
||||||
goto InvalidImmediate;
|
|
||||||
|
|
||||||
if (!armCheckMemBaseIndexRel(m))
|
|
||||||
goto InvalidAddress;
|
|
||||||
|
|
||||||
int64_t offset = m.offset();
|
|
||||||
uint32_t prfop = o0.as<Imm>().valueAs<uint32_t>();
|
|
||||||
|
|
||||||
if (m.hasBaseReg()) {
|
|
||||||
// [Base {Offset | Index}]
|
|
||||||
if (m.hasIndex()) {
|
|
||||||
uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
|
|
||||||
if (opt == 0xFF)
|
|
||||||
goto InvalidAddress;
|
|
||||||
|
|
||||||
uint32_t shift = m.shift();
|
|
||||||
uint32_t s = shift != 0;
|
|
||||||
|
|
||||||
if (s && shift != immShift)
|
|
||||||
goto InvalidAddressScale;
|
|
||||||
|
|
||||||
opcode.reset(uint32_t(opData.registerOp) << 21);
|
|
||||||
opcode.addImm(opt, 13);
|
|
||||||
opcode.addImm(s, 12);
|
|
||||||
opcode |= B(11);
|
|
||||||
opcode.addImm(prfop, 0);
|
|
||||||
goto EmitOp_MemBaseIndex_Rn5_Rm16;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Support::isInt32(offset))
|
|
||||||
goto InvalidDisplacement;
|
|
||||||
|
|
||||||
int32_t offset32 = int32_t(offset);
|
|
||||||
|
|
||||||
if (m.isPreOrPost())
|
|
||||||
goto InvalidAddress;
|
|
||||||
|
|
||||||
uint32_t imm12 = uint32_t(offset32) >> immShift;
|
|
||||||
|
|
||||||
if (Support::isUInt12(imm12) && (imm12 << immShift) == uint32_t(offset32)) {
|
|
||||||
opcode.reset(uint32_t(opData.sOffsetOp) << 22);
|
|
||||||
opcode.addImm(imm12, 10);
|
|
||||||
opcode.addImm(prfop, 0);
|
|
||||||
goto EmitOp_MemBase_Rn5;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Support::isInt9(offset32)) {
|
|
||||||
opcode.reset(uint32_t(opData.uOffsetOp) << 21);
|
|
||||||
opcode.addImm(uint32_t(offset32) & 0x1FFu, 12);
|
|
||||||
opcode.addImm(prfop, 0);
|
|
||||||
goto EmitOp_MemBase_Rn5;
|
|
||||||
}
|
|
||||||
|
|
||||||
goto InvalidAddress;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
opcode.reset(uint32_t(opData.literalOp) << 24);
|
|
||||||
opcode.addImm(prfop, 0);
|
|
||||||
offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
|
|
||||||
goto EmitOp_Rel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// [Base - Load / Store]
|
// [Base - Load / Store]
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -2350,7 +2272,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co
|
|||||||
if (m.hasBaseReg()) {
|
if (m.hasBaseReg()) {
|
||||||
// [Base {Offset | Index}]
|
// [Base {Offset | Index}]
|
||||||
if (m.hasIndex()) {
|
if (m.hasIndex()) {
|
||||||
uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
|
uint32_t opt = armShiftOpToLdStOptMap[m.predicate()];
|
||||||
if (opt == 0xFF)
|
if (opt == 0xFF)
|
||||||
goto InvalidAddress;
|
goto InvalidAddress;
|
||||||
|
|
||||||
@ -2768,7 +2690,7 @@ Case_BaseLdurStur:
|
|||||||
// hD, vS.{4|8}h (16-bit)
|
// hD, vS.{4|8}h (16-bit)
|
||||||
// sD, vS.4s (32-bit)
|
// sD, vS.4s (32-bit)
|
||||||
uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
|
uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
|
||||||
uint32_t elementSz = diff(o1.as<Vec>().elementType(), VecElementType::kH);
|
uint32_t elementSz = o1.as<Vec>().elementType() - Vec::kElementTypeH;
|
||||||
|
|
||||||
// Size greater than 1 means 64-bit elements, not supported.
|
// Size greater than 1 means 64-bit elements, not supported.
|
||||||
if ((sz | elementSz) > 1 || sz != elementSz)
|
if ((sz | elementSz) > 1 || sz != elementSz)
|
||||||
@ -2890,7 +2812,7 @@ Case_BaseLdurStur:
|
|||||||
if (q > 1)
|
if (q > 1)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kB);
|
uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeB;
|
||||||
if (sz == 0 || sz > 3)
|
if (sz == 0 || sz > 3)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
@ -2982,7 +2904,7 @@ Case_BaseLdurStur:
|
|||||||
if (q > 1)
|
if (q > 1)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kB);
|
uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeB;
|
||||||
if (sz == 0 || sz > 3)
|
if (sz == 0 || sz > 3)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
@ -3164,11 +3086,11 @@ Case_BaseLdurStur:
|
|||||||
if (uint32_t(opcode.hasQ()) != q)
|
if (uint32_t(opcode.hasQ()) != q)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (rL.isVecS4() && rN.elementType() == VecElementType::kH && !opData.isCvtxn()) {
|
if (rL.isVecS4() && rN.elementType() == Vec::kElementTypeH && !opData.isCvtxn()) {
|
||||||
goto EmitOp_Rd0_Rn5;
|
goto EmitOp_Rd0_Rn5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rL.isVecD2() && rN.elementType() == VecElementType::kS) {
|
if (rL.isVecD2() && rN.elementType() == Vec::kElementTypeS) {
|
||||||
opcode |= B(22);
|
opcode |= B(22);
|
||||||
goto EmitOp_Rd0_Rn5;
|
goto EmitOp_Rd0_Rn5;
|
||||||
}
|
}
|
||||||
@ -3279,8 +3201,8 @@ Case_BaseLdurStur:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (uint32_t(o0.as<Reg>().type()) != uint32_t(o1.as<Reg>().type()) + qIsOptional ||
|
if (uint32_t(o0.as<Reg>().type()) != uint32_t(o1.as<Reg>().type()) + qIsOptional ||
|
||||||
uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
|
o0.as<Vec>().elementType() != opData.tA ||
|
||||||
uint32_t(o1.as<Vec>().elementType()) != opData.tB)
|
o1.as<Vec>().elementType() != opData.tB)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (!o2.as<Vec>().hasElementIndex()) {
|
if (!o2.as<Vec>().hasElementIndex()) {
|
||||||
@ -3292,7 +3214,7 @@ Case_BaseLdurStur:
|
|||||||
goto EmitOp_Rd0_Rn5_Rm16;
|
goto EmitOp_Rd0_Rn5_Rm16;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (uint32_t(o2.as<Vec>().elementType()) != opData.tElement)
|
if (o2.as<Vec>().elementType() != opData.tElement)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (o2.as<Reg>().id() > 15)
|
if (o2.as<Reg>().id() > 15)
|
||||||
@ -3442,7 +3364,7 @@ Case_BaseLdurStur:
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
uint32_t q = diff(o0.as<Vec>().type(), RegType::kARM_VecD);
|
uint32_t q = diff(o0.as<Vec>().type(), RegType::kARM_VecD);
|
||||||
uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kH);
|
uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeH;
|
||||||
|
|
||||||
if (q > 1 || sz > 2)
|
if (q > 1 || sz > 2)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
@ -3496,7 +3418,7 @@ Case_BaseLdurStur:
|
|||||||
if (q > 1)
|
if (q > 1)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kH);
|
uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeH;
|
||||||
if (sz > 2)
|
if (sz > 2)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
@ -3520,7 +3442,7 @@ Case_BaseLdurStur:
|
|||||||
if (isign4 == ENC_OPS2(Reg, Reg)) {
|
if (isign4 == ENC_OPS2(Reg, Reg)) {
|
||||||
// The first destination operand is scalar, which matches element-type of source vectors.
|
// The first destination operand is scalar, which matches element-type of source vectors.
|
||||||
uint32_t L = (instFlags & InstDB::kInstFlagLong) != 0;
|
uint32_t L = (instFlags & InstDB::kInstFlagLong) != 0;
|
||||||
if (diff(o0.as<Vec>().type(), RegType::kARM_VecB) != diff(o1.as<Vec>().elementType(), VecElementType::kB) + L)
|
if (diff(o0.as<Vec>().type(), RegType::kARM_VecB) != o1.as<Vec>().elementType() - Vec::kElementTypeB + L)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
|
SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
|
||||||
@ -3620,7 +3542,7 @@ Case_BaseLdurStur:
|
|||||||
if (!sizeOp.isValid())
|
if (!sizeOp.isValid())
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (!checkSignature(o0, o1) || !o0.as<Reg>().isVecV() || uint32_t(o0.as<Vec>().elementType()) != uint32_t(o2.as<Vec>().elementType()) + 1u)
|
if (!checkSignature(o0, o1) || !o0.as<Reg>().isVecV() || o0.as<Vec>().elementType() != o2.as<Vec>().elementType() + 1)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
opcode.reset(opData.opcode());
|
opcode.reset(opData.opcode());
|
||||||
@ -3905,9 +3827,9 @@ Case_BaseLdurStur:
|
|||||||
if (o0.as<Reg>().type() != o1.as<Reg>().type() || o1.as<Reg>().type() != o2.as<Reg>().type())
|
if (o0.as<Reg>().type() != o1.as<Reg>().type() || o1.as<Reg>().type() != o2.as<Reg>().type())
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
|
if (o0.as<Vec>().elementType() != opData.tA ||
|
||||||
uint32_t(o1.as<Vec>().elementType()) != opData.tB ||
|
o1.as<Vec>().elementType() != opData.tB ||
|
||||||
uint32_t(o2.as<Vec>().elementType()) != opData.tB)
|
o2.as<Vec>().elementType() != opData.tB)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
opcode.reset(uint32_t(opData.vectorOp) << 10);
|
opcode.reset(uint32_t(opData.vectorOp) << 10);
|
||||||
@ -3921,9 +3843,9 @@ Case_BaseLdurStur:
|
|||||||
if (o0.as<Reg>().type() != o1.as<Reg>().type() || !o2.as<Reg>().isVecV())
|
if (o0.as<Reg>().type() != o1.as<Reg>().type() || !o2.as<Reg>().isVecV())
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
if (uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
|
if (o0.as<Vec>().elementType() != opData.tA ||
|
||||||
uint32_t(o1.as<Vec>().elementType()) != opData.tB ||
|
o1.as<Vec>().elementType() != opData.tB ||
|
||||||
uint32_t(o2.as<Vec>().elementType()) != opData.tElement)
|
o2.as<Vec>().elementType() != opData.tElement)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t elementIndex = o2.as<Vec>().elementIndex();
|
uint32_t elementIndex = o2.as<Vec>().elementIndex();
|
||||||
@ -3949,13 +3871,13 @@ Case_BaseLdurStur:
|
|||||||
case InstDB::kEncodingSimdDup: SimdDup: {
|
case InstDB::kEncodingSimdDup: SimdDup: {
|
||||||
if (isign4 == ENC_OPS2(Reg, Reg)) {
|
if (isign4 == ENC_OPS2(Reg, Reg)) {
|
||||||
// Truth table of valid encodings of `Q:1|ElementType:3`
|
// Truth table of valid encodings of `Q:1|ElementType:3`
|
||||||
uint32_t kValidEncodings = B(uint32_t(VecElementType::kB) + 0) |
|
uint32_t kValidEncodings = B(Vec::kElementTypeB + 0) |
|
||||||
B(uint32_t(VecElementType::kH) + 0) |
|
B(Vec::kElementTypeH + 0) |
|
||||||
B(uint32_t(VecElementType::kS) + 0) |
|
B(Vec::kElementTypeS + 0) |
|
||||||
B(uint32_t(VecElementType::kB) + 8) |
|
B(Vec::kElementTypeB + 8) |
|
||||||
B(uint32_t(VecElementType::kH) + 8) |
|
B(Vec::kElementTypeH + 8) |
|
||||||
B(uint32_t(VecElementType::kS) + 8) |
|
B(Vec::kElementTypeS + 8) |
|
||||||
B(uint32_t(VecElementType::kD) + 8) ;
|
B(Vec::kElementTypeD + 8) ;
|
||||||
|
|
||||||
uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
|
uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
|
||||||
|
|
||||||
@ -3964,7 +3886,7 @@ Case_BaseLdurStur:
|
|||||||
//
|
//
|
||||||
// NOTE: This is only scalar for `dup d, x` case, otherwise the value
|
// NOTE: This is only scalar for `dup d, x` case, otherwise the value
|
||||||
// would be duplicated across all vector elements (1, 2, 4, 8, or 16).
|
// would be duplicated across all vector elements (1, 2, 4, 8, or 16).
|
||||||
uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
|
uint32_t elementType = o0.as<Vec>().elementType();
|
||||||
if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
|
if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
@ -3985,7 +3907,7 @@ Case_BaseLdurStur:
|
|||||||
// DUP - Vec (scalar) <- Vec[N].
|
// DUP - Vec (scalar) <- Vec[N].
|
||||||
uint32_t lsbIndex = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
|
uint32_t lsbIndex = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
|
||||||
|
|
||||||
if (lsbIndex != diff(o1.as<Vec>().elementType(), VecElementType::kB) || lsbIndex > 3)
|
if (lsbIndex != o1.as<Vec>().elementType() - Vec::kElementTypeB || lsbIndex > 3)
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
|
uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
|
||||||
@ -3998,7 +3920,7 @@ Case_BaseLdurStur:
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// DUP - Vec (all) <- Vec[N].
|
// DUP - Vec (all) <- Vec[N].
|
||||||
uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
|
uint32_t elementType = o0.as<Vec>().elementType();
|
||||||
if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
|
if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
@ -4023,7 +3945,7 @@ Case_BaseLdurStur:
|
|||||||
if (!o0.as<Vec>().hasElementIndex())
|
if (!o0.as<Vec>().hasElementIndex())
|
||||||
goto InvalidInstruction;
|
goto InvalidInstruction;
|
||||||
|
|
||||||
uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
|
uint32_t elementType = o0.as<Vec>().elementType();
|
||||||
uint32_t dstIndex = o0.as<Vec>().elementIndex();
|
uint32_t dstIndex = o0.as<Vec>().elementIndex();
|
||||||
uint32_t lsbIndex = elementType - 1u;
|
uint32_t lsbIndex = elementType - 1u;
|
||||||
|
|
||||||
@ -4192,6 +4114,7 @@ Case_BaseLdurStur:
|
|||||||
|
|
||||||
if (inverted) {
|
if (inverted) {
|
||||||
imm8 = ~imm8 & 0xFFu;
|
imm8 = ~imm8 & 0xFFu;
|
||||||
|
inverted = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmode = B(3) | B(2) | B(1);
|
cmode = B(3) | B(2) | B(1);
|
||||||
@ -4224,6 +4147,7 @@ Case_BaseLdurStur:
|
|||||||
case 3:
|
case 3:
|
||||||
if (inverted) {
|
if (inverted) {
|
||||||
imm8 = ~imm8 & 0xFFu;
|
imm8 = ~imm8 & 0xFFu;
|
||||||
|
inverted = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
op = 1;
|
op = 1;
|
||||||
@ -4511,7 +4435,7 @@ Case_BaseLdurStur:
|
|||||||
if (m.hasBaseReg()) {
|
if (m.hasBaseReg()) {
|
||||||
// [Base {Offset | Index}]
|
// [Base {Offset | Index}]
|
||||||
if (m.hasIndex()) {
|
if (m.hasIndex()) {
|
||||||
uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
|
uint32_t opt = armShiftOpToLdStOptMap[m.predicate()];
|
||||||
if (opt == 0xFFu)
|
if (opt == 0xFFu)
|
||||||
goto InvalidAddress;
|
goto InvalidAddress;
|
||||||
|
|
||||||
@ -4735,7 +4659,7 @@ Case_SimdLdurStur:
|
|||||||
uint32_t q = 0;
|
uint32_t q = 0;
|
||||||
uint32_t rm = 0;
|
uint32_t rm = 0;
|
||||||
uint32_t rn = m.baseId();
|
uint32_t rn = m.baseId();
|
||||||
uint32_t sz = diff(v.elementType(), VecElementType::kB);
|
uint32_t sz = v.elementType() - Vec::kElementTypeB;
|
||||||
uint32_t opcSsize = sz;
|
uint32_t opcSsize = sz;
|
||||||
uint32_t offsetPossibility = 0;
|
uint32_t offsetPossibility = 0;
|
||||||
|
|
||||||
@ -5167,10 +5091,6 @@ Error Assembler::align(AlignMode alignMode, uint32_t alignment) {
|
|||||||
|
|
||||||
Error Assembler::onAttach(CodeHolder* code) noexcept {
|
Error Assembler::onAttach(CodeHolder* code) noexcept {
|
||||||
ASMJIT_PROPAGATE(Base::onAttach(code));
|
ASMJIT_PROPAGATE(Base::onAttach(code));
|
||||||
|
|
||||||
_instructionAlignment = uint8_t(4);
|
|
||||||
assignEmitterFuncs(this);
|
|
||||||
|
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
deps/asmjit/src/asmjit/arm/a64assembler.h
vendored
13
deps/asmjit/src/asmjit/arm/a64assembler.h
vendored
@ -23,7 +23,7 @@ class ASMJIT_VIRTAPI Assembler
|
|||||||
public:
|
public:
|
||||||
typedef BaseAssembler Base;
|
typedef BaseAssembler Base;
|
||||||
|
|
||||||
//! \name Construction & Destruction
|
//! \name Construction / Destruction
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept;
|
ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept;
|
||||||
@ -31,6 +31,17 @@ public:
|
|||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
|
//! \name Accessors
|
||||||
|
//! \{
|
||||||
|
|
||||||
|
//! Gets whether the current ARM mode is THUMB (alternative to 32-bit ARM encoding).
|
||||||
|
ASMJIT_INLINE_NODEBUG bool isInThumbMode() const noexcept { return _environment.isArchThumb(); }
|
||||||
|
|
||||||
|
//! Gets the current code alignment of the current mode (ARM vs THUMB).
|
||||||
|
ASMJIT_INLINE_NODEBUG uint32_t codeAlignment() const noexcept { return isInThumbMode() ? 2 : 4; }
|
||||||
|
|
||||||
|
//! \}
|
||||||
|
|
||||||
//! \name Emit
|
//! \name Emit
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
|
10
deps/asmjit/src/asmjit/arm/a64builder.cpp
vendored
10
deps/asmjit/src/asmjit/arm/a64builder.cpp
vendored
@ -17,6 +17,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|||||||
|
|
||||||
Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
|
Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
|
||||||
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
||||||
|
assignEmitterFuncs(this);
|
||||||
|
|
||||||
if (code)
|
if (code)
|
||||||
code->attach(this);
|
code->attach(this);
|
||||||
}
|
}
|
||||||
@ -26,19 +28,13 @@ Builder::~Builder() noexcept {}
|
|||||||
// =====================
|
// =====================
|
||||||
|
|
||||||
Error Builder::onAttach(CodeHolder* code) noexcept {
|
Error Builder::onAttach(CodeHolder* code) noexcept {
|
||||||
ASMJIT_PROPAGATE(Base::onAttach(code));
|
return Base::onAttach(code);
|
||||||
|
|
||||||
_instructionAlignment = uint8_t(4);
|
|
||||||
assignEmitterFuncs(this);
|
|
||||||
|
|
||||||
return kErrorOk;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Error Builder::onDetach(CodeHolder* code) noexcept {
|
Error Builder::onDetach(CodeHolder* code) noexcept {
|
||||||
return Base::onDetach(code);
|
return Base::onDetach(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// a64::Builder - Finalize
|
// a64::Builder - Finalize
|
||||||
// =======================
|
// =======================
|
||||||
|
|
||||||
|
5
deps/asmjit/src/asmjit/arm/a64compiler.cpp
vendored
5
deps/asmjit/src/asmjit/arm/a64compiler.cpp
vendored
@ -18,6 +18,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|||||||
|
|
||||||
Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
|
Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
|
||||||
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
_archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
|
||||||
|
assignEmitterFuncs(this);
|
||||||
|
|
||||||
if (code)
|
if (code)
|
||||||
code->attach(this);
|
code->attach(this);
|
||||||
}
|
}
|
||||||
@ -35,9 +37,6 @@ Error Compiler::onAttach(CodeHolder* code) noexcept {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
_instructionAlignment = uint8_t(4);
|
|
||||||
assignEmitterFuncs(this);
|
|
||||||
|
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
deps/asmjit/src/asmjit/arm/a64compiler.h
vendored
21
deps/asmjit/src/asmjit/arm/a64compiler.h
vendored
@ -45,27 +45,20 @@ public:
|
|||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RegT, typename Type>
|
|
||||||
ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s) {
|
|
||||||
#ifndef ASMJIT_NO_LOGGING
|
|
||||||
RegT reg(Globals::NoInit);
|
|
||||||
_newReg(®, type, s);
|
|
||||||
return reg;
|
|
||||||
#else
|
|
||||||
DebugUtils::unused(s);
|
|
||||||
return _newRegInternal<RegT>(type);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename RegT, typename Type, typename... Args>
|
template<typename RegT, typename Type, typename... Args>
|
||||||
ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s, Args&&... args) {
|
ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s, Args&&... args) {
|
||||||
#ifndef ASMJIT_NO_LOGGING
|
#ifndef ASMJIT_NO_LOGGING
|
||||||
RegT reg(Globals::NoInit);
|
RegT reg(Globals::NoInit);
|
||||||
_newRegFmt(®, type, s, std::forward<Args>(args)...);
|
if (sizeof...(Args) == 0)
|
||||||
|
_newReg(®, type, s);
|
||||||
|
else
|
||||||
|
_newRegFmt(®, type, s, std::forward<Args>(args)...);
|
||||||
return reg;
|
return reg;
|
||||||
#else
|
#else
|
||||||
DebugUtils::unused(s, std::forward<Args>(args)...);
|
DebugUtils::unused(s, std::forward<Args>(args)...);
|
||||||
return _newRegInternal<RegT>(type);
|
RegT reg(Globals::NoInit);
|
||||||
|
_newReg(®, type, nullptr);
|
||||||
|
return reg;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
14
deps/asmjit/src/asmjit/arm/a64emithelper.cpp
vendored
14
deps/asmjit/src/asmjit/arm/a64emithelper.cpp
vendored
@ -169,7 +169,7 @@ Error EmitHelper::emitArgMove(
|
|||||||
|
|
||||||
if (TypeUtils::isInt(dstTypeId)) {
|
if (TypeUtils::isInt(dstTypeId)) {
|
||||||
if (TypeUtils::isInt(srcTypeId)) {
|
if (TypeUtils::isInt(srcTypeId)) {
|
||||||
uint32_t x = uint32_t(dstSize == 8);
|
uint32_t x = dstSize == 8;
|
||||||
|
|
||||||
dst.setSignature(OperandSignature{x ? uint32_t(GpX::kSignature) : uint32_t(GpW::kSignature)});
|
dst.setSignature(OperandSignature{x ? uint32_t(GpX::kSignature) : uint32_t(GpW::kSignature)});
|
||||||
_emitter->setInlineComment(comment);
|
_emitter->setInlineComment(comment);
|
||||||
@ -186,7 +186,7 @@ Error EmitHelper::emitArgMove(
|
|||||||
case TypeId::kInt16: instId = Inst::kIdLdrsh; break;
|
case TypeId::kInt16: instId = Inst::kIdLdrsh; break;
|
||||||
case TypeId::kUInt16: instId = Inst::kIdLdrh; break;
|
case TypeId::kUInt16: instId = Inst::kIdLdrh; break;
|
||||||
case TypeId::kInt32: instId = x ? Inst::kIdLdrsw : Inst::kIdLdr; break;
|
case TypeId::kInt32: instId = x ? Inst::kIdLdrsw : Inst::kIdLdr; break;
|
||||||
case TypeId::kUInt32: instId = Inst::kIdLdr; break;
|
case TypeId::kUInt32: instId = Inst::kIdLdr; x = 0; break;
|
||||||
case TypeId::kInt64: instId = Inst::kIdLdr; break;
|
case TypeId::kInt64: instId = Inst::kIdLdr; break;
|
||||||
case TypeId::kUInt64: instId = Inst::kIdLdr; break;
|
case TypeId::kUInt64: instId = Inst::kIdLdr; break;
|
||||||
default:
|
default:
|
||||||
@ -312,12 +312,6 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
|
|||||||
{ Inst::kIdStr_v, Inst::kIdStp_v }
|
{ Inst::kIdStr_v, Inst::kIdStp_v }
|
||||||
}};
|
}};
|
||||||
|
|
||||||
// Emit: 'bti' (indirect branch protection).
|
|
||||||
if (frame.hasIndirectBranchProtection()) {
|
|
||||||
// TODO: The instruction is not available at the moment (would be ABI break).
|
|
||||||
// ASMJIT_PROPAGATE(emitter->bti());
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t adjustInitialOffset = pei.sizeTotal;
|
uint32_t adjustInitialOffset = pei.sizeTotal;
|
||||||
|
|
||||||
for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
|
for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
|
||||||
@ -345,7 +339,7 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
|
|||||||
else
|
else
|
||||||
ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
|
ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
|
||||||
|
|
||||||
mem.resetOffsetMode();
|
mem.resetToFixedOffset();
|
||||||
|
|
||||||
if (i == 0 && frame.hasPreservedFP()) {
|
if (i == 0 && frame.hasPreservedFP()) {
|
||||||
ASMJIT_PROPAGATE(emitter->mov(x29, sp));
|
ASMJIT_PROPAGATE(emitter->mov(x29, sp));
|
||||||
@ -427,7 +421,7 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) {
|
|||||||
else
|
else
|
||||||
ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
|
ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
|
||||||
|
|
||||||
mem.resetOffsetMode();
|
mem.resetToFixedOffset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
19
deps/asmjit/src/asmjit/arm/a64emitter.h
vendored
19
deps/asmjit/src/asmjit/arm/a64emitter.h
vendored
@ -71,7 +71,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|||||||
//! ARM emitter.
|
//! ARM emitter.
|
||||||
//!
|
//!
|
||||||
//! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
|
//! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
|
||||||
//! \ref Assembler, \ref Builder, or \ref Compiler (use with caution with \ref Compiler as it expects virtual
|
//! \ref Assembler, \ref Builder, or \ref Compiler (use withcaution with \ref Compiler as it expects virtual
|
||||||
//! registers to be used).
|
//! registers to be used).
|
||||||
template<typename This>
|
template<typename This>
|
||||||
struct EmitterExplicitT {
|
struct EmitterExplicitT {
|
||||||
@ -79,22 +79,11 @@ struct EmitterExplicitT {
|
|||||||
|
|
||||||
// These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
|
// These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
|
||||||
// I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
|
// I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
|
||||||
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG This* _emitter() noexcept { return static_cast<This*>(this); }
|
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline This* _emitter() noexcept { return static_cast<This*>(this); }
|
||||||
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG const This* _emitter() const noexcept { return static_cast<const This*>(this); }
|
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline const This* _emitter() const noexcept { return static_cast<const This*>(this); }
|
||||||
|
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
|
||||||
|
|
||||||
//! \name Native Registers
|
|
||||||
//! \{
|
|
||||||
|
|
||||||
//! Returns either 32-bit or 64-bit GP register of the given `id` depending on the emitter's architecture.
|
|
||||||
inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gpSignature, id); }
|
|
||||||
//! Clones the given `reg` to either 32-bit or 64-bit GP register depending on the emitter's architecture.
|
|
||||||
inline Gp gpz(const Gp& reg) const noexcept { return Gp(_emitter()->_gpSignature, reg.id()); }
|
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
//! \name General Purpose Instructions
|
//! \name General Purpose Instructions
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
@ -525,8 +514,6 @@ struct EmitterExplicitT {
|
|||||||
ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem)
|
ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem)
|
||||||
ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem)
|
ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem)
|
||||||
|
|
||||||
ASMJIT_INST_2x(prfm, Prfm, Imm, Mem)
|
|
||||||
|
|
||||||
ASMJIT_INST_2x(stadd, Stadd, Gp, Mem)
|
ASMJIT_INST_2x(stadd, Stadd, Gp, Mem)
|
||||||
ASMJIT_INST_2x(staddb, Staddb, Gp, Mem)
|
ASMJIT_INST_2x(staddb, Staddb, Gp, Mem)
|
||||||
ASMJIT_INST_2x(staddh, Staddh, Gp, Mem)
|
ASMJIT_INST_2x(staddh, Staddh, Gp, Mem)
|
||||||
|
6
deps/asmjit/src/asmjit/arm/a64formatter.cpp
vendored
6
deps/asmjit/src/asmjit/arm/a64formatter.cpp
vendored
@ -29,10 +29,12 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
|
|||||||
Arch arch,
|
Arch arch,
|
||||||
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
|
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
|
||||||
|
|
||||||
|
DebugUtils::unused(arch);
|
||||||
|
|
||||||
// Format instruction options and instruction mnemonic.
|
// Format instruction options and instruction mnemonic.
|
||||||
InstId instId = inst.realId();
|
InstId instId = inst.realId();
|
||||||
if (instId != Inst::kIdNone && instId < Inst::_kIdCount)
|
if (instId < Inst::_kIdCount)
|
||||||
ASMJIT_PROPAGATE(InstInternal::instIdToString(instId, sb));
|
ASMJIT_PROPAGATE(InstInternal::instIdToString(arch, instId, sb));
|
||||||
else
|
else
|
||||||
ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
|
ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
|
||||||
|
|
||||||
|
25
deps/asmjit/src/asmjit/arm/a64func.cpp
vendored
25
deps/asmjit/src/asmjit/arm/a64func.cpp
vendored
@ -41,13 +41,12 @@ static RegType regTypeFromFpOrVecTypeId(TypeId typeId) noexcept {
|
|||||||
|
|
||||||
ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
|
ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
|
||||||
cc.setArch(environment.arch());
|
cc.setArch(environment.arch());
|
||||||
cc.setStrategy(environment.isDarwin() ? CallConvStrategy::kAArch64Apple : CallConvStrategy::kDefault);
|
|
||||||
|
|
||||||
cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
|
cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
|
||||||
cc.setSaveRestoreRegSize(RegGroup::kVec, 8);
|
cc.setSaveRestoreRegSize(RegGroup::kVec, 8);
|
||||||
cc.setSaveRestoreAlignment(RegGroup::kGp, 16);
|
cc.setSaveRestoreAlignment(RegGroup::kGp, 16);
|
||||||
cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
|
cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
|
||||||
cc.setSaveRestoreAlignment(RegGroup::kMask, 1);
|
cc.setSaveRestoreAlignment(RegGroup::kExtraVirt2, 1);
|
||||||
cc.setSaveRestoreAlignment(RegGroup::kExtraVirt3, 1);
|
cc.setSaveRestoreAlignment(RegGroup::kExtraVirt3, 1);
|
||||||
cc.setPassedOrder(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7);
|
cc.setPassedOrder(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7);
|
||||||
cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
|
cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
|
||||||
@ -69,7 +68,7 @@ ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Enviro
|
|||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept {
|
ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept {
|
||||||
DebugUtils::unused(signature);
|
DebugUtils::unused(signature);
|
||||||
|
|
||||||
const CallConv& cc = func.callConv();
|
const CallConv& cc = func.callConv();
|
||||||
@ -78,13 +77,6 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si
|
|||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t argCount = func.argCount();
|
uint32_t argCount = func.argCount();
|
||||||
|
|
||||||
// Minimum stack size of a single argument passed via stack. The standard AArch64 calling convention
|
|
||||||
// specifies 8 bytes, so each function argument would occupy at least 8 bytes even if it needs less.
|
|
||||||
// However, Apple has decided to not follow this rule and function argument can occupy less, for
|
|
||||||
// example two consecutive 32-bit arguments would occupy 8 bytes total, instead of 16 as specified
|
|
||||||
// by ARM.
|
|
||||||
uint32_t minStackArgSize = cc.strategy() == CallConvStrategy::kAArch64Apple ? 4u : 8u;
|
|
||||||
|
|
||||||
if (func.hasRet()) {
|
if (func.hasRet()) {
|
||||||
for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
|
for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
|
||||||
TypeId typeId = func._rets[valueIndex].typeId();
|
TypeId typeId = func._rets[valueIndex].typeId();
|
||||||
@ -127,8 +119,7 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (cc.strategy()) {
|
switch (cc.strategy()) {
|
||||||
case CallConvStrategy::kDefault:
|
case CallConvStrategy::kDefault: {
|
||||||
case CallConvStrategy::kAArch64Apple: {
|
|
||||||
uint32_t gpzPos = 0;
|
uint32_t gpzPos = 0;
|
||||||
uint32_t vecPos = 0;
|
uint32_t vecPos = 0;
|
||||||
|
|
||||||
@ -149,9 +140,7 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si
|
|||||||
gpzPos++;
|
gpzPos++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), minStackArgSize);
|
uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), registerSize);
|
||||||
if (size >= 8)
|
|
||||||
stackOffset = Support::alignUp(stackOffset, 8);
|
|
||||||
arg.assignStackOffset(int32_t(stackOffset));
|
arg.assignStackOffset(int32_t(stackOffset));
|
||||||
stackOffset += size;
|
stackOffset += size;
|
||||||
}
|
}
|
||||||
@ -175,9 +164,7 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si
|
|||||||
vecPos++;
|
vecPos++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), minStackArgSize);
|
uint32_t size = TypeUtils::sizeOf(typeId);
|
||||||
if (size >= 8)
|
|
||||||
stackOffset = Support::alignUp(stackOffset, 8);
|
|
||||||
arg.assignStackOffset(int32_t(stackOffset));
|
arg.assignStackOffset(int32_t(stackOffset));
|
||||||
stackOffset += size;
|
stackOffset += size;
|
||||||
}
|
}
|
||||||
@ -191,7 +178,7 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si
|
|||||||
return DebugUtils::errored(kErrorInvalidState);
|
return DebugUtils::errored(kErrorInvalidState);
|
||||||
}
|
}
|
||||||
|
|
||||||
func._argStackSize = Support::alignUp(stackOffset, 8u);
|
func._argStackSize = stackOffset;
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
deps/asmjit/src/asmjit/arm/a64func_p.h
vendored
2
deps/asmjit/src/asmjit/arm/a64func_p.h
vendored
@ -21,7 +21,7 @@ namespace FuncInternal {
|
|||||||
Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
|
Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
|
||||||
|
|
||||||
//! Initialize `FuncDetail` (AArch64 specific).
|
//! Initialize `FuncDetail` (AArch64 specific).
|
||||||
Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept;
|
Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept;
|
||||||
|
|
||||||
} // {FuncInternal}
|
} // {FuncInternal}
|
||||||
|
|
||||||
|
4
deps/asmjit/src/asmjit/arm/a64globals.h
vendored
4
deps/asmjit/src/asmjit/arm/a64globals.h
vendored
@ -15,6 +15,9 @@
|
|||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
||||||
|
|
||||||
|
// a64 uses everything from arm namespace and adds into it.
|
||||||
|
using namespace arm;
|
||||||
|
|
||||||
//! \addtogroup asmjit_a64
|
//! \addtogroup asmjit_a64
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
@ -290,7 +293,6 @@ struct Inst {
|
|||||||
kIdPacdza, //!< Instruction 'pacdza'.
|
kIdPacdza, //!< Instruction 'pacdza'.
|
||||||
kIdPacdzb, //!< Instruction 'pacdzb'.
|
kIdPacdzb, //!< Instruction 'pacdzb'.
|
||||||
kIdPacga, //!< Instruction 'pacga'.
|
kIdPacga, //!< Instruction 'pacga'.
|
||||||
kIdPrfm, //!< Instruction 'prfm'.
|
|
||||||
kIdPssbb, //!< Instruction 'pssbb'.
|
kIdPssbb, //!< Instruction 'pssbb'.
|
||||||
kIdRbit, //!< Instruction 'rbit'.
|
kIdRbit, //!< Instruction 'rbit'.
|
||||||
kIdRet, //!< Instruction 'ret'.
|
kIdRet, //!< Instruction 'ret'.
|
||||||
|
80
deps/asmjit/src/asmjit/arm/a64instapi.cpp
vendored
80
deps/asmjit/src/asmjit/arm/a64instapi.cpp
vendored
@ -15,22 +15,65 @@
|
|||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
||||||
|
|
||||||
namespace InstInternal {
|
|
||||||
|
|
||||||
// a64::InstInternal - Text
|
// a64::InstInternal - Text
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_TEXT
|
#ifndef ASMJIT_NO_TEXT
|
||||||
Error instIdToString(InstId instId, String& output) noexcept {
|
Error InstInternal::instIdToString(Arch arch, InstId instId, String& output) noexcept {
|
||||||
uint32_t realId = instId & uint32_t(InstIdParts::kRealId);
|
uint32_t realId = instId & uint32_t(InstIdParts::kRealId);
|
||||||
|
DebugUtils::unused(arch);
|
||||||
|
|
||||||
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
|
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
|
||||||
return DebugUtils::errored(kErrorInvalidInstruction);
|
return DebugUtils::errored(kErrorInvalidInstruction);
|
||||||
|
|
||||||
return InstNameUtils::decode(output, InstDB::_instNameIndexTable[realId], InstDB::_instNameStringTable);
|
|
||||||
|
char nameData[32];
|
||||||
|
size_t nameSize = Support::decodeInstName(nameData, InstDB::_instNameIndexTable[realId], InstDB::_instNameStringTable);
|
||||||
|
|
||||||
|
return output.append(nameData, nameSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
InstId stringToInstId(const char* s, size_t len) noexcept {
|
InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexcept {
|
||||||
return InstNameUtils::find(s, len, InstDB::instNameIndex, InstDB::_instNameIndexTable, InstDB::_instNameStringTable);
|
DebugUtils::unused(arch);
|
||||||
|
|
||||||
|
if (ASMJIT_UNLIKELY(!s))
|
||||||
|
return Inst::kIdNone;
|
||||||
|
|
||||||
|
if (len == SIZE_MAX)
|
||||||
|
len = strlen(s);
|
||||||
|
|
||||||
|
if (ASMJIT_UNLIKELY(len == 0 || len > InstDB::kMaxNameSize))
|
||||||
|
return Inst::kIdNone;
|
||||||
|
|
||||||
|
uint32_t prefix = uint32_t(s[0]) - 'a';
|
||||||
|
if (ASMJIT_UNLIKELY(prefix > 'z' - 'a'))
|
||||||
|
return Inst::kIdNone;
|
||||||
|
|
||||||
|
size_t base = InstDB::instNameIndex[prefix].start;
|
||||||
|
size_t end = InstDB::instNameIndex[prefix].end;
|
||||||
|
|
||||||
|
if (ASMJIT_UNLIKELY(!base))
|
||||||
|
return Inst::kIdNone;
|
||||||
|
|
||||||
|
char nameData[32];
|
||||||
|
for (size_t lim = end - base; lim != 0; lim >>= 1) {
|
||||||
|
size_t instId = base + (lim >> 1);
|
||||||
|
size_t nameSize = Support::decodeInstName(nameData, InstDB::_instNameIndexTable[instId], InstDB::_instNameStringTable);
|
||||||
|
|
||||||
|
int result = Support::compareStringViews(s, len, nameData, nameSize);
|
||||||
|
if (result < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
base = instId + 1;
|
||||||
|
lim--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return InstId(instId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Inst::kIdNone;
|
||||||
}
|
}
|
||||||
#endif // !ASMJIT_NO_TEXT
|
#endif // !ASMJIT_NO_TEXT
|
||||||
|
|
||||||
@ -38,9 +81,9 @@ InstId stringToInstId(const char* s, size_t len) noexcept {
|
|||||||
// ============================
|
// ============================
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_VALIDATION
|
#ifndef ASMJIT_NO_VALIDATION
|
||||||
ASMJIT_FAVOR_SIZE Error validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
|
ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
|
||||||
// TODO:
|
// TODO:
|
||||||
DebugUtils::unused(inst, operands, opCount, validationFlags);
|
DebugUtils::unused(arch, inst, operands, opCount, validationFlags);
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
#endif // !ASMJIT_NO_VALIDATION
|
#endif // !ASMJIT_NO_VALIDATION
|
||||||
@ -84,7 +127,13 @@ static const InstRWInfoData instRWInfoData[] = {
|
|||||||
|
|
||||||
static const uint8_t elementTypeSize[8] = { 0, 1, 2, 4, 8, 4, 4, 0 };
|
static const uint8_t elementTypeSize[8] = { 0, 1, 2, 4, 8, 4, 4, 0 };
|
||||||
|
|
||||||
Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
|
Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
|
||||||
|
// Unused in Release configuration as the assert is not compiled in.
|
||||||
|
DebugUtils::unused(arch);
|
||||||
|
|
||||||
|
// Only called when `arch` matches X86 family.
|
||||||
|
ASMJIT_ASSERT(Environment::isFamilyARM(arch));
|
||||||
|
|
||||||
// Get the instruction data.
|
// Get the instruction data.
|
||||||
uint32_t realId = inst.id() & uint32_t(InstIdParts::kRealId);
|
uint32_t realId = inst.id() & uint32_t(InstIdParts::kRealId);
|
||||||
|
|
||||||
@ -174,10 +223,10 @@ Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount
|
|||||||
if (srcOp.isReg()) {
|
if (srcOp.isReg()) {
|
||||||
if (srcOp.as<Vec>().hasElementIndex()) {
|
if (srcOp.as<Vec>().hasElementIndex()) {
|
||||||
// Only part of the vector is accessed if element index [] is used.
|
// Only part of the vector is accessed if element index [] is used.
|
||||||
VecElementType elementType = srcOp.as<Vec>().elementType();
|
uint32_t elementType = srcOp.as<Vec>().elementType();
|
||||||
uint32_t elementIndex = srcOp.as<Vec>().elementIndex();
|
uint32_t elementIndex = srcOp.as<Vec>().elementIndex();
|
||||||
|
|
||||||
uint32_t elementSize = elementTypeSize[size_t(elementType)];
|
uint32_t elementSize = elementTypeSize[elementType];
|
||||||
uint64_t accessMask = uint64_t(Support::lsbMask<uint32_t>(elementSize)) << (elementIndex * elementSize);
|
uint64_t accessMask = uint64_t(Support::lsbMask<uint32_t>(elementSize)) << (elementIndex * elementSize);
|
||||||
|
|
||||||
op._readByteMask &= accessMask;
|
op._readByteMask &= accessMask;
|
||||||
@ -194,7 +243,8 @@ Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (memOp.hasIndex()) {
|
if (memOp.hasIndex()) {
|
||||||
op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexRW : OpRWFlags::kMemIndexRead);
|
op.addOpFlags(OpRWFlags::kMemIndexRead);
|
||||||
|
op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexWrite : OpRWFlags::kNone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,15 +258,13 @@ Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount
|
|||||||
// =================================
|
// =================================
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_INTROSPECTION
|
#ifndef ASMJIT_NO_INTROSPECTION
|
||||||
Error queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
|
Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
|
||||||
// TODO: [ARM] QueryFeatures not implemented yet.
|
// TODO: [ARM] QueryFeatures not implemented yet.
|
||||||
DebugUtils::unused(inst, operands, opCount, out);
|
DebugUtils::unused(arch, inst, operands, opCount, out);
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
#endif // !ASMJIT_NO_INTROSPECTION
|
#endif // !ASMJIT_NO_INTROSPECTION
|
||||||
|
|
||||||
} // {InstInternal}
|
|
||||||
|
|
||||||
// a64::InstInternal - Unit
|
// a64::InstInternal - Unit
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
|
10
deps/asmjit/src/asmjit/arm/a64instapi_p.h
vendored
10
deps/asmjit/src/asmjit/arm/a64instapi_p.h
vendored
@ -18,17 +18,17 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|||||||
namespace InstInternal {
|
namespace InstInternal {
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_TEXT
|
#ifndef ASMJIT_NO_TEXT
|
||||||
Error ASMJIT_CDECL instIdToString(InstId instId, String& output) noexcept;
|
Error ASMJIT_CDECL instIdToString(Arch arch, InstId instId, String& output) noexcept;
|
||||||
InstId ASMJIT_CDECL stringToInstId(const char* s, size_t len) noexcept;
|
InstId ASMJIT_CDECL stringToInstId(Arch arch, const char* s, size_t len) noexcept;
|
||||||
#endif // !ASMJIT_NO_TEXT
|
#endif // !ASMJIT_NO_TEXT
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_VALIDATION
|
#ifndef ASMJIT_NO_VALIDATION
|
||||||
Error ASMJIT_CDECL validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
|
Error ASMJIT_CDECL validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
|
||||||
#endif // !ASMJIT_NO_VALIDATION
|
#endif // !ASMJIT_NO_VALIDATION
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_INTROSPECTION
|
#ifndef ASMJIT_NO_INTROSPECTION
|
||||||
Error ASMJIT_CDECL queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
|
Error ASMJIT_CDECL queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
|
||||||
Error ASMJIT_CDECL queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
|
Error ASMJIT_CDECL queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
|
||||||
#endif // !ASMJIT_NO_INTROSPECTION
|
#endif // !ASMJIT_NO_INTROSPECTION
|
||||||
|
|
||||||
} // {InstInternal}
|
} // {InstInternal}
|
||||||
|
1078
deps/asmjit/src/asmjit/arm/a64instdb.cpp
vendored
1078
deps/asmjit/src/asmjit/arm/a64instdb.cpp
vendored
File diff suppressed because it is too large
Load Diff
2
deps/asmjit/src/asmjit/arm/a64instdb.h
vendored
2
deps/asmjit/src/asmjit/arm/a64instdb.h
vendored
@ -29,7 +29,7 @@ enum InstFlags : uint32_t {
|
|||||||
//! SIMD element access of half-words can only be used with v0..15.
|
//! SIMD element access of half-words can only be used with v0..15.
|
||||||
kInstFlagVH0_15 = 0x00000010u,
|
kInstFlagVH0_15 = 0x00000010u,
|
||||||
|
|
||||||
//! Instruction uses consecutive registers if the number of operands is greater than 2.
|
//! Instruction may consecutive registers if the number of operands is greater than 2.
|
||||||
kInstFlagConsecutive = 0x00000080u
|
kInstFlagConsecutive = 0x00000080u
|
||||||
};
|
};
|
||||||
|
|
||||||
|
44
deps/asmjit/src/asmjit/arm/a64instdb_p.h
vendored
44
deps/asmjit/src/asmjit/arm/a64instdb_p.h
vendored
@ -7,7 +7,6 @@
|
|||||||
#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
|
#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
|
||||||
|
|
||||||
#include "../core/codeholder.h"
|
#include "../core/codeholder.h"
|
||||||
#include "../core/instdb_p.h"
|
|
||||||
#include "../arm/a64instdb.h"
|
#include "../arm/a64instdb.h"
|
||||||
#include "../arm/a64operand.h"
|
#include "../arm/a64operand.h"
|
||||||
|
|
||||||
@ -59,14 +58,14 @@ enum RWInfoType : uint32_t {
|
|||||||
// a64::InstDB - ElementType
|
// a64::InstDB - ElementType
|
||||||
// =========================
|
// =========================
|
||||||
|
|
||||||
enum InstElementType : uint8_t {
|
enum ElementType : uint8_t {
|
||||||
kET_None = uint8_t(VecElementType::kNone),
|
kET_None = Vec::kElementTypeNone,
|
||||||
kET_B = uint8_t(VecElementType::kB),
|
kET_B = Vec::kElementTypeB,
|
||||||
kET_H = uint8_t(VecElementType::kH),
|
kET_H = Vec::kElementTypeH,
|
||||||
kET_S = uint8_t(VecElementType::kS),
|
kET_S = Vec::kElementTypeS,
|
||||||
kET_D = uint8_t(VecElementType::kD),
|
kET_D = Vec::kElementTypeD,
|
||||||
kET_2H = uint8_t(VecElementType::kH2),
|
kET_2H = Vec::kElementTypeH2,
|
||||||
kET_4B = uint8_t(VecElementType::kB4)
|
kET_4B = Vec::kElementTypeB4
|
||||||
};
|
};
|
||||||
|
|
||||||
// a64::InstDB - GpType
|
// a64::InstDB - GpType
|
||||||
@ -193,7 +192,6 @@ enum EncodingId : uint32_t {
|
|||||||
kEncodingBaseMvnNeg,
|
kEncodingBaseMvnNeg,
|
||||||
kEncodingBaseOp,
|
kEncodingBaseOp,
|
||||||
kEncodingBaseOpImm,
|
kEncodingBaseOpImm,
|
||||||
kEncodingBasePrfm,
|
|
||||||
kEncodingBaseR,
|
kEncodingBaseR,
|
||||||
kEncodingBaseRM_NoImm,
|
kEncodingBaseRM_NoImm,
|
||||||
kEncodingBaseRM_SImm10,
|
kEncodingBaseRM_SImm10,
|
||||||
@ -414,13 +412,6 @@ struct BaseRM_SImm10 {
|
|||||||
uint32_t immShift : 4;
|
uint32_t immShift : 4;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BasePrfm {
|
|
||||||
uint32_t registerOp : 11;
|
|
||||||
uint32_t sOffsetOp : 10;
|
|
||||||
uint32_t uOffsetOp : 11;
|
|
||||||
uint32_t literalOp;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BaseLdSt {
|
struct BaseLdSt {
|
||||||
uint32_t uOffsetOp : 10;
|
uint32_t uOffsetOp : 10;
|
||||||
uint32_t prePostOp : 11;
|
uint32_t prePostOp : 11;
|
||||||
@ -796,7 +787,6 @@ extern const BaseMovKNZ baseMovKNZ[3];
|
|||||||
extern const BaseMvnNeg baseMvnNeg[3];
|
extern const BaseMvnNeg baseMvnNeg[3];
|
||||||
extern const BaseOp baseOp[23];
|
extern const BaseOp baseOp[23];
|
||||||
extern const BaseOpImm baseOpImm[14];
|
extern const BaseOpImm baseOpImm[14];
|
||||||
extern const BasePrfm basePrfm[1];
|
|
||||||
extern const BaseR baseR[10];
|
extern const BaseR baseR[10];
|
||||||
extern const BaseRM_NoImm baseRM_NoImm[21];
|
extern const BaseRM_NoImm baseRM_NoImm[21];
|
||||||
extern const BaseRM_SImm10 baseRM_SImm10[2];
|
extern const BaseRM_SImm10 baseRM_SImm10[2];
|
||||||
@ -853,13 +843,27 @@ extern const SimdTblTbx simdTblTbx[2];
|
|||||||
|
|
||||||
} // {EncodingData}
|
} // {EncodingData}
|
||||||
|
|
||||||
|
// a64::InstDB - InstNameIndex
|
||||||
|
// ===========================
|
||||||
|
|
||||||
|
// ${NameLimits:Begin}
|
||||||
|
// ------------------- Automatically generated, do not edit -------------------
|
||||||
|
enum : uint32_t { kMaxNameSize = 9 };
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ${NameLimits:End}
|
||||||
|
|
||||||
|
struct InstNameIndex {
|
||||||
|
uint16_t start;
|
||||||
|
uint16_t end;
|
||||||
|
};
|
||||||
|
|
||||||
// a64::InstDB - Tables
|
// a64::InstDB - Tables
|
||||||
// ====================
|
// ====================
|
||||||
|
|
||||||
#ifndef ASMJIT_NO_TEXT
|
#ifndef ASMJIT_NO_TEXT
|
||||||
extern const InstNameIndex instNameIndex;
|
|
||||||
extern const char _instNameStringTable[];
|
|
||||||
extern const uint32_t _instNameIndexTable[];
|
extern const uint32_t _instNameIndexTable[];
|
||||||
|
extern const char _instNameStringTable[];
|
||||||
|
extern const InstNameIndex instNameIndex[26];
|
||||||
#endif // !ASMJIT_NO_TEXT
|
#endif // !ASMJIT_NO_TEXT
|
||||||
|
|
||||||
} // {InstDB}
|
} // {InstDB}
|
||||||
|
6
deps/asmjit/src/asmjit/arm/a64operand.cpp
vendored
6
deps/asmjit/src/asmjit/arm/a64operand.cpp
vendored
@ -56,7 +56,7 @@ UNIT(a64_operand) {
|
|||||||
EXPECT_EQ(vd_1.group(), RegGroup::kVec);
|
EXPECT_EQ(vd_1.group(), RegGroup::kVec);
|
||||||
EXPECT_EQ(vd_1.id(), 15u);
|
EXPECT_EQ(vd_1.id(), 15u);
|
||||||
EXPECT_TRUE(vd_1.isVecD2());
|
EXPECT_TRUE(vd_1.isVecD2());
|
||||||
EXPECT_EQ(vd_1.elementType(), VecElementType::kD);
|
EXPECT_EQ(vd_1.elementType(), Vec::kElementTypeD);
|
||||||
EXPECT_TRUE(vd_1.hasElementIndex());
|
EXPECT_TRUE(vd_1.hasElementIndex());
|
||||||
EXPECT_EQ(vd_1.elementIndex(), 1u);
|
EXPECT_EQ(vd_1.elementIndex(), 1u);
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ UNIT(a64_operand) {
|
|||||||
EXPECT_EQ(vs_3.group(), RegGroup::kVec);
|
EXPECT_EQ(vs_3.group(), RegGroup::kVec);
|
||||||
EXPECT_EQ(vs_3.id(), 15u);
|
EXPECT_EQ(vs_3.id(), 15u);
|
||||||
EXPECT_TRUE(vs_3.isVecS4());
|
EXPECT_TRUE(vs_3.isVecS4());
|
||||||
EXPECT_EQ(vs_3.elementType(), VecElementType::kS);
|
EXPECT_EQ(vs_3.elementType(), Vec::kElementTypeS);
|
||||||
EXPECT_TRUE(vs_3.hasElementIndex());
|
EXPECT_TRUE(vs_3.hasElementIndex());
|
||||||
EXPECT_EQ(vs_3.elementIndex(), 3u);
|
EXPECT_EQ(vs_3.elementIndex(), 3u);
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ UNIT(a64_operand) {
|
|||||||
EXPECT_EQ(vb_4.group(), RegGroup::kVec);
|
EXPECT_EQ(vb_4.group(), RegGroup::kVec);
|
||||||
EXPECT_EQ(vb_4.id(), 15u);
|
EXPECT_EQ(vb_4.id(), 15u);
|
||||||
EXPECT_TRUE(vb_4.isVecB4x4());
|
EXPECT_TRUE(vb_4.isVecB4x4());
|
||||||
EXPECT_EQ(vb_4.elementType(), VecElementType::kB4);
|
EXPECT_EQ(vb_4.elementType(), Vec::kElementTypeB4);
|
||||||
EXPECT_TRUE(vb_4.hasElementIndex());
|
EXPECT_TRUE(vb_4.hasElementIndex());
|
||||||
EXPECT_EQ(vb_4.elementIndex(), 3u);
|
EXPECT_EQ(vb_4.elementIndex(), 3u);
|
||||||
}
|
}
|
||||||
|
362
deps/asmjit/src/asmjit/arm/a64operand.h
vendored
362
deps/asmjit/src/asmjit/arm/a64operand.h
vendored
@ -13,276 +13,24 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|||||||
//! \addtogroup asmjit_a64
|
//! \addtogroup asmjit_a64
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
class GpW;
|
using arm::Reg;
|
||||||
class GpX;
|
using arm::Mem;
|
||||||
|
using arm::Gp;
|
||||||
|
using arm::GpW;
|
||||||
|
using arm::GpX;
|
||||||
|
|
||||||
class VecB;
|
using arm::Vec;
|
||||||
class VecH;
|
using arm::VecB;
|
||||||
class VecS;
|
using arm::VecH;
|
||||||
class VecD;
|
using arm::VecS;
|
||||||
class VecV;
|
using arm::VecD;
|
||||||
|
using arm::VecV;
|
||||||
//! General purpose register (AArch64).
|
|
||||||
class Gp : public Reg {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg)
|
|
||||||
|
|
||||||
//! Special register id.
|
|
||||||
enum Id : uint32_t {
|
|
||||||
//! Register that depends on OS, could be used as TLS offset.
|
|
||||||
kIdOs = 18,
|
|
||||||
//! Frame pointer register id.
|
|
||||||
kIdFp = 29,
|
|
||||||
//! Link register id.
|
|
||||||
kIdLr = 30,
|
|
||||||
//! Stack register id.
|
|
||||||
kIdSp = 31,
|
|
||||||
//! Zero register id.
|
|
||||||
//!
|
|
||||||
//! Although zero register has the same id as stack register it has a special treatment, because we need to be
|
|
||||||
//! able to distinguish between these two at API level. Some instructions were designed to be used with SP and
|
|
||||||
//! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing.
|
|
||||||
//!
|
|
||||||
//! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs,
|
|
||||||
//! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction.
|
|
||||||
kIdZr = 63
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Test whether this register is ZR register.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isZR() const noexcept { return id() == kIdZr; }
|
|
||||||
//! Test whether this register is SP register.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isSP() const noexcept { return id() == kIdSp; }
|
|
||||||
|
|
||||||
//! Cast this register to a 32-bit W register (returns a new operand).
|
|
||||||
ASMJIT_INLINE_NODEBUG GpW w() const noexcept;
|
|
||||||
//! \overload
|
|
||||||
ASMJIT_INLINE_NODEBUG GpW r32() const noexcept;
|
|
||||||
//! Cast this register to a 64-bit X register (returns a new operand).
|
|
||||||
ASMJIT_INLINE_NODEBUG GpX x() const noexcept;
|
|
||||||
//! \overload
|
|
||||||
ASMJIT_INLINE_NODEBUG GpX r64() const noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 32-bit general purpose W register (AArch64).
|
|
||||||
class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits<RegType::kARM_GpW>); };
|
|
||||||
//! 64-bit general purpose X register (AArch64).
|
|
||||||
class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits<RegType::kARM_GpX>); };
|
|
||||||
|
|
||||||
#ifndef _DOXYGEN
|
|
||||||
ASMJIT_INLINE_NODEBUG GpW Gp::w() const noexcept { return GpW(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG GpX Gp::x() const noexcept { return GpX(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG GpW Gp::r32() const noexcept { return GpW(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG GpX Gp::r64() const noexcept { return GpX(id()); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! Vector element type (AArch64).
|
|
||||||
enum class VecElementType : uint32_t {
|
|
||||||
//! No element type specified.
|
|
||||||
kNone = 0,
|
|
||||||
//! Byte elements (B8 or B16).
|
|
||||||
kB,
|
|
||||||
//! Halfword elements (H4 or H8).
|
|
||||||
kH,
|
|
||||||
//! Singleword elements (S2 or S4).
|
|
||||||
kS,
|
|
||||||
//! Doubleword elements (D2).
|
|
||||||
kD,
|
|
||||||
//! Byte elements grouped by 4 bytes (B4).
|
|
||||||
//!
|
|
||||||
//! \note This element-type is only used by few instructions.
|
|
||||||
kB4,
|
|
||||||
//! Halfword elements grouped by 2 halfwords (H2).
|
|
||||||
//!
|
|
||||||
//! \note This element-type is only used by few instructions.
|
|
||||||
kH2,
|
|
||||||
|
|
||||||
//! Maximum value of \ref VecElementType
|
|
||||||
kMaxValue = kH2
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Vector register (AArch64).
|
|
||||||
class Vec : public BaseVec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_ABSTRACT_REG(Vec, BaseVec)
|
|
||||||
|
|
||||||
//! \cond
|
|
||||||
//! Shortcuts.
|
|
||||||
enum SignatureReg : uint32_t {
|
|
||||||
kSignatureElementB = uint32_t(VecElementType::kB) << kSignatureRegElementTypeShift,
|
|
||||||
kSignatureElementH = uint32_t(VecElementType::kH) << kSignatureRegElementTypeShift,
|
|
||||||
kSignatureElementS = uint32_t(VecElementType::kS) << kSignatureRegElementTypeShift,
|
|
||||||
kSignatureElementD = uint32_t(VecElementType::kD) << kSignatureRegElementTypeShift,
|
|
||||||
kSignatureElementB4 = uint32_t(VecElementType::kB4) << kSignatureRegElementTypeShift,
|
|
||||||
kSignatureElementH2 = uint32_t(VecElementType::kH2) << kSignatureRegElementTypeShift
|
|
||||||
};
|
|
||||||
//! \endcond
|
|
||||||
|
|
||||||
//! Returns whether the register has element type or element index (or both).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask | kSignatureRegElementFlagMask>(); }
|
|
||||||
|
|
||||||
//! Returns whether the vector register has associated a vector element type.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool hasElementType() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask>(); }
|
|
||||||
//! Returns vector element type of the register.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr VecElementType elementType() const noexcept { return VecElementType(_signature.getField<kSignatureRegElementTypeMask>()); }
|
|
||||||
//! Sets vector element type of the register to `elementType`.
|
|
||||||
ASMJIT_INLINE_NODEBUG void setElementType(VecElementType elementType) noexcept { _signature.setField<kSignatureRegElementTypeMask>(uint32_t(elementType)); }
|
|
||||||
//! Resets vector element type to none.
|
|
||||||
ASMJIT_INLINE_NODEBUG void resetElementType() noexcept { _signature.setField<kSignatureRegElementTypeMask>(0); }
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementB); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementH); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementS); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature); }
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementS); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementD); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB4); }
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH2); }
|
|
||||||
|
|
||||||
//! Creates a cloned register with element access.
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec at(uint32_t elementIndex) const noexcept {
|
|
||||||
return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id());
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Cast this register to an 8-bit B register (AArch64 only).
|
|
||||||
ASMJIT_INLINE_NODEBUG VecB b() const noexcept;
|
|
||||||
//! Cast this register to a 16-bit H register (AArch64 only).
|
|
||||||
ASMJIT_INLINE_NODEBUG VecH h() const noexcept;
|
|
||||||
//! Cast this register to a 32-bit S register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecS s() const noexcept;
|
|
||||||
//! Cast this register to a 64-bit D register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD d() const noexcept;
|
|
||||||
//! Cast this register to a 128-bit Q register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV q() const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV v() const noexcept;
|
|
||||||
|
|
||||||
//! Casts this register to b (clone).
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec v8() const noexcept;
|
|
||||||
//! Casts this register to h (clone).
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec v16() const noexcept;
|
|
||||||
//! Casts this register to s (clone).
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec v32() const noexcept;
|
|
||||||
//! Casts this register to d (clone).
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec v64() const noexcept;
|
|
||||||
//! Casts this register to q (clone).
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec v128() const noexcept;
|
|
||||||
|
|
||||||
//! Cast this register to a 128-bit V.B[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV b(uint32_t elementIndex) const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V.H[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV h(uint32_t elementIndex) const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V.S[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV s(uint32_t elementIndex) const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V.D[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV d(uint32_t elementIndex) const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V.H2[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV h2(uint32_t elementIndex) const noexcept;
|
|
||||||
//! Cast this register to a 128-bit V.B4[elementIndex] register.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV b4(uint32_t elementIndex) const noexcept;
|
|
||||||
|
|
||||||
//! Cast this register to V.8B.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD b8() const noexcept;
|
|
||||||
//! Cast this register to V.16B.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV b16() const noexcept;
|
|
||||||
//! Cast this register to V.2H.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecS h2() const noexcept;
|
|
||||||
//! Cast this register to V.4H.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD h4() const noexcept;
|
|
||||||
//! Cast this register to V.8H.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV h8() const noexcept;
|
|
||||||
//! Cast this register to V.2S.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD s2() const noexcept;
|
|
||||||
//! Cast this register to V.4S.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV s4() const noexcept;
|
|
||||||
//! Cast this register to V.2D.
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV d2() const noexcept;
|
|
||||||
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr OperandSignature _makeElementAccessSignature(VecElementType elementType, uint32_t elementIndex) noexcept {
|
|
||||||
return OperandSignature{
|
|
||||||
uint32_t(RegTraits<RegType::kARM_VecV>::kSignature) |
|
|
||||||
uint32_t(kSignatureRegElementFlagMask) |
|
|
||||||
(uint32_t(elementType) << kSignatureRegElementTypeShift) |
|
|
||||||
(uint32_t(elementIndex << kSignatureRegElementIndexShift))};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 8-bit view (S) of VFP/SIMD register.
|
|
||||||
class VecB : public Vec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits<RegType::kARM_VecB>)
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 16-bit view (S) of VFP/SIMD register.
|
|
||||||
class VecH : public Vec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits<RegType::kARM_VecH>)
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 32-bit view (S) of VFP/SIMD register.
|
|
||||||
class VecS : public Vec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits<RegType::kARM_VecS>)
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 64-bit view (D) of VFP/SIMD register.
|
|
||||||
class VecD : public Vec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits<RegType::kARM_VecD>)
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 128-bit vector register (Q or V).
|
|
||||||
class VecV : public Vec {
|
|
||||||
public:
|
|
||||||
ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits<RegType::kARM_VecV>)
|
|
||||||
};
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG VecB Vec::b() const noexcept { return VecB(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecH Vec::h() const noexcept { return VecH(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecS Vec::s() const noexcept { return VecS(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD Vec::d() const noexcept { return VecD(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::q() const noexcept { return VecV(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::v() const noexcept { return VecV(id()); }
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec Vec::v8() const noexcept { return VecB(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec Vec::v16() const noexcept { return VecH(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec Vec::v32() const noexcept { return VecS(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec Vec::v64() const noexcept { return VecD(id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG Vec Vec::v128() const noexcept { return VecV(id()); }
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB, elementIndex), id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH, elementIndex), id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kS, elementIndex), id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kD, elementIndex), id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH2, elementIndex), id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB4, elementIndex), id()); }
|
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); }
|
|
||||||
ASMJIT_INLINE_NODEBUG VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); }
|
|
||||||
|
|
||||||
#ifndef _DOXYGEN
|
#ifndef _DOXYGEN
|
||||||
namespace regs {
|
namespace regs {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! Creates a 32-bit W register operand.
|
using namespace ::asmjit::arm::regs;
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr GpW w(uint32_t id) noexcept { return GpW(id); }
|
|
||||||
//! Creates a 64-bit X register operand.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr GpX x(uint32_t id) noexcept { return GpX(id); }
|
|
||||||
|
|
||||||
//! Creates a 32-bit S register operand.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr VecS s(uint32_t id) noexcept { return VecS(id); }
|
|
||||||
//! Creates a 64-bit D register operand.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr VecD d(uint32_t id) noexcept { return VecD(id); }
|
|
||||||
//! Creates a 1282-bit V register operand.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr VecV v(uint32_t id) noexcept { return VecV(id); }
|
|
||||||
|
|
||||||
static constexpr GpW w0 = GpW(0);
|
static constexpr GpW w0 = GpW(0);
|
||||||
static constexpr GpW w1 = GpW(1);
|
static constexpr GpW w1 = GpW(1);
|
||||||
@ -557,94 +305,8 @@ static constexpr VecV v31 = VecV(31);
|
|||||||
using namespace regs;
|
using namespace regs;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! \name Shift Operation Construction
|
|
||||||
//! \{
|
|
||||||
|
|
||||||
//! Constructs a `UXTB #value` extend and shift (unsigned byte extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); }
|
|
||||||
//! Constructs a `UXTH #value` extend and shift (unsigned hword extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); }
|
|
||||||
//! Constructs a `UXTW #value` extend and shift (unsigned word extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); }
|
|
||||||
//! Constructs a `UXTX #value` extend and shift (unsigned dword extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); }
|
|
||||||
|
|
||||||
//! Constructs a `SXTB #value` extend and shift (signed byte extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); }
|
|
||||||
//! Constructs a `SXTH #value` extend and shift (signed hword extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); }
|
|
||||||
//! Constructs a `SXTW #value` extend and shift (signed word extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); }
|
|
||||||
//! Constructs a `SXTX #value` extend and shift (signed dword extend) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); }
|
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
//! \name Memory Operand Construction
|
|
||||||
//! \{
|
|
||||||
|
|
||||||
//! Creates `[base, offset]` memory operand (offset mode) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept {
|
|
||||||
return Mem(base, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base, offset]!` memory operand (pre-index mode) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept {
|
|
||||||
return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base], offset` memory operand (post-index mode) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept {
|
|
||||||
return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base, index]` memory operand (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index) noexcept {
|
|
||||||
return Mem(base, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base, index]!` memory operand (pre-index mode) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, const Gp& index) noexcept {
|
|
||||||
return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base], index` memory operand (post-index mode) (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept {
|
|
||||||
return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base, index, SHIFT_OP #shift]` memory operand (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept {
|
|
||||||
return Mem(base, index, shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Creates `[base, offset]` memory operand (AArch64).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept {
|
|
||||||
return Mem(base, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: [ARM] PC + offset address.
|
|
||||||
#if 0
|
|
||||||
//! Creates `[PC + offset]` (relative) memory operand.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept {
|
|
||||||
return Mem(pc, offset);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
ASMJIT_END_SUB_NAMESPACE
|
ASMJIT_END_SUB_NAMESPACE
|
||||||
|
|
||||||
//! \cond INTERNAL
|
|
||||||
ASMJIT_BEGIN_NAMESPACE
|
|
||||||
ASMJIT_DEFINE_TYPE_ID(a64::GpW, TypeId::kInt32);
|
|
||||||
ASMJIT_DEFINE_TYPE_ID(a64::GpX, TypeId::kInt64);
|
|
||||||
ASMJIT_DEFINE_TYPE_ID(a64::VecS, TypeId::kFloat32x1);
|
|
||||||
ASMJIT_DEFINE_TYPE_ID(a64::VecD, TypeId::kFloat64x1);
|
|
||||||
ASMJIT_DEFINE_TYPE_ID(a64::VecV, TypeId::kInt32x4);
|
|
||||||
ASMJIT_END_NAMESPACE
|
|
||||||
//! \endcond
|
|
||||||
|
|
||||||
#endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED
|
#endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED
|
||||||
|
12
deps/asmjit/src/asmjit/arm/a64rapass.cpp
vendored
12
deps/asmjit/src/asmjit/arm/a64rapass.cpp
vendored
@ -131,7 +131,7 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstB
|
|||||||
InstId instId = inst->id();
|
InstId instId = inst->id();
|
||||||
uint32_t opCount = inst->opCount();
|
uint32_t opCount = inst->opCount();
|
||||||
const Operand* opArray = inst->operands();
|
const Operand* opArray = inst->operands();
|
||||||
ASMJIT_PROPAGATE(InstInternal::queryRWInfo(inst->baseInst(), opArray, opCount, &rwInfo));
|
ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo));
|
||||||
|
|
||||||
const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
|
const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
|
||||||
uint32_t singleRegOps = 0;
|
uint32_t singleRegOps = 0;
|
||||||
@ -230,7 +230,7 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstB
|
|||||||
if (reg.as<Vec>().hasElementIndex()) {
|
if (reg.as<Vec>().hasElementIndex()) {
|
||||||
// Only the first 0..15 registers can be used if the register uses
|
// Only the first 0..15 registers can be used if the register uses
|
||||||
// element accessor that accesses half-words (h[0..7] elements).
|
// element accessor that accesses half-words (h[0..7] elements).
|
||||||
if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as<Vec>().elementType() == VecElementType::kH) {
|
if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as<Vec>().elementType() == Vec::kElementTypeH) {
|
||||||
if (Support::test(flags, RATiedFlags::kUse))
|
if (Support::test(flags, RATiedFlags::kUse))
|
||||||
useId &= 0x0000FFFFu;
|
useId &= 0x0000FFFFu;
|
||||||
else
|
else
|
||||||
@ -595,14 +595,14 @@ void ARMRAPass::onInit() noexcept {
|
|||||||
_archTraits = &ArchTraits::byArch(arch);
|
_archTraits = &ArchTraits::byArch(arch);
|
||||||
_physRegCount.set(RegGroup::kGp, 32);
|
_physRegCount.set(RegGroup::kGp, 32);
|
||||||
_physRegCount.set(RegGroup::kVec, 32);
|
_physRegCount.set(RegGroup::kVec, 32);
|
||||||
_physRegCount.set(RegGroup::kMask, 0);
|
_physRegCount.set(RegGroup::kExtraVirt2, 0);
|
||||||
_physRegCount.set(RegGroup::kExtraVirt3, 0);
|
_physRegCount.set(RegGroup::kExtraVirt3, 0);
|
||||||
_buildPhysIndex();
|
_buildPhysIndex();
|
||||||
|
|
||||||
_availableRegCount = _physRegCount;
|
_availableRegCount = _physRegCount;
|
||||||
_availableRegs[RegGroup::kGp] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kGp));
|
_availableRegs[RegGroup::kGp] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kGp));
|
||||||
_availableRegs[RegGroup::kVec] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kVec));
|
_availableRegs[RegGroup::kVec] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kVec));
|
||||||
_availableRegs[RegGroup::kMask] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kMask));
|
_availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt2));
|
||||||
_availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt3));
|
_availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt3));
|
||||||
|
|
||||||
_scratchRegIndexes[0] = uint8_t(27);
|
_scratchRegIndexes[0] = uint8_t(27);
|
||||||
@ -612,9 +612,7 @@ void ARMRAPass::onInit() noexcept {
|
|||||||
// make unavailable all registers that are special and cannot be used in general.
|
// make unavailable all registers that are special and cannot be used in general.
|
||||||
bool hasFP = _func->frame().hasPreservedFP();
|
bool hasFP = _func->frame().hasPreservedFP();
|
||||||
|
|
||||||
// Apple ABI requires that the frame-pointer register is not changed by leaf functions and properly updated
|
if (hasFP)
|
||||||
// by non-leaf functions. So, let's make this register unavailable as it's just not safe to update it.
|
|
||||||
if (hasFP || cc()->environment().isDarwin())
|
|
||||||
makeUnavailable(RegGroup::kGp, Gp::kIdFp);
|
makeUnavailable(RegGroup::kGp, Gp::kIdFp);
|
||||||
|
|
||||||
makeUnavailable(RegGroup::kGp, Gp::kIdSp);
|
makeUnavailable(RegGroup::kGp, Gp::kIdSp);
|
||||||
|
247
deps/asmjit/src/asmjit/arm/armformatter.cpp
vendored
247
deps/asmjit/src/asmjit/arm/armformatter.cpp
vendored
@ -9,7 +9,7 @@
|
|||||||
#include "../core/misc_p.h"
|
#include "../core/misc_p.h"
|
||||||
#include "../core/support.h"
|
#include "../core/support.h"
|
||||||
#include "../arm/armformatter_p.h"
|
#include "../arm/armformatter_p.h"
|
||||||
#include "../arm/a64operand.h"
|
#include "../arm/armoperand.h"
|
||||||
#include "../arm/a64instapi_p.h"
|
#include "../arm/a64instapi_p.h"
|
||||||
#include "../arm/a64instdb_p.h"
|
#include "../arm/a64instdb_p.h"
|
||||||
|
|
||||||
@ -31,45 +31,26 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"ARMv8a\0"
|
"ARMv8a\0"
|
||||||
"THUMB\0"
|
"THUMB\0"
|
||||||
"THUMBv2\0"
|
"THUMBv2\0"
|
||||||
"ABLE\0"
|
|
||||||
"ADERR\0"
|
|
||||||
"AES\0"
|
"AES\0"
|
||||||
"AFP\0"
|
"AFP\0"
|
||||||
"AIE\0"
|
|
||||||
"AMU1\0"
|
|
||||||
"AMU1_1\0"
|
|
||||||
"ANERR\0"
|
|
||||||
"ASIMD\0"
|
"ASIMD\0"
|
||||||
"BF16\0"
|
"BF16\0"
|
||||||
"BRBE\0"
|
|
||||||
"BTI\0"
|
"BTI\0"
|
||||||
"BWE\0"
|
|
||||||
"CCIDX\0"
|
"CCIDX\0"
|
||||||
"CHK\0"
|
"CHK\0"
|
||||||
"CLRBHB\0"
|
"CLRBHB\0"
|
||||||
"CMOW\0"
|
|
||||||
"CONSTPACFIELD\0"
|
|
||||||
"CPA\0"
|
|
||||||
"CPA2\0"
|
|
||||||
"CPUID\0"
|
"CPUID\0"
|
||||||
"CRC32\0"
|
"CRC32\0"
|
||||||
"CSSC\0"
|
"CSSC\0"
|
||||||
"CSV2\0"
|
|
||||||
"CSV2_3\0"
|
|
||||||
"CSV3\0"
|
|
||||||
"D128\0"
|
"D128\0"
|
||||||
"DGH\0"
|
"DGH\0"
|
||||||
"DIT\0"
|
"DIT\0"
|
||||||
"DOTPROD\0"
|
"DOTPROD\0"
|
||||||
"DPB\0"
|
"DPB\0"
|
||||||
"DPB2\0"
|
"DPB2\0"
|
||||||
"EBEP\0"
|
|
||||||
"EBF16\0"
|
"EBF16\0"
|
||||||
"ECBHB\0"
|
|
||||||
"ECV\0"
|
"ECV\0"
|
||||||
"EDHSR\0"
|
|
||||||
"EDSP\0"
|
"EDSP\0"
|
||||||
"FAMINMAX\0"
|
|
||||||
"FCMA\0"
|
"FCMA\0"
|
||||||
"FGT\0"
|
"FGT\0"
|
||||||
"FGT2\0"
|
"FGT2\0"
|
||||||
@ -80,25 +61,13 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"FP\0"
|
"FP\0"
|
||||||
"FP16\0"
|
"FP16\0"
|
||||||
"FP16CONV\0"
|
"FP16CONV\0"
|
||||||
"FP8\0"
|
|
||||||
"FP8DOT2\0"
|
|
||||||
"FP8DOT4\0"
|
|
||||||
"FP8FMA\0"
|
|
||||||
"FPMR\0"
|
|
||||||
"FRINTTS\0"
|
"FRINTTS\0"
|
||||||
"GCS\0"
|
"GCS\0"
|
||||||
"HACDBS\0"
|
|
||||||
"HAFDBS\0"
|
|
||||||
"HAFT\0"
|
|
||||||
"HDBSS\0"
|
|
||||||
"HBC\0"
|
"HBC\0"
|
||||||
"HCX\0"
|
"HCX\0"
|
||||||
"HPDS\0"
|
|
||||||
"HPDS2\0"
|
|
||||||
"I8MM\0"
|
"I8MM\0"
|
||||||
"IDIVA\0"
|
"IDIVA\0"
|
||||||
"IDIVT\0"
|
"IDIVT\0"
|
||||||
"ITE\0"
|
|
||||||
"JSCVT\0"
|
"JSCVT\0"
|
||||||
"LOR\0"
|
"LOR\0"
|
||||||
"LRCPC\0"
|
"LRCPC\0"
|
||||||
@ -110,24 +79,12 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"LSE\0"
|
"LSE\0"
|
||||||
"LSE128\0"
|
"LSE128\0"
|
||||||
"LSE2\0"
|
"LSE2\0"
|
||||||
"LUT\0"
|
|
||||||
"LVA\0"
|
|
||||||
"LVA3\0"
|
|
||||||
"MEC\0"
|
|
||||||
"MOPS\0"
|
"MOPS\0"
|
||||||
"MPAM\0"
|
"MPAM\0"
|
||||||
"MTE\0"
|
"MTE\0"
|
||||||
"MTE2\0"
|
"MTE2\0"
|
||||||
"MTE3\0"
|
"MTE3\0"
|
||||||
"MTE4\0"
|
"MTE4\0"
|
||||||
"MTE_ASYM_FAULT\0"
|
|
||||||
"MTE_ASYNC\0"
|
|
||||||
"MTE_CANONICAL_TAGS\0"
|
|
||||||
"MTE_NO_ADDRESS_TAGS\0"
|
|
||||||
"MTE_PERM_S1\0"
|
|
||||||
"MTE_STORE_ONLY\0"
|
|
||||||
"MTE_TAGGED_FAR\0"
|
|
||||||
"MTPMU\0"
|
|
||||||
"NMI\0"
|
"NMI\0"
|
||||||
"NV\0"
|
"NV\0"
|
||||||
"NV2\0"
|
"NV2\0"
|
||||||
@ -135,28 +92,19 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"PAN2\0"
|
"PAN2\0"
|
||||||
"PAN3\0"
|
"PAN3\0"
|
||||||
"PAUTH\0"
|
"PAUTH\0"
|
||||||
"PFAR\0"
|
|
||||||
"PMU\0"
|
"PMU\0"
|
||||||
"PMULL\0"
|
"PMULL\0"
|
||||||
"PRFMSLC\0"
|
"PRFMSLC\0"
|
||||||
"RAS\0"
|
"RAS\0"
|
||||||
"RAS1_1\0"
|
"RAS1_1\0"
|
||||||
"RAS2\0"
|
"RAS2\0"
|
||||||
"RASSA2\0"
|
|
||||||
"RDM\0"
|
"RDM\0"
|
||||||
"RME\0"
|
"RME\0"
|
||||||
"RNG\0"
|
"RNG\0"
|
||||||
"RNG_TRAP\0"
|
"RNG_TRAP\0"
|
||||||
"RPRES\0"
|
"RPRES\0"
|
||||||
"RPRFM\0"
|
"RPRFM\0"
|
||||||
"S1PIE\0"
|
|
||||||
"S1POE\0"
|
|
||||||
"S2PIE\0"
|
|
||||||
"S2POE\0"
|
|
||||||
"SB\0"
|
"SB\0"
|
||||||
"SCTLR2\0"
|
|
||||||
"SEBEP\0"
|
|
||||||
"SEL2\0"
|
|
||||||
"SHA1\0"
|
"SHA1\0"
|
||||||
"SHA256\0"
|
"SHA256\0"
|
||||||
"SHA3\0"
|
"SHA3\0"
|
||||||
@ -173,32 +121,14 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"SME_F16F32\0"
|
"SME_F16F32\0"
|
||||||
"SME_F32F32\0"
|
"SME_F32F32\0"
|
||||||
"SME_F64F64\0"
|
"SME_F64F64\0"
|
||||||
"SME_F8F16\0"
|
|
||||||
"SME_F8F32\0"
|
|
||||||
"SME_FA64\0"
|
"SME_FA64\0"
|
||||||
"SME_I16I32\0"
|
"SME_I16I32\0"
|
||||||
"SME_I16I64\0"
|
"SME_I16I64\0"
|
||||||
"SME_I8I32\0"
|
"SME_I8I32\0"
|
||||||
"SME_LUTv2\0"
|
|
||||||
"SPE\0"
|
|
||||||
"SPE1_1\0"
|
|
||||||
"SPE1_2\0"
|
|
||||||
"SPE1_3\0"
|
|
||||||
"SPE1_4\0"
|
|
||||||
"SPE_ALTCLK\0"
|
|
||||||
"SPE_CRR\0"
|
|
||||||
"SPE_EFT\0"
|
|
||||||
"SPE_FDS\0"
|
|
||||||
"SPE_FPF\0"
|
|
||||||
"SPE_SME\0"
|
|
||||||
"SPECRES\0"
|
"SPECRES\0"
|
||||||
"SPECRES2\0"
|
"SPECRES2\0"
|
||||||
"SPMU\0"
|
|
||||||
"SSBS\0"
|
"SSBS\0"
|
||||||
"SSBS2\0"
|
"SSBS2\0"
|
||||||
"SSVE_FP8DOT2\0"
|
|
||||||
"SSVE_FP8DOT4\0"
|
|
||||||
"SSVE_FP8FMA\0"
|
|
||||||
"SVE\0"
|
"SVE\0"
|
||||||
"SVE2\0"
|
"SVE2\0"
|
||||||
"SVE2_1\0"
|
"SVE2_1\0"
|
||||||
@ -216,35 +146,25 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
|
|||||||
"SYSINSTR128\0"
|
"SYSINSTR128\0"
|
||||||
"SYSREG128\0"
|
"SYSREG128\0"
|
||||||
"THE\0"
|
"THE\0"
|
||||||
"TLBIOS\0"
|
|
||||||
"TLBIRANGE\0"
|
|
||||||
"TLBIW\0"
|
|
||||||
"TME\0"
|
"TME\0"
|
||||||
"TRF\0"
|
"TRF\0"
|
||||||
"UAO\0"
|
"UAO\0"
|
||||||
"VFP_D32\0"
|
"VFP_D32\0"
|
||||||
"VHE\0"
|
"VHE\0"
|
||||||
"VMID16\0"
|
|
||||||
"WFXT\0"
|
"WFXT\0"
|
||||||
"XNX\0"
|
|
||||||
"XS\0"
|
"XS\0"
|
||||||
"<Unknown>\0";
|
"<Unknown>\0";
|
||||||
|
|
||||||
static const uint16_t sFeatureIndex[] = {
|
static const uint16_t sFeatureIndex[] = {
|
||||||
0, 5, 11, 17, 24, 30, 38, 43, 49, 53, 57, 61, 66, 73, 79, 85, 90, 95, 99,
|
0, 5, 11, 17, 24, 30, 38, 42, 46, 52, 57, 61, 67, 71, 78, 84, 90, 95, 100,
|
||||||
103, 109, 113, 120, 125, 139, 143, 148, 154, 160, 165, 170, 177, 182, 187,
|
104, 108, 116, 120, 125, 131, 135, 140, 145, 149, 154, 158, 164, 171, 176,
|
||||||
191, 195, 203, 207, 212, 217, 223, 229, 233, 239, 244, 253, 258, 262, 267,
|
179, 184, 193, 201, 205, 209, 213, 218, 224, 230, 236, 240, 246, 253, 260,
|
||||||
271, 277, 284, 289, 292, 297, 306, 310, 318, 326, 333, 338, 346, 350, 357,
|
265, 278, 285, 289, 296, 301, 306, 311, 315, 320, 325, 330, 334, 337, 341,
|
||||||
364, 369, 375, 379, 383, 388, 394, 399, 405, 411, 415, 421, 425, 431, 438,
|
345, 350, 355, 361, 365, 371, 379, 383, 390, 395, 399, 403, 407, 416, 422,
|
||||||
445, 450, 463, 470, 474, 481, 486, 490, 494, 499, 503, 508, 513, 517, 522,
|
428, 431, 436, 443, 448, 455, 459, 463, 467, 472, 479, 490, 501, 513, 524,
|
||||||
527, 532, 547, 557, 576, 596, 608, 623, 638, 644, 648, 651, 655, 659, 664,
|
535, 546, 557, 566, 577, 588, 598, 606, 615, 620, 626, 630, 635, 642, 650,
|
||||||
669, 675, 680, 684, 690, 698, 702, 709, 714, 721, 725, 729, 733, 742, 748,
|
661, 670, 682, 692, 702, 712, 721, 734, 743, 751, 763, 773, 777, 781, 785,
|
||||||
754, 760, 766, 772, 778, 781, 788, 794, 799, 804, 811, 816, 823, 827, 831,
|
789, 797, 801, 806, 809
|
||||||
835, 840, 847, 858, 869, 881, 892, 903, 914, 925, 935, 945, 954, 965, 976,
|
|
||||||
986, 996, 1000, 1007, 1014, 1021, 1028, 1039, 1047, 1055, 1063, 1071, 1079,
|
|
||||||
1087, 1096, 1101, 1106, 1112, 1125, 1138, 1150, 1154, 1159, 1166, 1174, 1185,
|
|
||||||
1194, 1206, 1216, 1226, 1236, 1245, 1258, 1267, 1275, 1287, 1297, 1301, 1308,
|
|
||||||
1318, 1324, 1328, 1332, 1336, 1344, 1348, 1355, 1360, 1364, 1367
|
|
||||||
};
|
};
|
||||||
// @EnumStringEnd@
|
// @EnumStringEnd@
|
||||||
|
|
||||||
@ -258,14 +178,14 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatCondCode(String& sb, CondCode c
|
|||||||
static const char condCodeData[] =
|
static const char condCodeData[] =
|
||||||
"al\0" "na\0"
|
"al\0" "na\0"
|
||||||
"eq\0" "ne\0"
|
"eq\0" "ne\0"
|
||||||
"hs\0" "lo\0" "mi\0" "pl\0" "vs\0" "vc\0"
|
"cs\0" "cc\0" "mi\0" "pl\0" "vs\0" "vc\0"
|
||||||
"hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0"
|
"hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0"
|
||||||
"<Unknown>";
|
"<Unknown>";
|
||||||
return sb.append(condCodeData + Support::min<uint32_t>(uint32_t(cc), 16u) * 3);
|
return sb.append(condCodeData + Support::min<uint32_t>(uint32_t(cc), 16u) * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shiftOp) noexcept {
|
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shiftOp) noexcept {
|
||||||
const char* str = nullptr;
|
const char* str = "<Unknown>";
|
||||||
switch (shiftOp) {
|
switch (shiftOp) {
|
||||||
case ShiftOp::kLSL: str = "lsl"; break;
|
case ShiftOp::kLSL: str = "lsl"; break;
|
||||||
case ShiftOp::kLSR: str = "lsr"; break;
|
case ShiftOp::kLSR: str = "lsr"; break;
|
||||||
@ -281,7 +201,6 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shi
|
|||||||
case ShiftOp::kSXTH: str = "sxth"; break;
|
case ShiftOp::kSXTH: str = "sxth"; break;
|
||||||
case ShiftOp::kSXTW: str = "sxtw"; break;
|
case ShiftOp::kSXTW: str = "sxtw"; break;
|
||||||
case ShiftOp::kSXTX: str = "sxtx"; break;
|
case ShiftOp::kSXTX: str = "sxtx"; break;
|
||||||
default: str = "<Unknown>"; break;
|
|
||||||
}
|
}
|
||||||
return sb.append(str);
|
return sb.append(str);
|
||||||
}
|
}
|
||||||
@ -289,25 +208,6 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shi
|
|||||||
// arm::FormatterInternal - Format Register
|
// arm::FormatterInternal - Format Register
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|
||||||
struct FormatElementData {
|
|
||||||
char letter;
|
|
||||||
uint8_t elementCount;
|
|
||||||
uint8_t onlyIndex;
|
|
||||||
uint8_t reserved;
|
|
||||||
};
|
|
||||||
|
|
||||||
static constexpr FormatElementData formatElementDataTable[9] = {
|
|
||||||
{ '?' , 0 , 0, 0 }, // None
|
|
||||||
{ 'b' , 16, 0, 0 }, // bX or b[index]
|
|
||||||
{ 'h' , 8 , 0, 0 }, // hX or h[index]
|
|
||||||
{ 's' , 4 , 0, 0 }, // sX or s[index]
|
|
||||||
{ 'd' , 2 , 0, 0 }, // dX or d[index]
|
|
||||||
{ 'b' , 4 , 1, 0 }, // ?? or b4[index]
|
|
||||||
{ 'h' , 2 , 1, 0 }, // ?? or h2[index]
|
|
||||||
{ '?' , 0 , 0, 0 }, // invalid (possibly stored in Operand)
|
|
||||||
{ '?' , 0 , 0, 0 } // invalid (never stored in Operand, bug...)
|
|
||||||
};
|
|
||||||
|
|
||||||
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
|
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
|
||||||
String& sb,
|
String& sb,
|
||||||
FormatFlags flags,
|
FormatFlags flags,
|
||||||
@ -364,22 +264,31 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
|
|||||||
if (Environment::is64Bit(arch)) {
|
if (Environment::is64Bit(arch)) {
|
||||||
letter = 'w';
|
letter = 'w';
|
||||||
|
|
||||||
if (rId == a64::Gp::kIdZr)
|
if (rId == Gp::kIdZr)
|
||||||
return sb.append("wzr", 3);
|
return sb.append("wzr", 3);
|
||||||
|
|
||||||
if (rId == a64::Gp::kIdSp)
|
if (rId == Gp::kIdSp)
|
||||||
return sb.append("wsp", 3);
|
return sb.append("wsp", 3);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
letter = 'r';
|
letter = 'r';
|
||||||
|
|
||||||
|
if (rId == 13)
|
||||||
|
return sb.append("sp", 2);
|
||||||
|
|
||||||
|
if (rId == 14)
|
||||||
|
return sb.append("lr", 2);
|
||||||
|
|
||||||
|
if (rId == 15)
|
||||||
|
return sb.append("pc", 2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RegType::kARM_GpX:
|
case RegType::kARM_GpX:
|
||||||
if (Environment::is64Bit(arch)) {
|
if (Environment::is64Bit(arch)) {
|
||||||
if (rId == a64::Gp::kIdZr)
|
if (rId == Gp::kIdZr)
|
||||||
return sb.append("xzr", 3);
|
return sb.append("xzr", 3);
|
||||||
if (rId == a64::Gp::kIdSp)
|
if (rId == Gp::kIdSp)
|
||||||
return sb.append("sp", 2);
|
return sb.append("sp", 2);
|
||||||
|
|
||||||
letter = 'x';
|
letter = 'x';
|
||||||
@ -390,7 +299,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
|
|||||||
ASMJIT_FALLTHROUGH;
|
ASMJIT_FALLTHROUGH;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ASMJIT_PROPAGATE(sb.appendFormat("<Reg-%u>?%u", uint32_t(regType), rId));
|
ASMJIT_PROPAGATE(sb.appendFormat("<Reg-%u>?$u", uint32_t(regType), rId));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,69 +307,54 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
|
|||||||
ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId));
|
ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId));
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr uint32_t kElementTypeCount = uint32_t(a64::VecElementType::kMaxValue) + 1;
|
|
||||||
if (elementType) {
|
if (elementType) {
|
||||||
elementType = Support::min(elementType, kElementTypeCount);
|
char elementLetter = '\0';
|
||||||
|
uint32_t elementCount = 0;
|
||||||
|
|
||||||
FormatElementData elementData = formatElementDataTable[elementType];
|
switch (elementType) {
|
||||||
uint32_t elementCount = elementData.elementCount;
|
case Vec::kElementTypeB:
|
||||||
|
elementLetter = 'b';
|
||||||
|
elementCount = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
if (regType == RegType::kARM_VecD) {
|
case Vec::kElementTypeH:
|
||||||
elementCount /= 2u;
|
elementLetter = 'h';
|
||||||
|
elementCount = 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Vec::kElementTypeS:
|
||||||
|
elementLetter = 's';
|
||||||
|
elementCount = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Vec::kElementTypeD:
|
||||||
|
elementLetter = 'd';
|
||||||
|
elementCount = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return sb.append(".<Unknown>");
|
||||||
}
|
}
|
||||||
|
|
||||||
ASMJIT_PROPAGATE(sb.append('.'));
|
if (elementLetter) {
|
||||||
if (elementCount) {
|
if (elementIndex == 0xFFFFFFFFu) {
|
||||||
ASMJIT_PROPAGATE(sb.appendUInt(elementCount));
|
if (regType == RegType::kARM_VecD)
|
||||||
|
elementCount /= 2u;
|
||||||
|
ASMJIT_PROPAGATE(sb.appendFormat(".%u%c", elementCount, elementLetter));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ASMJIT_PROPAGATE(sb.appendFormat(".%c[%u]", elementLetter, elementIndex));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ASMJIT_PROPAGATE(sb.append(elementData.letter));
|
|
||||||
}
|
}
|
||||||
|
else if (elementIndex != 0xFFFFFFFFu) {
|
||||||
if (elementIndex != 0xFFFFFFFFu) {
|
// This should only be used by AArch32 - AArch64 requires an additional elementType in index[].
|
||||||
ASMJIT_PROPAGATE(sb.appendFormat("[%u]", elementIndex));
|
ASMJIT_PROPAGATE(sb.appendFormat("[%u]", elementIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
return kErrorOk;
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegisterList(
|
|
||||||
String& sb,
|
|
||||||
FormatFlags flags,
|
|
||||||
const BaseEmitter* emitter,
|
|
||||||
Arch arch,
|
|
||||||
RegType regType,
|
|
||||||
uint32_t rMask) noexcept {
|
|
||||||
|
|
||||||
bool first = true;
|
|
||||||
|
|
||||||
ASMJIT_PROPAGATE(sb.append('{'));
|
|
||||||
while (rMask != 0u) {
|
|
||||||
uint32_t start = Support::ctz(rMask);
|
|
||||||
uint32_t count = 0u;
|
|
||||||
|
|
||||||
uint32_t mask = 1u << start;
|
|
||||||
do {
|
|
||||||
rMask &= ~mask;
|
|
||||||
mask <<= 1u;
|
|
||||||
count++;
|
|
||||||
} while (rMask & mask);
|
|
||||||
|
|
||||||
if (!first)
|
|
||||||
ASMJIT_PROPAGATE(sb.append(", "));
|
|
||||||
|
|
||||||
ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start, 0, 0xFFFFFFFFu));
|
|
||||||
if (count >= 2u) {
|
|
||||||
ASMJIT_PROPAGATE(sb.append('-'));
|
|
||||||
ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start + count - 1, 0, 0xFFFFFFFFu));
|
|
||||||
}
|
|
||||||
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
ASMJIT_PROPAGATE(sb.append('}'));
|
|
||||||
|
|
||||||
return kErrorOk;
|
|
||||||
}
|
|
||||||
|
|
||||||
// a64::FormatterInternal - Format Operand
|
// a64::FormatterInternal - Format Operand
|
||||||
// =======================================
|
// =======================================
|
||||||
|
|
||||||
@ -474,10 +368,10 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
|
|||||||
if (op.isReg()) {
|
if (op.isReg()) {
|
||||||
const BaseReg& reg = op.as<BaseReg>();
|
const BaseReg& reg = op.as<BaseReg>();
|
||||||
|
|
||||||
uint32_t elementType = op._signature.getField<BaseVec::kSignatureRegElementTypeMask>();
|
uint32_t elementType = op.as<Vec>().elementType();
|
||||||
uint32_t elementIndex = op.as<BaseVec>().elementIndex();
|
uint32_t elementIndex = op.as<Vec>().elementIndex();
|
||||||
|
|
||||||
if (!op.as<BaseVec>().hasElementIndex())
|
if (!op.as<Vec>().hasElementIndex())
|
||||||
elementIndex = 0xFFFFFFFFu;
|
elementIndex = 0xFFFFFFFFu;
|
||||||
|
|
||||||
return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex);
|
return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex);
|
||||||
@ -539,7 +433,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
|
|||||||
if (m.hasShift()) {
|
if (m.hasShift()) {
|
||||||
ASMJIT_PROPAGATE(sb.append(' '));
|
ASMJIT_PROPAGATE(sb.append(' '));
|
||||||
if (!m.isPreOrPost())
|
if (!m.isPreOrPost())
|
||||||
ASMJIT_PROPAGATE(formatShiftOp(sb, m.shiftOp()));
|
ASMJIT_PROPAGATE(formatShiftOp(sb, (ShiftOp)m.predicate()));
|
||||||
ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift()));
|
ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -555,12 +449,6 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
|
|||||||
if (op.isImm()) {
|
if (op.isImm()) {
|
||||||
const Imm& i = op.as<Imm>();
|
const Imm& i = op.as<Imm>();
|
||||||
int64_t val = i.value();
|
int64_t val = i.value();
|
||||||
uint32_t predicate = i.predicate();
|
|
||||||
|
|
||||||
if (predicate) {
|
|
||||||
ASMJIT_PROPAGATE(formatShiftOp(sb, ShiftOp(predicate)));
|
|
||||||
ASMJIT_PROPAGATE(sb.append(' '));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
|
if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
|
||||||
ASMJIT_PROPAGATE(sb.append("0x"));
|
ASMJIT_PROPAGATE(sb.append("0x"));
|
||||||
@ -575,11 +463,6 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
|
|||||||
return Formatter::formatLabel(sb, flags, emitter, op.id());
|
return Formatter::formatLabel(sb, flags, emitter, op.id());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op.isRegList()) {
|
|
||||||
const BaseRegList& regList = op.as<BaseRegList>();
|
|
||||||
return formatRegisterList(sb, flags, emitter, arch, regList.type(), regList.list());
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.append("<None>");
|
return sb.append("<None>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
deps/asmjit/src/asmjit/arm/armformatter_p.h
vendored
8
deps/asmjit/src/asmjit/arm/armformatter_p.h
vendored
@ -43,14 +43,6 @@ Error ASMJIT_CDECL formatRegister(
|
|||||||
uint32_t elementType = 0,
|
uint32_t elementType = 0,
|
||||||
uint32_t elementIndex = 0xFFFFFFFF) noexcept;
|
uint32_t elementIndex = 0xFFFFFFFF) noexcept;
|
||||||
|
|
||||||
Error ASMJIT_CDECL formatRegisterList(
|
|
||||||
String& sb,
|
|
||||||
FormatFlags flags,
|
|
||||||
const BaseEmitter* emitter,
|
|
||||||
Arch arch,
|
|
||||||
RegType regType,
|
|
||||||
uint32_t rMask) noexcept;
|
|
||||||
|
|
||||||
Error ASMJIT_CDECL formatOperand(
|
Error ASMJIT_CDECL formatOperand(
|
||||||
String& sb,
|
String& sb,
|
||||||
FormatFlags flags,
|
FormatFlags flags,
|
||||||
|
4
deps/asmjit/src/asmjit/arm/armglobals.h
vendored
4
deps/asmjit/src/asmjit/arm/armglobals.h
vendored
@ -14,4 +14,8 @@
|
|||||||
//!
|
//!
|
||||||
//! API shared between AArch32 & AArch64 backends.
|
//! API shared between AArch32 & AArch64 backends.
|
||||||
|
|
||||||
|
ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
||||||
|
|
||||||
|
ASMJIT_END_SUB_NAMESPACE
|
||||||
|
|
||||||
#endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
|
#endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
|
||||||
|
444
deps/asmjit/src/asmjit/arm/armoperand.h
vendored
444
deps/asmjit/src/asmjit/arm/armoperand.h
vendored
@ -19,7 +19,18 @@ ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
|||||||
class Reg;
|
class Reg;
|
||||||
class Mem;
|
class Mem;
|
||||||
|
|
||||||
//! Register traits (AArch32/AArch64).
|
class Gp;
|
||||||
|
class GpW;
|
||||||
|
class GpX;
|
||||||
|
|
||||||
|
class Vec;
|
||||||
|
class VecB;
|
||||||
|
class VecH;
|
||||||
|
class VecS;
|
||||||
|
class VecD;
|
||||||
|
class VecV;
|
||||||
|
|
||||||
|
//! Register traits (ARM/AArch64).
|
||||||
//!
|
//!
|
||||||
//! Register traits contains information about a particular register type. It's used by asmjit to setup register
|
//! Register traits contains information about a particular register type. It's used by asmjit to setup register
|
||||||
//! information on-the-fly and to populate tables that contain register information (this way it's possible to
|
//! information on-the-fly and to populate tables that contain register information (this way it's possible to
|
||||||
@ -28,31 +39,27 @@ template<RegType kRegType>
|
|||||||
struct RegTraits : public BaseRegTraits {};
|
struct RegTraits : public BaseRegTraits {};
|
||||||
|
|
||||||
//! \cond
|
//! \cond
|
||||||
// <--------------------+------------------------+------------------------+---+------------------+
|
// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
|
||||||
// | Reg-Type | Reg-Group |Sz | TypeId |
|
// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId |
|
||||||
// <--------------------+------------------------+------------------------+---+------------------+
|
// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpW , RegGroup::kGp , 4 , TypeId::kInt32 ); // AArch32 & AArch64
|
ASMJIT_DEFINE_REG_TRAITS(GpW , RegType::kARM_GpW , RegGroup::kGp , 4 , 32, TypeId::kInt32 );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpX , RegGroup::kGp , 8 , TypeId::kInt64 ); // AArch64
|
ASMJIT_DEFINE_REG_TRAITS(GpX , RegType::kARM_GpX , RegGroup::kGp , 8 , 32, TypeId::kInt64 );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecB , RegGroup::kVec , 1 , TypeId::kVoid ); // AArch64
|
ASMJIT_DEFINE_REG_TRAITS(VecB , RegType::kARM_VecB , RegGroup::kVec , 1 , 32, TypeId::kVoid );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecH , RegGroup::kVec , 2 , TypeId::kVoid ); // AArch64
|
ASMJIT_DEFINE_REG_TRAITS(VecH , RegType::kARM_VecH , RegGroup::kVec , 2 , 32, TypeId::kVoid );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecS , RegGroup::kVec , 4 , TypeId::kInt32x1 ); // AArch32 & AArch64
|
ASMJIT_DEFINE_REG_TRAITS(VecS , RegType::kARM_VecS , RegGroup::kVec , 4 , 32, TypeId::kInt32x1 );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecD , RegGroup::kVec , 8 , TypeId::kInt32x2 ); // AArch32 & AArch64
|
ASMJIT_DEFINE_REG_TRAITS(VecD , RegType::kARM_VecD , RegGroup::kVec , 8 , 32, TypeId::kInt32x2 );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecQ , RegGroup::kVec , 16, TypeId::kInt32x4 ); // AArch32 & AArch64
|
ASMJIT_DEFINE_REG_TRAITS(VecV , RegType::kARM_VecV , RegGroup::kVec , 16, 32, TypeId::kInt32x4 );
|
||||||
ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_PC , RegGroup::kPC , 8 , TypeId::kInt64 ); // AArch64
|
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
|
||||||
//! Register operand that can represent AArch32 and AArch64 registers.
|
//! Register (ARM).
|
||||||
class Reg : public BaseReg {
|
class Reg : public BaseReg {
|
||||||
public:
|
public:
|
||||||
ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
|
ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
|
||||||
|
|
||||||
//! Gets whether the register is either `R` or `W` register (32-bit).
|
//! Gets whether the register is a `R|W` register (32-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isGpR() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
|
|
||||||
//! Gets whether the register is either `R` or `W` register (32-bit).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
|
||||||
//! Gets whether the register is an `X` register (64-bit).
|
//! Gets whether the register is an `X` register (64-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpX>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpX>::kSignature; }
|
||||||
|
|
||||||
//! Gets whether the register is a VEC-B register (8-bit).
|
//! Gets whether the register is a VEC-B register (8-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
|
||||||
//! Gets whether the register is a VEC-H register (16-bit).
|
//! Gets whether the register is a VEC-H register (16-bit).
|
||||||
@ -63,22 +70,13 @@ public:
|
|||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
|
||||||
//! Gets whether the register is a VEC-Q register (128-bit).
|
//! Gets whether the register is a VEC-Q register (128-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
|
||||||
|
|
||||||
//! Gets whether the register is either VEC-D (64-bit) or VEC-Q (128-bit).
|
//! Gets whether the register is either VEC-D (64-bit) or VEC-Q (128-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; }
|
||||||
|
|
||||||
//! Gets whether the register is a VEC-V register (128-bit).
|
//! Gets whether the register is a VEC-V register (128-bit).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
|
||||||
|
|
||||||
//! Gets whether the register is an 8-bit vector register or view, alias if \ref isVecB().
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVec8() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
|
|
||||||
//! Gets whether the register is a 16-bit vector register or view, alias if \ref isVecH().
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVec16() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecH>::kSignature; }
|
|
||||||
//! Gets whether the register is a 32-bit vector register or view, alias if \ref isVecS().
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVec32() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecS>::kSignature; }
|
|
||||||
//! Gets whether the register is a 64-bit vector register or view, alias if \ref isVecD().
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVec64() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
|
|
||||||
//! Gets whether the register is a 128-bit vector register or view, alias if \ref isVecQ().
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
|
|
||||||
|
|
||||||
template<RegType kRegType>
|
template<RegType kRegType>
|
||||||
ASMJIT_INLINE_NODEBUG void setRegT(uint32_t id) noexcept {
|
ASMJIT_INLINE_NODEBUG void setRegT(uint32_t id) noexcept {
|
||||||
setSignature(RegTraits<kRegType>::kSignature);
|
setSignature(RegTraits<kRegType>::kSignature);
|
||||||
@ -101,7 +99,7 @@ public:
|
|||||||
static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return RegTraits<kRegType>::kTypeId; }
|
static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return RegTraits<kRegType>::kTypeId; }
|
||||||
|
|
||||||
template<RegType kRegType>
|
template<RegType kRegType>
|
||||||
static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits<kRegType>::kSignature}; }
|
static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return RegTraits<kRegType>::kSignature; }
|
||||||
|
|
||||||
static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op) noexcept { return op.as<Reg>().isGpW(); }
|
static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op) noexcept { return op.as<Reg>().isGpW(); }
|
||||||
static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op) noexcept { return op.as<Reg>().isGpX(); }
|
static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op) noexcept { return op.as<Reg>().isGpX(); }
|
||||||
@ -122,12 +120,47 @@ public:
|
|||||||
static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecV(op)) & unsigned(op.id() == id)); }
|
static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecV(op)) & unsigned(op.id() == id)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Vector register base - a common base for both AArch32 & AArch64 vector register.
|
//! General purpose register (ARM).
|
||||||
class BaseVec : public Reg {
|
class Gp : public Reg {
|
||||||
public:
|
public:
|
||||||
ASMJIT_DEFINE_ABSTRACT_REG(BaseVec, Reg)
|
ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg)
|
||||||
|
|
||||||
//! Additional signature bits used by a vector register.
|
//! Special register id.
|
||||||
|
enum Id : uint32_t {
|
||||||
|
//! Register that depends on OS, could be used as TLS offset.
|
||||||
|
kIdOs = 18,
|
||||||
|
//! Frame pointer.
|
||||||
|
kIdFp = 29,
|
||||||
|
//! Link register.
|
||||||
|
kIdLr = 30,
|
||||||
|
//! Stack register id.
|
||||||
|
kIdSp = 31,
|
||||||
|
//! Zero register id.
|
||||||
|
//!
|
||||||
|
//! Although zero register has the same id as stack register it has a special treatment, because we need to be
|
||||||
|
//! able to distinguish between these two at API level. Some intructions were designed to be used with SP and
|
||||||
|
//! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing.
|
||||||
|
//!
|
||||||
|
//! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs,
|
||||||
|
//! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction.
|
||||||
|
kIdZr = 63
|
||||||
|
};
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isZR() const noexcept { return id() == kIdZr; }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isSP() const noexcept { return id() == kIdSp; }
|
||||||
|
|
||||||
|
//! Cast this register to a 32-bit R|W.
|
||||||
|
ASMJIT_INLINE_NODEBUG GpW w() const noexcept;
|
||||||
|
//! Cast this register to a 64-bit X.
|
||||||
|
ASMJIT_INLINE_NODEBUG GpX x() const noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Vector register (ARM).
|
||||||
|
class Vec : public Reg {
|
||||||
|
public:
|
||||||
|
ASMJIT_DEFINE_ABSTRACT_REG(Vec, Reg)
|
||||||
|
|
||||||
|
//! Additional signature bits used by arm::Vec.
|
||||||
enum AdditionalBits : uint32_t {
|
enum AdditionalBits : uint32_t {
|
||||||
// Register element type (3 bits).
|
// Register element type (3 bits).
|
||||||
// |........|........|.XXX....|........|
|
// |........|........|.XXX....|........|
|
||||||
@ -145,8 +178,57 @@ public:
|
|||||||
kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift
|
kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Element type (AArch64 only).
|
||||||
|
enum ElementType : uint32_t {
|
||||||
|
//! No element type specified.
|
||||||
|
kElementTypeNone = 0,
|
||||||
|
//! Byte elements (B8 or B16).
|
||||||
|
kElementTypeB,
|
||||||
|
//! Halfword elements (H4 or H8).
|
||||||
|
kElementTypeH,
|
||||||
|
//! Singleword elements (S2 or S4).
|
||||||
|
kElementTypeS,
|
||||||
|
//! Doubleword elements (D2).
|
||||||
|
kElementTypeD,
|
||||||
|
//! Byte elements grouped by 4 bytes (B4).
|
||||||
|
//!
|
||||||
|
//! \note This element-type is only used by few instructions.
|
||||||
|
kElementTypeB4,
|
||||||
|
//! Halfword elements grouped by 2 halfwords (H2).
|
||||||
|
//!
|
||||||
|
//! \note This element-type is only used by few instructions.
|
||||||
|
kElementTypeH2,
|
||||||
|
|
||||||
|
//! Count of element types.
|
||||||
|
kElementTypeCount
|
||||||
|
};
|
||||||
|
|
||||||
|
//! \cond
|
||||||
|
//! Shortcuts.
|
||||||
|
enum SignatureReg : uint32_t {
|
||||||
|
kSignatureElementB = kElementTypeB << kSignatureRegElementTypeShift,
|
||||||
|
kSignatureElementH = kElementTypeH << kSignatureRegElementTypeShift,
|
||||||
|
kSignatureElementS = kElementTypeS << kSignatureRegElementTypeShift,
|
||||||
|
kSignatureElementD = kElementTypeD << kSignatureRegElementTypeShift,
|
||||||
|
kSignatureElementB4 = kElementTypeB4 << kSignatureRegElementTypeShift,
|
||||||
|
kSignatureElementH2 = kElementTypeH2 << kSignatureRegElementTypeShift
|
||||||
|
};
|
||||||
|
//! \endcond
|
||||||
|
|
||||||
|
//! Returns whether the register has associated an element type.
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool hasElementType() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask>(); }
|
||||||
//! Returns whether the register has element index (it's an element index access).
|
//! Returns whether the register has element index (it's an element index access).
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool hasElementIndex() const noexcept { return _signature.hasField<kSignatureRegElementFlagMask>(); }
|
ASMJIT_INLINE_NODEBUG constexpr bool hasElementIndex() const noexcept { return _signature.hasField<kSignatureRegElementFlagMask>(); }
|
||||||
|
//! Returns whether the reggister has element type or element index (or both).
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask | kSignatureRegElementFlagMask>(); }
|
||||||
|
|
||||||
|
//! Returns element type of the register.
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr uint32_t elementType() const noexcept { return _signature.getField<kSignatureRegElementTypeMask>(); }
|
||||||
|
//! Sets element type of the register to `elementType`.
|
||||||
|
ASMJIT_INLINE_NODEBUG void setElementType(uint32_t elementType) noexcept { _signature.setField<kSignatureRegElementTypeMask>(elementType); }
|
||||||
|
//! Resets element type to none.
|
||||||
|
ASMJIT_INLINE_NODEBUG void resetElementType() noexcept { _signature.setField<kSignatureRegElementTypeMask>(0); }
|
||||||
|
|
||||||
//! Returns element index of the register.
|
//! Returns element index of the register.
|
||||||
ASMJIT_INLINE_NODEBUG constexpr uint32_t elementIndex() const noexcept { return _signature.getField<kSignatureRegElementIndexMask>(); }
|
ASMJIT_INLINE_NODEBUG constexpr uint32_t elementIndex() const noexcept { return _signature.getField<kSignatureRegElementIndexMask>(); }
|
||||||
//! Sets element index of the register to `elementType`.
|
//! Sets element index of the register to `elementType`.
|
||||||
@ -158,8 +240,140 @@ public:
|
|||||||
ASMJIT_INLINE_NODEBUG void resetElementIndex() noexcept {
|
ASMJIT_INLINE_NODEBUG void resetElementIndex() noexcept {
|
||||||
_signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask);
|
_signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementB); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementH); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementS); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature); }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementS); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementD); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB4); }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH2); }
|
||||||
|
|
||||||
|
//! Creates a cloned register with element access.
|
||||||
|
ASMJIT_INLINE_NODEBUG Vec at(uint32_t elementIndex) const noexcept {
|
||||||
|
return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id());
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Cast this register to an 8-bit B register (AArch64 only).
|
||||||
|
ASMJIT_INLINE_NODEBUG VecB b() const noexcept;
|
||||||
|
//! Cast this register to a 16-bit H register (AArch64 only).
|
||||||
|
ASMJIT_INLINE_NODEBUG VecH h() const noexcept;
|
||||||
|
//! Cast this register to a 32-bit S register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecS s() const noexcept;
|
||||||
|
//! Cast this register to a 64-bit D register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD d() const noexcept;
|
||||||
|
//! Cast this register to a 128-bit Q register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV q() const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV v() const noexcept;
|
||||||
|
|
||||||
|
//! Cast this register to a 128-bit V.B[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV b(uint32_t elementIndex) const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V.H[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV h(uint32_t elementIndex) const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V.S[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV s(uint32_t elementIndex) const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V.D[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV d(uint32_t elementIndex) const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V.H2[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV h2(uint32_t elementIndex) const noexcept;
|
||||||
|
//! Cast this register to a 128-bit V.B4[elementIndex] register.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV b4(uint32_t elementIndex) const noexcept;
|
||||||
|
|
||||||
|
//! Cast this register to V.8B.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD b8() const noexcept;
|
||||||
|
//! Cast this register to V.16B.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV b16() const noexcept;
|
||||||
|
//! Cast this register to V.2H.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecS h2() const noexcept;
|
||||||
|
//! Cast this register to V.4H.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD h4() const noexcept;
|
||||||
|
//! Cast this register to V.8H.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV h8() const noexcept;
|
||||||
|
//! Cast this register to V.2S.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD s2() const noexcept;
|
||||||
|
//! Cast this register to V.4S.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV s4() const noexcept;
|
||||||
|
//! Cast this register to V.2D.
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV d2() const noexcept;
|
||||||
|
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr OperandSignature _makeElementAccessSignature(uint32_t elementType, uint32_t elementIndex) noexcept {
|
||||||
|
return OperandSignature{
|
||||||
|
uint32_t(RegTraits<RegType::kARM_VecV>::kSignature) |
|
||||||
|
uint32_t(kSignatureRegElementFlagMask) |
|
||||||
|
uint32_t(elementType << kSignatureRegElementTypeShift) |
|
||||||
|
uint32_t(elementIndex << kSignatureRegElementIndexShift)};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! 32-bit GPW (AArch64) and/or GPR (ARM/AArch32) register.
|
||||||
|
class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits<RegType::kARM_GpW>) };
|
||||||
|
//! 64-bit GPX (AArch64) register.
|
||||||
|
class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits<RegType::kARM_GpX>) };
|
||||||
|
|
||||||
|
//! 8-bit view (S) of VFP/SIMD register.
|
||||||
|
class VecB : public Vec { ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits<RegType::kARM_VecB>) };
|
||||||
|
//! 16-bit view (S) of VFP/SIMD register.
|
||||||
|
class VecH : public Vec { ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits<RegType::kARM_VecH>) };
|
||||||
|
//! 32-bit view (S) of VFP/SIMD register.
|
||||||
|
class VecS : public Vec { ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits<RegType::kARM_VecS>) };
|
||||||
|
//! 64-bit view (D) of VFP/SIMD register.
|
||||||
|
class VecD : public Vec { ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits<RegType::kARM_VecD>) };
|
||||||
|
//! 128-bit vector register (Q or V).
|
||||||
|
class VecV : public Vec { ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits<RegType::kARM_VecV>) };
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG GpW Gp::w() const noexcept { return GpW(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG GpX Gp::x() const noexcept { return GpX(id()); }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG VecB Vec::b() const noexcept { return VecB(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecH Vec::h() const noexcept { return VecH(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecS Vec::s() const noexcept { return VecS(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD Vec::d() const noexcept { return VecD(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::q() const noexcept { return VecV(id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::v() const noexcept { return VecV(id()); }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB, elementIndex), id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH, elementIndex), id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeS, elementIndex), id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeD, elementIndex), id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH2, elementIndex), id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB4, elementIndex), id()); }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); }
|
||||||
|
ASMJIT_INLINE_NODEBUG VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); }
|
||||||
|
|
||||||
|
#ifndef _DOXYGEN
|
||||||
|
namespace regs {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//! Creates a 32-bit W register operand (ARM/AArch64).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr GpW w(uint32_t id) noexcept { return GpW(id); }
|
||||||
|
//! Creates a 64-bit X register operand (AArch64).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr GpX x(uint32_t id) noexcept { return GpX(id); }
|
||||||
|
//! Creates a 32-bit S register operand (ARM/AArch64).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr VecS s(uint32_t id) noexcept { return VecS(id); }
|
||||||
|
//! Creates a 64-bit D register operand (ARM/AArch64).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr VecD d(uint32_t id) noexcept { return VecD(id); }
|
||||||
|
//! Creates a 1282-bit V register operand (ARM/AArch64).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr VecV v(uint32_t id) noexcept { return VecV(id); }
|
||||||
|
|
||||||
|
#ifndef _DOXYGEN
|
||||||
|
} // {regs}
|
||||||
|
|
||||||
|
// Make `arm::regs` accessible through `arm` namespace as well.
|
||||||
|
using namespace regs;
|
||||||
|
#endif
|
||||||
|
|
||||||
//! Memory operand (ARM).
|
//! Memory operand (ARM).
|
||||||
class Mem : public BaseMem {
|
class Mem : public BaseMem {
|
||||||
public:
|
public:
|
||||||
@ -171,18 +385,23 @@ public:
|
|||||||
kSignatureMemShiftValueShift = 14,
|
kSignatureMemShiftValueShift = 14,
|
||||||
kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift,
|
kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift,
|
||||||
|
|
||||||
// Index shift operation (4 bits).
|
// Shift operation type (4 bits).
|
||||||
// |........|XXXX....|........|........|
|
// |........|XXXX....|........|........|
|
||||||
kSignatureMemShiftOpShift = 20,
|
kSignatureMemPredicateShift = 20,
|
||||||
kSignatureMemShiftOpMask = 0x0Fu << kSignatureMemShiftOpShift,
|
kSignatureMemPredicateMask = 0x0Fu << kSignatureMemPredicateShift
|
||||||
|
|
||||||
// Offset mode type (2 bits).
|
|
||||||
// |......XX|........|........|........|
|
|
||||||
kSignatureMemOffsetModeShift = 24,
|
|
||||||
kSignatureMemOffsetModeMask = 0x03u << kSignatureMemOffsetModeShift
|
|
||||||
};
|
};
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
|
||||||
|
//! Memory offset mode.
|
||||||
|
//!
|
||||||
|
//! Additional constants that can be used with the `predicate`.
|
||||||
|
enum OffsetMode : uint32_t {
|
||||||
|
//! Pre-index "[BASE, #Offset {, <shift>}]!" with write-back.
|
||||||
|
kOffsetPreIndex = 0xE,
|
||||||
|
//! Post-index "[BASE], #Offset {, <shift>}" with write-back.
|
||||||
|
kOffsetPostIndex = 0xF
|
||||||
|
};
|
||||||
|
|
||||||
//! \name Construction & Destruction
|
//! \name Construction & Destruction
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
@ -219,11 +438,11 @@ public:
|
|||||||
: BaseMem(Signature::fromOpType(OperandType::kMem) |
|
: BaseMem(Signature::fromOpType(OperandType::kMem) |
|
||||||
Signature::fromMemBaseType(base.type()) |
|
Signature::fromMemBaseType(base.type()) |
|
||||||
Signature::fromMemIndexType(index.type()) |
|
Signature::fromMemIndexType(index.type()) |
|
||||||
Signature::fromValue<kSignatureMemShiftOpMask>(uint32_t(shift.op())) |
|
Signature::fromValue<kSignatureMemPredicateMask>(uint32_t(shift.op())) |
|
||||||
Signature::fromValue<kSignatureMemShiftValueMask>(shift.value()) |
|
Signature::fromValue<kSignatureMemShiftValueMask>(shift.value()) |
|
||||||
signature, base.id(), index.id(), 0) {}
|
signature, base.id(), index.id(), 0) {}
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr explicit Mem(uint64_t base, Signature signature = Signature{0}) noexcept
|
ASMJIT_INLINE_NODEBUG constexpr Mem(uint64_t base, Signature signature = Signature{0}) noexcept
|
||||||
: BaseMem(Signature::fromOpType(OperandType::kMem) |
|
: BaseMem(Signature::fromOpType(OperandType::kMem) |
|
||||||
signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
|
signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
|
||||||
|
|
||||||
@ -252,14 +471,14 @@ public:
|
|||||||
//! Clones the memory operand and makes it pre-index.
|
//! Clones the memory operand and makes it pre-index.
|
||||||
ASMJIT_INLINE_NODEBUG Mem pre() const noexcept {
|
ASMJIT_INLINE_NODEBUG Mem pre() const noexcept {
|
||||||
Mem result(*this);
|
Mem result(*this);
|
||||||
result.setOffsetMode(OffsetMode::kPreIndex);
|
result.setPredicate(kOffsetPreIndex);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Clones the memory operand, applies a given offset `off` and makes it pre-index.
|
//! Clones the memory operand, applies a given offset `off` and makes it pre-index.
|
||||||
ASMJIT_INLINE_NODEBUG Mem pre(int64_t off) const noexcept {
|
ASMJIT_INLINE_NODEBUG Mem pre(int64_t off) const noexcept {
|
||||||
Mem result(*this);
|
Mem result(*this);
|
||||||
result.setOffsetMode(OffsetMode::kPreIndex);
|
result.setPredicate(kOffsetPreIndex);
|
||||||
result.addOffset(off);
|
result.addOffset(off);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -267,14 +486,14 @@ public:
|
|||||||
//! Clones the memory operand and makes it post-index.
|
//! Clones the memory operand and makes it post-index.
|
||||||
ASMJIT_INLINE_NODEBUG Mem post() const noexcept {
|
ASMJIT_INLINE_NODEBUG Mem post() const noexcept {
|
||||||
Mem result(*this);
|
Mem result(*this);
|
||||||
result.setOffsetMode(OffsetMode::kPostIndex);
|
result.setPredicate(kOffsetPostIndex);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Clones the memory operand, applies a given offset `off` and makes it post-index.
|
//! Clones the memory operand, applies a given offset `off` and makes it post-index.
|
||||||
ASMJIT_INLINE_NODEBUG Mem post(int64_t off) const noexcept {
|
ASMJIT_INLINE_NODEBUG Mem post(int64_t off) const noexcept {
|
||||||
Mem result(*this);
|
Mem result(*this);
|
||||||
result.setOffsetMode(OffsetMode::kPostIndex);
|
result.setPredicate(kOffsetPostIndex);
|
||||||
result.addOffset(off);
|
result.addOffset(off);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -301,85 +520,88 @@ public:
|
|||||||
setShift(shift);
|
setShift(shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, Shift shift) noexcept {
|
|
||||||
setIndex(index);
|
|
||||||
setShift(shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
//! \name ARM Specific Features
|
//! \name ARM Specific Features
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! Gets offset mode.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr OffsetMode offsetMode() const noexcept { return OffsetMode(_signature.getField<kSignatureMemOffsetModeMask>()); }
|
|
||||||
//! Sets offset mode to `mode`.
|
|
||||||
ASMJIT_INLINE_NODEBUG void setOffsetMode(OffsetMode mode) noexcept { _signature.setField<kSignatureMemOffsetModeMask>(uint32_t(mode)); }
|
|
||||||
//! Resets offset mode to default (fixed offset, without write-back).
|
|
||||||
ASMJIT_INLINE_NODEBUG void resetOffsetMode() noexcept { _signature.setField<kSignatureMemOffsetModeMask>(uint32_t(OffsetMode::kFixed)); }
|
|
||||||
|
|
||||||
//! Tests whether the current memory offset mode is fixed (see \ref OffsetMode::kFixed).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isFixedOffset() const noexcept { return offsetMode() == OffsetMode::kFixed; }
|
|
||||||
//! Tests whether the current memory offset mode is either pre-index or post-index (write-back is used).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isPreOrPost() const noexcept { return offsetMode() != OffsetMode::kFixed; }
|
|
||||||
//! Tests whether the current memory offset mode is pre-index (write-back is used).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isPreIndex() const noexcept { return offsetMode() == OffsetMode::kPreIndex; }
|
|
||||||
//! Tests whether the current memory offset mode is post-index (write-back is used).
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool isPostIndex() const noexcept { return offsetMode() == OffsetMode::kPostIndex; }
|
|
||||||
|
|
||||||
//! Sets offset mode of this memory operand to pre-index (write-back is used).
|
|
||||||
ASMJIT_INLINE_NODEBUG void makePreIndex() noexcept { setOffsetMode(OffsetMode::kPreIndex); }
|
|
||||||
//! Sets offset mode of this memory operand to post-index (write-back is used).
|
|
||||||
ASMJIT_INLINE_NODEBUG void makePostIndex() noexcept { setOffsetMode(OffsetMode::kPostIndex); }
|
|
||||||
|
|
||||||
//! Gets shift operation that is used by index register.
|
|
||||||
ASMJIT_INLINE_NODEBUG constexpr ShiftOp shiftOp() const noexcept { return ShiftOp(_signature.getField<kSignatureMemShiftOpMask>()); }
|
|
||||||
//! Sets shift operation that is used by index register.
|
|
||||||
ASMJIT_INLINE_NODEBUG void setShiftOp(ShiftOp sop) noexcept { _signature.setField<kSignatureMemShiftOpMask>(uint32_t(sop)); }
|
|
||||||
//! Resets shift operation that is used by index register to LSL (default value).
|
|
||||||
ASMJIT_INLINE_NODEBUG void resetShiftOp() noexcept { _signature.setField<kSignatureMemShiftOpMask>(uint32_t(ShiftOp::kLSL)); }
|
|
||||||
|
|
||||||
//! Gets whether the memory operand has shift (aka scale) constant.
|
//! Gets whether the memory operand has shift (aka scale) constant.
|
||||||
ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
|
ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
|
||||||
//! Gets the memory operand's shift (aka scale) constant.
|
//! Gets the memory operand's shift (aka scale) constant.
|
||||||
ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
|
ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
|
||||||
//! Sets the memory operand's shift (aka scale) constant.
|
//! Sets the memory operand's shift (aka scale) constant.
|
||||||
ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
|
ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
|
||||||
|
|
||||||
//! Sets the memory operand's shift and shift operation.
|
|
||||||
ASMJIT_INLINE_NODEBUG void setShift(Shift shift) noexcept {
|
|
||||||
_signature.setField<kSignatureMemShiftOpMask>(uint32_t(shift.op()));
|
|
||||||
_signature.setField<kSignatureMemShiftValueMask>(shift.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Resets the memory operand's shift (aka scale) constant to zero.
|
//! Resets the memory operand's shift (aka scale) constant to zero.
|
||||||
ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
|
ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
|
||||||
|
|
||||||
|
//! Gets memory predicate (shift mode or offset mode), see \ref ShiftOp and \ref OffsetMode.
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return _signature.getField<kSignatureMemPredicateMask>(); }
|
||||||
|
//! Sets memory predicate to `predicate`, see `Mem::ShiftOp`.
|
||||||
|
ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { _signature.setField<kSignatureMemPredicateMask>(predicate); }
|
||||||
|
//! Resets shift mode to LSL (default).
|
||||||
|
ASMJIT_INLINE_NODEBUG void resetPredicate() noexcept { _signature.setField<kSignatureMemPredicateMask>(0); }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isFixedOffset() const noexcept { return predicate() < kOffsetPreIndex; }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isPreOrPost() const noexcept { return predicate() >= kOffsetPreIndex; }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isPreIndex() const noexcept { return predicate() == kOffsetPreIndex; }
|
||||||
|
ASMJIT_INLINE_NODEBUG constexpr bool isPostIndex() const noexcept { return predicate() == kOffsetPostIndex; }
|
||||||
|
|
||||||
|
ASMJIT_INLINE_NODEBUG void resetToFixedOffset() noexcept { resetPredicate(); }
|
||||||
|
ASMJIT_INLINE_NODEBUG void makePreIndex() noexcept { setPredicate(kOffsetPreIndex); }
|
||||||
|
ASMJIT_INLINE_NODEBUG void makePostIndex() noexcept { setPredicate(kOffsetPostIndex); }
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
};
|
};
|
||||||
|
|
||||||
//! \name Shift Operation Construction
|
//! Creates `[base, offset]` memory operand (offset mode).
|
||||||
//! \{
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept {
|
||||||
|
return Mem(base, offset);
|
||||||
|
}
|
||||||
|
|
||||||
//! Constructs a `LSL #value` shift (logical shift left).
|
//! Creates `[base, offset]!` memory operand (pre-index mode).
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); }
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept {
|
||||||
//! Constructs a `LSR #value` shift (logical shift right).
|
return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPreIndex));
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); }
|
}
|
||||||
//! Constructs a `ASR #value` shift (arithmetic shift right).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); }
|
|
||||||
//! Constructs a `ROR #value` shift (rotate right).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); }
|
|
||||||
//! Constructs a `RRX` shift (rotate with carry by 1).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); }
|
|
||||||
//! Constructs a `MSL #value` shift (logical shift left filling ones).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); }
|
|
||||||
|
|
||||||
//! \}
|
//! Creates `[base], offset` memory operand (post-index mode).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept {
|
||||||
|
return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPostIndex));
|
||||||
|
}
|
||||||
|
|
||||||
//! \name Memory Operand Construction
|
//! Creates `[base, index]` memory operand.
|
||||||
//! \{
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index) noexcept {
|
||||||
|
return Mem(base, index);
|
||||||
|
}
|
||||||
|
|
||||||
//! Creates `[base]` absolute memory operand (AArch32 or AArch64).
|
//! Creates `[base, index]!` memory operand (pre-index mode).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, const Gp& index) noexcept {
|
||||||
|
return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPreIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Creates `[base], index` memory operand (post-index mode).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept {
|
||||||
|
return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPostIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Creates `[base, index, SHIFT_OP #shift]` memory operand.
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept {
|
||||||
|
return Mem(base, index, shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Creates `[base, offset]` memory operand.
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept {
|
||||||
|
return Mem(base, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: [ARM] PC + offset address.
|
||||||
|
#if 0
|
||||||
|
//! Creates `[PC + offset]` (relative) memory operand.
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept {
|
||||||
|
return Mem(pc, offset);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//! Creates `[base]` absolute memory operand.
|
||||||
//!
|
//!
|
||||||
//! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing.
|
//! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing.
|
||||||
//! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it
|
//! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it
|
||||||
@ -389,8 +611,16 @@ static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base) noexcept { return
|
|||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
ASMJIT_END_SUB_NAMESPACE
|
ASMJIT_END_SUB_NAMESPACE
|
||||||
|
|
||||||
|
//! \cond INTERNAL
|
||||||
|
ASMJIT_BEGIN_NAMESPACE
|
||||||
|
ASMJIT_DEFINE_TYPE_ID(arm::GpW, TypeId::kInt32);
|
||||||
|
ASMJIT_DEFINE_TYPE_ID(arm::GpX, TypeId::kInt64);
|
||||||
|
ASMJIT_DEFINE_TYPE_ID(arm::VecS, TypeId::kFloat32x1);
|
||||||
|
ASMJIT_DEFINE_TYPE_ID(arm::VecD, TypeId::kFloat64x1);
|
||||||
|
ASMJIT_DEFINE_TYPE_ID(arm::VecV, TypeId::kInt32x4);
|
||||||
|
ASMJIT_END_NAMESPACE
|
||||||
|
//! \endcond
|
||||||
|
|
||||||
#endif // ASMJIT_ARM_ARMOPERAND_H_INCLUDED
|
#endif // ASMJIT_ARM_ARMOPERAND_H_INCLUDED
|
||||||
|
40
deps/asmjit/src/asmjit/arm/armutils.h
vendored
40
deps/asmjit/src/asmjit/arm/armutils.h
vendored
@ -6,7 +6,6 @@
|
|||||||
#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
||||||
#define ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
#define ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
||||||
|
|
||||||
#include "../core/support.h"
|
|
||||||
#include "../arm/armglobals.h"
|
#include "../arm/armglobals.h"
|
||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
||||||
@ -17,38 +16,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
|||||||
//! Public utilities and helpers for targeting AArch32 and AArch64 architectures.
|
//! Public utilities and helpers for targeting AArch32 and AArch64 architectures.
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
//! Encodes a 12-bit immediate part of opcode that ise used by a standard 32-bit ARM encoding.
|
|
||||||
ASMJIT_MAYBE_UNUSED
|
|
||||||
static inline bool encodeAArch32Imm(uint64_t imm, uint32_t* encodedImmOut) noexcept {
|
|
||||||
if (imm & 0xFFFFFFFF00000000u)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
uint32_t v = uint32_t(imm);
|
|
||||||
uint32_t r = 0;
|
|
||||||
|
|
||||||
if (v <= 0xFFu) {
|
|
||||||
*encodedImmOut = v;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotate if there are bits on both ends (LSB and MSB)
|
|
||||||
// (otherwise we would not be able to calculate the rotation with ctz).
|
|
||||||
if (v & 0xFF0000FFu) {
|
|
||||||
v = Support::ror(v, 16);
|
|
||||||
r = 16u;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t n = Support::ctz(v) & ~0x1u;
|
|
||||||
r = (r - n) & 0x1Eu;
|
|
||||||
v = Support::ror(v, n);
|
|
||||||
|
|
||||||
if (v > 0xFFu)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
*encodedImmOut = v | (r << 7);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Decomposed fields of a logical immediate value.
|
//! Decomposed fields of a logical immediate value.
|
||||||
struct LogicalImm {
|
struct LogicalImm {
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
@ -127,13 +94,6 @@ static ASMJIT_INLINE_NODEBUG bool isLogicalImm(uint64_t imm, uint32_t width) noe
|
|||||||
return encodeLogicalImm(imm, width, &dummy);
|
return encodeLogicalImm(imm, width, &dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns true if the given `imm` value is encodable as an immediate with `add` and `sub` instructions on AArch64.
|
|
||||||
//! These two instructions can encode 12-bit immediate value optionally shifted left by 12 bits.
|
|
||||||
ASMJIT_MAYBE_UNUSED
|
|
||||||
static ASMJIT_INLINE_NODEBUG bool isAddSubImm(uint64_t imm) noexcept {
|
|
||||||
return imm <= 0xFFFu || (imm & ~uint64_t(0xFFFu << 12)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
|
//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
|
||||||
//! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to
|
//! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to
|
||||||
//! verify that the immediate is encodable before using the value.
|
//! verify that the immediate is encodable before using the value.
|
||||||
|
2
deps/asmjit/src/asmjit/asmjit.h
vendored
2
deps/asmjit/src/asmjit/asmjit.h
vendored
@ -3,7 +3,7 @@
|
|||||||
// SPDX-License-Identifier: Zlib
|
// SPDX-License-Identifier: Zlib
|
||||||
// Official GitHub Repository: https://github.com/asmjit/asmjit
|
// Official GitHub Repository: https://github.com/asmjit/asmjit
|
||||||
//
|
//
|
||||||
// Copyright (c) 2008-2024 The AsmJit Authors
|
// Copyright (c) 2008-2021 The AsmJit Authors
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
129
deps/asmjit/src/asmjit/core.h
vendored
129
deps/asmjit/src/asmjit/core.h
vendored
@ -179,47 +179,38 @@ namespace asmjit {
|
|||||||
//! AsmJit currently supports only X86/X64 backend, but the plan is to add more backends in the future. By default
|
//! AsmJit currently supports only X86/X64 backend, but the plan is to add more backends in the future. By default
|
||||||
//! AsmJit builds only the host backend, which is auto-detected at compile-time, but this can be overridden.
|
//! AsmJit builds only the host backend, which is auto-detected at compile-time, but this can be overridden.
|
||||||
//!
|
//!
|
||||||
//! - \ref ASMJIT_NO_X86 - Disables both X86 and X86_64 backends.
|
//! - \ref ASMJIT_NO_X86 - Disable X86/X64 backends.
|
||||||
//! - \ref ASMJIT_NO_AARCH64 - Disables AArch64 backend.
|
//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architectures.
|
||||||
//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architecture backends, only keeps a native backend.
|
|
||||||
//!
|
|
||||||
//! ### AsmJit Compilation Options
|
|
||||||
//!
|
|
||||||
//! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time so it won't be available and the
|
|
||||||
//! compilation will fail if there is attempt to use such API. This includes deprecated classes, namespaces,
|
|
||||||
//! enumerations, and functions.
|
|
||||||
//!
|
|
||||||
//! - \ref ASMJIT_NO_SHM_OPEN - Disables functionality that uses `shm_open()`.
|
|
||||||
//!
|
|
||||||
//! - \ref ASMJIT_NO_ABI_NAMESPACE - Disables inline ABI namespace within `asmjit` namespace. This is only provided
|
|
||||||
//! for users that control all the dependencies (even transitive ones) and that make sure that no two AsmJit
|
|
||||||
//! versions are used at the same time. This option can be debugging a little simpler as there would not be ABI
|
|
||||||
//! tag after `asmjit::` namespace. Otherwise asmjit would look like `asmjit::_abi_1_13::`, for example.
|
|
||||||
//!
|
//!
|
||||||
//! ### Features Selection
|
//! ### Features Selection
|
||||||
//!
|
//!
|
||||||
//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and
|
//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and
|
||||||
//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...`
|
//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...`
|
||||||
//! definitions.
|
//! definitions.
|
||||||
|
//!
|
||||||
|
//! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time so it won't be available and the
|
||||||
|
//! compilation will fail if there is attempt to use such API. This includes deprecated classes, namespaces,
|
||||||
|
//! enumerations, and functions.
|
||||||
|
//!
|
||||||
|
//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref
|
||||||
|
//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder.
|
||||||
|
//!
|
||||||
|
//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely.
|
||||||
|
//!
|
||||||
//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime.
|
//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime.
|
||||||
//!
|
//!
|
||||||
|
//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter.
|
||||||
|
//!
|
||||||
//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should
|
//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should
|
||||||
//! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query
|
//! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query
|
||||||
//! instruction names, register names, etc...
|
//! instruction names, register names, etc...
|
||||||
//!
|
//!
|
||||||
//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter.
|
|
||||||
//!
|
|
||||||
//! - \ref ASMJIT_NO_VALIDATION - Disables validation API.
|
//! - \ref ASMJIT_NO_VALIDATION - Disables validation API.
|
||||||
//!
|
//!
|
||||||
//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API, must be used together with \ref
|
//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API, must be used together with \ref
|
||||||
//! ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and register
|
//! ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and register
|
||||||
//! allocation.
|
//! allocation.
|
||||||
//!
|
//!
|
||||||
//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref
|
|
||||||
//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder.
|
|
||||||
//!
|
|
||||||
//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely.
|
|
||||||
//!
|
|
||||||
//! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be
|
//! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be
|
||||||
//! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution).
|
//! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution).
|
||||||
//! The possibility to disable certain features exists mainly for customized AsmJit builds.
|
//! The possibility to disable certain features exists mainly for customized AsmJit builds.
|
||||||
@ -240,7 +231,7 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! Useful tips before you start:
|
//! Useful tips before you start:
|
||||||
//!
|
//!
|
||||||
//! - Visit our [Public Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help.
|
//! - Visit our [Public Gitter Channel](https://gitter.im/asmjit/asmjit) if you need a quick help.
|
||||||
//!
|
//!
|
||||||
//! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that you are not using deprecated
|
//! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that you are not using deprecated
|
||||||
//! functionality at all. Deprecated functions are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes
|
//! functionality at all. Deprecated functions are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes
|
||||||
@ -248,47 +239,6 @@ namespace asmjit {
|
|||||||
//! because some compilers would warn about that. If your project compiles fine with `ASMJIT_NO_DEPRECATED`
|
//! because some compilers would warn about that. If your project compiles fine with `ASMJIT_NO_DEPRECATED`
|
||||||
//! it's not using anything, which was deprecated.
|
//! it's not using anything, which was deprecated.
|
||||||
//!
|
//!
|
||||||
//! ### Changes committed at 2024-01-01
|
|
||||||
//!
|
|
||||||
//! Core changes:
|
|
||||||
//!
|
|
||||||
//! - Renamed equality functions `eq()` to `equals()` - Only related to `String`, `ZoneVector`, and `CpuFeatures`.
|
|
||||||
//! Old function names were deprecated.
|
|
||||||
//!
|
|
||||||
//! - Removed `CallConvId::kNone` in favor of `CallConvId::kCDecl`, which is now the default calling convention.
|
|
||||||
//!
|
|
||||||
//! - Deprecated `CallConvId::kHost` in favor of `CallConvId::kCDecl` - host calling convention is now not part
|
|
||||||
//! of CallConvId, it can be calculated from CallConvId and Environment instead.
|
|
||||||
//!
|
|
||||||
//! ### Changes committed at 2023-12-27
|
|
||||||
//!
|
|
||||||
//! Core changes:
|
|
||||||
//!
|
|
||||||
//! - Renamed `a64::Vec::ElementType` to `a64::VecElementType` and made it a typed enum. This enum was used mostly
|
|
||||||
//! internally, but there is a public API using it, so it's a breaking change.
|
|
||||||
//!
|
|
||||||
//! - Refactored `FuncSignature`, `FuncSignatureT`, and `FuncSignatureBuilder`. There is only `FuncSignature` now,
|
|
||||||
//! which acts as a function signature holder and builder. Replace `FuncSignatureBuilder` with `FuncSignature`
|
|
||||||
//! and use `FuncSignature::build<args>` instead of `FuncSignatureT<args>`. The old API has been deprecated.
|
|
||||||
//!
|
|
||||||
//! - The maximum number of function arguments was raised from 16 to 32.
|
|
||||||
//!
|
|
||||||
//! ### Changes committed at 2023-12-26
|
|
||||||
//!
|
|
||||||
//! Core changes:
|
|
||||||
//!
|
|
||||||
//! - Reworked InstNode and InstExNode to be friendlier to static analysis and to not cause undefined behavior.
|
|
||||||
//! InstNode has no operands visually embedded within the struct so there is no _opArray (which was internal).
|
|
||||||
//! This means that sizeof(InstNode) changed, but since it's allocated by AsmJit this should be fine. Moreover,
|
|
||||||
//! there is no longer InstExNode as that was more a hack, instead there is now InstNodeWithOperands, which is
|
|
||||||
//! a template and specifies the number of operands embedded (InstNode accesses these). All nodes that inherited
|
|
||||||
//! InstExNode now just inherit InstNodeWithOperands<InstNode::kBaseOpCapacity>, which would provide the same
|
|
||||||
//! number of nodes as InstNode.
|
|
||||||
//!
|
|
||||||
//! - Moved GP and Vec registers from asmjit::arm namespace to asmjit::a64 namespace. At this time there was
|
|
||||||
//! no prior deprecation as having arm::Vec would collide with a64::Vec as arm namespace is used within a64
|
|
||||||
//! namespace. Just change `arm::Gp` to `a64::Gp` and `arm::Vec` to `a64::Vec`.
|
|
||||||
//!
|
|
||||||
//! ### Changes committed at 2023-09-10
|
//! ### Changes committed at 2023-09-10
|
||||||
//!
|
//!
|
||||||
//! Core changes:
|
//! Core changes:
|
||||||
@ -469,7 +419,7 @@ namespace asmjit {
|
|||||||
//! // Calling a function (Compiler) changed - use invoke() instead of call().
|
//! // Calling a function (Compiler) changed - use invoke() instead of call().
|
||||||
//! void functionInvocation(x86::Compiler& cc) {
|
//! void functionInvocation(x86::Compiler& cc) {
|
||||||
//! InvokeNode* invokeNode;
|
//! InvokeNode* invokeNode;
|
||||||
//! cc.invoke(&invokeNode, targetOperand, FuncSignature::build<...>(...));
|
//! cc.invoke(&invokeNode, targetOperand, FuncSignatureT<...>(...));
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
@ -966,15 +916,12 @@ namespace asmjit {
|
|||||||
//! with assembler requires the knowledge of the following:
|
//! with assembler requires the knowledge of the following:
|
||||||
//!
|
//!
|
||||||
//! - \ref BaseAssembler and architecture-specific assemblers:
|
//! - \ref BaseAssembler and architecture-specific assemblers:
|
||||||
//! - \ref x86::Assembler - Assembler implementation targeting X86 and X86_64 architectures.
|
//! - \ref x86::Assembler - Assembler specific to X86 architecture
|
||||||
//! - \ref a64::Assembler - Assembler implementation targeting AArch64 architecture.
|
|
||||||
//! - \ref Operand and its variations:
|
//! - \ref Operand and its variations:
|
||||||
//! - \ref BaseReg - Base class for a register operand, inherited by:
|
//! - \ref BaseReg - Base class for a register operand, inherited by:
|
||||||
//! - \ref x86::Reg - Register operand specific to X86 and X86_64 architectures.
|
//! - \ref x86::Reg - Register operand specific to X86 architecture.
|
||||||
//! - \ref arm::Reg - Register operand specific to AArch64 architecture.
|
|
||||||
//! - \ref BaseMem - Base class for a memory operand, inherited by:
|
//! - \ref BaseMem - Base class for a memory operand, inherited by:
|
||||||
//! - \ref x86::Mem - Memory operand specific to X86 architecture.
|
//! - \ref x86::Mem - Memory operand specific to X86 architecture.
|
||||||
//! - \ref arm::Mem - Memory operand specific to AArch64 architecture.
|
|
||||||
//! - \ref Imm - Immediate (value) operand.
|
//! - \ref Imm - Immediate (value) operand.
|
||||||
//! - \ref Label - Label operand.
|
//! - \ref Label - Label operand.
|
||||||
//!
|
//!
|
||||||
@ -1082,7 +1029,7 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! // Type-unsafe, but possible.
|
//! // Type-unsafe, but possible.
|
||||||
//! a.emit(x86::Inst::kIdMov, dst, m);
|
//! a.emit(x86::Inst::kIdMov, dst, m);
|
||||||
//! // Also possible, `emit()` is type-less and can be used with raw Operand.
|
//! // Also possible, `emit()` is typeless and can be used with raw Operand.
|
||||||
//! a.emit(x86::Inst::kIdMov, dst, op);
|
//! a.emit(x86::Inst::kIdMov, dst, op);
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
@ -1153,10 +1100,10 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! void testX86Mem() {
|
//! void testX86Mem() {
|
||||||
//! // The same as: dword ptr [rax + rbx].
|
//! // The same as: dword ptr [rax + rbx].
|
||||||
//! x86::Mem a = x86::dword_ptr(x86::rax, x86::rbx);
|
//! x86::Mem a = x86::dword_ptr(rax, rbx);
|
||||||
//!
|
//!
|
||||||
//! // The same as: qword ptr [rdx + rsi << 0 + 1].
|
//! // The same as: qword ptr [rdx + rsi << 0 + 1].
|
||||||
//! x86::Mem b = x86::qword_ptr(x86::rdx, x86::rsi, 0, 1);
|
//! x86::Mem b = x86::qword_ptr(rdx, rsi, 0, 1);
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
@ -1169,18 +1116,18 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! void testX86Mem() {
|
//! void testX86Mem() {
|
||||||
//! // The same as: dword ptr [rax + 12].
|
//! // The same as: dword ptr [rax + 12].
|
||||||
//! x86::Mem mem = x86::dword_ptr(x86::rax, 12);
|
//! x86::Mem mem = x86::dword_ptr(rax, 12);
|
||||||
//!
|
//!
|
||||||
//! mem.hasBase(); // true.
|
//! mem.hasBase(); // true.
|
||||||
//! mem.hasIndex(); // false.
|
//! mem.hasIndex(); // false.
|
||||||
//! mem.size(); // 4.
|
//! mem.size(); // 4.
|
||||||
//! mem.offset(); // 12.
|
//! mem.offset(); // 12.
|
||||||
//!
|
//!
|
||||||
//! mem.setSize(0); // Sets the size to 0 (makes it size-less).
|
//! mem.setSize(0); // Sets the size to 0 (makes it sizeless).
|
||||||
//! mem.addOffset(-1); // Adds -1 to the offset and makes it 11.
|
//! mem.addOffset(-1); // Adds -1 to the offset and makes it 11.
|
||||||
//! mem.setOffset(0); // Sets the offset to 0.
|
//! mem.setOffset(0); // Sets the offset to 0.
|
||||||
//! mem.setBase(x86::rcx); // Changes BASE to RCX.
|
//! mem.setBase(rcx); // Changes BASE to RCX.
|
||||||
//! mem.setIndex(x86::rax); // Changes INDEX to RAX.
|
//! mem.setIndex(rax); // Changes INDEX to RAX.
|
||||||
//! mem.hasIndex(); // true.
|
//! mem.hasIndex(); // true.
|
||||||
//! }
|
//! }
|
||||||
//! // ...
|
//! // ...
|
||||||
@ -1272,8 +1219,7 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! ### Builder Examples
|
//! ### Builder Examples
|
||||||
//!
|
//!
|
||||||
//! - \ref x86::Builder - Builder implementation targeting X86 and X86_64 architectures.
|
//! - \ref x86::Builder provides many X86/X64 examples.
|
||||||
//! - \ref a64::Builder - Builder implementation targeting AArch64 architecture.
|
|
||||||
|
|
||||||
|
|
||||||
//! \defgroup asmjit_compiler Compiler
|
//! \defgroup asmjit_compiler Compiler
|
||||||
@ -1310,8 +1256,7 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! ### Compiler Examples
|
//! ### Compiler Examples
|
||||||
//!
|
//!
|
||||||
//! - \ref x86::Compiler - Compiler implementation targeting X86 and X86_64 architectures.
|
//! - \ref x86::Compiler provides many X86/X64 examples.
|
||||||
//! - \ref a64::Compiler - Compiler implementation targeting AArch64 architecture.
|
|
||||||
//!
|
//!
|
||||||
//! ### Compiler Tips
|
//! ### Compiler Tips
|
||||||
//!
|
//!
|
||||||
@ -1483,7 +1428,7 @@ namespace asmjit {
|
|||||||
//! The first example illustrates how to format operands:
|
//! The first example illustrates how to format operands:
|
||||||
//!
|
//!
|
||||||
//! ```
|
//! ```
|
||||||
//! #include <asmjit/x86.h>
|
//! #include <asmjit/core.h>
|
||||||
//! #include <stdio.h>
|
//! #include <stdio.h>
|
||||||
//!
|
//!
|
||||||
//! using namespace asmjit;
|
//! using namespace asmjit;
|
||||||
@ -1508,17 +1453,17 @@ namespace asmjit {
|
|||||||
//! // compatible with what AsmJit normally does.
|
//! // compatible with what AsmJit normally does.
|
||||||
//! Arch arch = Arch::kX64;
|
//! Arch arch = Arch::kX64;
|
||||||
//!
|
//!
|
||||||
//! logOperand(arch, rax); // Prints 'rax'.
|
//! log(arch, rax); // Prints 'rax'.
|
||||||
//! logOperand(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`.
|
//! log(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`.
|
||||||
//! logOperand(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`.
|
//! log(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`.
|
||||||
//! logOperand(arch, imm(42)); // Prints '42'.
|
//! log(arch, imm(42)); // Prints '42'.
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! Next example illustrates how to format whole instructions:
|
//! Next example illustrates how to format whole instructions:
|
||||||
//!
|
//!
|
||||||
//! ```
|
//! ```
|
||||||
//! #include <asmjit/x86.h>
|
//! #include <asmjit/core.h>
|
||||||
//! #include <stdio.h>
|
//! #include <stdio.h>
|
||||||
//! #include <utility>
|
//! #include <utility>
|
||||||
//!
|
//!
|
||||||
@ -1533,7 +1478,7 @@ namespace asmjit {
|
|||||||
//! FormatFlags formatFlags = FormatFlags::kNone;
|
//! FormatFlags formatFlags = FormatFlags::kNone;
|
||||||
//!
|
//!
|
||||||
//! // The formatter expects operands in an array.
|
//! // The formatter expects operands in an array.
|
||||||
//! Operand_ operands[] { std::forward<Args>(args)... };
|
//! Operand_ operands { std::forward<Args>(args)... };
|
||||||
//!
|
//!
|
||||||
//! StringTmp<128> sb;
|
//! StringTmp<128> sb;
|
||||||
//! Formatter::formatInstruction(
|
//! Formatter::formatInstruction(
|
||||||
@ -1555,13 +1500,13 @@ namespace asmjit {
|
|||||||
//! // Prints 'vaddpd zmm0, zmm1, [rax] {1to8}'.
|
//! // Prints 'vaddpd zmm0, zmm1, [rax] {1to8}'.
|
||||||
//! logInstruction(arch,
|
//! logInstruction(arch,
|
||||||
//! BaseInst(Inst::kIdVaddpd),
|
//! BaseInst(Inst::kIdVaddpd),
|
||||||
//! zmm0, zmm1, ptr(rax)._1to8());
|
//! zmm0, zmm1, ptr(rax)._1toN());
|
||||||
//!
|
//!
|
||||||
//! // BaseInst abstracts instruction id, instruction options, and extraReg.
|
//! // BaseInst abstracts instruction id, instruction options, and extraReg.
|
||||||
//! // Prints 'lock add [rax], rcx'.
|
//! // Prints 'lock add [rax], rcx'.
|
||||||
//! logInstruction(arch,
|
//! logInstruction(arch,
|
||||||
//! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock),
|
//! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock),
|
||||||
//! ptr(rax), rcx);
|
//! x86::ptr(rax), rcx);
|
||||||
//!
|
//!
|
||||||
//! // Similarly an extra register (like AVX-512 selector) can be used.
|
//! // Similarly an extra register (like AVX-512 selector) can be used.
|
||||||
//! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'.
|
//! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'.
|
||||||
@ -1679,7 +1624,7 @@ namespace asmjit {
|
|||||||
//!
|
//!
|
||||||
//! Each instruction can be then queried for the following information:
|
//! Each instruction can be then queried for the following information:
|
||||||
//!
|
//!
|
||||||
//! - \ref InstRWInfo - Read/write information of instruction and its operands (includes \ref OpRWInfo).
|
//! - \ref InstRWInfo - Read/write information of instruction and its oprands (includes \ref OpRWInfo).
|
||||||
//!
|
//!
|
||||||
//! - \ref CpuFeatures - CPU features required to execute the instruction.
|
//! - \ref CpuFeatures - CPU features required to execute the instruction.
|
||||||
//!
|
//!
|
||||||
|
261
deps/asmjit/src/asmjit/core/api-config.h
vendored
261
deps/asmjit/src/asmjit/core/api-config.h
vendored
@ -16,7 +16,7 @@
|
|||||||
#define ASMJIT_LIBRARY_MAKE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
|
#define ASMJIT_LIBRARY_MAKE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
|
||||||
|
|
||||||
//! AsmJit library version, see \ref ASMJIT_LIBRARY_MAKE_VERSION for a version format reference.
|
//! AsmJit library version, see \ref ASMJIT_LIBRARY_MAKE_VERSION for a version format reference.
|
||||||
#define ASMJIT_LIBRARY_VERSION ASMJIT_LIBRARY_MAKE_VERSION(1, 13, 0)
|
#define ASMJIT_LIBRARY_VERSION ASMJIT_LIBRARY_MAKE_VERSION(1, 11, 0)
|
||||||
|
|
||||||
//! \def ASMJIT_ABI_NAMESPACE
|
//! \def ASMJIT_ABI_NAMESPACE
|
||||||
//!
|
//!
|
||||||
@ -27,7 +27,7 @@
|
|||||||
//! AsmJit default, which makes it possible to use multiple AsmJit libraries within a single project, totally
|
//! AsmJit default, which makes it possible to use multiple AsmJit libraries within a single project, totally
|
||||||
//! controlled by users. This is useful especially in cases in which some of such library comes from third party.
|
//! controlled by users. This is useful especially in cases in which some of such library comes from third party.
|
||||||
#if !defined(ASMJIT_ABI_NAMESPACE)
|
#if !defined(ASMJIT_ABI_NAMESPACE)
|
||||||
#define ASMJIT_ABI_NAMESPACE _abi_1_13
|
#define ASMJIT_ABI_NAMESPACE _abi_1_11
|
||||||
#endif // !ASMJIT_ABI_NAMESPACE
|
#endif // !ASMJIT_ABI_NAMESPACE
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
@ -42,7 +42,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <initializer_list>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -112,7 +112,7 @@ namespace asmjit {
|
|||||||
#define ASMJIT_NO_INTROSPECTION
|
#define ASMJIT_NO_INTROSPECTION
|
||||||
|
|
||||||
// Avoid doxygen preprocessor using feature-selection definitions.
|
// Avoid doxygen preprocessor using feature-selection definitions.
|
||||||
#undef ASMJIT_BUILD_EMBED
|
#undef ASMJIT_BUILD_EMBNED
|
||||||
#undef ASMJIT_BUILD_STATIC
|
#undef ASMJIT_BUILD_STATIC
|
||||||
#undef ASMJIT_BUILD_DEBUG
|
#undef ASMJIT_BUILD_DEBUG
|
||||||
#undef ASMJIT_BUILD_RELEASE
|
#undef ASMJIT_BUILD_RELEASE
|
||||||
@ -163,41 +163,6 @@ namespace asmjit {
|
|||||||
// Target Architecture Detection
|
// Target Architecture Detection
|
||||||
// =============================
|
// =============================
|
||||||
|
|
||||||
//! \addtogroup asmjit_core
|
|
||||||
//! \{
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_X86
|
|
||||||
//!
|
|
||||||
//! Defined to either 0, 32, or 64 depending on whether the target CPU is X86 (32) or X86_64 (64).
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_ARM
|
|
||||||
//!
|
|
||||||
//! Defined to either 0, 32, or 64 depending on whether the target CPU is ARM (32) or AArch64 (64).
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_MIPS
|
|
||||||
//!
|
|
||||||
//! Defined to either 0, 32, or 64 depending on whether the target CPU is MIPS (32) or MISP64 (64).
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_RISCV
|
|
||||||
//!
|
|
||||||
//! Defined to either 0, 32, or 64 depending on whether the target CPU is RV32 (32) or RV64 (64).
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_BITS
|
|
||||||
//!
|
|
||||||
//! Defined to either 32 or 64 depending on the target.
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_LE
|
|
||||||
//!
|
|
||||||
//! Defined to 1 if the target architecture is little endian.
|
|
||||||
|
|
||||||
//! \def ASMJIT_ARCH_BE
|
|
||||||
//!
|
|
||||||
//! Defined to 1 if the target architecture is big endian.
|
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
//! \cond NONE
|
|
||||||
|
|
||||||
#if defined(_M_X64) || defined(__x86_64__)
|
#if defined(_M_X64) || defined(__x86_64__)
|
||||||
#define ASMJIT_ARCH_X86 64
|
#define ASMJIT_ARCH_X86 64
|
||||||
#elif defined(_M_IX86) || defined(__X86__) || defined(__i386__)
|
#elif defined(_M_IX86) || defined(__X86__) || defined(__i386__)
|
||||||
@ -222,17 +187,10 @@ namespace asmjit {
|
|||||||
#define ASMJIT_ARCH_MIPS 0
|
#define ASMJIT_ARCH_MIPS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// NOTE `__riscv` is the correct macro in this case as specified by "RISC-V Toolchain Conventions".
|
#define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS)
|
||||||
#if (defined(__riscv) || defined(__riscv__)) && defined(__riscv_xlen)
|
|
||||||
#define ASMJIT_ARCH_RISCV __riscv_xlen
|
|
||||||
#else
|
|
||||||
#define ASMJIT_ARCH_RISCV 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS | ASMJIT_ARCH_RISCV)
|
|
||||||
#if ASMJIT_ARCH_BITS == 0
|
#if ASMJIT_ARCH_BITS == 0
|
||||||
#undef ASMJIT_ARCH_BITS
|
#undef ASMJIT_ARCH_BITS
|
||||||
#if defined(__LP64__) || defined(_LP64)
|
#if defined (__LP64__) || defined(_LP64)
|
||||||
#define ASMJIT_ARCH_BITS 64
|
#define ASMJIT_ARCH_BITS 64
|
||||||
#else
|
#else
|
||||||
#define ASMJIT_ARCH_BITS 32
|
#define ASMJIT_ARCH_BITS 32
|
||||||
@ -254,88 +212,62 @@ namespace asmjit {
|
|||||||
#define ASMJIT_NO_X86
|
#define ASMJIT_NO_X86
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ASMJIT_ARCH_ARM != 64 && !defined(ASMJIT_NO_AARCH64)
|
#if !ASMJIT_ARCH_ARM && !defined(ASMJIT_NO_AARCH64)
|
||||||
#define ASMJIT_NO_AARCH64
|
#define ASMJIT_NO_AARCH64
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! \endcond
|
|
||||||
|
|
||||||
// C++ Compiler and Features Detection
|
// C++ Compiler and Features Detection
|
||||||
// ===================================
|
// ===================================
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__has_attribute)
|
#define ASMJIT_CXX_GNU 0
|
||||||
|
#define ASMJIT_CXX_MAKE_VER(MAJOR, MINOR) ((MAJOR) * 1000 + (MINOR))
|
||||||
|
|
||||||
|
// Intel Compiler [pretends to be GNU or MSC, so it must be checked first]:
|
||||||
|
// - https://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler
|
||||||
|
// - https://software.intel.com/en-us/articles/c14-features-supported-by-intel-c-compiler
|
||||||
|
// - https://software.intel.com/en-us/articles/c17-features-supported-by-intel-c-compiler
|
||||||
|
#if defined(__INTEL_COMPILER)
|
||||||
|
|
||||||
|
// MSC Compiler:
|
||||||
|
// - https://msdn.microsoft.com/en-us/library/hh567368.aspx
|
||||||
|
//
|
||||||
|
// Version List:
|
||||||
|
// - 16.00.0 == VS2010
|
||||||
|
// - 17.00.0 == VS2012
|
||||||
|
// - 18.00.0 == VS2013
|
||||||
|
// - 19.00.0 == VS2015
|
||||||
|
// - 19.10.0 == VS2017
|
||||||
|
#elif defined(_MSC_VER) && defined(_MSC_FULL_VER)
|
||||||
|
|
||||||
|
// Clang Compiler [Pretends to be GNU, so it must be checked before]:
|
||||||
|
// - https://clang.llvm.org/cxx_status.html
|
||||||
|
#elif defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__)
|
||||||
|
|
||||||
|
// GNU Compiler:
|
||||||
|
// - https://gcc.gnu.org/projects/cxx-status.html
|
||||||
|
#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||||
|
|
||||||
|
#undef ASMJIT_CXX_GNU
|
||||||
|
#define ASMJIT_CXX_GNU ASMJIT_CXX_MAKE_VER(__GNUC__, __GNUC_MINOR__)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Compiler features detection macros.
|
||||||
|
#if defined(__clang__) && defined(__has_attribute)
|
||||||
#define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (__has_attribute(NAME))
|
#define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (__has_attribute(NAME))
|
||||||
#else
|
#else
|
||||||
#define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK)))
|
#define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK)))
|
||||||
#endif // !ASMJIT_CXX_HAS_ATTRIBUTE
|
#endif
|
||||||
|
|
||||||
// API Decorators & C++ Extensions
|
// API Decorators & C++ Extensions
|
||||||
// ===============================
|
// ===============================
|
||||||
|
|
||||||
//! \addtogroup asmjit_core
|
|
||||||
//! \{
|
|
||||||
|
|
||||||
//! \def ASMJIT_API
|
//! \def ASMJIT_API
|
||||||
//!
|
//!
|
||||||
//! A decorator that is used to decorate API that AsmJit exports when built as a shared library.
|
//! A decorator that is used to decorate API that AsmJit exports when built as a shared library.
|
||||||
|
|
||||||
//! \def ASMJIT_VIRTAPI
|
|
||||||
//!
|
|
||||||
//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which
|
|
||||||
//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class
|
|
||||||
//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export
|
|
||||||
//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
|
|
||||||
|
|
||||||
//! \def ASMJIT_FORCE_INLINE
|
|
||||||
//!
|
|
||||||
//! Decorator to force inlining of functions, uses either `__attribute__((__always_inline__))` or __forceinline,
|
|
||||||
//! depending on C++ compiler.
|
|
||||||
|
|
||||||
//! \def ASMJIT_INLINE_NODEBUG
|
|
||||||
//!
|
|
||||||
//! Like \ref ASMJIT_FORCE_INLINE, but uses additionally `__nodebug__` or `__artificial__` attribute to make the
|
|
||||||
//! debugging of some AsmJit functions easier, especially getters and one-line abstractions where usually you don't
|
|
||||||
//! want to step in.
|
|
||||||
|
|
||||||
//! \def ASMJIT_NOINLINE
|
|
||||||
//!
|
|
||||||
//! Decorator to avoid inlining of functions, uses either `__attribute__((__noinline__))` or `__declspec(noinline)`
|
|
||||||
//! depending on C++ compiler.
|
|
||||||
|
|
||||||
//! \def ASMJIT_NORETURN
|
|
||||||
//!
|
|
||||||
//! Decorator that marks functions that should never return. Typically used to implement assertion handlers that
|
|
||||||
//! terminate, so the function never returns.
|
|
||||||
|
|
||||||
//! \def ASMJIT_CDECL
|
|
||||||
//!
|
|
||||||
//! CDECL function attribute - either `__attribute__((__cdecl__))` or `__cdecl`.
|
|
||||||
|
|
||||||
//! \def ASMJIT_STDCALL
|
|
||||||
//!
|
|
||||||
//! STDCALL function attribute - either `__attribute__((__stdcall__))` or `__stdcall`.
|
|
||||||
//!
|
|
||||||
//! \note This expands to nothing on non-x86 targets as STDCALL is X86 specific.
|
|
||||||
|
|
||||||
//! \def ASMJIT_FASTCALL
|
|
||||||
//!
|
|
||||||
//! FASTCALL function attribute - either `__attribute__((__fastcall__))` or `__fastcall`.
|
|
||||||
//!
|
|
||||||
//! \note Expands to nothing on non-x86 targets as FASTCALL is X86 specific.
|
|
||||||
|
|
||||||
//! \def ASMJIT_REGPARM(N)
|
|
||||||
//!
|
|
||||||
//! Expands to `__attribute__((__regparm__(N)))` when compiled by GCC or clang, nothing otherwise.
|
|
||||||
|
|
||||||
//! \def ASMJIT_VECTORCALL
|
|
||||||
//!
|
|
||||||
//! VECTORCALL function attribute - either `__attribute__((__vectorcall__))` or `__vectorcall`.
|
|
||||||
//!
|
|
||||||
//! \note Expands to nothing on non-x86 targets as VECTORCALL is X86 specific.
|
|
||||||
|
|
||||||
//! \}
|
|
||||||
|
|
||||||
// API (Export / Import).
|
// API (Export / Import).
|
||||||
#if !defined(ASMJIT_STATIC)
|
#if !defined(ASMJIT_STATIC)
|
||||||
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))
|
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))
|
||||||
@ -363,7 +295,13 @@ namespace asmjit {
|
|||||||
#define ASMJIT_VARAPI extern ASMJIT_API
|
#define ASMJIT_VARAPI extern ASMJIT_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(_WIN32)
|
//! \def ASMJIT_VIRTAPI
|
||||||
|
//!
|
||||||
|
//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which
|
||||||
|
//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class
|
||||||
|
//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export
|
||||||
|
//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
|
||||||
|
#if !defined(_WIN32) && defined(__GNUC__)
|
||||||
#define ASMJIT_VIRTAPI ASMJIT_API
|
#define ASMJIT_VIRTAPI ASMJIT_API
|
||||||
#else
|
#else
|
||||||
#define ASMJIT_VIRTAPI
|
#define ASMJIT_VIRTAPI
|
||||||
@ -520,10 +458,17 @@ namespace asmjit {
|
|||||||
//! Marks function, class, struct, enum, or anything else as deprecated.
|
//! Marks function, class, struct, enum, or anything else as deprecated.
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
#define ASMJIT_DEPRECATED(MESSAGE) __attribute__((__deprecated__(MESSAGE)))
|
#define ASMJIT_DEPRECATED(MESSAGE) __attribute__((__deprecated__(MESSAGE)))
|
||||||
|
#if defined(__clang__)
|
||||||
|
#define ASMJIT_DEPRECATED_STRUCT(MESSAGE) __attribute__((__deprecated__(MESSAGE)))
|
||||||
|
#else
|
||||||
|
#define ASMJIT_DEPRECATED_STRUCT(MESSAGE) /* not usable if a deprecated function uses it */
|
||||||
|
#endif
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
#define ASMJIT_DEPRECATED(MESSAGE) __declspec(deprecated(MESSAGE))
|
#define ASMJIT_DEPRECATED(MESSAGE) __declspec(deprecated(MESSAGE))
|
||||||
|
#define ASMJIT_DEPRECATED_STRUCT(MESSAGE) /* not usable if a deprecated function uses it */
|
||||||
#else
|
#else
|
||||||
#define ASMJIT_DEPRECATED(MESSAGE)
|
#define ASMJIT_DEPRECATED(MESSAGE)
|
||||||
|
#define ASMJIT_DEPRECATED_STRUCT(MESSAGE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Utilities.
|
// Utilities.
|
||||||
@ -532,60 +477,66 @@ namespace asmjit {
|
|||||||
|
|
||||||
#if ASMJIT_CXX_HAS_ATTRIBUTE(no_sanitize, 0)
|
#if ASMJIT_CXX_HAS_ATTRIBUTE(no_sanitize, 0)
|
||||||
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize__("undefined")))
|
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize__("undefined")))
|
||||||
#elif defined(__GNUC__) && __GNUC__ >= 5
|
#elif ASMJIT_CXX_GNU >= ASMJIT_CXX_MAKE_VER(4, 9)
|
||||||
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize_undefined__))
|
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize_undefined__))
|
||||||
#else
|
#else
|
||||||
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF
|
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Diagnostic Macros
|
|
||||||
// ======================================
|
|
||||||
|
|
||||||
#if !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(_DOXYGEN)
|
|
||||||
#if defined(__GNUC__) && __GNUC__ == 4
|
|
||||||
// There is a bug in GCC 4.X that has been fixed in GCC 5+, so just silence the warning.
|
|
||||||
#define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
|
|
||||||
_Pragma("GCC diagnostic push") \
|
|
||||||
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"")
|
|
||||||
#define ASMJIT_END_DIAGNOSTIC_SCOPE \
|
|
||||||
_Pragma("GCC diagnostic pop")
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
|
|
||||||
__pragma(warning(push)) \
|
|
||||||
__pragma(warning(disable: 4127)) /* conditional expression is const */ \
|
|
||||||
__pragma(warning(disable: 4201)) /* nameless struct/union */
|
|
||||||
#define ASMJIT_END_DIAGNOSTIC_SCOPE \
|
|
||||||
__pragma(warning(pop))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ASMJIT_BEGIN_DIAGNOSTIC_SCOPE) && !defined(ASMJIT_END_DIAGNOSTIC_SCOPE)
|
|
||||||
#define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE
|
|
||||||
#define ASMJIT_END_DIAGNOSTIC_SCOPE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Begin-Namespace & End-Namespace Macros
|
// Begin-Namespace & End-Namespace Macros
|
||||||
// ======================================
|
// ======================================
|
||||||
|
|
||||||
#if !defined(ASMJIT_NO_ABI_NAMESPACE) && !defined(_DOXYGEN)
|
#if defined _DOXYGEN
|
||||||
|
#define ASMJIT_BEGIN_NAMESPACE namespace asmjit {
|
||||||
|
#define ASMJIT_END_NAMESPACE }
|
||||||
|
#elif defined(__clang__)
|
||||||
#define ASMJIT_BEGIN_NAMESPACE \
|
#define ASMJIT_BEGIN_NAMESPACE \
|
||||||
ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
|
namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
|
||||||
namespace asmjit { \
|
_Pragma("clang diagnostic push") \
|
||||||
inline namespace ASMJIT_ABI_NAMESPACE {
|
_Pragma("clang diagnostic ignored \"-Wconstant-logical-operand\"") \
|
||||||
|
_Pragma("clang diagnostic ignored \"-Wunnamed-type-template-args\"")
|
||||||
#define ASMJIT_END_NAMESPACE \
|
#define ASMJIT_END_NAMESPACE \
|
||||||
}} \
|
_Pragma("clang diagnostic pop") \
|
||||||
ASMJIT_END_DIAGNOSTIC_SCOPE
|
}}
|
||||||
#else
|
#elif defined(__GNUC__) && __GNUC__ == 4
|
||||||
#define ASMJIT_BEGIN_NAMESPACE \
|
#define ASMJIT_BEGIN_NAMESPACE \
|
||||||
ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
|
namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
|
||||||
namespace asmjit {
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"")
|
||||||
#define ASMJIT_END_NAMESPACE \
|
#define ASMJIT_END_NAMESPACE \
|
||||||
} \
|
_Pragma("GCC diagnostic pop") \
|
||||||
ASMJIT_END_DIAGNOSTIC_SCOPE
|
}}
|
||||||
|
#elif defined(__GNUC__) && __GNUC__ >= 8
|
||||||
|
#define ASMJIT_BEGIN_NAMESPACE \
|
||||||
|
namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
|
||||||
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic ignored \"-Wclass-memaccess\"")
|
||||||
|
#define ASMJIT_END_NAMESPACE \
|
||||||
|
_Pragma("GCC diagnostic pop") \
|
||||||
|
}}
|
||||||
|
#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
|
||||||
|
#define ASMJIT_BEGIN_NAMESPACE \
|
||||||
|
namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
|
||||||
|
__pragma(warning(push)) \
|
||||||
|
__pragma(warning(disable: 4127)) /* conditional expression is const */ \
|
||||||
|
__pragma(warning(disable: 4201)) /* nameless struct/union */
|
||||||
|
#define ASMJIT_END_NAMESPACE \
|
||||||
|
__pragma(warning(pop)) \
|
||||||
|
}}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) ASMJIT_BEGIN_NAMESPACE namespace NAMESPACE {
|
#if !defined(ASMJIT_BEGIN_NAMESPACE) && !defined(ASMJIT_END_NAMESPACE)
|
||||||
#define ASMJIT_END_SUB_NAMESPACE } ASMJIT_END_NAMESPACE
|
#define ASMJIT_BEGIN_NAMESPACE namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE {
|
||||||
|
#define ASMJIT_END_NAMESPACE }}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) \
|
||||||
|
ASMJIT_BEGIN_NAMESPACE \
|
||||||
|
namespace NAMESPACE {
|
||||||
|
|
||||||
|
#define ASMJIT_END_SUB_NAMESPACE \
|
||||||
|
} \
|
||||||
|
ASMJIT_END_NAMESPACE
|
||||||
|
|
||||||
// C++ Utilities
|
// C++ Utilities
|
||||||
// =============
|
// =============
|
||||||
@ -661,4 +612,10 @@ namespace asmjit {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Cleanup Api-Config Specific Macros
|
||||||
|
// ==================================
|
||||||
|
|
||||||
|
#undef ASMJIT_CXX_GNU
|
||||||
|
#undef ASMJIT_CXX_MAKE_VER
|
||||||
|
|
||||||
#endif // ASMJIT_CORE_API_CONFIG_H_INCLUDED
|
#endif // ASMJIT_CORE_API_CONFIG_H_INCLUDED
|
||||||
|
180
deps/asmjit/src/asmjit/core/archcommons.h
vendored
180
deps/asmjit/src/asmjit/core/archcommons.h
vendored
@ -29,8 +29,8 @@ enum class CondCode : uint8_t {
|
|||||||
kNE = 0x03u, //!< Z==0 (any_sign !=)
|
kNE = 0x03u, //!< Z==0 (any_sign !=)
|
||||||
kCS = 0x04u, //!< C==1 (unsigned >=)
|
kCS = 0x04u, //!< C==1 (unsigned >=)
|
||||||
kHS = 0x04u, //!< C==1 (unsigned >=)
|
kHS = 0x04u, //!< C==1 (unsigned >=)
|
||||||
kLO = 0x05u, //!< C==0 (unsigned < )
|
|
||||||
kCC = 0x05u, //!< C==0 (unsigned < )
|
kCC = 0x05u, //!< C==0 (unsigned < )
|
||||||
|
kLO = 0x05u, //!< C==0 (unsigned < )
|
||||||
kMI = 0x06u, //!< N==1 (is negative)
|
kMI = 0x06u, //!< N==1 (is negative)
|
||||||
kPL = 0x07u, //!< N==0 (is positive or zero)
|
kPL = 0x07u, //!< N==0 (is positive or zero)
|
||||||
kVS = 0x08u, //!< V==1 (is overflow)
|
kVS = 0x08u, //!< V==1 (is overflow)
|
||||||
@ -42,24 +42,21 @@ enum class CondCode : uint8_t {
|
|||||||
kGT = 0x0Eu, //!< Z==0 & N==V (signed > )
|
kGT = 0x0Eu, //!< Z==0 & N==V (signed > )
|
||||||
kLE = 0x0Fu, //!< Z==1 | N!=V (signed <=)
|
kLE = 0x0Fu, //!< Z==1 | N!=V (signed <=)
|
||||||
|
|
||||||
kZero = kEQ, //!< Zero flag (alias to equal).
|
kSign = kMI, //!< Sign.
|
||||||
kNotZero = kNE, //!< Not zero (alias to Not Equal).
|
kNotSign = kPL, //!< Not sign.
|
||||||
|
|
||||||
|
kOverflow = kVS, //!< Signed overflow.
|
||||||
|
kNotOverflow = kVC, //!< Not signed overflow.
|
||||||
|
|
||||||
kEqual = kEQ, //!< Equal `a == b`.
|
kEqual = kEQ, //!< Equal `a == b`.
|
||||||
kNotEqual = kNE, //!< Not Equal `a != b`.
|
kNotEqual = kNE, //!< Not Equal `a != b`.
|
||||||
|
|
||||||
kCarry = kCS, //!< Carry flag.
|
kZero = kEQ, //!< Zero (alias to equal).
|
||||||
kNotCarry = kCC, //!< Not carry.
|
kNotZero = kNE, //!< Not Zero (alias to Not Equal).
|
||||||
|
|
||||||
kSign = kMI, //!< Sign flag.
|
|
||||||
kNotSign = kPL, //!< Not sign.
|
|
||||||
|
|
||||||
kNegative = kMI, //!< Negative.
|
kNegative = kMI, //!< Negative.
|
||||||
kPositive = kPL, //!< Positive or zero.
|
kPositive = kPL, //!< Positive or zero.
|
||||||
|
|
||||||
kOverflow = kVS, //!< Signed overflow.
|
|
||||||
kNotOverflow = kVC, //!< Not signed overflow.
|
|
||||||
|
|
||||||
kSignedLT = kLT, //!< Signed `a < b`.
|
kSignedLT = kLT, //!< Signed `a < b`.
|
||||||
kSignedLE = kLE, //!< Signed `a <= b`.
|
kSignedLE = kLE, //!< Signed `a <= b`.
|
||||||
kSignedGT = kGT, //!< Signed `a > b`.
|
kSignedGT = kGT, //!< Signed `a > b`.
|
||||||
@ -70,51 +67,49 @@ enum class CondCode : uint8_t {
|
|||||||
kUnsignedGT = kHI, //!< Unsigned `a > b`.
|
kUnsignedGT = kHI, //!< Unsigned `a > b`.
|
||||||
kUnsignedGE = kHS, //!< Unsigned `a >= b`.
|
kUnsignedGE = kHS, //!< Unsigned `a >= b`.
|
||||||
|
|
||||||
kBTZero = kZero, //!< Tested bit is zero.
|
|
||||||
kBTNotZero = kNotZero, //!< Tested bit is not zero.
|
|
||||||
|
|
||||||
kAlways = kAL, //!< No condition code (always).
|
kAlways = kAL, //!< No condition code (always).
|
||||||
|
|
||||||
kMaxValue = 0x0Fu //!< Maximum value of `CondCode`.
|
kMaxValue = 0x0Fu //!< Maximum value of `CondCode`.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//! \cond
|
|
||||||
static constexpr CondCode _reverseCondTable[] = {
|
|
||||||
CondCode::kAL, // AL <- AL
|
|
||||||
CondCode::kNA, // NA <- NA
|
|
||||||
CondCode::kEQ, // EQ <- EQ
|
|
||||||
CondCode::kNE, // NE <- NE
|
|
||||||
CondCode::kLS, // LS <- CS
|
|
||||||
CondCode::kHI, // HI <- LO
|
|
||||||
CondCode::kMI, // MI <- MI
|
|
||||||
CondCode::kPL, // PL <- PL
|
|
||||||
CondCode::kVS, // VS <- VS
|
|
||||||
CondCode::kVC, // VC <- VC
|
|
||||||
CondCode::kLO, // LO <- HI
|
|
||||||
CondCode::kCS, // CS <- LS
|
|
||||||
CondCode::kLE, // LE <- GE
|
|
||||||
CondCode::kGT, // GT <- LT
|
|
||||||
CondCode::kLT, // LT <- GT
|
|
||||||
CondCode::kGE // GE <- LE
|
|
||||||
};
|
|
||||||
//! \endcond
|
|
||||||
|
|
||||||
//! Reverses a condition code (reverses the corresponding operands of a comparison).
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; }
|
|
||||||
//! Negates a condition code.
|
//! Negates a condition code.
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); }
|
static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); }
|
||||||
|
|
||||||
//! Memory offset mode.
|
//! Data type that can be encoded with the instruction (AArch32 only).
|
||||||
//!
|
enum class DataType : uint32_t {
|
||||||
//! Describes either fixed, pre-index, or post-index offset modes.
|
//! No data type specified (default for all general purpose instructions).
|
||||||
enum class OffsetMode : uint32_t {
|
kNone = 0,
|
||||||
//! Fixed offset mode (either no index at all or a regular index without a write-back).
|
//! 8-bit signed integer, specified as `.s8` in assembly.
|
||||||
kFixed = 0u,
|
kS8 = 1,
|
||||||
//! Pre-index "[BASE, #Offset {, <shift>}]!" with write-back.
|
//! 16-bit signed integer, specified as `.s16` in assembly.
|
||||||
kPreIndex = 1u,
|
kS16 = 2,
|
||||||
//! Post-index "[BASE], #Offset {, <shift>}" with write-back.
|
//! 32-bit signed integer, specified as `.s32` in assembly.
|
||||||
kPostIndex = 2u
|
kS32 = 3,
|
||||||
|
//! 64-bit signed integer, specified as `.s64` in assembly.
|
||||||
|
kS64 = 4,
|
||||||
|
//! 8-bit unsigned integer, specified as `.u8` in assembly.
|
||||||
|
kU8 = 5,
|
||||||
|
//! 16-bit unsigned integer, specified as `.u16` in assembly.
|
||||||
|
kU16 = 6,
|
||||||
|
//! 32-bit unsigned integer, specified as `.u32` in assembly.
|
||||||
|
kU32 = 7,
|
||||||
|
//! 64-bit unsigned integer, specified as `.u64` in assembly.
|
||||||
|
kU64 = 8,
|
||||||
|
//! 16-bit floating point (half precision), specified as `.f16` in assembly.
|
||||||
|
kF16 = 10,
|
||||||
|
//! 32-bit floating point (single precision), specified as `.f32` in assembly.
|
||||||
|
kF32 = 11,
|
||||||
|
//! 64-bit floating point (double precision), specified as `.f64` in assembly.
|
||||||
|
kF64 = 12,
|
||||||
|
//! 8-bit polynomial.
|
||||||
|
kP8 = 13,
|
||||||
|
//! 16-bit BF16 floating point.
|
||||||
|
kBF16 = 14,
|
||||||
|
//! 64-bit polynomial.
|
||||||
|
kP64 = 15,
|
||||||
|
|
||||||
|
//! Maximum value of `DataType`.
|
||||||
|
kMaxValue = 15
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Shift operation predicate (ARM) describes either SHIFT or EXTEND operation.
|
//! Shift operation predicate (ARM) describes either SHIFT or EXTEND operation.
|
||||||
@ -192,70 +187,45 @@ public:
|
|||||||
//! Sets shift operation to `op`.
|
//! Sets shift operation to `op`.
|
||||||
ASMJIT_INLINE_NODEBUG void setOp(ShiftOp op) noexcept { _op = op; }
|
ASMJIT_INLINE_NODEBUG void setOp(ShiftOp op) noexcept { _op = op; }
|
||||||
|
|
||||||
//! Returns the shift amount.
|
//! Returns the shift smount.
|
||||||
ASMJIT_INLINE_NODEBUG constexpr uint32_t value() const noexcept { return _value; }
|
ASMJIT_INLINE_NODEBUG constexpr uint32_t value() const noexcept { return _value; }
|
||||||
//! Sets shift amount to `value`.
|
//! Sets shift amount to `value`.
|
||||||
ASMJIT_INLINE_NODEBUG void setValue(uint32_t value) noexcept { _value = value; }
|
ASMJIT_INLINE_NODEBUG void setValue(uint32_t value) noexcept { _value = value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Constructs a `LSL #value` shift (logical shift left).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); }
|
||||||
|
//! Constructs a `LSR #value` shift (logical shift right).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); }
|
||||||
|
//! Constructs a `ASR #value` shift (arithmetic shift right).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); }
|
||||||
|
//! Constructs a `ROR #value` shift (rotate right).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); }
|
||||||
|
//! Constructs a `RRX` shift (rotate with carry by 1).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); }
|
||||||
|
//! Constructs a `MSL #value` shift (logical shift left filling ones).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); }
|
||||||
|
|
||||||
|
//! Constructs a `UXTB #value` extend and shift (unsigned byte extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); }
|
||||||
|
//! Constructs a `UXTH #value` extend and shift (unsigned hword extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); }
|
||||||
|
//! Constructs a `UXTW #value` extend and shift (unsigned word extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); }
|
||||||
|
//! Constructs a `UXTX #value` extend and shift (unsigned dword extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); }
|
||||||
|
|
||||||
|
//! Constructs a `SXTB #value` extend and shift (signed byte extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); }
|
||||||
|
//! Constructs a `SXTH #value` extend and shift (signed hword extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); }
|
||||||
|
//! Constructs a `SXTW #value` extend and shift (signed word extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); }
|
||||||
|
//! Constructs a `SXTX #value` extend and shift (signed dword extend).
|
||||||
|
static ASMJIT_INLINE_NODEBUG constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); }
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
ASMJIT_END_SUB_NAMESPACE
|
ASMJIT_END_SUB_NAMESPACE
|
||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(a32)
|
|
||||||
|
|
||||||
using namespace arm;
|
|
||||||
|
|
||||||
//! Data type that can be encoded with AArch32 instruction identifier.
|
|
||||||
//!
|
|
||||||
//! \note Data types are frequently used with AArch32 SIMD instructions. For example `VMAX` instruction can
|
|
||||||
//! use almost all datatypes in a form `VMAX.F32`, `VMAX.S16`, `VMAX.U32`, etc... Emitter automatically adds
|
|
||||||
//! the required data type at emit level.
|
|
||||||
enum class DataType : uint32_t {
|
|
||||||
//! No data type specified (default for all general purpose instructions).
|
|
||||||
kNone = 0,
|
|
||||||
//! 8-bit signed integer, specified as `.s8` in assembly.
|
|
||||||
kS8 = 1,
|
|
||||||
//! 16-bit signed integer, specified as `.s16` in assembly.
|
|
||||||
kS16 = 2,
|
|
||||||
//! 32-bit signed integer, specified as `.s32` in assembly.
|
|
||||||
kS32 = 3,
|
|
||||||
//! 64-bit signed integer, specified as `.s64` in assembly.
|
|
||||||
kS64 = 4,
|
|
||||||
//! 8-bit unsigned integer, specified as `.u8` in assembly.
|
|
||||||
kU8 = 5,
|
|
||||||
//! 16-bit unsigned integer, specified as `.u16` in assembly.
|
|
||||||
kU16 = 6,
|
|
||||||
//! 32-bit unsigned integer, specified as `.u32` in assembly.
|
|
||||||
kU32 = 7,
|
|
||||||
//! 64-bit unsigned integer, specified as `.u64` in assembly.
|
|
||||||
kU64 = 8,
|
|
||||||
//! 16-bit floating point (half precision), specified as `.f16` in assembly.
|
|
||||||
kF16 = 10,
|
|
||||||
//! 32-bit floating point (single precision), specified as `.f32` in assembly.
|
|
||||||
kF32 = 11,
|
|
||||||
//! 64-bit floating point (double precision), specified as `.f64` in assembly.
|
|
||||||
kF64 = 12,
|
|
||||||
//! 8-bit polynomial.
|
|
||||||
kP8 = 13,
|
|
||||||
//! 16-bit BF16 floating point.
|
|
||||||
kBF16 = 14,
|
|
||||||
//! 64-bit polynomial.
|
|
||||||
kP64 = 15,
|
|
||||||
|
|
||||||
//! Maximum value of `DataType`.
|
|
||||||
kMaxValue = 15
|
|
||||||
};
|
|
||||||
|
|
||||||
static ASMJIT_INLINE_NODEBUG uint32_t dataTypeSize(DataType dt) noexcept {
|
|
||||||
static constexpr uint8_t table[] = { 0, 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 1, 2, 8 };
|
|
||||||
return table[size_t(dt)];
|
|
||||||
}
|
|
||||||
|
|
||||||
ASMJIT_END_SUB_NAMESPACE
|
|
||||||
|
|
||||||
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
|
|
||||||
using namespace arm;
|
|
||||||
ASMJIT_END_SUB_NAMESPACE
|
|
||||||
|
|
||||||
#endif // ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
|
#endif // ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
|
||||||
|
3
deps/asmjit/src/asmjit/core/archtraits.h
vendored
3
deps/asmjit/src/asmjit/core/archtraits.h
vendored
@ -74,9 +74,6 @@ enum class Arch : uint8_t {
|
|||||||
ASMJIT_ARCH_X86 == 32 ? kX86 :
|
ASMJIT_ARCH_X86 == 32 ? kX86 :
|
||||||
ASMJIT_ARCH_X86 == 64 ? kX64 :
|
ASMJIT_ARCH_X86 == 64 ? kX64 :
|
||||||
|
|
||||||
ASMJIT_ARCH_RISCV == 32 ? kRISCV32 :
|
|
||||||
ASMJIT_ARCH_RISCV == 64 ? kRISCV64 :
|
|
||||||
|
|
||||||
ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kARM :
|
ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kARM :
|
||||||
ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kARM_BE :
|
ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kARM_BE :
|
||||||
ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kAArch64 :
|
ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kAArch64 :
|
||||||
|
1
deps/asmjit/src/asmjit/core/assembler.h
vendored
1
deps/asmjit/src/asmjit/core/assembler.h
vendored
@ -25,7 +25,6 @@ ASMJIT_BEGIN_NAMESPACE
|
|||||||
//! Check out architecture specific assemblers for more details and examples:
|
//! Check out architecture specific assemblers for more details and examples:
|
||||||
//!
|
//!
|
||||||
//! - \ref x86::Assembler - X86/X64 assembler implementation.
|
//! - \ref x86::Assembler - X86/X64 assembler implementation.
|
||||||
//! - \ref a64::Assembler - AArch64 assembler implementation.
|
|
||||||
class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter {
|
class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter {
|
||||||
public:
|
public:
|
||||||
ASMJIT_NONCOPYABLE(BaseAssembler)
|
ASMJIT_NONCOPYABLE(BaseAssembler)
|
||||||
|
2
deps/asmjit/src/asmjit/core/builder.cpp
vendored
2
deps/asmjit/src/asmjit/core/builder.cpp
vendored
@ -590,7 +590,7 @@ Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1,
|
|||||||
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
||||||
|
|
||||||
ValidationFlags validationFlags = isCompiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone;
|
ValidationFlags validationFlags = isCompiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone;
|
||||||
Error err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags);
|
Error err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags);
|
||||||
|
|
||||||
if (ASMJIT_UNLIKELY(err)) {
|
if (ASMJIT_UNLIKELY(err)) {
|
||||||
#ifndef ASMJIT_NO_LOGGING
|
#ifndef ASMJIT_NO_LOGGING
|
||||||
|
158
deps/asmjit/src/asmjit/core/builder.h
vendored
158
deps/asmjit/src/asmjit/core/builder.h
vendored
@ -48,7 +48,7 @@ enum class NodeType : uint8_t {
|
|||||||
|
|
||||||
// [BaseBuilder]
|
// [BaseBuilder]
|
||||||
|
|
||||||
//! Node is \ref InstNode.
|
//! Node is \ref InstNode or \ref InstExNode.
|
||||||
kInst = 1,
|
kInst = 1,
|
||||||
//! Node is \ref SectionNode.
|
//! Node is \ref SectionNode.
|
||||||
kSection = 2,
|
kSection = 2,
|
||||||
@ -181,7 +181,6 @@ public:
|
|||||||
//! Check out architecture specific builders for more details and examples:
|
//! Check out architecture specific builders for more details and examples:
|
||||||
//!
|
//!
|
||||||
//! - \ref x86::Builder - X86/X64 builder implementation.
|
//! - \ref x86::Builder - X86/X64 builder implementation.
|
||||||
//! - \ref a64::Builder - AArch64 builder implementation.
|
|
||||||
class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter {
|
class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter {
|
||||||
public:
|
public:
|
||||||
ASMJIT_NONCOPYABLE(BaseBuilder)
|
ASMJIT_NONCOPYABLE(BaseBuilder)
|
||||||
@ -547,7 +546,7 @@ public:
|
|||||||
uint8_t _reserved1;
|
uint8_t _reserved1;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Data that can have different meaning depending on \ref NodeType.
|
//! Data that can have different meaning dependning on \ref NodeType.
|
||||||
union {
|
union {
|
||||||
//! Data useful by any node type.
|
//! Data useful by any node type.
|
||||||
AnyData _any;
|
AnyData _any;
|
||||||
@ -695,9 +694,8 @@ public:
|
|||||||
|
|
||||||
//! Returns user data casted to `T*`.
|
//! Returns user data casted to `T*`.
|
||||||
//!
|
//!
|
||||||
//! User data is dedicated to be used only by AsmJit users and not touched by the library. The data is of a pointer
|
//! User data is decicated to be used only by AsmJit users and not touched by the library. The data has a pointer
|
||||||
//! size so you can either store a pointer or `int64_t` value through `setUserDataAsPtr()`, `setUserDataAsInt64()`
|
//! size so you can either store a pointer or `intptr_t` value through `setUserDataAsIntPtr()`.
|
||||||
//! and `setUserDataAsUInt64()`.
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ASMJIT_INLINE_NODEBUG T* userDataAsPtr() const noexcept { return static_cast<T*>(_userDataPtr); }
|
ASMJIT_INLINE_NODEBUG T* userDataAsPtr() const noexcept { return static_cast<T*>(_userDataPtr); }
|
||||||
//! Returns user data casted to `int64_t`.
|
//! Returns user data casted to `int64_t`.
|
||||||
@ -749,15 +747,12 @@ public:
|
|||||||
//! \name Constants
|
//! \name Constants
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! The number of embedded operands for a default \ref InstNode instance that are always allocated as a part of
|
enum : uint32_t {
|
||||||
//! the instruction itself. Minimum embedded operands is 4, but in 32-bit more pointers are smaller and we can
|
//! Count of embedded operands per `InstNode` that are always allocated as a part of the instruction. Minimum
|
||||||
//! embed 5. The rest (up to 6 operands) is considered extended.
|
//! embedded operands is 4, but in 32-bit more pointers are smaller and we can embed 5. The rest (up to 6 operands)
|
||||||
//!
|
//! is always stored in `InstExNode`.
|
||||||
//! The number of operands InstNode holds is decided when \ref InstNode is created.
|
kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_))
|
||||||
static constexpr uint32_t kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_));
|
};
|
||||||
|
|
||||||
//! Count of maximum number of operands \ref InstNode can hold.
|
|
||||||
static constexpr uint32_t kFullOpCapacity = Globals::kMaxOpCount;
|
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
@ -766,6 +761,8 @@ public:
|
|||||||
|
|
||||||
//! Base instruction data.
|
//! Base instruction data.
|
||||||
BaseInst _baseInst;
|
BaseInst _baseInst;
|
||||||
|
//! First 4 or 5 operands (indexed from 0).
|
||||||
|
Operand_ _opArray[kBaseOpCapacity];
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
@ -814,17 +811,11 @@ public:
|
|||||||
//! \name Instruction Options
|
//! \name Instruction Options
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! Returns instruction options, see \ref InstOptions for more details.
|
|
||||||
ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _baseInst.options(); }
|
ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _baseInst.options(); }
|
||||||
//! Tests whether instruction has the given \option` set/enabled.
|
|
||||||
ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); }
|
ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); }
|
||||||
//! Sets instruction `options` to the provided value, resetting all others.
|
|
||||||
ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); }
|
ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); }
|
||||||
//! Adds instruction `options` to the instruction.
|
|
||||||
ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); }
|
ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); }
|
||||||
//! Clears instruction `options` of the instruction (disables the given options).
|
|
||||||
ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); }
|
ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); }
|
||||||
//! Resets instruction options to none - disabling all instruction options.
|
|
||||||
ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _baseInst.resetOptions(); }
|
ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _baseInst.resetOptions(); }
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
@ -859,52 +850,38 @@ public:
|
|||||||
ASMJIT_INLINE_NODEBUG void setOpCount(uint32_t opCount) noexcept { _inst._opCount = uint8_t(opCount); }
|
ASMJIT_INLINE_NODEBUG void setOpCount(uint32_t opCount) noexcept { _inst._opCount = uint8_t(opCount); }
|
||||||
|
|
||||||
//! Returns operands array.
|
//! Returns operands array.
|
||||||
ASMJIT_INLINE_NODEBUG Operand* operands() noexcept {
|
ASMJIT_INLINE_NODEBUG Operand* operands() noexcept { return (Operand*)_opArray; }
|
||||||
return reinterpret_cast<Operand*>(reinterpret_cast<uint8_t*>(this) + sizeof(InstNode));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns operands array (const).
|
//! Returns operands array (const).
|
||||||
ASMJIT_INLINE_NODEBUG const Operand* operands() const noexcept {
|
ASMJIT_INLINE_NODEBUG const Operand* operands() const noexcept { return (const Operand*)_opArray; }
|
||||||
return reinterpret_cast<const Operand*>(reinterpret_cast<const uint8_t*>(this) + sizeof(InstNode));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns operand at the given `index`.
|
//! Returns operand at the given `index`.
|
||||||
inline Operand& op(uint32_t index) noexcept {
|
inline Operand& op(uint32_t index) noexcept {
|
||||||
ASMJIT_ASSERT(index < opCapacity());
|
ASMJIT_ASSERT(index < opCapacity());
|
||||||
|
return _opArray[index].as<Operand>();
|
||||||
Operand* ops = operands();
|
|
||||||
return ops[index].as<Operand>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns operand at the given `index` (const).
|
//! Returns operand at the given `index` (const).
|
||||||
inline const Operand& op(uint32_t index) const noexcept {
|
inline const Operand& op(uint32_t index) const noexcept {
|
||||||
ASMJIT_ASSERT(index < opCapacity());
|
ASMJIT_ASSERT(index < opCapacity());
|
||||||
|
return _opArray[index].as<Operand>();
|
||||||
const Operand* ops = operands();
|
|
||||||
return ops[index].as<Operand>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets operand at the given `index` to `op`.
|
//! Sets operand at the given `index` to `op`.
|
||||||
inline void setOp(uint32_t index, const Operand_& op) noexcept {
|
inline void setOp(uint32_t index, const Operand_& op) noexcept {
|
||||||
ASMJIT_ASSERT(index < opCapacity());
|
ASMJIT_ASSERT(index < opCapacity());
|
||||||
|
_opArray[index].copyFrom(op);
|
||||||
Operand* ops = operands();
|
|
||||||
ops[index].copyFrom(op);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Resets operand at the given `index` to none.
|
//! Resets operand at the given `index` to none.
|
||||||
inline void resetOp(uint32_t index) noexcept {
|
inline void resetOp(uint32_t index) noexcept {
|
||||||
ASMJIT_ASSERT(index < opCapacity());
|
ASMJIT_ASSERT(index < opCapacity());
|
||||||
|
_opArray[index].reset();
|
||||||
Operand* ops = operands();
|
|
||||||
ops[index].reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Resets operands at `[start, end)` range.
|
//! Resets operands at `[start, end)` range.
|
||||||
inline void resetOpRange(uint32_t start, uint32_t end) noexcept {
|
inline void resetOpRange(uint32_t start, uint32_t end) noexcept {
|
||||||
Operand* ops = operands();
|
|
||||||
for (uint32_t i = start; i < end; i++)
|
for (uint32_t i = start; i < end; i++)
|
||||||
ops[i].reset();
|
_opArray[i].reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
@ -912,47 +889,33 @@ public:
|
|||||||
//! \name Utilities
|
//! \name Utilities
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! Tests whether the given operand type `opType` is used by the instruction.
|
|
||||||
inline bool hasOpType(OperandType opType) const noexcept {
|
inline bool hasOpType(OperandType opType) const noexcept {
|
||||||
const Operand* ops = operands();
|
|
||||||
for (uint32_t i = 0, count = opCount(); i < count; i++)
|
for (uint32_t i = 0, count = opCount(); i < count; i++)
|
||||||
if (ops[i].opType() == opType)
|
if (_opArray[i].opType() == opType)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Tests whether the instruction uses at least one register operand.
|
|
||||||
inline bool hasRegOp() const noexcept { return hasOpType(OperandType::kReg); }
|
inline bool hasRegOp() const noexcept { return hasOpType(OperandType::kReg); }
|
||||||
//! Tests whether the instruction uses at least one memory operand.
|
|
||||||
inline bool hasMemOp() const noexcept { return hasOpType(OperandType::kMem); }
|
inline bool hasMemOp() const noexcept { return hasOpType(OperandType::kMem); }
|
||||||
//! Tests whether the instruction uses at least one immediate operand.
|
|
||||||
inline bool hasImmOp() const noexcept { return hasOpType(OperandType::kImm); }
|
inline bool hasImmOp() const noexcept { return hasOpType(OperandType::kImm); }
|
||||||
//! Tests whether the instruction uses at least one label operand.
|
|
||||||
inline bool hasLabelOp() const noexcept { return hasOpType(OperandType::kLabel); }
|
inline bool hasLabelOp() const noexcept { return hasOpType(OperandType::kLabel); }
|
||||||
|
|
||||||
//! Returns the index of the given operand type `opType`.
|
|
||||||
//!
|
|
||||||
//! \note If the operand type wa found, the value returned represents its index in \ref operands()
|
|
||||||
//! array, otherwise \ref Globals::kNotFound is returned to signalize that the operand was not found.
|
|
||||||
inline uint32_t indexOfOpType(OperandType opType) const noexcept {
|
inline uint32_t indexOfOpType(OperandType opType) const noexcept {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint32_t count = opCount();
|
uint32_t count = opCount();
|
||||||
const Operand* ops = operands();
|
|
||||||
|
|
||||||
while (i < count) {
|
while (i < count) {
|
||||||
if (ops[i].opType() == opType)
|
if (_opArray[i].opType() == opType)
|
||||||
return i;
|
break;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Globals::kNotFound;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! A shortcut that calls `indexOfOpType(OperandType::kMem)`.
|
|
||||||
inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(OperandType::kMem); }
|
inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(OperandType::kMem); }
|
||||||
//! A shortcut that calls `indexOfOpType(OperandType::kImm)`.
|
|
||||||
inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(OperandType::kImm); }
|
inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(OperandType::kImm); }
|
||||||
//! A shortcut that calls `indexOfOpType(OperandType::kLabel)`.
|
|
||||||
inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(OperandType::kLabel); }
|
inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(OperandType::kLabel); }
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
@ -961,40 +924,20 @@ public:
|
|||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! \cond INTERNAL
|
//! \cond INTERNAL
|
||||||
|
|
||||||
//! Returns uint32_t[] view that represents BaseInst::RegOnly and instruction operands.
|
|
||||||
ASMJIT_INLINE_NODEBUG uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; }
|
ASMJIT_INLINE_NODEBUG uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; }
|
||||||
//! \overload
|
|
||||||
ASMJIT_INLINE_NODEBUG const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; }
|
ASMJIT_INLINE_NODEBUG const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; }
|
||||||
|
|
||||||
//! Maximum value of rewrite id - 6 operands each having 4 slots is 24, one RegOnly having 2 slots => 26.
|
|
||||||
static constexpr uint32_t kMaxRewriteId = 26 - 1;
|
|
||||||
|
|
||||||
//! Returns a rewrite index of the given pointer to `id`.
|
|
||||||
//!
|
|
||||||
//! This function returns a value that can be then passed to `\ref rewriteIdAtIndex() function. It can address
|
|
||||||
//! any id from any operand that is used by the instruction in addition to \ref BaseInst::regOnly field, which
|
|
||||||
//! can also be used by the register allocator.
|
|
||||||
inline uint32_t getRewriteIndex(const uint32_t* id) const noexcept {
|
inline uint32_t getRewriteIndex(const uint32_t* id) const noexcept {
|
||||||
const uint32_t* array = _getRewriteArray();
|
const uint32_t* array = _getRewriteArray();
|
||||||
ASMJIT_ASSERT(array <= id);
|
ASMJIT_ASSERT(array <= id);
|
||||||
|
|
||||||
size_t index = (size_t)(id - array);
|
size_t index = (size_t)(id - array);
|
||||||
ASMJIT_ASSERT(index <= kMaxRewriteId);
|
ASMJIT_ASSERT(index < 32);
|
||||||
|
|
||||||
return uint32_t(index);
|
return uint32_t(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Rewrites the given `index` to the provided identifier `id`.
|
|
||||||
//!
|
|
||||||
//! \note This is an internal function that is used by a \ref BaseCompiler implementation to rewrite virtual
|
|
||||||
//! registers to physical registers. The rewriter in this case sees all operands as array of uint32 values
|
|
||||||
//! and the given `index` describes a position in this array. For example a single \ref Operand would be
|
|
||||||
//! decomposed to 4 uint32_t values, where the first at index 0 would be operand signature, next would be
|
|
||||||
//! base id, etc... This is a comfortable way of patching operands without having to check for their types.
|
|
||||||
inline void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept {
|
inline void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept {
|
||||||
ASMJIT_ASSERT(index <= kMaxRewriteId);
|
|
||||||
|
|
||||||
uint32_t* array = _getRewriteArray();
|
uint32_t* array = _getRewriteArray();
|
||||||
array[index] = id;
|
array[index] = id;
|
||||||
}
|
}
|
||||||
@ -1006,40 +949,43 @@ public:
|
|||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! \cond INTERNAL
|
//! \cond INTERNAL
|
||||||
|
static ASMJIT_INLINE_NODEBUG uint32_t capacityOfOpCount(uint32_t opCount) noexcept {
|
||||||
//! Returns the capacity required for the given operands count `opCount`.
|
return opCount <= kBaseOpCapacity ? kBaseOpCapacity : Globals::kMaxOpCount;
|
||||||
//!
|
|
||||||
//! There are only two capacities used - \ref kBaseOpCapacity and \ref kFullOpCapacity, so this function
|
|
||||||
//! is used to decide between these two. The general rule is that instructions that can be represented with
|
|
||||||
//! \ref kBaseOpCapacity would use this value, and all others would take \ref kFullOpCapacity.
|
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr uint32_t capacityOfOpCount(uint32_t opCount) noexcept {
|
|
||||||
return opCount <= kBaseOpCapacity ? kBaseOpCapacity : kFullOpCapacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Calculates the size of \ref InstNode required to hold at most `opCapacity` operands.
|
static ASMJIT_INLINE_NODEBUG size_t nodeSizeOfOpCapacity(uint32_t opCapacity) noexcept {
|
||||||
//!
|
size_t base = sizeof(InstNode) - kBaseOpCapacity * sizeof(Operand);
|
||||||
//! This function is used internally to allocate \ref InstNode.
|
return base + opCapacity * sizeof(Operand);
|
||||||
static ASMJIT_INLINE_NODEBUG constexpr size_t nodeSizeOfOpCapacity(uint32_t opCapacity) noexcept {
|
|
||||||
return sizeof(InstNode) + opCapacity * sizeof(Operand);
|
|
||||||
}
|
}
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Instruction node with embedded operands following \ref InstNode layout.
|
//! Instruction node with maximum number of operands.
|
||||||
//!
|
//!
|
||||||
//! \note This is used to make tools such as static analysis and compilers happy about the layout. There were two
|
//! This node is created automatically by Builder/Compiler in case that the required number of operands exceeds
|
||||||
//! instruction nodes in the past, having the second extend the operand array of the first, but that has caused
|
//! the default capacity of `InstNode`.
|
||||||
//! undefined behavior and made recent tools unhappy about that.
|
class InstExNode : public InstNode {
|
||||||
template<uint32_t kN>
|
|
||||||
class InstNodeWithOperands : public InstNode {
|
|
||||||
public:
|
public:
|
||||||
Operand_ _operands[kN];
|
ASMJIT_NONCOPYABLE(InstExNode)
|
||||||
|
|
||||||
//! Creates a new `InstNodeWithOperands` instance.
|
//! \name Members
|
||||||
ASMJIT_INLINE_NODEBUG InstNodeWithOperands(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount) noexcept
|
//! \{
|
||||||
: InstNode(cb, instId, options, opCount, kN) {}
|
|
||||||
|
//! Continued `_opArray[]` to hold up to `kMaxOpCount` operands.
|
||||||
|
Operand_ _opArrayEx[Globals::kMaxOpCount - kBaseOpCapacity];
|
||||||
|
|
||||||
|
//! \}
|
||||||
|
|
||||||
|
//! \name Construction & Destruction
|
||||||
|
//! \{
|
||||||
|
|
||||||
|
//! Creates a new `InstExNode` instance.
|
||||||
|
ASMJIT_INLINE_NODEBUG InstExNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCapacity = Globals::kMaxOpCount) noexcept
|
||||||
|
: InstNode(cb, instId, options, opCapacity) {}
|
||||||
|
|
||||||
|
//! \}
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Section node.
|
//! Section node.
|
||||||
@ -1066,9 +1012,9 @@ public:
|
|||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! Creates a new `SectionNode` instance.
|
//! Creates a new `SectionNode` instance.
|
||||||
ASMJIT_INLINE_NODEBUG SectionNode(BaseBuilder* cb, uint32_t sectionId = 0) noexcept
|
ASMJIT_INLINE_NODEBUG SectionNode(BaseBuilder* cb, uint32_t secionId = 0) noexcept
|
||||||
: BaseNode(cb, NodeType::kSection, NodeFlags::kHasNoEffect),
|
: BaseNode(cb, NodeType::kSection, NodeFlags::kHasNoEffect),
|
||||||
_id(sectionId),
|
_id(secionId),
|
||||||
_nextSection(nullptr) {}
|
_nextSection(nullptr) {}
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
2
deps/asmjit/src/asmjit/core/builder_p.h
vendored
2
deps/asmjit/src/asmjit/core/builder_p.h
vendored
@ -13,7 +13,6 @@
|
|||||||
|
|
||||||
ASMJIT_BEGIN_NAMESPACE
|
ASMJIT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
//! \cond INTERNAL
|
|
||||||
//! \addtogroup asmjit_builder
|
//! \addtogroup asmjit_builder
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
@ -29,7 +28,6 @@ static inline void BaseBuilder_assignInstState(BaseBuilder* self, InstNode* node
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
//! \endcond
|
|
||||||
|
|
||||||
ASMJIT_END_NAMESPACE
|
ASMJIT_END_NAMESPACE
|
||||||
|
|
||||||
|
6
deps/asmjit/src/asmjit/core/codeholder.cpp
vendored
6
deps/asmjit/src/asmjit/core/codeholder.cpp
vendored
@ -132,8 +132,8 @@ CodeHolder::~CodeHolder() noexcept {
|
|||||||
CodeHolder_resetInternal(this, ResetPolicy::kHard);
|
CodeHolder_resetInternal(this, ResetPolicy::kHard);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CodeHolder - Initialization & Reset
|
// CodeHolder - Init & Reset
|
||||||
// ===================================
|
// =========================
|
||||||
|
|
||||||
inline void CodeHolder_setSectionDefaultName(
|
inline void CodeHolder_setSectionDefaultName(
|
||||||
Section* section,
|
Section* section,
|
||||||
@ -908,7 +908,7 @@ size_t CodeHolder::codeSize() const noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sizeof(uint64_t) > sizeof(size_t) && offset > uint64_t(SIZE_MAX)) || of)
|
if ((sizeof(uint64_t) > sizeof(size_t) && offset > SIZE_MAX) || of)
|
||||||
return SIZE_MAX;
|
return SIZE_MAX;
|
||||||
|
|
||||||
return size_t(offset);
|
return size_t(offset);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user