2024-07-03 17:59:42 -07:00
# FEX-2407
2021-03-30 11:38:33 +03:00
2023-09-05 22:16:35 -07:00
## FEXCore
See [FEXCore/Readme.md ](../FEXCore/Readme.md ) for more details
2021-03-30 11:38:33 +03:00
### Glossary
- Splatter: a code generator backend that concaternates configurable macros instead of doing isel
- IR: Intermediate Representation, our high-level opcode representation, loosely modeling arm64
- SSA: Single Static Assignment, a form of representing IR in memory
- Basic Block: A block of instructions with no control flow, terminated by control flow
- Fragment: A Collection of basic blocks, possibly an entire guest function or a subset of it
### backend
IR to host code generation
#### arm64
2023-09-05 22:16:35 -07:00
- [ALUOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/ALUOps.cpp )
- [Arm64Relocations.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/Arm64Relocations.cpp ): relocation logic of the arm64 splatter backend
- [AtomicOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/AtomicOps.cpp )
- [BranchOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/BranchOps.cpp )
- [ConversionOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/ConversionOps.cpp )
- [EncryptionOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/EncryptionOps.cpp )
- [FlagOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/FlagOps.cpp )
- [JIT.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/JIT.cpp ): Main glue logic of the arm64 splatter backend
- [JITClass.h ](../FEXCore/Source/Interface/Core/JIT/Arm64/JITClass.h )
- [MemoryOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp )
- [MiscOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/MiscOps.cpp )
- [MoveOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/MoveOps.cpp )
- [VectorOps.cpp ](../FEXCore/Source/Interface/Core/JIT/Arm64/VectorOps.cpp )
2021-03-30 11:38:33 +03:00
#### shared
2024-04-05 15:20:24 -07:00
- [CPUBackend.h ](../FEXCore/Source/Interface/Core/CPUBackend.h )
2021-03-30 11:38:33 +03:00
### frontend
#### x86-meta-blocks
2023-09-05 22:16:35 -07:00
- [Frontend.cpp ](../FEXCore/Source/Interface/Core/Frontend.cpp ): Extracts instruction & block meta info, frontend multiblock logic
2021-03-30 11:38:33 +03:00
#### x86-tables
Metadata that drives the frontend x86/64 decoding
2023-09-05 22:16:35 -07:00
- [BaseTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp )
- [DDDTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp )
- [EVEXTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/EVEXTables.cpp )
- [H0F38Tables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp )
- [H0F3ATables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp )
- [PrimaryGroupTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/PrimaryGroupTables.cpp )
- [SecondaryGroupTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp )
- [SecondaryModRMTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp )
- [SecondaryTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp )
- [VEXTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp )
- [X86Tables.h ](../FEXCore/Source/Interface/Core/X86Tables/X86Tables.h )
- [X87Tables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp )
- [XOPTables.cpp ](../FEXCore/Source/Interface/Core/X86Tables/XOPTables.cpp )
- [X86Tables.cpp ](../FEXCore/Source/Interface/Core/X86Tables.cpp )
2021-03-30 11:38:33 +03:00
#### x86-to-ir
2024-07-03 17:59:42 -07:00
- [AVX_128.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp ): Handles x86/64 AVX instructions to 128-bit IR
2023-09-05 22:16:35 -07:00
- [Crypto.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp ): Handles x86/64 Crypto instructions to IR
- [Flags.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp ): Handles x86/64 flag generation
- [Vector.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp ): Handles x86/64 Vector instructions to IR
- [X87.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp ): Handles x86/64 x87 to IR
- [X87F64.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87F64.cpp ): Handles x86/64 x87 to IR
- [OpcodeDispatcher.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp ): Handles x86/64 ops to IR, no-pf opt, local-flags opt
2021-03-30 11:38:33 +03:00
### glue
Logic that binds various parts together
#### block-database
2023-09-05 22:16:35 -07:00
- [LookupCache.cpp ](../FEXCore/Source/Interface/Core/LookupCache.cpp ): Stores information about blocks, and provides C++ implementations to lookup the blocks
2021-03-30 11:38:33 +03:00
#### driver
Emulation mainloop related glue logic
2023-09-05 22:16:35 -07:00
- [Core.cpp ](../FEXCore/Source/Interface/Core/Core.cpp ): Glues Frontend, OpDispatcher and IR Opts & Compilation, LookupCache, Dispatcher and provides the Execution loop entrypoint
2021-03-30 11:38:33 +03:00
#### log-manager
2023-09-05 22:16:35 -07:00
- [LogManager.cpp ](../FEXCore/Source/Utils/LogManager.cpp )
2021-03-30 11:38:33 +03:00
#### thunks
FEXCore side of thunks: Registration, Lookup
2023-09-05 22:16:35 -07:00
- [Thunks.cpp ](../FEXCore/Source/Interface/HLE/Thunks/Thunks.cpp )
- [Thunks.h ](../FEXCore/Source/Interface/HLE/Thunks/Thunks.h )
2021-03-30 11:38:33 +03:00
#### x86-guest-code
2023-09-05 22:16:35 -07:00
- [X86HelperGen.cpp ](../FEXCore/Source/Interface/Core/X86HelperGen.cpp ): Guest-side assembly helpers used by the backends
- [X86HelperGen.h ](../FEXCore/Source/Interface/Core/X86HelperGen.h )
2021-03-30 11:38:33 +03:00
### ir
2023-09-05 22:16:35 -07:00
#### debug
- [IRDumperPass.cpp ](../FEXCore/Source/Interface/IR/Passes/IRDumperPass.cpp ): Prints IR
2021-03-30 11:38:33 +03:00
#### dumper
IR -> Text
2023-09-05 22:16:35 -07:00
- [IRDumper.cpp ](../FEXCore/Source/Interface/IR/IRDumper.cpp )
2021-03-30 11:38:33 +03:00
#### emitter
C++ Functions to generate IR. See IR.json for spec.
2023-09-05 22:16:35 -07:00
- [IREmitter.cpp ](../FEXCore/Source/Interface/IR/IREmitter.cpp )
2021-03-30 11:38:33 +03:00
#### opts
IR to IR Optimization
2023-09-05 22:16:35 -07:00
- [PassManager.cpp ](../FEXCore/Source/Interface/IR/PassManager.cpp ): Defines which passes are run, and runs them
- [PassManager.h ](../FEXCore/Source/Interface/IR/PassManager.h )
2024-06-12 18:41:54 -07:00
- [ConstProp.cpp ](../FEXCore/Source/Interface/IR/Passes/ConstProp.cpp ): ConstProp, ZExt elim, const pooling, fcmp reduction, const inlining
2024-07-02 13:15:45 -07:00
- [DeadContextStoreElimination.cpp ](../FEXCore/Source/Interface/IR/Passes/DeadContextStoreElimination.cpp ): Transforms ContextLoad/Store to temporaries, similar to mem2reg
2023-09-05 22:16:35 -07:00
- [DeadStoreElimination.cpp ](../FEXCore/Source/Interface/IR/Passes/DeadStoreElimination.cpp ): Cross block store-after-store elimination
- [IRValidation.cpp ](../FEXCore/Source/Interface/IR/Passes/IRValidation.cpp ): Sanity checking pass
- [RedundantFlagCalculationElimination.cpp ](../FEXCore/Source/Interface/IR/Passes/RedundantFlagCalculationElimination.cpp ): This is not used right now, possibly broken
- [RegisterAllocationPass.cpp ](../FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.cpp )
- [RegisterAllocationPass.h ](../FEXCore/Source/Interface/IR/Passes/RegisterAllocationPass.h )
2021-03-30 11:38:33 +03:00
2024-06-12 18:41:54 -07:00
2021-03-30 11:38:33 +03:00
### opcodes
#### cpuid
2023-09-05 22:16:35 -07:00
- [CPUID.cpp ](../FEXCore/Source/Interface/Core/CPUID.cpp ): Handles presented capability bits for guest cpu
2021-03-30 11:38:33 +03:00
#### dispatcher-implementations
2024-07-03 17:59:42 -07:00
- [AVX_128.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp ): Handles x86/64 AVX instructions to 128-bit IR
2023-09-05 22:16:35 -07:00
- [Crypto.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp ): Handles x86/64 Crypto instructions to IR
- [Flags.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp ): Handles x86/64 flag generation
- [Vector.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp ): Handles x86/64 Vector instructions to IR
- [X87.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp ): Handles x86/64 x87 to IR
- [X87F64.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher/X87F64.cpp ): Handles x86/64 x87 to IR
- [OpcodeDispatcher.cpp ](../FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp ): Handles x86/64 ops to IR, no-pf opt, local-flags opt
2021-03-30 11:38:33 +03:00
## ThunkLibs
See [ThunkLibs/README.md ](../ThunkLibs/README.md ) for more details
### thunklibs
These are generated + glue logic 1:1 thunks unless noted otherwise
#### EGL
- [libEGL_Guest.cpp ](../ThunkLibs/libEGL/libEGL_Guest.cpp ): Depends on glXGetProcAddress thunk
- [libEGL_Host.cpp ](../ThunkLibs/libEGL/libEGL_Host.cpp )
#### GL
- [libGL_Guest.cpp ](../ThunkLibs/libGL/libGL_Guest.cpp ): Handles glXGetProcAddress
- [libGL_Host.cpp ](../ThunkLibs/libGL/libGL_Host.cpp ): Uses glXGetProcAddress instead of dlsym
#### SDL2
- [libSDL2_Guest.cpp ](../ThunkLibs/libSDL2/libSDL2_Guest.cpp ): Handles sdlglproc, dload, stubs a few log fns
- [libSDL2_Host.cpp ](../ThunkLibs/libSDL2/libSDL2_Host.cpp )
2022-09-05 10:32:07 -07:00
#### VDSO
- [libVDSO_Guest.cpp ](../ThunkLibs/libVDSO/libVDSO_Guest.cpp ): Linux VDSO thunking
2022-02-05 22:48:35 -08:00
#### Vulkan
2022-07-07 10:06:29 -07:00
- [Guest.cpp ](../ThunkLibs/libvulkan/Guest.cpp )
- [Host.cpp ](../ThunkLibs/libvulkan/Host.cpp )
2022-02-05 22:48:35 -08:00
2021-03-30 11:38:33 +03:00
#### X11
- [libXext_Guest.cpp ](../ThunkLibs/libXext/libXext_Guest.cpp )
- [libXext_Host.cpp ](../ThunkLibs/libXext/libXext_Host.cpp )
- [libXfixes_Guest.cpp ](../ThunkLibs/libXfixes/libXfixes_Guest.cpp )
- [libXfixes_Host.cpp ](../ThunkLibs/libXfixes/libXfixes_Host.cpp )
- [libXrender_Guest.cpp ](../ThunkLibs/libXrender/libXrender_Guest.cpp )
- [libXrender_Host.cpp ](../ThunkLibs/libXrender/libXrender_Host.cpp )
#### asound
- [libasound_Guest.cpp ](../ThunkLibs/libasound/libasound_Guest.cpp )
- [libasound_Host.cpp ](../ThunkLibs/libasound/libasound_Host.cpp )
2022-10-13 00:46:59 -07:00
#### cef
- [libcef_Guest.cpp ](../ThunkLibs/libcef/libcef_Guest.cpp )
- [libcef_Host.cpp ](../ThunkLibs/libcef/libcef_Host.cpp )
2021-10-08 16:29:35 -07:00
#### drm
- [Guest.cpp ](../ThunkLibs/libdrm/Guest.cpp )
- [Host.cpp ](../ThunkLibs/libdrm/Host.cpp )
#### fex_malloc
- [Guest.cpp ](../ThunkLibs/libfex_malloc/Guest.cpp ): Handles allocations between guest and host thunks
- [Host.cpp ](../ThunkLibs/libfex_malloc/Host.cpp ): Handles allocations between guest and host thunks
#### fex_malloc_loader
- [Guest.cpp ](../ThunkLibs/libfex_malloc_loader/Guest.cpp ): Delays malloc symbol replacement until it is safe to run constructors
#### fex_malloc_symbols
- [Host.cpp ](../ThunkLibs/libfex_malloc_symbols/Host.cpp ): Allows FEX to export allocation symbols
2023-10-05 14:39:10 -07:00
#### fex_thunk_test
- [Guest.cpp ](../ThunkLibs/libfex_thunk_test/Guest.cpp )
- [Host.cpp ](../ThunkLibs/libfex_thunk_test/Host.cpp )
2023-05-07 05:00:11 -07:00
#### wayland-client
- [Guest.cpp ](../ThunkLibs/libwayland-client/Guest.cpp )
- [Host.cpp ](../ThunkLibs/libwayland-client/Host.cpp )
2021-10-08 16:29:35 -07:00
#### xshmfence
- [Guest.cpp ](../ThunkLibs/libxshmfence/Guest.cpp )
- [Host.cpp ](../ThunkLibs/libxshmfence/Host.cpp )
2021-03-30 11:38:33 +03:00
## Source/Tests
## unittests
See [unittests/Readme.md ](../unittests/Readme.md ) for more details