citra/externals
Wunk e13735b624
video_core: Implement an arm64 shader-jit backend (#7002)
* externals: Add oaksim submodule

Used for emitting ARM64 assembly

* common: Implement aarch64 ABI

Utilize oaknut to implement a stack frame.

* tests: Allow shader-jit tests for x64 and a64

Run the shader-jit tests for both x86_64 and arm64 targets

* video_core: Initialize arm64 shader-jit backend

Passes all current unit tests!

* shader_jit_a64: protect/unprotect memory when jit-ing

Required on MacOS. Memory needs to be fully unprotected and then
re-protected when writing or there will be memory access errors on
MacOS.

* shader_jit_a64: Fix ARM64-Imm overflow

These conditionals were throwing exceptions since the immediate values
were overflowing the available space in the `EOR` instructions. Instead
they are generated from `MOV` and then `EOR`-ed after.

* shader_jit_a64: Fix Geometry shader conditional

* shader_jit_a64: Replace `ADRL` with `MOVP2R`

Fixes some immediate-generation exceptions.

* common/aarch64: Fix CallFarFunction

* shader_jit_a64: Optimize `SantitizedMul`

Co-authored-by: merryhime <merryhime@users.noreply.github.com>

* shader_jit_a64: Fix address register offset behavior

Based on https://github.com/citra-emu/citra/pull/6942
Passes unit tests.

* shader_jit_a64: Fix `RET` address offset

A64 stack is 16-byte aligned rather than 8. So a direct port of the x64
code won't work. Fixes weird branches into invalid memory for any
shaders with subroutines.

* shader_jit_a64: Increase max program size

Tuned for A64 program size.

* shader_jit_a64: Use `UBFX` for extracting loop-state

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit_a64: Optimize `SUB+CMP` to `SUBS`

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit_a64: Optimize `CMP+B` to `CBNZ`

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit_a64: Use `FMOV` for `ONE` vector

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit_a64: Remove x86-specific documentation

* shader_jit_a64: Use `UBFX` to extract exponent

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit_a64: Remove redundant MIN/MAX `SRC2`-NaN check

Special handling only needs to check SRC1 for NaN, not SRC2.
It would work as follows in the four possible cases:

No NaN: No special handling needed.
Only SRC1 is NaN: The special handling is triggered because SRC1 is NaN, and SRC2 is picked.
Only SRC2 is NaN: FMAX automatically picks SRC2 because it always picks the NaN if there is one.
Both SRC1 and SRC2 are NaN: The special handling is triggered because SRC1 is NaN, and SRC2 is picked.

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit/tests:: Add catch-stringifier for vec2f/vec3f

* shader_jit/tests: Add Dest Mask unit test

* shader_jit_a64: Fix Dest-Mask `BSL` operand order

Passes the dest-mask unit tests now.

* shader_jit_a64: Use `MOVI` for DestEnable mask

Accelerate certain cases of masking with MOVI as well

Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>

* shader_jit/tests: Add source-swizzle unit test

This is not expansive. Generating all `4^4` cases seems to make Catch2
crash. So I've added some component-masking(non-reordering) tests based
on the Dest-Mask unit-test and some additional ones to test
broadcasts/splats and component re-ordering.

* shader_jit_a64: Fix swizzle index generation

This was still generating `SHUFPS` indices and not the ones that we wanted for the `TBL` instruction. Passes all unit tests now.

* shader_jit/tests: Add `ShaderSetup` constructor to `ShaderTest`

Rather than using the direct output of `CompileShaderSetup` allow a
`ShaderSetup` object to be passed in directly.  This enabled the ability
emit assembly that is not directly supported by nihstro.

* shader_jit/tests: Add `CALL` unit-test

Tests nested `CALL` instructions to eventually reach an `EX2`
instruction.

EX2 is picked in particular since it is implemented as an even deeper
dispatch and ensures subroutines are properly implemented between `CALL`
instructions and implementation-calls.

* shader_jit_a64: Fix nested `BL` subroutines

`lr` was getting writen over by nested calls to `BL`, causing undefined
behavior with mixtures of `CALL`, `EX2`, and `LG2` instructions.

Each usage of `BL` is now protected with a stach push/pop to preserve
and restore teh `lr` register to allow nested subroutines to work
properly.

* shader_jit/tests: Allocate generated tests on heap

Each of these generated shader-test objects were causing the stack to
overflow.  Allocate each of the generated tests on the heap and use
unique_ptr so they only exist within the life-time of the `REQUIRE`
statement.

* shader_jit_a64: Preserve `lr` register from external function calls

`EMIT` makes an external function call, and should be preserving `lr`

* shader_jit/tests: Add `MAD` unit-test

The Inline Asm version requires an upstream fix:
https://github.com/neobrain/nihstro/issues/68

Instead, the program code is manually configured and added.

* shader_jit/tests: Fix uninitialized instructions

These `union`-type instruction-types were uninitialized, causing tests
to indeterminantly fail at times.

* shader_jit_a64: Remove unneeded `MOV`

Residue from the direct-port of x64 code.

* shader_jit_a64: Use `std::array` for `instr_table`

Add some type-safety and const-correctness around this type as well.

* shader_jit_a64: Avoid c-style offset casting

Add some more const-correctness to this function as well.

* video_core: Add arch preprocessor comments

* common/aarch64: Use X16 as the veneer register

https://developer.arm.com/documentation/102374/0101/Procedure-Call-Standard

* shader_jit/tests: Add uniform reading unit-test

Particularly to ensure that addresses are being properly truncated

* common/aarch64: Use `X0` as `ABI_RETURN`

`X8` is used as the indirect return result value in the case that the
result is bigger than 128-bits. Principally `X0` is the general-case
return register though.

* common/aarch64: Add veneer register note

`LR` is generally overwritten by `BLR` anyways, and would also be a safe
veneer to utilize for far-calls.

* shader_jit_a64: Remove unneeded scratch register from `SanitizedMul`

* shader_jit_a64: Fix CALLU condition

Should be `EQ` not `NE`. Fixes the regression on Kid Icarus.
No known regressions anymore!

---------

Co-authored-by: merryhime <merryhime@users.noreply.github.com>
Co-authored-by: JosJuice <JosJuice@users.noreply.github.com>
2023-11-05 21:40:31 +01:00
..
android-ifaddrs HTTP_C::Implement Context::MakeRequest (#4754) 2020-02-21 19:04:04 +01:00
boost@3c27c785ad shader_interpreter: Fix control flow edge cases and implement break/breakc (#6844) 2023-08-21 18:12:46 -07:00
catch2@3f0283de7a externals: update catch to v3.3.2 2023-05-04 11:12:59 -03:00
cmake-modules audio_core: Replace AAC decoders with single FAAD2-based decoder. (#7098) 2023-11-04 14:56:13 -07:00
cpp-jwt@e12ef06218 externals: Update cpp-jwt to e12ef062 (#6051) 2022-06-25 14:41:57 +05:30
cryptopp@af7d1050bf externals: Update cryptopp-cmake and cryptopp. (#7041) 2023-10-17 11:03:03 -07:00
cryptopp-cmake@9327192b00 externals: Update cryptopp-cmake and cryptopp. (#7041) 2023-10-17 11:03:03 -07:00
cubeb@48689ae7a7 externals: update cubeb (#6548) 2023-05-19 00:24:43 +02:00
dds-ktx@42dd8aa6de Custom textures rewrite (#6452) 2023-04-27 07:38:28 +03:00
discord-rpc@20cc99aeff ci: Fix CI builds being marked as dirty. (#6656) 2023-07-04 21:02:33 -07:00
dynarmic@d333a09b3b externals: Update dynarmic to 6.4.8 (#6596) 2023-06-07 20:25:28 -07:00
enet@4f8e9bdc4c Upgrade codebase to C++ 20 + fix warnings + update submodules (#6115) 2022-09-21 18:36:12 +02:00
faad2 audio_core: Replace AAC decoders with single FAAD2-based decoder. (#7098) 2023-11-04 14:56:13 -07:00
fmt@2dd4fa8742 externals: Update fmt. (#7015) 2023-09-27 03:29:13 -07:00
getopt
glad video_core: Take factors into account with min/max blending functions (#6925) 2023-08-30 21:26:28 +03:00
glslang@1e4955adbc Prepare for Vulkan backend (#6595) 2023-06-05 07:29:05 -07:00
httplib Implement more HTTP:C functionality (#7035) 2023-10-11 10:09:16 -07:00
inih externals: allow user to use system inih (#7073) 2023-10-16 19:31:56 -07:00
json Upgrade codebase to C++ 20 + fix warnings + update submodules (#6115) 2022-09-21 18:36:12 +02:00
libadrenotools@deec5f75ee Add vulkan backend (#6512) 2023-09-13 01:28:50 +03:00
library-headers@3b3e28dbe6 externals: Make system dynamic library headers flags instead of auto-detect. (#7065) 2023-10-16 19:32:58 -07:00
libressl@d4fc7348a3 ci: Fix CI builds being marked as dirty. (#6656) 2023-07-04 21:02:33 -07:00
libusb externals: Link SDL2 statically. (#6461) 2023-05-10 05:08:25 +02:00
libyuv@6900494d90 Upgrade codebase to C++ 20 + fix warnings + update submodules (#6115) 2022-09-21 18:36:12 +02:00
lodepng Upgrade codebase to C++ 20 + fix warnings + update submodules (#6115) 2022-09-21 18:36:12 +02:00
microprofile src/CMakeLists: Enforce multiple warnings on MSVC (#5692) 2022-11-09 23:14:28 +01:00
moltenvk Add vulkan backend (#6512) 2023-09-13 01:28:50 +03:00
nihstro@fd69de1a1b
oaknut@e6eecc3f94 video_core: Implement an arm64 shader-jit backend (#7002) 2023-11-05 21:40:31 +01:00
open_source_archives
openal-soft@d9fed51aa6 audio_core: Implement OpenAL backend (#6450) 2023-05-01 21:17:45 +02:00
sdl2 sdl: Enable cpuinfo detection. (#6554) 2023-05-19 15:48:30 +02:00
sirit@4ab79a8c02 Prepare for Vulkan backend (#6595) 2023-06-05 07:29:05 -07:00
soundtouch@dd2252e9af externals: Update SoundTouch (#6473) 2023-04-27 17:48:57 +05:30
teakra@01db7cdd00 Update teakra (#5961) 2022-02-24 21:02:40 +05:30
vma@0e89587db3 Prepare for Vulkan backend (#6595) 2023-06-05 07:29:05 -07:00
vulkan-headers@85c2334e92 Add vulkan backend (#6512) 2023-09-13 01:28:50 +03:00
xbyak@a1ac3750f9 externals: bump xbyak to v6.68 2023-01-06 06:41:51 -08:00
zstd@63779c7982 externals: update zstd to v1.5.5 again 2023-05-04 11:08:05 -03:00
CMakeLists.txt video_core: Implement an arm64 shader-jit backend (#7002) 2023-11-05 21:40:31 +01:00