Compare commits

...
2264 Commits
Author SHA1 Message Date
ptitSeb 79052e9df9 Introduce BOX64_NOVULKANOVERLAY to disabled x64 Vulkan Overlay 2026-03-03 22:08:01 +01:00
7e5310b260 cpuid: Enable Invariant TSC bit for Intel CPU type (#3579)
* cpuid: Enable Invariant TSC bit for Intel CPU type

The Invariant TSC bit (CPUID leaf 0x80000007, EDX bit 8) was already
enabled for AMD CPU type but was commented out for Intel CPU type.

ARM64 provides an invariant system counter via CNTPCT_EL0, so
advertising Invariant TSC capability is correct on ARM64 hardware
regardless of the emulated CPU vendor.

Some applications (notably World of Warcraft and VanillaFixes) check
this bit and refuse to run or crash when it is not set.

Fixes #2485

* Gate Invariant TSC behind BOX64_RDTSC_INV env var

Software often reports the timer clock as the CPU clock, which
is incorrect under Box64. Make the Invariant TSC bit in CPUID
leaf 0x80000007 opt-in for the Intel CPU type path via
BOX64_RDTSC_INV=1 (disabled by default).

The AMD CPU type path already reports this bit unconditionally.

* cpuid: fix BOX64_RDTSC_INV availability in WowBox64.dll and sanitize comments

- Set wine flag to 1 so BOX64_RDTSC_INV is parseable and initialised
  correctly when compiled as WowBox64.dll (_WIN32 context)
- Remove verbose comment annotation; env var name is evident from code

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Joe <[email protected]>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
2026-03-03 20:23:00 +01:00
ptitSeb 815b6f17ce [ELFLOADER] Revert #3540 as it can create issue on LA64 2026-03-03 17:51:22 +01:00
ptitSeb 1848ec1ee8 [DYNAREC] Removing safeguard on pass0 read as error has handled as exception now (for #3588) 2026-03-03 14:04:47 +01:00
ptitSeb 1ff11d67ef [WRAPPER] Added missing files from previous commits 2026-03-03 14:02:11 +01:00
Trung Lê 14f610b4e9 Add libogg wrapper for BOX32 (#3596)
Add 32-bit wrapper for libogg (libogg.so.0) to enable native wrapping
in BOX32 mode. This is a simple pass-through wrapper with no callbacks
or struct conversions needed.

New files:
- src/wrapped32/wrappedlibogg.c
- src/wrapped32/wrappedlibogg_private.h
- src/wrapped32/generated/wrappedlibogg{defs,types,undefs}32.h

New signature added to wrapper32 generated files:
- lFpi (intptr_t fn(void*, int32_t))
2026-03-03 11:40:01 +01:00
Trung Lê f53654b555 [WRAPPER] Add libayatana-indicator3.so.7 and libayatana-ido3-0.4.so.0 wrappers (#3553)
Add native wrappers for the two missing ayatana libraries that are
dependencies of the already-wrapped libayatana-appindicator3.so.1.

This fixes loading of applications like Spotify that depend on
libayatana-appindicator3 which in turn needs these two libraries.

Fixes #3408
2026-03-02 22:52:35 +01:00
ptitSeb e4d852f3c7 [WRAPPER][VULKAN] Fixed a nasty typo from baa1afeb5c 2026-03-02 22:01:14 +01:00
ptitSeb 4cf52d5636 [WRAPPER] Added some more symbols to nettle and hogweed (for #3593) 2026-03-02 21:44:26 +01:00
ptitSeb baa1afeb5c Imrpoved vulkan wrapping, fixing a potential of pipeline creating issue when having x64 overlay 2026-03-02 19:54:47 +01:00
ptitSeb 77aabfcad3 [BOX32][WRAPPER] Added missing files from previous PR 2026-03-02 19:42:16 +01:00
16ca4f28fe wrapped32: enable missing libm and libpthread entries (#3584)
* wrapped32: enable missing libm and libpthread wrapper entries

Enable 12 libm math functions (drem, dremf, fdim, fdimf, gamma,
gammaf, nan, nanf, scalb, scalbf, significand, significandf) and
2 libpthread functions (pthread_rwlockattr_getpshared,
pthread_rwlockattr_setpshared) for 32-bit emulation.

Signatures derived from existing 64-bit wrappers with F→E calling
convention conversion. The pthread getpshared/setpshared signatures
match the existing barrierattr and condattr equivalents in the
same file.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* Fix Box32 CI: drop nanf (fEp_32 converter type missing)

Re-comment nanf — the fEp_32 converter doesn't exist in generated
Box32 wrappers. Keep 13 other functions with existing types.

* Add fEp_32 converter type, re-enable nanf

Add missing Box32 wrapper type fEp_32 (float return, emulator
convention, pointer arg) to wrapper32.c/h and functions_list.txt.
Modeled after existing dEp_32 (double variant).

---------

Co-authored-by: Joe <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-03-02 19:12:26 +01:00
gigachadmma69andJoe 77ffe39472 Enable seekdir, telldir, getdelim, getline in Box32 libc wrapper (#3580)
* Enable seekdir, telldir, getdelim, getline in Box32 libc wrapper

Enable four commonly-needed libc functions in the 32-bit (Box32) wrapper
that were previously commented out, fixing symbol-not-found errors when
running 32-bit Linux binaries.

- seekdir: Fixed signature from vEpi to vEpl (second arg is long).
  Fixes #3190 (AMX Mod X / Xash3D-FWGS server fails to load).

- telldir: Fixed return type from iEp to lEp (returns long).
  Fixes #3190.

- getdelim: Uncommented with existing correct signature iEbp_bL_iS.
  Matches already-enabled __getdelim. Fixes #3575 (Metamod / CS:Source
  server fails to load).

- getline: Fixed signature from iEppp to iEbp_bL_S to properly handle
  char** (bp_), size_t* (bL_), and FILE* (S) 32-to-64 bit conversions.
  Same argument pattern as getdelim minus the delimiter parameter.

* Fix Box32 CI: correct seekdir signature, drop getline

- seekdir: vEpl → vEpL (lowercase l was wrong, needs unsigned long)
- getline: re-comment — converter type iEbp_bL_S_32 doesn't exist yet
- getdelim and telldir signatures verified against existing converter types

* Add iEbp_bL_S_32 converter type, re-enable getline

Add missing Box32 wrapper type iEbp_bL_S_32 for getline(char **lineptr,
size_t *n, FILE *stream). Modeled after iEbp_bL_iS_32 (getdelim) but
without the int delim parameter — FILE* is at ESP+12 instead of ESP+16.

---------

Co-authored-by: Joe <[email protected]>
2026-03-02 19:08:13 +01:00
ptitSeb f1b2076890 [RCFILE] Added 1 more game profile 2026-03-02 16:39:42 +01:00
ptitSeb bc16008759 [DYNAREC] Improved error handling on FillBlock64 (will help #3588) 2026-03-02 15:54:18 +01:00
ptitSeb 03324f6c73 [DYNAREC] Small refactor of FillBlock64 for later error handling improvment 2026-03-02 14:22:25 +01:00
ptitSeb b561993f6e [RCFILE] One more game profile 2026-03-02 14:07:38 +01:00
ptitSeb 430ca5b954 [RCFIEL] Add 1 game profile 2026-03-02 12:46:33 +01:00
ptitSeb 960cc2dbb7 [BOX32][WRAPPER] Added back the 2 disabled function and the missing files from #3583 2026-03-02 08:38:30 +01:00
fdc317334c Enable 7 missing functions in Box32 libc and librt wrappers (#3583)
* Enable 7 missing functions in Box32 libc and librt wrappers

Enable commonly-needed POSIX functions in the Box32 wrapper layer:

libc (6 functions):
- eaccess: check effective access permissions
- memccpy: copy memory until character found
- ptsname_r: get pseudoterminal name (thread-safe)
- tolower_l / toupper_l: locale-aware character case conversion
- truncate: truncate file to specified length

librt (1 function):
- clock_settime: set clock time (fixed signature from iEup to
  iEurLL_ for proper struct timespec conversion between 32-bit
  and 64-bit, matching clock_gettime's BLL_ pattern)

All functions are already enabled in the 64-bit wrapper and have
straightforward signatures with no complex struct conversions
(except clock_settime which now correctly uses rLL_ for the
input timespec struct).

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* Fix Box32 CI: drop functions with missing converter types

Remove memccpy (pEppiL_32) and clock_settime (iEurLL_32) — their
converter types don't exist in the generated Box32 wrappers.
Keep 5 functions that use existing converter types.

---------

Co-authored-by: Joe <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-03-02 08:34:58 +01:00
147898cd80 Implement SDL3 callback wrappers for timer, event, hint, and log functions (#3581)
* Implement SDL3 callback wrappers for timer, event, hint, and log functions

Enable 11 SDL3 callback-based functions that were previously commented out:
- SDL_AddTimer / SDL_AddTimerNS (with SDL3's new callback signature)
- SDL_SetEventFilter / SDL_GetEventFilter
- SDL_AddEventWatch / SDL_RemoveEventWatch
- SDL_FilterEvents
- SDL_AddHintCallback / SDL_RemoveHintCallback
- SDL_SetLogOutputFunction / SDL_GetLogOutputFunction

All wrappers follow the established SDL2 callback pattern with 5-slot
SUPER() macros, find/reverse functions, and RunFunctionFmt bridges.

The SDL3 Timer callback signature changed from SDL2 (added timerID param,
reordered args), so Timer and TimerNS get their own slot types.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* Add generated wrapper files for SDL3 callback signatures

Add wrappedsdl3types.h entries for all new GOM callback functions
and add the missing uFEUpp wrapper type (for SDL_AddTimerNS).

---------

Co-authored-by: Joe <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-03-02 07:45:18 +01:00
ptitSeb f2881840e6 [DYNAREC] Reduce the test introduced with #3590 where dynarec check if next 15-bytes are readable only on non-file mapped memory (might impact #3588) 2026-03-01 18:30:00 +01:00
ptitSeb 81a5d1cee0 Fixed a regression from bae577f915 where BOX64_MAXCPU from rcfile would not be applied properly 2026-03-01 18:13:17 +01:00
ptitSeb af7df03221 [WRAPPER] Small adjustment on wrapper return value (fix a xonotic regression introduced with 38cfeeb558) (for #3593) 2026-03-01 15:27:49 +01:00
ptitSeb 0592854919 [WRAPPER] Added back some generated files 2026-03-01 13:46:16 +01:00
rajdakin aab7817df8 [WRAPPERHELPER] Fixed x86-specific inclusion specification file (#3602) 2026-03-01 11:18:43 +01:00
Trung Lê 15994e78c7 [WRAPPER] Add libvpx wrapper for VP8/VP9 codec support (#3594)
Add wrapping for libvpx.so.9, covering all 37 exported functions
(decoder, encoder, image, and codec info APIs). Three callback-based
functions are left commented out as they would require GOM wrappers.
Four internal _algo data symbols are also commented out since
applications use the accessor functions instead.
2026-03-01 11:03:52 +01:00
rajdakin 3e3ad92f30 [WRAPPERHELPER] Added an x86-specific inclusion specification file (#3601) 2026-03-01 10:43:46 +01:00
Luke Short 92e52c0b77 Bundle emulated libs list (#3600)
* [BUNDLE] Update non-emulated libs link

from the Box64 tag v0.3.6 to v0.4.0.

* [BUNDLE] Link to emulated libraries
2026-03-01 10:17:43 +01:00
Trung Lê 34a813764b Add pulse-simple (libpulse-simple) wrapper for BOX32 (#3598) 2026-03-01 10:05:11 +01:00
Trung Lê dbfafb82fa [BOX32] Add libSDL2-2.0.so.1 to 32-bit library list (#3595)
The 64-bit library_list.h already maps libSDL2-2.0.so.1 to the sdl2
wrapper, but library_list_32.h only had libSDL2-2.0.so.0. This caused
32-bit games shipping SDL2 with soname .so.1 (e.g. Grim Fandango
Remastered) to fall through to full emulation instead of using the
native SDL2 wrapper.
2026-03-01 09:31:28 +01:00
ptitSeb 388d9c88a4 [DYNAREC] Rework SEP, fixing a speed regression from b07e2ea9d7 and introducing BOX64_DYNAREC_SEP to control them 2026-02-28 18:04:55 +01:00
FrontMage 2c293fc742 dynarec: fail-close readable-range guards for FillBlock/native-call probes (#3590)
* dynarec: guard FillBlock decode/native-call reads on unreadable pages

* dynarec: merge decode-window guard into existing stop path
2026-02-28 15:17:50 +01:00
Trung Lê 1c5d1f515c [PPC64LE] Add PPC64LE platform support (interpreter-only) (#3591)
Add PPC64LE (POWER9+, little-endian) as a recognized platform for
interpreter-only builds. No dynarec code is included yet.

Platform support:
- Build system: CMakeLists.txt cross-compiler setup, CPACK, CONFIG_64BIT
- CI: GitHub Actions matrix with qemu-ppc64le-static testing
- Host CPU feature detection (CRYPTO, DARN, ISA 3.1, MMA)
- Signal handling for PPC64LE (xSPSave/old_savedsp, context registers)
- O_LARGEFILE conversion (PPC64LE uses 0200000)
- Static build: -fno-stack-protector (glibc uses TLS-based canary via r13)
- __stack_chk_guard guard for PPC64LE static builds
- Wrapper generator PPC64LE support
2026-02-28 21:56:25 +08:00
Trung Lê 740eab30ce ppc64le: Hook ogg_sync_pageout to fix use-after-free in statically-linked libogg (#3589)
Games that statically link libogg (e.g. Grim Fandango Remastered) crash
because ogg_sync_pageout returns pointers into an internal buffer that
gets moved by a subsequent realloc in ogg_sync_buffer. On PPC64LE with
64KB pages, realloc moves the buffer much more aggressively than on x86.

The fix hooks ogg_sync_pageout via addAlternate and copies the returned
page header and body to stable allocations, preventing stale pointer
dereferences. Currently gated behind PPC64LE but may apply to other
backends.

See https://github.com/ptitSeb/box64/issues/3587
2026-02-28 14:25:57 +01:00
Leslie ZhaiandZewei Yang 3a00578707 [WRAPPER] Fix g_type_module_register_type forgot to findFct other (#3586)
callbacks for my_GTypeInfo_t

Co-authored-by: Zewei Yang <[email protected]>
2026-02-28 11:17:19 +01:00
Leslie Zhai f69720119a [WRAPPER] Fix xmlMemGet typo (#3585) 2026-02-28 10:46:02 +01:00
b5639f884d Fix execl/execle/execlp varargs: use i+1 instead of cnt+1 (#3582)
The argument-filling loop in my_execl(), my_execle(), and my_execlp()
used getVargN(emu, cnt+1) which always reads the last vararg before
NULL. This meant every argv entry was filled with the same (wrong)
value, corrupting the argument list passed to execv/execve/execvp.

Fix by using getVargN(emu, i+1) to read each argument in order.

This caused x64 applications that use execl() to re-exec themselves
(e.g. game restart via fork+execl) to fail with missing binary path.

Fixes #3542

Co-authored-by: Joe <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-02-28 10:06:47 +01:00
Trung Lê 2ef63f29f1 [WRAPPER] Fix SDL Vulkan bridge2 passing wrong fnc2 (regression from c7bc29329) (#3578)
* [WRAPPER] Fix SDL_Vulkan_GetVkGetInstanceProcAddr bridge2 fnc2 parameter

Commit c7bc29329 introduced a regression in both wrappedsdl2.c and
wrappedsdl3.c where AddCheckBridge2() was called with
my->SDL_Vulkan_GetVkGetInstanceProcAddr as the fnc2 parameter. This is
the SDL function that *returns* the native vkGetInstanceProcAddr pointer,
not the pointer itself.

When my_vkGetInstanceProcAddr (wrappedvulkan.c) later calls
getBridgeFnc2(R_RIP) to retrieve the native proc address resolver, it
gets SDL_Vulkan_GetVkGetInstanceProcAddr instead. Calling
getprocaddr(instance, name) then invokes
SDL_Vulkan_GetVkGetInstanceProcAddr(instance, name), which ignores both
arguments and returns the vkGetInstanceProcAddr pointer. This pointer
gets wrapped as if it were the resolved function (e.g.
vkEnumerateInstanceVersion), so calling the bridge actually calls
vkGetInstanceProcAddr with wrong arguments, causing Vulkan loader
validation errors and a crash (SIGSEGV/SIGABRT).

Fix: pass (void*)emu->context->vkprocaddress instead, which already
holds the actual native vkGetInstanceProcAddr pointer (set on line 840
in SDL2 and line 51 in SDL3).

Tested with SuperTuxKart on PPC64LE — Vulkan initializes correctly
(RADV NAVI23, Vulkan 1.4.328) and the game runs without crash.

* [WRAPPER] Always use fresh SDL_Vulkan_GetVkGetInstanceProcAddr result as fnc2

As suggested by ptitSeb: the bridge2 fnc2 parameter should use the
result of the current SDL call, not the potentially stale cached
vkprocaddress from a previous invocation. Store the SDL call result
in a local variable and pass that directly to AddCheckBridge2().
2026-02-27 18:05:05 +01:00
ptitSeb b975a87cf9 [ARM64_DYNAREC] Upped log level of the calling 0x0 warning 2026-02-27 17:14:32 +01:00
ptitSeb 58d3525cbc Fixed a speed regression introduced with ad90eaef8d (should help #3573) 2026-02-27 17:06:12 +01:00
ptitSeb 0c76a09575 [DYNAREC] Fixed an issue where flags would not be fetched on callret return 2026-02-27 13:23:02 +01:00
Yang Liu dee9a747ae [LA64_DYNAREC] Fixed non-lbt path of SF computation in emit_cmp32_0 (#3572)
Similar fix as #3569
2026-02-26 15:41:58 +01:00
ptitSeb 1e1b37a45d [LA64_DYNAREC] Fixed Non-wine INT n opcode that wasn't triggering the right signal 2026-02-26 15:05:38 +01:00
Trung Lê 2ee476465d [BOX32][WRAPPER] Enable __isoc99_vfscanf and __isoc99_vsscanf in wrapped libc (#3570)
Uncomment the GOM registrations for __isoc99_vfscanf and
__isoc99_vsscanf. The implementations already exist as aliases to
my32_vfscanf and my32_vsscanf respectively (wrappedlibc.c lines
1088 and 1100), and the __isoc23 variants using the same underlying
functions are already enabled.

Without these symbols, 32-bit binaries that depend on
__isoc99_vsscanf@GLIBC_2.7 (e.g. Grim Fandango Remastered's bundled
SDL2) fail to resolve the symbol and exit immediately.

Fix #3568
2026-02-26 14:53:00 +01:00
Mark Zhuang a3c5c60975 [RV64_DYNAREC] Use SRLIW for 32-bit SF extraction in emit_cmp32_0 (#3569)
SRLI on a 64-bit register with dirty upper 32 bits produces wrong SF.
Unlike 8/16-bit paths where callers mask s1 beforehand, 32-bit callers
pass raw registers. SRLIW correctly ignores the upper 32 bits.
2026-02-26 21:51:56 +08:00
Trung Lê 2fb1ad18c0 Fix box32 ELF loading on 64KB page systems (e.g. POWER9) (#3566)
When the ELF vaddr (typically 0x8048000 for i386 binaries) is not
aligned to the host page size, mmap with MAP_FIXED fails with EINVAL.
Round down to the page boundary and increase the mapping size to cover
the full range, then set image to the actual vaddr within the mapping.
2026-02-26 12:15:13 +01:00
Mark Zhuang fc8b34ebc5 [RV64_DYNAREC] Fix OF flag position in copyUCTXreg2Emu for signal handling (#3567)
Convert F_OF2 to F_OF when reading eflags from native context, matching
the reverse conversion already done in copyEmu2USignalCTXreg.
2026-02-26 09:23:53 +01:00
Mark Zhuang d43b3000a4 [RV64_DYNAREC] fix rv64 epilog (#3565) 2026-02-26 08:42:24 +01:00
yzewei 5dd2ecdde9 [wrapped] Add some missing symbols (#3549)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-26 08:41:34 +01:00
Luke Short 69f2a9c388 [BUNDLE] Add manual symlinks first (#3561)
before doing automatic symlinks of the base '.so' files. This fixes
the ordering of symlinks.
2026-02-25 21:11:51 +01:00
Trung Lê fafdb6e516 [TOOLS] Add rbtree_walk() and optional dynablock size histogram (#3558)
Add rbtree_walk() for in-order tree traversal with user callback.
Use it to implement a dynablock size histogram printed at exit,
disabled by default behind //#define DYNAREC_HIST (following the
TRACE_MEMSTAT pattern). Ref #3554.
2026-02-25 16:26:52 +01:00
Trung Lê fbfb4697ad Add per-thread native sigaltstack for box64's internal signal handlers (#3559)
Allocate a native alternate signal stack (64KB or SIGSTKSZ, whichever
is larger) for each thread via pthread_key_t with destructor cleanup.
Add SA_ONSTACK to the four internal signal handler registrations
(SIGSEGV, SIGBUS, SIGILL, SIGABRT) so the kernel can deliver signals
even when the emulated program has exhausted the native stack.

This is orthogonal to the emulated sigaltstack machinery that handles
guest programs' own sigaltstack/SA_ONSTACK requests.

Fix #3552
2026-02-25 16:26:09 +01:00
Trung Lê b8469abb05 Fix protectDB/protectDBJumpTable stripping PROT_WRITE from data regions on large-page hosts (fix #3556) (#3557)
On systems with host page sizes larger than 4KB (e.g. 64KB on PPC64LE
POWER9, or 16KB/64KB on some AArch64), protectDB() and
protectDBJumpTable() call mprotect() to remove PROT_WRITE for dynarec
write-protection. This can inadvertently strip writability from data
regions sharing the same host page. Kernel syscalls like read() then
fail with EFAULT because they cannot write to the now non-writable
buffer page (unlike userspace writes, this cannot be caught via SEGV).

Add hostPageHasExternalWrite_locked() helper that scans all sub-ranges
within a host page to detect mixed code+data pages. When detected on
large-page systems (box64_pagesize > 4096), use PROT_NEVERCLEAN
(always_test mode with hash-based validation) instead of mprotect.

Also fix dynablock.c always_test handling: when always_test==1
(NEVERCLEAN), skip the protectDB() call since on mixed pages it would
either redundantly set PROT_NEVERCLEAN or counterproductively call
mprotect(). Only re-protect when always_test==2 (hotpage-based).

All changes are gated by box64_pagesize > 4096, so there is zero
impact on 4KB page systems.
2026-02-25 15:50:57 +01:00
ptitSeb ac11fd4f01 [WRAPPER] Refactored execl[ep] (should help #3542) 2026-02-25 14:38:51 +01:00
Trung Lê 373c002347 [WRAPPER] Add libomp.so.5 wrapper with native libomp.so backend (#3543)
- Uncomment all fully-defined functions in wrappedlibomp_private.h
- Add ALTNAME libgomp.so fallback
- Add gomp/libomp duplicate exception in rebuild_wrappers.py
- Fix CMakeLists.txt alphabetical ordering
- Regenerate wrapper files
2026-02-25 14:34:54 +01:00
Trung Lê 71ea8eb17e [DYNAREC] Replace hardcoded jmpnext trampoline size with per-arch JMPNEXT_SIZE macro (fix #3544) (#3551)
The jmpnext area size was hardcoded as 4*sizeof(void*) (32 bytes) in ~10
places across dynarec_native.c. This works for ARM64, LA64, and RV64
which all have PC-relative load and direct branch-through-GPR instructions,
fitting the trampoline in 2-3 instructions.

Architectures lacking these capabilities (e.g. PPC64LE which needs 5
instructions for PC-relative load + indirect branch) cannot fit within
32 bytes. Rather than scattering arch-specific size constants, introduce
a JMPNEXT_SIZE macro in dynarec_arch.h that each architecture defines.

For all three existing architectures, JMPNEXT_SIZE is defined as
4*sizeof(void*) — a pure constant-for-constant substitution with
identical compiled output and zero functional change.
2026-02-25 13:15:24 +01:00
Yang Liu de13462e0f [WRAPPER] Reworked libxml2 (#3550) 2026-02-25 11:58:39 +01:00
Trung Lê e02d60c792 [WRAPPER] Fix my_fegetround() to convert native rounding mode to x86 format (fix #3545) (#3548)
my_fegetround() returned the raw native fegetround() value without
converting it back to x86 rounding constants (0x0/0x400/0x800/0xc00)
when sync_rounding is off.

On x86 hosts, native and x86 rounding constants happen to be identical,
masking the bug. On all other architectures (AArch64, RISC-V, LoongArch,
PPC64LE), the native FE_TONEAREST/FE_DOWNWARD/FE_UPWARD/FE_TOWARDZERO
values differ, so emulated programs calling fegetround() would receive
incorrect values.

Add round_from_native() (the inverse of the existing round_to_native())
and use it to convert the native rounding mode back to x86 format before
returning to the emulated program.
2026-02-25 11:15:27 +01:00
Trung Lê 0c5a9cc2ca Fix ELF loader crash on hosts with >4KB page sizes (e.g. 64KB) (#3546)
When host page size exceeds the ELF segment alignment (e.g. 64KB pages
on ppc64le vs 4KB-aligned x86-64 segments), multiple LOAD segments can
share the same host page. The old code called mprotect() to strip
PROT_WRITE from a segment's page immediately after loading it. If a
later segment mapped to the same host page, fread() into that address
would SIGSEGV because the shared page was already made read-only.

Fix: defer mprotect calls until after ALL segments are loaded. A new
loop iterates over multiblocks and applies final protections using
getProtection() which reflects the merged protection from all segments
sharing each host page.

Verified: 33/33 ctests pass on ppc64le Fedora 43 with 64KB pages.

Fixes: https://github.com/ptitSeb/box64/issues/3516
2026-02-25 10:02:20 +01:00
Luke Short 9a39b2eb9b [BUNDLE] Add missing symlink (#3508)
for 'libmbedtls.so'. This was a copy and paste issue.
2026-02-24 17:58:13 +01:00
ptitSeb cf7070f3e0 [WRAPPER] Unregister atforks that were register when unloading a library from memory (for #3482) 2026-02-24 14:39:13 +01:00
ptitSeb 63e0b7d251 Small refactor on atlstack handling in signal handler 2026-02-24 13:16:05 +01:00
ptitSeb 13c8510ad1 [WRAPPER] Refactored TO_NATIVE macro helper in libm to be more portable 2026-02-24 13:15:36 +01:00
Yang Liu a8a9bee86b [INTERP][COSIM] Disabled GPF emissions in cosim mode (#3541) 2026-02-24 13:10:25 +01:00
Yang Liu ecce4145c9 [ELFLOADER] Added back MAP_FIXED flag (#3540) 2026-02-24 13:09:50 +01:00
Yang Liu 8f8c4abc20 Added some auto-generated leftovers (#3539) 2026-02-24 12:50:08 +01:00
Yang Liu 695a0b3744 [LA64_DYNAREC] Removed many redundant native mnemonics printer (#3538) 2026-02-24 12:27:42 +01:00
Trung Lê 16107c0bec Fix fesetenv/feupdateenv SIGSEGV on ppc64le with x86 FE_DFL_ENV sentinel (#3531) (#3533)
Add GOM wrappers for fesetenv and feupdateenv that translate x86_64
sentinel values (FE_DFL_ENV = (fenv_t*)-1, FE_NOMASK_ENV = (fenv_t*)-2)
to their native equivalents. On ppc64le, these are real pointers rather
than sentinels, so passing the x86 values directly causes a SIGSEGV.

Also fix my_fesetround to use TO_NATIVE() in the non-sync_rounding path,
which was passing raw x86 rounding constants (0x0/0x400/0x800/0xc00)
directly to native fesetround() where they are invalid on non-x86.
2026-02-23 21:31:45 +01:00
ptitSeb 896a9602a7 Added syscall 88 2026-02-23 20:04:10 +01:00
ptitSeb c7bc293292 [WRAPPER] Add/Fix SDL_Vulkan_GetVkGetInstanceProcAddr wrapped function from SDL2/SDL3 to use bridge2 2026-02-23 15:03:10 +01:00
Trung Lê 05b1086f09 [WRAPPER] Add SDL3 (libSDL3.so.0) wrapper for OldUnreal game support (#3530)
* [WRAPPER] Add SDL3 (libSDL3.so.0) wrapper for OldUnreal game support

Add wrapper for SDL3 exposing 72 functions used by OldUnreal's Unreal Gold
and UT2004 ports. SDL_GL_GetProcAddress uses GOM for GL proc address wrapping;
all other functions are plain GO passthroughs. The _private.h lists all 1,271
SDL3 exported functions (1,199 commented out) per maintainer requirements.
Uses ALTMY my3_ prefix to avoid collision with SDL1/SDL2 wrappers.
Add libSDL3.so.0 to BOX64_PREFER_EMULATED list as safety measure for Steam.
Also add iconv/libunistring2 duplicate-name exception in rebuild_wrappers.py.

Ref: https://github.com/ptitSeb/box64/issues/3529

* [WRAPPER] Add SDL3_ttf (libSDL3_ttf.so.0) wrapper for OldUnreal game support

Add wrapper for SDL3_ttf exposing all 115 exported functions as plain GO
passthroughs. No GOM functions needed as SDL3_ttf has no callback function
pointers. Uses ALTMY my3_ prefix consistent with SDL3 wrapper. Also adds
duplicate-name exceptions in rebuild_wrappers.py for sdl1ttf/sdl3ttf and
sdl2ttf/sdl3ttf pairs.

Ref: https://github.com/ptitSeb/box64/issues/3529
2026-02-23 14:56:47 +01:00
ptitSeb dff10fdfc7 [ARM64_DYNAREC] Fixed 0F 77 opcode 2026-02-22 10:52:29 +01:00
ptitSeb 22a5520e98 [INTERP] Fixed 0F 77 opcode 2026-02-22 10:52:13 +01:00
ptitSeb 857991c500 [WRAPPER] Added libunistring 5 as a synonym to unistring 2 2026-02-18 18:18:15 +01:00
ptitSeb 35e04bd69d [WRAPPER] Added some new gtkclass wrapping 2026-02-18 18:14:25 +01:00
Luke Short e5e9d5809e [CI] Add stale issues workflow (#3522) 2026-02-18 09:56:00 +01:00
Chi-Kuan Chiu 0fed9f364a [BOX32][WRAPPER] Fix XRRGetPanning shrinking wrong variable (#3521)
Lines 67-68 were operating on res (XRRScreenResources* input)
instead of ret (XRRPanning* return value), corrupting the input
struct instead of shrinking the returned panning data.
2026-02-17 19:32:23 +01:00
Chi-Kuan Chiu 49b5b131a2 [BOX32] Add MAP_FAILED check in my32_prepare_thread (#3520)
Add MAP_FAILED check after mmap64 in
my32_prepare_thread

Fix #3519
2026-02-17 18:07:12 +01:00
Chi-Kuan Chiu dc58ff0315 [BOX32] Fix missing get_attr() (#3518)
my32_pthread_attr_setaffinity_np() was passing the raw attr wrapper
pointer directly to the native pthread_attr_setaffinity_np() instead
of using get_attr(attr) to extract the native pthread_attr_t pointer.

This bug existed since the initial Box32 commit (b5105a1e). All other
pthread_attr_* functions in threads32.c correctly use get_attr(attr).
2026-02-16 19:04:05 +01:00
Chi-Kuan Chiu f35c00e278 [BOX32][WRAPPER] Fix inverted condition in del_cond() (#3517)
del_cond() had an inverted kh_end check introduced in bebae710e.
k==kh_end(mapcond) means key NOT found, but the code proceeded to
call box_free and kh_del on the invalid iterator.

Fix: change == to != to match the correct khash idiom used elsewhere.
2026-02-16 19:02:25 +01:00
ptitSeb efa4961e46 [WOWBOX64] Disable Secondary Entry Point for now, seems to create speed issues 2026-02-16 13:51:02 +01:00
ptitSeb a469a16a65 [BOX32][WRAPPER] Added partial libnvidia-ml wrapping (enough for gameoverlayui) 2026-02-16 12:19:58 +01:00
ptitSeb bf76c36327 This should fix the build 2026-02-16 11:42:56 +01:00
ptitSeb c7247cf335 [DYNAREC] Signal handler can now exit by jumping to native_next instead of doing a longjump if signal was from a DynaBlock 2026-02-16 11:03:32 +01:00
ptitSeb a25e2a3ae4 [RCFILE] Added a few more profiles 2026-02-16 11:02:18 +01:00
ptitSeb 5477586dab [WRAPPER] libnvidia-ml is not part of gtk family 2026-02-16 11:01:51 +01:00
ptitSeb a267631d92 [ARM64_DYNAREC] Remove obsolete comments 2026-02-16 09:38:01 +01:00
ptitSeb 3d775a4c5d Try to fix non-dynarec build 2026-02-15 10:51:48 +01:00
ptitSeb 80253a6f22 Reorganised signal code 2026-02-15 10:06:33 +01:00
ptitSeb 3989cfd2fc [RCFILE] Added another game profile 2026-02-15 09:24:57 +01:00
ptitSeb 62f566e8e8 Small imrpovment on memfd tracking 2026-02-15 09:24:29 +01:00
Yang Liu d8bb64b147 [ENV] Added a new env. var. BOX64_FORCE_LD_PRELOAD (#3514) 2026-02-14 12:56:39 +01:00
FrontMage 521b3784b5 [BOX32] Fix ARPL (0x63) semantics and add regression test (#3513)
* [BOX32] Fix ARPL (0x63) semantics

In 32-bit mode, opcode 0x63 is ARPL Ew, Gw, not MOVSXD.\n\nImplement correct ARPL behavior (conditional update of RPL + ZF only) in the interpreter and ARM64 dynarec, and update opcode memory access decode for 32-bit mode.

* tests32/extensions: add ARPL regression test

Add an ARPL 0x63 regression test for BOX32 builds.\n\nThe test validates conditional RPL update and ZF-only flag behavior (other status flags preserved).
2026-02-14 12:30:47 +01:00
Chi-Kuan Chiu 3eed18214e Fix use-before-set and wrong element size (#3512)
In inplace_XRRMonitorInfo_enlarge(), dst and src alias the same memory
with different struct layouts (64-bit vs 32-bit). The inner loop read
dst->noutput and dst->outputs at 64-bit struct offsets before they were
copied from src, so dst->noutput actually read src->x (wrong field) and
dst->outputs read past the 32-bit struct boundary (garbage pointer).

Additionally, the loop used from_ulong(dst->outputs[j]) which reads
8-byte unsigned long elements, but the source data contains 4-byte
ulong_t XIDs packed in the 32-bit layout.

Fix by saving src->noutput and from_ptrv(src->outputs) to local
variables before the conversion loop, and reading source elements
as ((ulong_t*)outputs)[j] to match the 32-bit element size.

This could cause crashes or memory corruption in multi-monitor setups
when enlarging XRRMonitorInfo arrays from 32-bit to 64-bit layout.
2026-02-14 12:14:06 +01:00
Chi-Kuan Chiu 8060bf2d3f Fix dst->key.which to src->key.which in SDL event (#3511)
In both convert_SDL_Event_to_32 (L113) and convert_SDL_Event_to_64 (L192),
the keyboard event's 'which' field is self-assigned from dst instead of
copied from src.
2026-02-14 09:35:05 +01:00
Luke Short ed98279202 Bundle libstdcpp5 (#3510)
* [BUNDLE] Add 'libstdc++.so.5' libraries

* [BUNDLE] Sort bundle
2026-02-13 18:30:40 +01:00
Luke Short 0f38d9d02e [BUNDLE] Better explain why it is needed (#3509) 2026-02-13 18:27:08 +01:00
Chi-Kuan Chiu 98e5753ae1 Fix epoll_create1 flag register in my_syscall handling (#3507)
In `my_syscall`, which handles the C ABI `syscall()` wrapper from libc,
the registers are mapped according to the C calling convention: the
syscall number is in `RDI` (S_EDI), and the first actual syscall argument
is in `RSI` (S_ESI).

For `epoll_create1` (syscall 291), the `#ifndef NOALIGN` fallback code
was incorrectly passing `S_EDI` to `of_convert()`. This meant the
syscall number itself (291) was being treated as the `flags` argument
and passed through bitwise conversion, resulting in invalid flags being
sent to the host's `epoll_create1`.
2026-02-13 11:31:16 +01:00
yzewei a0b962c18e x87: Fix FPREM/FPREM1 semantics in dynarec and interpreter (#3505)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-13 08:31:18 +01:00
yzewei 6e534739c2 [WRAPPER] Fix libpam conversation callback ABI (#3506)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-13 08:27:51 +01:00
Luke Short 9ea17e0192 [BUNDLE] Add 'libz.so' libraries (#3504)
Related #2389
2026-02-13 08:20:34 +01:00
Luke Short f256834627 [BUNDLE] Fix 'libstdc++.so.6' download (#3503)
Related #2389
2026-02-13 08:20:10 +01:00
Luke Short e246fcca7f [BUNDLE] Add libpng12 libraries (#3502)
Related #2389
2026-02-13 08:17:41 +01:00
Luke Short 398b4b0ccc [BUNDLE] Add libmbed libraries (#3501)
This includes 'libmbedcrypto.so', 'libmbedcrypto.so',
and 'libmbedx509.so'.

Also hard-code additional symlinks that are commonly used.

Related #2389
2026-02-13 08:17:08 +01:00
ptitSeb 1e17b17ae1 [WRAPPER][VULKAN] Added 1 more extension 2026-02-12 19:15:10 +01:00
ptitSeb 1e89645ef6 [BOX32][WRAPPER] Added 1 wrapped function to libc 2026-02-12 14:33:26 +01:00
Chi-Kuan Chiu d7f4176de3 Fix size calculation in my_strlcat (#3500)
Previously, strncat was called with the total buffer size, ignoring the
length of the existing string in 'dst'. This caused a buffer overflow
when appending to a non-empty string.

Fixed by passing 'remaining space' (total - current - 1) to strncat:
strncat(dst, src, l-s-1);   // Remaining space in buffer

Also fix strlcpy off-by-one buffer overflow:
dest[len-1]=0;   // Write NUL within buffer bounds
2026-02-12 12:18:59 +01:00
Chi-Kuan Chiu 7591fce9fc [ARM64_DYNAREC] Fix operator precedence issue (#3498)
Due to && having higher precedence than ||, the expression is parsed as:

(opcode==0x21) || ((opcode==0x23) && rex.r)

This means opcode 0x21 (MOV REG, drX) is ALWAYS treated as illegal
(regardless of rex.r), while opcode 0x23 (MOV drX, REG) is only illegal
when rex.r is set.

A parentheses is added to fix the issue, ensuring the check applies
to both opcodes:

((opcode==0x21) || (opcode==0x23)) && rex.r
2026-02-12 11:08:07 +01:00
Yang Liu 34004b84bb [WRAPPER] Wrapped 1 more symbol for libc (#3497) 2026-02-12 08:07:19 +01:00
Chi-Kuan Chiu e915221be7 [ARM64_DYNAREC] Fix BICxw flag handling (#3495)
BICxw uses FEMIT which marks ARM64 NZCV flags as modified.
However ARM64 BIC does NOT set NZCV — only BICS does.

Fix #3493
2026-02-12 12:05:27 +08:00
Kuixi Ren 41c7a5320e Fix incorrect dlinfo RTLD_DI_LINKMAP usage in initWrappedLib (#3494) 2026-02-11 22:14:43 +01:00
Chi-Kuan Chiu 6c62e16d14 Fix incorrect bit shift in fpu_do_free (#3492)
The FPU tag word uses 2 bits per register.
The previous implementation
shifted the mask by 'i' instead of 'i * 2'.
2026-02-11 18:05:19 +01:00
Yang Liu ea503d4559 [DYNAREC] Added STRONGMEM=4 (#3491)
For paper's evaluation.
2026-02-11 14:58:30 +01:00
airidosas252 a0dfa80005 Snapdragon 8 Elite Gen 5 optimization flags (#3489)
* Add support for Snapdragon 8 Elite Gen 5 with appropriate optimization flags

* Add support for Snapdragon 8 Elite Gen 5 with appropriate optimization flags

* [COMPILE.md] Add instructions for targeting Snapdragon 8 Elite Gen 5
2026-02-11 10:55:27 +01:00
yzewei 074223016c [FIX]: separate sse4_2 and sha_ni (#3490)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-11 09:47:48 +01:00
ptitSeb 6f1361dd58 Fixed allocator missmatch for atforks (might help #3482) 2026-02-11 09:39:51 +01:00
Mark Zhuang 367b80c9d9 [DEBIAN] Support RISCV (#3488) 2026-02-11 08:06:56 +01:00
ptitSeb 1a0974efbd [WRAPPER] Another small fix for the previous commit 2026-02-10 17:05:01 +01:00
ptitSeb 3ad2856ade [WRAPPER] Fixed previous commit 2026-02-10 16:51:35 +01:00
ptitSeb d3031abc40 [WRAPPER] Try to convert proc/pid/exe to real box64 exe for box64 process 2026-02-10 15:57:28 +01:00
ptitSeb 321643324a [TRACE] Improved trace for __vsnprintf_chk 2026-02-10 10:27:46 +01:00
yzewei 4f01e75a53 [LA64_DYNAREC] Close the fastnan path for MINSS/MAXSS/VMINSS/VMAXSS to correct NaN semantics. (#3486)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-10 09:11:19 +01:00
Chi-Kuan Chiu be89f30b3d Fix 32-bit shift overflow in 64-bit BTR/BTC (#3483)
The interpreter path for LOCK BTR and BTC was using a 32-bit literal
`1` for shifts. This caused UB when the shift amount was >= 32 in
64-bit mode (rex.w=1).

Replaced `1 << tmp8u` with `1LL << tmp8u` to correctly handle high bits.
2026-02-09 21:56:46 +01:00
ptitSeb 72fe79db7c [WOWBOX64] Fix build 2026-02-09 19:30:55 +01:00
ptitSeb 3dc758284e Some small improvements to CPUID 2026-02-09 18:47:54 +01:00
Chi-Kuan Chiu 6b86d11006 Fix incorrect page-alignment test preventing mprotect() (#3481)
The fallback ELF loader tests alignment with:
    paddr == (paddr & (box64_pagesize - 1))

This check will always fail, so mprotect() is skipped.
Fix it to use ~(box64_pagesize - 1).
2026-02-09 14:24:25 +01:00
Chi-Kuan Chiu 5dd12a0042 Add missing ClearCache after ARCH_UDF (#3480)
MarkDynablock() and the always_test path in dynarec_native.c write
ARCH_UDF to callret slots to trigger SIGILL for dirty-block detection,
but don't flush the I-cache afterward. On ARM64/RV64/LA64 the I-cache
and D-cache are not coherent, so the CPU keeps executing the stale
instruction and the dirty check never fires.

InvalidDynablock() already calls ClearCache after the same ARCH_UDF
write. Add the missing calls to match.
2026-02-09 14:22:31 +01:00
Chi-Kuan Chiu 0b5c1fcc2f Fix memory leak of mmaplist_t->chunks and allocator mismatch (#3479)
mmaplist_t->chunks (blocklist_t**) is a heap-allocated pointer array
grown via box_realloc in MmaplistAddBlock/MmaplistAddNBlocks. The
individual elements chunks[i] point into InternalMmap regions and are
correctly freed by InternalMunmap, but the pointer array itself was
never freed.

DelMmaplist(): add box_free(list->chunks) before box_free(list).
This function is called at runtime from RemoveMapping (env.c) on
dlclose/munmap, so the leak accumulates over the program lifetime.

fini_custommem_helper(): add box_free(head->chunks) before freeing
the struct. Remove box_free(mmaplist) which was dead code — mmaplist
was already set to NULL before the if(head) block. Also fix
allocator mismatch: the struct is allocated via box_calloc in
NewMmaplist() but was freed with raw free() instead of box_free().

Verified with valgrind on ARM64:
https://github.com/devarajabc/box64_test_cases/tree/main/003_mmaplist_chunks_leak
2026-02-09 14:20:24 +01:00
yzeweiandLeslie Zhai 1c0830e496 [LA64_DYNAREC] Fix call_c arg setup clobbering A0-mapped regs (#3476)
Signed-off-by: Zewei Yang <[email protected]>
Co-authored-by: Leslie Zhai <[email protected]>
2026-02-09 11:26:51 +01:00
ptitSeb 110566d468 Try to fix non-dynarec build 2026-02-08 15:19:51 +01:00
ptitSeb 6f3f7cffc3 Try to optimize PE Volatile Metadata reading 2026-02-08 15:05:29 +01:00
ptitSeb 790207a1e9 Protected Add/Remove mapping behind a mutex 2026-02-08 15:05:01 +01:00
ptitSeb a2002cdfb7 [BOX32] Try to improve stability of SYS_clone syscall 2026-02-08 14:28:17 +01:00
ptitSeb 322a9f17c5 [WRAPPER][VULKAN] Added hard-coded white list for x64 vulkan overlay 2026-02-07 16:12:40 +01:00
ptitSeb 8879ead6b1 [WRAPPER][BOX32] Fixed pthread_timedjoin_np wrapper signature 2026-02-07 13:59:52 +01:00
ptitSeb 7f45efeebd [BOX32] Improved syscall 141 (helps gameoverlayui) 2026-02-07 13:47:09 +01:00
Chi-Kuan Chiu 2d468b116e Fix missing return in openat syscall wrapper (#3477)
Previously, the __NR_openat (257) case lacked a return statement,
causing it to fall through to the newfstatat (262) case.
2026-02-07 13:45:38 +01:00
ptitSeb ad5b0d681c [WRAPPER] Reworked libgio wrapping with wrapperhelper 2026-02-07 09:38:09 +01:00
ptitSeb 07e82e6230 [WRAPPER] More fixes to g_dbus wrapping 2026-02-06 19:06:16 +01:00
ptitSeb 9c9e91d090 [WRAPPER] Fixed another g_dbus wrapped function 2026-02-06 18:25:06 +01:00
ptitSeb 9d9a1e3ac0 [WRAPPER] Fixed some g_dbus functions call 2026-02-06 18:13:41 +01:00
ptitSeb 2500d0541d [WRAPPER] Fixed one libgio2 signature 2026-02-06 16:54:29 +01:00
Chi-Kuan Chiu 4e330169c9 Fix undefined behavior in EXTRQ/INSERTQ (#3473)
Use 1LL instead of 1 in left shift for EXTRQ (0x78, 0x79) and
INSERTQ (0x78, 0x79) mask generation. The shift amount (tmp8s+1)
ranges 1-64 since tmp8s is masked with 0x3f (0-63), causing
undefined behavior when shifting the 32-bit int literal 1 by
more than 31.
2026-02-06 16:10:16 +01:00
ptitSeb 045ccb80b7 [TRACE] Fixed some regression with detailled trace introduced wit bridge2 2026-02-06 16:08:24 +01:00
ptitSeb 6613ccefd8 [TRACE] Even better trace for __lxstat 2026-02-06 15:48:20 +01:00
ptitSeb 59fa3067d2 [TRACE] Better trace for __lxstat 2026-02-06 15:39:29 +01:00
yzewei ba1b73da0f x87: Manually raise FE_OVERFLOW/FE_UNDERFLOW flags in LD2D conversion (#3472)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-06 08:07:16 +01:00
Chi-Kuan Chiu 1aed7e0281 Fix missing braces in x64run0f.c opcode 0x00 handler (#3471)
The else branch at line 89 was missing braces, causing the second
switch statement to always execute regardless of rex.is32bits.

In 32-bit mode, after the first switch handled instructions like
VERR/VERW (cases 4/5), the second switch would also run and hit
default, returning 0.
2026-02-05 20:59:14 +01:00
ptitSeb b3b7f3a6f1 [WRAPPER] Fully wrapped libpcre2-16 2026-02-05 18:25:03 +01:00
ptitSeb 48fb691aed [WRAPPER] Improved libpng16 wrapping but prefer emulated first 2026-02-05 17:42:36 +01:00
ptitSeb a56f17d907 [WRAPPER] Added all fully wrapped libharfbuzz-subset.so.0 2026-02-05 17:27:10 +01:00
ptitSeb 69437ad173 [X64LIB] Update libstdc++.so.6 and libgcc_s.so.1 2026-02-05 17:10:27 +01:00
ptitSeb 99497205b5 [WRAPPER] Added mostly fully wrapped libpcre2-16.so.0 2026-02-05 16:57:43 +01:00
ptitSeb 90d1c51a35 [WRAPPER] Prefer emulated first for libicu 2026-02-05 16:38:10 +01:00
ptitSeb 6de77e7cd0 Fixed some issue with box64 initialization happening too late in certain cases 2026-02-05 14:40:27 +01:00
Yang Liu abbbd05411 [ELF] Clean up native symbol resolving stuff (#3469) 2026-02-05 12:27:19 +01:00
ptitSeb 70bb817dfa [TRACE] Better trace for popen 2026-02-05 11:45:17 +01:00
ptitSeb faf7c69341 [WRAPPER] Added alternative function for newer xml2 library 2026-02-05 11:33:40 +01:00
ptitSeb c1b5c992dc [WRAPPER] Added libxml alternative name for loading 2026-02-05 11:27:32 +01:00
Yang Liu 41d56aa052 [WRAPPER] Fixed __cxa_atexit where dso_handle can be NULL (for #3467) (#3468) 2026-02-05 10:14:34 +01:00
Yang Liu 81553485d1 [STEAM] Registered VERSION_CODENAME env. var. for better compatibility (#3465) 2026-02-05 10:11:12 +01:00
yzewei 8f9603ba2a [WRAPPER] fix libc argp_parse bridging; add selinux symbols (#3462)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-05 09:29:42 +01:00
Yang Liu 97a405d690 [LA64_DYNAREC] Improved 0F AE opcodes (#3466) 2026-02-05 08:21:04 +01:00
ptitSeb 9d9b20c672 [DYNAREC] Fix build 2026-02-04 13:43:06 +01:00
ptitSeb b07e2ea9d7 [DYNAREC] Added Secondary Entry Point to dynablock at CALLRET return 2026-02-04 11:55:35 +01:00
Yang Liu 96435ff12b [SYSINFO] Fixed reentrancy handling (#3463) 2026-02-04 11:52:32 +01:00
Leslie ZhaiandYang Liu 7a8f1f523b [ELF] Fix ABS_ADDR for LA64 ABI 1.0 (#3461)
Co-authored-by: Yang Liu <[email protected]>
2026-02-04 10:02:15 +01:00
Chi-Kuan Chiu 88272c2ee7 [WRAPPER] Fixed atfork handler (#3460)
Increment atfork_sz after registering an entry in my___register_atfork
and my32___register_atfork, matching the working pattern in
wrappedlibpthread.c. Without the increment, each registration
overwrites slot 0 and all prior handlers are lost.

Fixed parent/child atfork loops from --i to ++i in x64emu_fork().
Starting at i=0 with --i causes an infinite loop with out-of-bounds
access when atfork_sz > 0. Changed to ++i to iterate forward, matching
the POSIX requirement that parent and child handlers execute in
registration order (FIFO), consistent with the existing prepare loop
which correctly iterates in reverse (LIFO).

Fixes #3455
2026-02-04 09:30:51 +01:00
Yang Liu 9d9a777dde [CORE][LA64] Fixed non-lasx resolving order (#3458) 2026-02-04 08:49:34 +01:00
Yang Liu 5ffe1068fb [WRAPPER] Wrapped more symbols for libgl (#3449) 2026-02-04 08:09:52 +01:00
yzewei da9588860a [WRAPPER] Fixed the xmlCreatePushParserCtxt function (#3456)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-04 08:08:21 +01:00
Mark Zhuang 544e71ab3c [SYSINFO] Support model name (#3454)
RISC-V use model name
2026-02-03 18:34:53 +01:00
ptitSeb c52c9540e3 [WRAPPER][VULKAN] Added one more extension 2026-02-03 13:26:24 +01:00
Yang Liu 05df55f89e [ELF] Fixed mangohud integration regression for OpenGL introduced by the Vulkan Overlays support (#3451) 2026-02-03 12:19:31 +01:00
yzewei b9a4d6f814 [WRAPPER] Add missing libc/crypto/ssl/glib/gomp/sqlite symbols (#3450)
Signed-off-by: Zewei Yang <[email protected]>
2026-02-03 12:14:25 +01:00
ptitSeb bc583e3828 [WRAPPER] Better handling of Alt addresses blocks 2026-02-03 11:55:50 +01:00
ptitSeb 2e724f461d [DYNAREC] Improved handling of abort on pass0 2026-02-03 08:36:02 +01:00
Yang Liu 9e260d563f [LA64_DYNAREC] Added and fixed fastround=0 path for some opcodes (#3448) 2026-02-03 07:39:24 +01:00
Yang Liu b321083929 [DYNAREC] Aligned fpu_reset_cache implementation (#3446) 2026-02-02 11:15:16 +01:00
Yang Liu 25ce305092 [LA64_DYNAREC] Added 66 D9 /6 FNSTENV opcode (#3445) 2026-02-02 11:14:13 +01:00
ptitSeb 5ec806058f [ARM64_DYNAREC] Small change on CALLRET macro for later use 2026-02-02 10:58:59 +01:00
ptitSeb 2fdfc4aaca [RCFILE] Added 2 game profiles 2026-02-02 10:56:29 +01:00
Yang Liu 808e22f183 [ENV] Added a new option for debugging, and made it default (#3444) 2026-02-02 08:53:05 +01:00
ptitSeb c389bdff4c [WRAPPER] Added one more gtkclass 2026-02-01 14:02:59 +01:00
ptitSeb 3bbb84502e [INTEGRATION] Added /opt/box64/lib[32/64] as system folder for easier system integration 2026-02-01 09:55:31 +01:00
ptitSeb c45c6ddd86 Added fake support for (monochrome and color) text video memory 2026-01-31 16:20:38 +01:00
Yang Liu 2f9eb362c0 [LA64_DYNAREC] Fixed 6B IMUL load immediate ([RV64_DYNAREC] too) (#3443) 2026-01-31 08:56:22 +01:00
Yang Liu f9c32107c1 [LA64_DYNAREC] Workaround for emit_sbb8 lbt path (#3442) 2026-01-31 08:55:54 +01:00
ptitSeb f2443996b4 [STATICBUILD] Another try to fix the build 2026-01-30 17:11:09 +01:00
ptitSeb ec4275ab42 [STATICBUILD] Try to fix the build 2026-01-30 16:58:46 +01:00
ptitSeb cfff06e6f4 [WRAPPER][VULKAN] Added support for x64 Vulkan Overlays 2026-01-30 16:15:20 +01:00
ptitSeb fc809368d0 [RCFILE] Added 1 game profile 2026-01-30 15:59:14 +01:00
ptitSeb 131aebd02b [WRAPPER] Improved GOM symbols to use Bridge2 instead of symple ones 2026-01-30 13:33:36 +01:00
ptitSeb d415c28347 [ARM64_DYNAREC] Added some overflow testing on div opcodes behind DIV0 tests 2026-01-30 11:34:52 +01:00
Yang Liu e85f190a50 [LA64_DYNAREC] Fixed and refined 66F30F opcodes (#3441) 2026-01-30 09:00:03 +01:00
Yang Liu 8f8aa39d39 [LA64_DYNAREC] Fixed AVX VMOVSS/D opcodes (#3440) 2026-01-30 08:14:36 +01:00
Yang Liu 242a4ca810 [LA64_DYNAREC] Fixed AVX VCMPSS/D opcodes (#3439) 2026-01-30 08:13:52 +01:00
Yang Liu a62d5dd435 [LA64_DYNAREC] Fixed 66 0F 15 UNPCKHPD opcode (#3438) 2026-01-30 08:13:10 +01:00
Yang Liu 6b381068ef [CORE] Fixed zydis initialization regression introduced in #3434 (#3437) 2026-01-30 08:06:17 +01:00
Yang Liu 652da4fbcf [DOCS] A Small polish to README (#3436)
* [DOCS] A Small polish to README

* an
2026-01-29 16:25:46 +01:00
Yang Liu 452f564ad3 [SYSINFO] Fixed initialization errors in sysinfo cont'd (#3435) 2026-01-29 16:25:28 +01:00
Yang Liu bae577f915 [SYSINFO] Fixed initialization errors in sysinfo (#3434) 2026-01-29 15:34:58 +01:00
ptitSeb 6c9e068aef [WRAPPER] Added some more symbols to ssl3, crypto3 and expat 2026-01-29 14:21:20 +01:00
ptitSeb 8240cf8cfd [WRAPPER] Added more symbols to zstd 2026-01-29 14:05:08 +01:00
ptitSeb 1b3abd7ac4 [WRAPPER] Added another symbol to libssl.so.3 2026-01-29 13:43:57 +01:00
ptitSeb b587834c04 [WRAPPER] Added 1 more symbol to libssl.so.3 2026-01-29 13:39:29 +01:00
ptitSeb 548fd15338 [WRAPPER] Added 2 more symbols 2026-01-29 13:28:50 +01:00
Yang Liu 4fd547d7b1 [RCFILE] Revealed a secret (#3433) 2026-01-29 13:23:32 +01:00
Yang Liu 191fbf3b1a [RCFILE] Updated ZenlessZoneZero profile (#3432) 2026-01-29 08:10:37 +01:00
Yang Liu daa6f7c483 [SYSINFO] Fixed a missing initialization (#3431) 2026-01-29 08:10:08 +01:00
Yang Liu a758d17e7f [ELFLOADER] Small log prefix fix (#3430) 2026-01-29 08:09:42 +01:00
Yang Liu ab41c03dd2 [LA64_DYNAREC] Fixed a typo in emit_rcr8c and some cosmetic changes too (#3429) 2026-01-29 08:09:13 +01:00
ptitSeb ca16ef8177 [WRAPPER] Added wrapped libgpgme.so.11 2026-01-28 11:31:44 +01:00
ptitSeb a7c1541abb [WRAPPER] Removed a warning 2026-01-28 11:04:39 +01:00
Yang LiuandptitSeb 935f6bcb28 [BOX32] Fixed wrong offset for many x11 32-bit structures (#3428)
Co-authored-by: ptitSeb <[email protected]>
2026-01-28 11:01:29 +01:00
yzewei 3310b7c718 [WRAPPER] Add lzma/nettle symbols and musl_lib_path changes (#3425)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-28 10:06:27 +01:00
Yang Liu a87b9fa9ee [LA64_DYNAREC] Fixed regression introduced in b798e0da (#3427) 2026-01-28 08:10:12 +01:00
Yang Liu 62ab624a7a [DYNAREC] Small optimization for PUSH imm opcodes (#3426) 2026-01-28 08:09:15 +01:00
ptitSeb 627b857cb4 [WRAPPER] Added fully wrapped lbavahi-client.so.3 (for #3374) 2026-01-27 16:47:05 +01:00
ptitSeb 1e5c085b88 [WRAPPER] Another build fix 2026-01-27 16:42:26 +01:00
Yang Liu 990632d5b8 [WRAPPER] Wrapped more symbols for pam and libm (#3424) 2026-01-27 15:14:28 +01:00
ptitSeb 364436405b [WRAPPER] Fix build 2026-01-27 15:12:37 +01:00
ptitSeb b9f17a819f [WRAPPER] Added fully wrapped libavahi-common.so.3 (for #3374) 2026-01-27 14:44:47 +01:00
yzewei c9ccaaed1b [WRAPPER] add libc/libselinux/libgmp missing symbols (#3422)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-27 09:26:35 +01:00
Yang Liu 72807b6b95 [WRAPPER] Wrapped libc argp_parse (#3423)
* [WRAPPER] Wrapped libc argp_parse

* workaround termux

* and of course android
2026-01-27 08:05:59 +01:00
ptitSeb 05b37ab897 [INTERP] Added F2 0F B7 opcode (for #3353) 2026-01-26 19:14:58 +01:00
Yang Liu ded7dab17b [SYSCALL] Added 2 more syscalls (#3421) 2026-01-26 18:41:29 +01:00
Yang Liu 715a239f1c [WRAPPER] Wrapped more symbols for libnettle8 and lzma (#3420) 2026-01-26 18:14:57 +01:00
Yang Liu 41bc4c5971 [WRAPPER] Submitted some leftovers (#3419) 2026-01-26 15:58:47 +01:00
Yang Liu 22f31e73bf Updated README (#3418)
* Updated README

* Remove youtube channels

* compat list
2026-01-26 15:57:23 +01:00
Yang Liu 47e2b974fc [LA64_DYNAREC] Removed more fastnan path on certain opcodes ([RV64_DYNAREC] too) (#3417) 2026-01-26 15:25:31 +01:00
Yang Liu 2319b5a0eb [WRAPPER] Wrapped a few more symbols for libc (#3413)
* [WRAPPER] Wrapped a few more symbols for libc

* static build

* fix
2026-01-26 14:46:28 +01:00
ptitSeb 426a4f38a7 [WRAPPER][VULKAN] Added support for some new Vulkan 1.4 extensions (for #3416) 2026-01-26 14:34:29 +01:00
Yang Liu 6e2d08c4b7 [LA64_DYNAREC] Removed fastnan path on certain opcodes ([RV64_DYNAREC] too) (#3414) 2026-01-26 11:50:51 +01:00
yzewei a288925967 [WRAPPER] fenv exception mask transform (#3412)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-26 11:48:08 +01:00
Yang Liu f06933aad7 [SYSINFO] Refactored sysinfo module (#3410)
* [SYSINFO] Refactored sysinfo module

* fix wowbox64 build

* fix

* fixfixfix

* review

* this is SO annoying

* ????

* woops

* build, please

* fix

* review
2026-01-26 10:34:20 +01:00
yzewei 5c7b90a52a [WRAPPER] torch running miss symbol (#3411)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-26 10:01:47 +01:00
ptitSeb 4bcc910d15 [ARM64_DYNAREC] Fixed AVX.66.0F3A 20 opcode 2026-01-25 15:04:53 +01:00
ptitSeb 2e3ccd9fff [INTERP] Fixed and small improvment in IRET opcode 2026-01-25 11:21:35 +01:00
ptitSeb 68de1d4fc9 Small typo fix on signal handler 2026-01-25 11:21:03 +01:00
Yang Liu be35201c65 [BOX32] Removed redundant logging prefix (#3407) 2026-01-25 08:59:55 +01:00
Yang Liu 0eb0f9decb [LA64_DYNAREC] Fixed AVX VPMASKMOVD/Q opcode (#3406) 2026-01-24 17:58:50 +01:00
Yang Liu 470203c39a [LA64_DYNAREC] Refactored the handling of deferred flags (#3405) 2026-01-24 17:04:20 +01:00
ptitSeb a2d5a172bf [WRAPPER] added full wrapping for libvdpau 2026-01-24 15:22:53 +01:00
ptitSeb 7d30bd40ff Improved libavutils and libavformat wrapping 2026-01-24 10:27:37 +01:00
ptitSeb c5f81e8a05 [DEBUG] Added disabled debug code to get potentially missing wrapped symbol for complex libs like X11 and friends 2026-01-24 10:27:08 +01:00
yzewei 361d71baee [WRAPPER] wrape ncurses curterm via set_curterm; add selinux setfilecon (#3400)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-23 12:02:21 +01:00
Yang Liu 9810a7e219 [LA64_DYNAREC] Refined more 16bit shift opcodes (#3404) 2026-01-23 09:11:33 +01:00
Yang Liu 694d08ddec [LA64_DYNAREC] Refined more 16-bit rotate opcodes (#3403) 2026-01-23 08:06:49 +01:00
ptitSeb 17662a6605 [RCFILE] Refined a game profile 2026-01-22 16:50:49 +01:00
ptitSeb 6139c1ae81 [BOX32][WRAPPER] Do notuse global gtk variables on box32, gtk is not wrapped 2026-01-22 16:29:18 +01:00
Yang Liu 25f83ca9ec [WRAPPER] Wrapped 1 more dbus symbol SDL3 uses (#3401) 2026-01-22 16:09:29 +01:00
ptitSeb a6c6b488a1 [BOX32][WRAPPER] Some fixes to wrapped dbus_message_get_args/dbus_message_get_args_valist 2026-01-22 15:08:14 +01:00
ptitSeb 3ec5de03c7 [INTERP] Fixed F0 66 BA opcodes 2026-01-21 15:35:48 +01:00
ptitSeb 90bcfff19b [INTERP] Added 66 63/E8/EB opcodes 2026-01-21 15:35:12 +01:00
ptitSeb c3f293a937 [ARM64_DYNAREC] Fixed 64/65 D7 opcode and added 66 E9/EB opcodes 2026-01-21 15:34:31 +01:00
ptitSeb 9b645b902e [INTERP] Fixed 64/65 D7 opcode 2026-01-21 15:32:58 +01:00
ptitSeb 8fdce4365e [ARM64_DYNAREC] Fixed arch metadata decoding when ninst is a start of a block 2026-01-21 15:32:25 +01:00
ptitSeb 982fd87284 [ARM64_DYNAREC] Fixed 66 D3 /2 when CPUTYPE is 1 2026-01-21 12:08:26 +01:00
ptitSeb a9ef6fa588 [ARM64_DYNAREC] Added 66 14 and 66 E8 opcodes 2026-01-21 11:26:44 +01:00
ptitSeb b7ed3fabde [INTERP] Fixed 32bit 66 E8 opcode 2026-01-21 11:26:08 +01:00
ptitSeb 377e2b27a4 [ARM64_DYNAREC] More work on Illegal Opcode and GPF 2026-01-21 11:12:50 +01:00
ptitSeb c99d5054c6 [INTERP] More work on Illegal Opcodes and GPF 2026-01-21 11:12:00 +01:00
Yang Liu b5407c4aab [RCFILE] Made file priority outweighs BOX64_ARCH (#3398) 2026-01-21 08:07:21 +01:00
ptitSeb aca2450749 [BOX32][WRAPPER] Added missing (un)wrpping of XIPropertyEvent event 2026-01-20 09:57:17 +01:00
ptitSeb 9f501924ee [ARM64_DYNAREC] Fixed some regression introduced with eb743a1307 2026-01-19 15:36:07 +01:00
ptitSeb dc7b9216ed [WRAPPER] Removed some useless warning on gtk class wrappers 2026-01-19 15:35:09 +01:00
Yang Liu a2a1f1cc40 [DYNAREC] Fixed a CRC32 decoding issue ([INTERP] too) (#3395) 2026-01-19 11:53:10 +01:00
ptitSeb 8744f024c8 [WRAPPER] Added one more wyland client listener (for #3390) 2026-01-18 17:33:01 +01:00
ptitSeb af508f9d5c [INTERP] Added F2 0F BC opcode (for #3353) 2026-01-18 10:13:10 +01:00
ptitSeb ca30eb91de [WRAPPER] Remove a redundend space in cpuinfo generated flags 2026-01-18 10:12:47 +01:00
Yang Liu aa7b392034 [LA64_DYNAREC] Fixed 32-bit VGATHER opcodes (#3393) 2026-01-18 09:07:40 +01:00
Yang Liu 99e2fc52b5 [ARM64_DYNAREC] Fixed 32-bit VGATHER opcodes ([INTERP] too) (#3392) 2026-01-18 09:06:56 +01:00
Yang Liu df223496b2 [ARM64_DYNAREC] Fixed a typo in iret_to_next() (#3391) 2026-01-17 18:19:57 +01:00
Gao c5c52c2852 [RV64_DYNAREC] Fix delta_ip range checks ([LA64_DYNAREC] too) (#3386)
* Fix delta_ip range checks in dynarec_rv64_helper.h

(1)“-0xfffffff” is seen as “unsigned int”。Here what is need shoule be INT_MIN。“-0x80000000L”  is equal to INT_MIN and "L" is important that seen as long。 
the exmaple code(I have tested in RV64(Vision Star2)and arm64(Pi5).
```c
#include <stdio.h>
int main(){
  ssize_t a = 0;
  if(a < -0xffffffff)
     printf("-0xfffffff is seen as positive value \n");
  return 0;
}
```
(2)"0xffffffff". Here what is need shoule be INT_MAX that should be "0x7fffffff"。
(3) the same situation is existed in “la64 GETIP_”.

* Fix delta_ip range checks in dynarec_la64_helper.h

for la64.

* Fix delta_ip range check in dynarec_rv64_helper.h

the new code for rv64.

* Fix condition for negative _delta_ip range check

* Fix delta_ip range check for negative values
2026-01-17 17:34:26 +01:00
Yang Liu f753453d9c [RCFILE] Removed an invalid profile (#3388)
The executable is called YandereSimulator.exe, and it works out of the box64.
2026-01-17 14:12:00 +01:00
Yang Liu 8df09b2609 Some more minor changes to test runner (#3387) 2026-01-17 14:11:17 +01:00
ptitSeb 8621d5aa75 [ARM64_DYNAREC] Improved (L/M/S)FENCE opcodes 2026-01-17 13:45:30 +01:00
yzewei a0d01deb1b WRAPPER] Add missing libc/selinux/ssl symbols (#3385)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-17 16:31:39 +08:00
Yang Liu 0414fadaf0 [INTERP] Fixed subnormal handling of f16 to f32 (#3382)
* [INTERP] Fixed subnormal handling of f16 to f32

* Fixed wow64 build
2026-01-16 09:39:14 +01:00
Yang Liu cef139306b [INTERP] Added DE /2 /3 opcodes (#3381) 2026-01-16 09:31:50 +01:00
Yang Liu 2eb2fd9cd5 [LA64_DYNAREC] Fixed more issues for non-lbt path (#3380) 2026-01-15 13:05:31 +01:00
Yang Liu b798e0da20 [LA64_DYNAREC] Minor optimizations for non-lbt path (#3379) 2026-01-15 10:33:40 +01:00
Yang Liu ed038dfdfb [LA64_DYNAREC] Fixed some typos for 16-bit LOCK INC/DEC opcodes (#3378) 2026-01-15 10:20:07 +01:00
Yang Liu 470e05f9e2 [LA64_DYNAREC] Fixed CALL FAR opcode ([ARM64_DYNAREC] too) (#3377) 2026-01-15 09:10:21 +01:00
yzewei 72edb453bf [WRAPPER] Provide weak arc4random in libc (#3376)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-15 08:20:59 +01:00
Yang Liu 341b20c3e4 [LA64_DYNAREC] Small fix to iret_to_next (#3375) 2026-01-14 10:35:53 +01:00
yzewei 32e513c533 [WRAPPER] Try dlopen(libbsd) before dlopen(NULL) (#3373)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-14 10:19:40 +01:00
Yang Liu 5929e402bf [LA64_DYNAREC] Enabled CALLRET optim for FAR opcodes (#3368)
* [LA64_DYNAREC] Enabled CALLRET optim for FAR opcodes

* fixfixfixfix
2026-01-14 09:36:24 +01:00
Yang Liu 746dc47485 [LA64_DYNAREC] Small optim to a few sign-exntension opcodes (#3372) 2026-01-14 09:06:21 +01:00
Yang Liu 6e31a7e266 [WRAPPER] Wrapped more symbols for libresolv (#3365) 2026-01-14 08:56:12 +01:00
Yang Liu 78d59dcee8 A Small change to test runner (#3366) 2026-01-14 08:51:19 +01:00
Yang Liu fdeec17ff0 [ELFLOADER] Added support for memfd created library (#3364) 2026-01-14 08:50:46 +01:00
ptitSeb 8d53ad5408 [ARM64_DYNAREC] Small optim on geted16 helper 2026-01-13 17:31:36 +01:00
ptitSeb b4cea8a0d1 [DYNAREC] Fixed a regression introduced with 6c5415886b (for #3357) 2026-01-13 17:28:30 +01:00
Yang Liu 299c74752e [LA64_DYNAREC] Small fixes to AVX VPSRAW/VPSRAD opcodes (#3363) 2026-01-13 10:27:30 +01:00
Yang Liu cc9555d9e5 [LA64_DYNAREC] Fixed a special-case of SHLD/SHRD opcodes ([RV64_DYNAREC] too) (#3362) 2026-01-13 10:26:59 +01:00
ptitSeb a13e2c1e3c [ARM64_DYNAREC] Fixed geted16 that might missing truncature in certain cases 2026-01-13 09:20:46 +01:00
Yang Liu 2643191ad1 [DYNAREC] Fixed RDFSBASE and WRFSBASE opcodes (#3361) 2026-01-13 09:17:03 +01:00
Yang Liu 5a744a3366 [LA64_DYNAREC] Fixed geted16 ([RV64_DYNAREC] too) (#3360) 2026-01-13 08:11:22 +01:00
Yang Liu c9d52c8f2a [LA64_DYNAREC] Handled more invalid opcodes (#3359) 2026-01-13 08:06:31 +01:00
Yang Liu 40cd903b07 [LA64_DYNAREC] Refined more opcodes (#3358) 2026-01-13 08:05:22 +01:00
ptitSeb 61b1253e80 [INTERP] Added support for F3 0F BA opcode (for #3353) 2026-01-12 09:52:59 +01:00
Yang Liu b48e0da81b [LA64_DYNAREC] Fixed DIV Ew as well (#3355) 2026-01-12 08:28:28 +01:00
yzeweiandYang Liu 9c1aadc722 [LA64_DYNAREC] Fix IDIV Ew with sign-extended DX:AX (#3354)
* [LA64_DYNAREC] Fix IDIV Ew with sign-extended DX:AX

Signed-off-by: Zewei Yang <[email protected]>

* [LA64_DYNAREC] Fix IDIV Ew: Simplify DX:AX construction with BSTRINS_W

Co-authored-by: Yang Liu <[email protected]>

---------

Signed-off-by: Zewei Yang <[email protected]>
Co-authored-by: Yang Liu <[email protected]>
2026-01-12 08:17:39 +01:00
Yang Liu 1dd15db8d8 [LA64_DYNAREC] Added non-LASX path for some SSE opcodes (#3356) 2026-01-12 08:13:45 +01:00
Yang Liu 3717266c3a [LA64_DYNAREC] Removed LASX from hard dependencies (#3350) 2026-01-10 19:03:02 +01:00
Yang Liu 637139cce1 [LA64_DYNAREC] Fixed 66 0F 73 /6 PSLLQ opcode (#3349) 2026-01-10 19:00:25 +01:00
Yang Liu 6d8c3c6afc [LA64_DYNAREC] Fixed F0 20 LOCK AND opcode (#3348) 2026-01-10 14:39:44 +01:00
ptitSeb 8f08aa99b1 [WRAPPER] Added wrapped libcupsimages and some private cups functions (for #2867) 2026-01-10 13:22:15 +01:00
Yang Liu 5533ccac38 [WRAPPER] More work on gtk wrapping (#3347) 2026-01-10 13:14:58 +01:00
ptitSeb fbbfc7ba0e [STATICBUILD] Yet another fix attempt 2026-01-10 12:26:19 +01:00
ptitSeb 7a7924495c [STATICBUILD] Another fix attempt 2026-01-10 12:12:29 +01:00
ptitSeb 68097c2721 [STATICBUILD] This should fix the build 2026-01-10 12:00:12 +01:00
ptitSeb 239825c521 [WRAPPER] Added 1 more symbol to libc 2026-01-10 11:34:53 +01:00
ptitSeb 31b491da79 [WRAPPER] More work on gtk-2 wrapping 2026-01-10 11:21:40 +01:00
ptitSeb 71f5207f6d [STATICBUILD] Fix static build 2026-01-09 16:54:40 +01:00
ptitSeb 0d1c027e9f [WRAPPER] More work on gtk-2 wrapping 2026-01-09 15:47:25 +01:00
yzewei b6c1735c07 [LA64_DYNAREC] Fix IDIV Ew dividend construction (#3346)
Signed-off-by: Zewei Yang <[email protected]>
2026-01-09 11:44:38 +01:00
ptitSeb 6c5415886b [ARM64_DYNAREC] Enabled CALLRET optim for FAR opcodes (helps for 32bit games on WOW64) 2026-01-09 09:44:26 +01:00
Yang Liu f1b2dc603b [LA64_DYNAREC] Enabled more patterns for nativeflags (#3345) 2026-01-09 08:18:52 +01:00
Yang Liu b3a43af4d0 [WRAPPER] Wrapped more gtk classes and functions (#3344) 2026-01-09 08:13:36 +01:00
ptitSeb 57e87b4ee9 [DYNAREC] Shorten isInHotPage when BOX64_DYNAREC_NOHOTPAGE is used 2026-01-08 16:26:45 +01:00
ptitSeb 6ed69e9575 [DYNAREC] Centralised the Dynarec stopped because of missing opcode message 2026-01-08 14:27:28 +01:00
Yang Liu b5c07726a7 [LA64_DYNAREC] Refined RCR32 opcode (#3343) 2026-01-08 09:25:33 +01:00
yzewei 055a58d878 [WRAPPER] Make libresolv symbols runtime-resolved (res_*/dn_expand) (#3342)
Signed-off-by: yzewei <[email protected]>
2026-01-08 09:25:22 +01:00
Gao fd4a9eaacf Change signal handling function to use signal_to_x64 (#3307)
my_sigactionhandler parament:sig is belong to host.
2026-01-08 09:09:25 +01:00
Yang Liu 65c57ba8a6 [LA64_DYNAREC] Enabled 1 more pattern for nativeflags (#3341) 2026-01-08 08:16:42 +01:00
Yang Liu 07cfee3c07 [RCFILE] Apply safeflags=2 for libjvm (#3340) 2026-01-08 08:14:12 +01:00
Yang Liu 6e0f1a3911 [LA64_DYNAREC] More work on safeflags, removed some obeslete code ([ARM_DYNAREC] too) (#3339) 2026-01-08 08:13:11 +01:00
ptitSeb 1df42cdb49 [LA64_DYNAREC] More fixes to adc 8/16 emiter 2026-01-07 12:34:51 +01:00
ptitSeb e588a32197 [LA64_DYNAREC] Another fix for adc8 emitter on lbt path 2026-01-07 12:01:44 +01:00
ptitSeb 95eedcf0dd [LA64_DYNAREC] Added some comment to make operation more clear 2026-01-07 11:57:24 +01:00
ptitSeb 61d4a40130 [LA646_DYNAREC] Fixed 8/16bits adc emiter PENDING handling on lbt path 2026-01-07 11:52:22 +01:00
ptitSeb af1b2c974f [LA646_DYNAREC] Fixed 8bits add emiter PENDING handling on lbt path 2026-01-07 09:50:42 +01:00
Yang Liu a7f81bcd4d [WRAPPER][BOX32] Wrapped 1 more symbol for sdl2 (#3336)
This allows the 32bit Linux superhexagon to run...
2026-01-07 09:12:07 +01:00
Yang Liu 5fc00acbbc [LA64_DYNAREC] Refined more RCL opcodes (#3335) 2026-01-07 09:08:21 +01:00
Yang Liu 283710f603 [LA64_DYNAREC] Refined more RCL/RCR opcodes (#3333) 2026-01-07 09:07:37 +01:00
ptitSeb b9d36a205b [LA64_DYNAREC] Fixed CB opcode 2026-01-06 10:21:36 +01:00
ptitSeb 7263e07f07 [RV64_DYNAREC] Improved TF handling in sync with ARM64_DYNAREC 2026-01-06 09:41:31 +01:00
ptitSeb 01f7f3f59e [LA64_DYNAREC] Improved TF handling in sync with ARM64_DYNAREC 2026-01-06 09:38:36 +01:00
ptitSeb 71520e80e7 [DYNAREC] Forgot this file in previous commit 2026-01-06 09:37:13 +01:00
ptitSeb da145dfe37 [ARM64_DYNAREC] More fine tunning to TF handling 2026-01-06 09:36:21 +01:00
Luke Short c31bf3329c Bundle fixes (#3332)
* [BUNDLE] Fix CSV format

by removing a duplicate entry on the wrong line.

* [BUNDLE] Make script executable
2026-01-05 18:52:23 +01:00
ptitSeb 51daf45373 [ARM64_DYNAREC] Fixed RET/RETN FAR opcodes 2026-01-05 18:49:42 +01:00
ptitSeb 887de0cb64 [INTERP] Fixced/Improved handling of JMP/CALL/RET/RETN FAR opcodes 2026-01-05 18:41:43 +01:00
ptitSeb fc0c258934 [INTERP] Fixed JMP FAR imm/CALL FAR imm opcodes 2026-01-05 16:10:58 +01:00
ptitSeb 152a381a98 [DYNAREC] Avoid generating a block if it will be run with interpreter anyway because of TF 2026-01-05 16:10:00 +01:00
ptitSeb 240ee83c3d Improved handling of TF flags (again) 2026-01-05 15:44:07 +01:00
matthewabbott 9d0f8d1d64 [ELF] Fix SIGSEGV when calling dlinfo RTLD_DI_LINKMAP for emulated code (#3331)
* [ELF] Fix dlinfo RTLD_DI_LINKMAP for emulated code

* [ELF] Tidy dynamic section patching

* [ELF] Fix dynamic section patch protections
2026-01-05 11:20:18 +01:00
ptitSeb 24076b60d7 [ARM64_DYNAREC] Fixed the ClearCache arm64 code path 2026-01-05 09:47:25 +01:00
Yang Liu e12c3769db [WRAPPER] Wrapped more symbols for gio2 and glib2 (#3330) 2026-01-05 08:54:24 +01:00
ptitSeb 5199e5c66d Start of a new dev. cycle 2026-01-05 08:53:27 +01:00
ptitSeb dae0917c47 Bumped version to v0.4.0 2026-01-03 16:50:53 +01:00
Yang Liu 37a189814c [BOX32][WRAPPER] Fixed XPeekIfEvent wrapping (#3329) 2026-01-03 16:45:04 +01:00
ptitSeb baa962f586 [RCFILE] Better profile for steam, more stable 2026-01-02 18:03:16 +01:00
Yang Liu df37f14729 [RCFILE] Added a profile for Total War: Three Kingdoms (#3328) 2026-01-02 17:54:07 +01:00
ptitSeb 48d5ce7b34 [STEAM] Don't let check requirement to run as it might want to use bwrap while it's not compatible with box64 (for #3321) 2026-01-02 15:04:22 +01:00
Yang Liu 4ed3c02834 [LA64_DYNAREC] Refined more rotate opcodes flags computation (#3327) 2026-01-02 14:43:37 +01:00
ptitSeb bebae710ec [BOX32][WRAPPER] Various box32 fixes 2026-01-02 14:07:23 +01:00
ptitSeb 0254fbdd83 [RCFILE][BOX32] Added secret settings to avoid setting Persona to 32bits on box32 runs 2026-01-01 18:53:10 +01:00
Yang Liu 758a1a9ea5 [LA64_DYNAREC] Small fix to geted and micro-optimization to LEA opcode (#3326) 2026-01-01 18:51:30 +01:00
Yang Liu 7f6e5fca90 Fixed non-dynarec build on dynarec available platforms (#3325) 2025-12-31 12:13:29 +01:00
Yang Liu 866cfe300d [LA64_DYNAREC] Refined RCL8/16/32/64 /imm opcodes (#3324) 2025-12-31 12:12:29 +01:00
Yang Liu ac5a149297 [CMAKE] Fixed an uninstall script warning (#3323) 2025-12-31 11:45:55 +01:00
ptitSeb 4759e2d20d [RV64_DYNAREC] Fixed a regression introduced with 2b070086d1 2025-12-30 18:56:46 +01:00
ptitSeb e0b4a8a48a [ARM64_DYNAREC] Fixed flags hack on CALL/RET/Illegal instruction to not destroy df info if status is unknown (for #3319) 2025-12-30 09:43:30 +01:00
Max Parry 977dcc6c4c [STEAM] Minor refactoring (#3320)
* [STEAM] Minor refactoring

- don't remove the deb files as they are already removed with the `rm -rf ./tmp/`
- don't create ~/steam as it is already bound to be created with `mkdir -p ~/steam/tmp`
- remove superfluous characters in path

* [STEAM] Use Curl over WGet, as it's more common on most systems
2025-12-30 08:05:29 +01:00
ptitSeb a89704c8a7 [RCFILE] Added 1 more game profile 2025-12-29 21:03:46 +01:00
Yang Liu 09bdbcb049 [LA64_DYNAREC] Micro-optimization for emit_test32c (#3318) 2025-12-29 16:43:48 +01:00
ptitSeb c23de7dc9c [RCFILE] Added some more game profiles 2025-12-29 15:59:54 +01:00
Yang Liu 816f807a2d [LA64_DYNAREC] Micro-optimization for emit_shr32c (#3317) 2025-12-29 11:09:04 +01:00
Yang Liu 7e15f0e3d5 [LA64_DYNAREC] Refined rcr8/16 /imm opcodes (#3316) 2025-12-29 08:10:46 +01:00
Yang Liu 1e73fe64e1 [RCFILE] Enable callret for gb6 (#3315) 2025-12-29 08:09:51 +01:00
Yang Liu 32fbdd28ac [LA64_DYNAREC] Added some missing SM=2 store hints (#3314) 2025-12-29 08:09:11 +01:00
ptitSeb 050e0f9f43 [ARM64_DYNAREC] Fixed some DIV IDIV flags issues 2025-12-28 10:05:56 +01:00
ptitSeb 7420c5a088 [INTERP] 0F 09 is a GPF not a Segfault 2025-12-28 09:20:04 +01:00
ptitSeb 9a5a8fedc5 [ARM64_DYNAREC] 0F 09 is a GPF, not a SIGILL 2025-12-27 21:37:54 +01:00
ptitSeb 9d6fcab85f [DYNAREC] Fixed an issue when a jump is internal but endup as a jump out where X_PEND would not be added as needed 2025-12-27 20:54:16 +01:00
Yang Liu 1654964362 [RCFILE] Added a profile for StarCraft II (#3313) 2025-12-27 17:25:32 +01:00
Yang Liu 3b5f3b26f1 [RCFILE] A small improvement for Battle.net client (#3312) 2025-12-27 16:13:13 +01:00
Yang Liu 8e4a17f851 [RCFILE] Removed some obsolete env. var. (#3311)
These are specific to Linux Steam, but they're not needed anymore.
2025-12-27 16:12:41 +01:00
Yang Liu cc117019ff [LA64_DYNAREC] Some refactor and cleanups on rotate opcodes (#3310) 2025-12-27 09:44:19 +01:00
ptitSeb 490350acac [WRAPPER] Various fixes for libGL wrapping ([BOX32] Too) 2025-12-26 18:40:33 +01:00
ptitSeb 90706e7f74 [BOX32][WRAPPER] Improved support for libGLX_nvidia.so and some small other libGL wrapping fixes 2025-12-26 16:38:57 +01:00
ptitSeb 3ac959275f [WRAPPER][LIBGL] more work on libGL wrapping 2025-12-26 16:08:52 +01:00
rajdakin d6651c3615 [BOX64] Fixed all true-positive GCC default warnings (#3309) 2025-12-26 15:44:43 +01:00
ptitSeb 80dafff3c5 [BOX32][WRAPPER] Refactored libGL wrapping 2025-12-26 14:46:33 +01:00
ptitSeb 3eb8e16958 [WRAPPING] Remove some obsolete code 2025-12-26 14:36:45 +01:00
ptitSeb 6a1861572d [WRAPPER] Reworked libGLX_nvidia wrapping 2025-12-26 11:32:57 +01:00
ptitSeb 78a2109344 [WRAPPING][LIBGL] Reworked libGL wrapping with new bridge2 2025-12-26 11:16:57 +01:00
Yang Liu 894285b1db [WRAPPER][BOX32] Minor fix and improvement to XGetICValues (#3306) 2025-12-26 08:27:56 +01:00
ptitSeb 663ae1abda [WRAPPER] Added 1 more symbol to libdbus 2025-12-25 17:03:56 +01:00
Yang Liu fddba78b84 Make sure managed memory blocks are always aligned to 16 bytes (#3305) 2025-12-25 11:15:46 +01:00
ptitSeb 0cec2e8bf8 [VULKAN][WRAPPER] refactored vulkan wrapper to use bridge2 2025-12-24 17:04:18 +01:00
ptitSeb 2557acc3b2 [WRAPPER] Fixed add bridge2 function 2025-12-24 14:27:03 +01:00
ptitSeb a8bb97f7e2 [WRAPPER] Improved bridge with a secondary function (inplace of the name) 2025-12-24 10:04:25 +01:00
ptitSeb 5adfb41a37 [VULKAN][WRAPPER] Removed some GOM in vulkan wrapper 2025-12-24 09:20:21 +01:00
Neltharion dd1420eeba More wrapped symbols for SDL2 (#3297)
* Added new wrappers for SDL2

* fix
2025-12-23 23:09:26 +01:00
Yang Liu b9a9317a73 [LA64_DYNAREC] Small improvments to ALSL printer (#3303) 2025-12-23 15:51:41 +01:00
Yang Liu ac816e90aa [RCFILE][LA64] Added Risk of Rain 2 profile (#3300) 2025-12-23 15:47:36 +01:00
ptitSeb d7f71d7a2f [WRAPPER] Added some more gstreamer wrapped symbols 2025-12-23 08:54:40 +01:00
Yang Liu d15a203bb1 [LA64_DYNAREC] Optimized RCR opcodes (#3299) 2025-12-23 08:54:03 +01:00
Yang Liu 3b9edf0070 [CORE] Refined tracing file header info (#3298)
There are some header info missing in tracing file when using rcfile
2025-12-23 08:11:28 +01:00
Yang Liu 0ae576964c [WRAPPER] Wrapped more gtk3 and related symbols (#3295) 2025-12-22 18:20:57 +01:00
Yang Liu 7086d0e5a2 [WRAPPER] Wrapped 1 more glib2 symbol (#3296)
used by Linux Steam
2025-12-22 18:18:47 +01:00
ptitSeb e912aff5c6 [WRAPPER] Make BOX64_EMULATED_LIBS to also affect gstreamer hacked loading of plugins 2025-12-21 18:29:16 +01:00
ptitSeb f93af92f5d [WRAPPER] Added some more gstreamer wrapped functions 2025-12-21 17:55:02 +01:00
ptitSeb e02c5c325d [WRAPPER][GTK] Fix overloaded signal with offset handling 2025-12-21 17:54:19 +01:00
ptitSeb 06950103a2 [RCFILE] Added a new game profile 2025-12-21 17:53:17 +01:00
ptitSeb 8f736dcdee [TRACE] Show wrapper name if signal happens in a bridge 2025-12-21 17:52:30 +01:00
ptitSeb 9aa5ba1b90 [TRACE] Small simplification on getAddrFunctionName helper function 2025-12-21 17:51:42 +01:00
ptitSeb 30f891aaa6 [ARM64_DYNAREC][TRACE] Print if Native call use simpleWrapper 2025-12-21 17:50:53 +01:00
Yang Liu 57466cf0f0 [LA64_DYNAREC] Fixed a regression in emit_sub32c (#3294) 2025-12-21 13:27:39 +01:00
ptitSeb 2babe3aa89 [WRAPPER] One fix for libunistring wrapping 2025-12-20 17:32:09 +01:00
ptitSeb 0fa0e02844 [WRAPPER] Reworked wrapping of libhogweed.so.6 with wrapperhelper 2025-12-20 16:15:23 +01:00
ptitSeb a983cbe67b [WRAPPER] Reworked libidn2 wrapping with wrapperhelper 2025-12-20 15:00:28 +01:00
ptitSeb f5d468718d [WRAPPER] Reworked libgmp wrapping with wrapperhelper 2025-12-20 14:58:58 +01:00
ptitSeb 62a053bc48 [TRACE] Show dirty when a dynablock is dirty on a signal 2025-12-20 14:51:15 +01:00
ptitSeb 451c7901b4 [WRAPPER] More work on libunistring.so.2 wrapping 2025-12-20 14:48:13 +01:00
ptitSeb 066e7d3aea [WRAPER] Reworked libunistring2 wrapping with wrapperhelper 2025-12-20 13:53:01 +01:00
luoqiaoling 1de324a500 [BOX64] Fixed my_box64signalhandler, convert native signal to x64 (#3292) 2025-12-20 10:25:19 +01:00
ptitSeb 2db33422c6 [RCFILE] Added 1 more game profile 2025-12-20 10:22:58 +01:00
ptitSeb f2660cd3f0 Improved log when PltResolver don't find a symbol 2025-12-19 18:57:29 +01:00
Yang Liu b34b7aca42 [LA64_DYNAREC] Fixed some minor typos of SQRTSD and XCHG opcodes (#3291) 2025-12-19 17:53:11 +01:00
ptitSeb cdf3890a33 [LA64_DYNAREC] Revert 7586bd47cb as it breaks Steam as-is 2025-12-19 17:20:17 +01:00
ptitSeb 14b660e3bb [BOX32]Improve auxval handling 2025-12-19 15:16:27 +01:00
ptitSeb 87d74ebf02 Improve auxval handling (fixing newer AppImage not running) 2025-12-19 15:16:12 +01:00
ptitSeb 3a6653dabf Improved SYS_clone syscal, and improved [TRACE] of some other syscalls 2025-12-19 15:15:33 +01:00
ptitSeb 052db75bd8 [TRACE] Improved trace of execve call/syscall 2025-12-19 15:15:02 +01:00
ptitSeb 25b83a80f0 [README] Put build badge from github workflows 2025-12-19 15:12:53 +01:00
Yang Liu f4ee2cc701 [WRAPPER] Wrapped more symbols for libfreetype (#3290) 2025-12-19 11:36:03 +01:00
Yang Liu 0158102974 [ENV] Fixed race condition of init/uninit of rolling logs (#3289)
I had issues using this feature to trace wps office
2025-12-19 10:30:13 +01:00
Yang Liu 7586bd47cb [LA64_DYNAREC] Refacfored the handling of deferred flags (#3288) 2025-12-19 08:14:58 +01:00
Yang Liu 7f20c20031 [LA64_DYNAREC] Fixed various typos ([RV64_DYNAREC] too) (#3287) 2025-12-17 18:16:33 +01:00
luoqiaoling 2143a88d99 [DYNACHCHE] correct dynacache typo (#3286) 2025-12-17 18:16:21 +01:00
ptitSeb 67c2df0b58 [WRAPPER] Fixed some wrapping issue with libnettle 2025-12-17 16:35:41 +01:00
ptitSeb 24ba5357de [TRACE] Print stack top when 40 53 is traced on 64bits 2025-12-17 16:35:41 +01:00
Yang Liu 57f1b60fb0 [LA64_DYNAREC] Fixed a potential issue of the ADDxREGy macro ([RV64_DYNAREC] too) (#3284) 2025-12-16 17:17:07 +01:00
ptitSeb 5b5b6aca0d [RCFILE] Added more games profile 2025-12-16 14:39:25 +01:00
luoqiaoling b7c386289d [BOX64][INTERP] Fixed idiv boundary tests (#3283)
- related test case: tests/test33
- add test33 to CMakeLists.txt for ctest
2025-12-16 12:11:21 +01:00
Yang Liu b0b2f3c611 [RV64_DYNAREC] Refactored opcode prefix decoding (#3282)
* [RV64_DYNAREC] Refactored opcode prefix decoding

* more
2025-12-16 10:44:33 +01:00
ptitSeb b9af6270d4 [RCFILE] Added a new game profile 2025-12-15 18:47:25 +01:00
Yang Liu 59b35d49e2 [RCFILE] Added a new option BOX64_PROFILE (#3280)
* [RCFILE] Added a new option BOX64_PROFILE

* Warn on unknown
2025-12-15 15:50:40 +01:00
phorcys c68dc6fd7b [LA64_DYNAREC] Add 0F FE /{0,1} LOCK {INC,DEC} Eb. (#3279)
For game FrostPunk 2.
2025-12-15 14:24:39 +01:00
Yang Liu c49ec4417f [LA64_DYNAREC] Ported the BARRIER_FLOAT refactor from Arm64 (#3278) 2025-12-15 12:02:03 +01:00
ptitSeb 8e3fc1e8d8 [BOX32][WRAPPER] Fixed longjmp with val==0 (for #3274) 2025-12-15 10:52:37 +01:00
ptitSeb 5ed336f8ce [WRAPPER] Fixed longjmp with val==0 (for #3274) 2025-12-15 10:52:17 +01:00
ptitSeb ecba89ea31 Improved cpuid handling 2025-12-15 10:51:15 +01:00
Yang Liu 9bf06e9929 [SYSCALL] Added 1 more syscall epoll_pwait2 (#3276) 2025-12-15 09:23:52 +01:00
Yang Liu 4e07b1765d [LA64_DYNAREC] Some improvements to safeflags=2, more to expect (#3273) 2025-12-14 21:39:53 +01:00
Yang Liu 391973d4a0 [LA64_DYNAREC] Small improvements to strongmem emulation (#3272) 2025-12-14 19:47:28 +01:00
Yang Liu 136b683e81 [CI] Added nocosim label to longjumpInSignals test (#3271) 2025-12-14 17:33:15 +01:00
ptitSeb f82c3ffe74 [TESTS] Improved test21 2025-12-14 14:13:13 +01:00
ptitSeb 76e41e7b1a [TRACE][INTERP] Trace when calling/jumping to NULL 2025-12-14 11:42:04 +01:00
ptitSeb bb78e2e63b [INTERP] Fixed regression with 66 F0 prefixed opcodes, introduced with prefix refactor 2025-12-14 10:56:50 +01:00
ptitSeb 1b8da86465 [INTERP] Removed obsolete macros 2025-12-14 10:56:02 +01:00
Yang Liu b53ba64cef [WRAPPER] Reworked libxkbcommon wrapping, added a few new symbols too (#3270)
Used by wine-wayland
2025-12-14 08:38:03 +01:00
Yang Liu 3970c2d50d [WRAPPER] Added 2 more listeners to waylandclient for wine-wayland and HDR support (#3269) 2025-12-14 08:36:08 +01:00
Chi-Kuan Chiu 9b868c9511 [Box32] Check allocation end address (#3268)
The box32_malloc/calloc/realloc/memalign functions were only checking if
the returned pointer was below 4GB (ptr < 0x100000000), but not whether
the entire allocation fits within 32-bit address space.

This caused a segfault when malloc returned an address like 0xFFFEA010
for a 0x20010 byte allocation - the start address passes the check, but
ptr + size = 0x1000A020 exceeds 4GB. When 32-bit code accesses elements
near the end of the array, the address calculation wraps around due to
32-bit arithmetic truncation, resulting in NULL pointer access.

Example crash scenario:
    - malloc(0x20010) returns 0xFFFEA010
    - Old check: 0xFFFEA010 < 0x100000000 ✓ (accepted)
    - Access bitmap[0x57FA]: 0xFFFEA018 + 0x15FE8 = 0x100000000
    - 32-bit truncation: 0x100000000 → 0x00000000
    - SEGFAULT at NULL

Fix:
    - mallochook.c: Add FITS_IN_32BIT(ptr, size) macro that checks
      (ptr + size) <= 0x100000000, apply to all box32_* functions
    - custommem.c: Fix three occurrences of the same bug in
      internal_customMalloc and customMemAligned32 functions

This bug was exposed when running 32-bit x86 NBench compiled with
-m32 -mno-sse flags under box32 on RV64, where memory layout caused
large allocations to land near the top of 32-bit address space.

close #2710
2025-12-13 20:33:17 +01:00
Yang Liu acad5acbef [CPUID] Refined the CPU branding display (#3267) 2025-12-13 19:24:00 +01:00
ptitSeb e6961d845e Small improvment on cpuid handling 2025-12-13 15:19:27 +01:00
ptitSeb cb2deb5cef [ARM64_DYNAREC] Optimized 66 D3 /3 opcode 2025-12-13 15:18:32 +01:00
ptitSeb 96f786e4a9 [ARM64_DYNAREC] Optimized 66 D3 /2 opcode 2025-12-13 15:15:24 +01:00
ptitSeb 9b3e548437 [ARM64_DYNAREC] Optimized D3 /2 opcode 2025-12-13 15:07:06 +01:00
ptitSeb 5a85a5eec4 [ARM64_DYNAREC] optimised D3 /3 opcode 2025-12-13 14:47:18 +01:00
ptitSeb b481e9d4fe [ARM64_DYNAREC][TRACE] Small improvement on cpuid trace 2025-12-13 12:16:51 +01:00
ptitSeb dc138a244f [ARM64_DYNAREC] Small optim for ENTER opcode 2025-12-13 12:02:33 +01:00
Yang Liu 3810383851 [CORE] Removed BOX64_ARG0 env var after use, fixed Heroic with Proton on LoongArch (#3266) 2025-12-13 09:01:47 +01:00
Yang Liu 466e5eb84b [LA64_DYNAREC] Fixed 1 more regression intoduced by the prefix refactor (#3265) 2025-12-12 23:52:32 +01:00
Yang Liu 55b6071e63 [DYNAREC] Fixed uninitlized lock flag for 16-bit opcodes (#3264)
This is a regresion introduced by the prefix refactor, so RV64 DynaRec should be good.
2025-12-12 20:46:53 +01:00
ptitSeb ac08b010d5 [INTERP] Fixed a regression introduced with 33c9d63498 2025-12-12 18:14:53 +01:00
ptitSeb 5253a7f483 [ARM64_DYNAREC] Added some Illegal Intructions special cases 2025-12-12 16:59:29 +01:00
ptitSeb 64855cd5e9 [INTERP] Added some Illegal Intructions special cases 2025-12-12 16:59:11 +01:00
ptitSeb 0727555759 [ARM64_DYNAREC] Small improvment on handling edge case for CMPXCHG8B/16B 2025-12-12 16:54:59 +01:00
Yang Liu 92e5e5618d [LA64_DYNAREC] Refined more flags computation for LBT path (#3263) 2025-12-12 16:45:25 +01:00
ptitSeb 33c9d63498 [INTERP] Small improvment on handling edge case for CMPXCHG8B/16B 2025-12-12 16:03:13 +01:00
ptitSeb 1369ac4b0c [ARM64_DYNAREC] Better handling of some rex.w 66 0F prefixed opcodes 2025-12-12 15:42:24 +01:00
Yang Liu 529fc7fe11 [LA64_DYNAREC] Fixed 1 more UD behaviour ([RV64_DYNAREC] too) (#3262)
Ported from a1f9147868
2025-12-12 15:40:06 +01:00
Yang Liu 1dd8775ff3 [WRAPPER] Added 1 more extension to libGL (#3261)
Seems to be used by Wine 11.
2025-12-12 15:20:41 +01:00
ptitSeb a1f9147868 [ARM64_DYNAREC] More work on UD 2025-12-12 10:24:41 +01:00
ptitSeb 1df9adcd14 [INTERP] More work on UD 2025-12-12 10:24:14 +01:00
Yang Liu 52e2514279 [INTERP] Refined CLFLUSH family opcodes (#3260) 2025-12-11 17:53:17 +01:00
ptitSeb 05b561f739 [ARM64_DYNAREC] Small optim on rcl8c helper 2025-12-11 16:22:08 +01:00
ptitSeb a573268b1b [TRACE] Added some commented trace on cpuid 2025-12-11 16:21:37 +01:00
ptitSeb fe186b32e7 [INTERP][COSIM] Removed obsolete code 2025-12-11 16:20:33 +01:00
ptitSeb f79a31e535 [INTERP] Fixed 8bits and 16bits rcl when shift is 0 2025-12-11 15:41:07 +01:00
ptitSeb eb743a1307 [ARM64_DYNAREC] Refacfored the handling of deffered flags 2025-12-11 13:59:20 +01:00
Yang Liu da76e7e214 [LA64_DYNAREC] Refined CLFLUSH family opcodes ([RV64_DYNAREC] too) (#3259)
* [LA64_DYNAREC] Refined CLFLUSH family opcodes ([RV64_DYNAREC] too)

* more tweaks
2025-12-11 13:32:13 +01:00
Yang Liu 34e9bf1caf [WRAPPER] Wrapped 1 more vulkan extension (#3258) 2025-12-11 11:43:26 +01:00
Yang Liu 498019ca75 [ARM64_DYNAREC] Refined CLFLUSH family opcodes (#3257)
CLFLUSH/CLFLUSHOPT/CLWB are not used to clear icache, so we don't need to clear corresponding dynablocks, but we do need to flush dcache.
2025-12-11 09:41:37 +01:00
ptitSeb cd8890f760 [ARM64_DYNAREC] Reverted deferred dfnone as it still introduced regressions 2025-12-11 09:38:29 +01:00
Chi-Kuan Chiu aa45e2583d [DOCS] Add BOX64_DYNAREC_PURGE_AGE documentation (#3253)
Update BOX64_DYNAREC_PURGE description to explain the tick-based
cache purge mechanism and add the new BOX64_DYNAREC_PURGE_AGE
environment variable documentation.
2025-12-10 21:34:29 +01:00
ptitSeb 1c28994871 [DYNAREC] Added notion of block creation speed to avoid purge when a burst of block creation accurs (to be fine tuned) 2025-12-10 15:25:33 +01:00
ptitSeb 2a68951574 [WRAPPER] Added more cuda wrapped functions 2025-12-10 12:01:00 +01:00
Yang Liu fa03a3915b [LA64_DYNAREC] Refined prefetch opcodes (#3255) 2025-12-10 09:12:06 +01:00
Yang Liu 1cc40d8401 [LA64_DYNAREC] Added more push/pop opcodes (#3254) 2025-12-10 08:09:20 +01:00
ptitSeb 1c282c2c26 [DYNAREC] Adjusted default age for block purge to avoid too much slowdown on steamwebhelper 2025-12-09 22:28:49 +01:00
Yang Liu 2c5bdd76fb [LA64_DYNAREC] Fixed a regression in IMUL opcodes flags computation (#3252) 2025-12-09 20:15:32 +01:00
Yang Liu 789c4e4671 [INTERP] Small fix to F0 0F B1 CMPXCHG opcode (#3251) 2025-12-09 19:32:58 +01:00
phorcys df7d74f418 [LA64_DYNAREC] Opt REP STOSB for withcher3. (#3250) 2025-12-09 18:24:56 +01:00
Chi-Kuan ChiuandptitSeb 98e50e28a6 [DYNAREC_PURGE] Tick-Based Cache Purge System (#3249)
Replace the hot-counter (LFU) purge heuristic with a timestamp-based
mechanism.

The previous logic incremented a hot counter on each execution and
implicitly pinned blocks after a small number of hits, preventing
reclamation even when blocks were no longer used.

The new logic tracks the last execution time using a global tick
counter. A dynarec block becomes purgeable when its age exceeds
BOX64_DYNAREC_PURGE_AGE.

== What is "tick" ==

A global counter that increments every time AllocDynarecMap() is called.
When a block is executed, it copies the current global tick to its own tick field.
This records "when" the block was last used.

== What is "age" ==

age = my_context->tick - dynablock->tick

The difference between the current global tick and the block's tick.
It represents how many allocations have happened since the block was last executed.
A higher age means the block hasn't been used for a longer time.
This shifts eviction from frequency-based to recency-based behavior.

== Configuration ==

 - BOX64_DYNAREC_PURGE=1       Enable purging (default: 0)
 - BOX64_DYNAREC_PURGE_AGE=N   Ticks before purgeable (default: 1024)

TODO: Implement auto-adjusting threshold algorithm.
      Currently users must manually tune BOX64_DYNAREC_PURGE_AGE based on
      their workload. An adaptive algorithm that adjusts based on memory
      pressure and cache hit rate would be better.

Co-authored-by: ptitSeb <[email protected]>
2025-12-09 18:21:22 +01:00
Yang Liu 06296c77c7 [RCFILE] Refined BOX64_STEAM_VULKAN to support more cases (#3248) 2025-12-09 12:42:27 +01:00
Yang Liu db191e2e72 [LA64_DYNAREC] Refactored opcode prefix decoding (#3247) 2025-12-09 11:52:05 +01:00
Yang Liu ed21c85ade [RV64_DYNAREC] Better handling for invalid lock opcodes (#3246) 2025-12-08 18:18:08 +01:00
ptitSeb c59bc5d54a [WRAPPER] Added support for wrapped libnvidia-ml.so 2025-12-08 16:06:18 +01:00
ptitSeb ce88a2be94 [WRAPPER] Added some more Warpped OpenCL functions 2025-12-08 15:18:09 +01:00
ptitSeb 67b1569c11 [ARM64_DYNAREC] Fixed an AVX opcode name 2025-12-08 14:28:09 +01:00
Chi-Kuan Chiu dfb284aa4e Add lookup cache for customMalloc (#3244)
Allocation functions (map64_customMalloc, map128_customMalloc,
internal_customMalloc) always scanned blocks from i=0 to find free space.
Since consecutive allocations often succeed in the same block, we can
skip the linear scan by trying the last successful block first.

Add type-specific caches so each allocator remembers its last successful
block and tries it before falling back to linear scan. The shared
last_block_index is still updated for findBlock compatibility.

  Cost: 4 additional static integers. Miss path unchanged.

Test case: box64 + wine + steam.exe on rpi5

  Results:
  - map64_customMalloc:    99.9% hit rate (25,920 hits / 26 misses)
  - map128_customMalloc:   99.9% hit rate (3,484 hits / 3 misses)
  - internal_customMalloc: 73.9% hit rate (2,574 hits / 907 misses)
  - findBlock:             72.8% hit rate (14,410 hits / 5,374 misses)

At cache hit time, the allocator managed 76-812 blocks (p25-p99),
confirming that skipping linear scan provides measurable benefit.

Block count percentiles at hit time (p25/p50/p75/p99): 76 / 419 / 588 / 812
2025-12-08 11:30:58 +01:00
ptitSeb 056999e8fd Fixed exception handling on wine 10.19+ 2025-12-01 16:41:55 +01:00
ptitSeb 5540c85ae4 [BOX32][WRAPPER] Initialized the array to avoid a valgrind warning 2025-12-01 15:15:01 +01:00
ptitSeb 3e30aa0002 [ARM64_DYNAREC] Refactor opcode prefix decoding, like on interpreter, removing lots of duplicated code and making opcode more generic 2025-12-01 11:17:42 +01:00
ptitSeb 13f9a9f83e [BOX32][WRAPPER] Fixed some issue with wrapped readv 2025-12-01 11:11:31 +01:00
ptitSeb 2d2c6a2aa1 [ARM64_DYNAREC] Fixed some more regression introduced with c64a431e35 2025-11-30 17:01:44 +01:00
Yang Liu 039c6f557e [ARM_DYNAREC] Fixed a regression introduced in commit c64a431e (#3241) 2025-11-29 21:14:41 +01:00
ptitSeb c4e09fddb9 [BOX32][WRAPPER] More fixes to some inplace enlarge functions for X11 2025-11-29 18:22:14 +01:00
Yang Liu 5a0448a1d5 [BOX32] Fixed some inplace shrink/enlarge functions for libxrandr (#3239) 2025-11-29 18:17:12 +01:00
ptitSeb 185de7eaf7 [COSIM] Fixed cosim when using FSGSBASE 2025-11-29 12:33:06 +01:00
Yang Liu 90babc5c45 [WRAPPER] Silent garbage dlerrors when nogtk is used (#3236) 2025-11-29 08:33:10 +01:00
ptitSeb 555b5065a0 [INTERP] Added F0 prefix to the generic prefix handling 2025-11-28 16:16:26 +01:00
ptitSeb c4e821db36 [ARM64_DYNAREC] Fixed more regression introduce with previous previous commit 2025-11-28 15:44:30 +01:00
ptitSeb 8642d48aee [ARM64_DYNAREC] Fixed regression introduce with previous commit 2025-11-28 15:27:20 +01:00
ptitSeb c64a431e35 [ARM64_DYNAREC] Made defered dfnone effect 2025-11-28 12:34:01 +01:00
ptitSeb b0ef9838a3 Fixed a buffer size (for #3235) 2025-11-28 09:31:01 +01:00
Yang Liu ffd32899ef [BOX32] Wrapped more symbols for libc (#3234) 2025-11-28 08:06:11 +01:00
ptitSeb 3059fe2d09 [INTERP] Fake handling of RF ([DYNAREC] too) 2025-11-27 15:50:57 +01:00
ptitSeb be1c926b67 [WRAPPER] Small improvment to some ptrace calls 2025-11-27 15:47:27 +01:00
Yang Liu 76fc77d6f8 [LA64_DYNAREC] Added more opcodes (#3233)
* [LA64_DYNAREC] Added more opcodes

* some fixes
2025-11-27 15:10:46 +01:00
Yang Liu 1eb55587b6 [INTERP][DYNAREC] Added F3 0F 4X CMOVcc opcodes (#3232) 2025-11-27 14:03:15 +01:00
Max Parry 25f0bd14b8 Reimplement my32_mkstemps64 (#3231)
* Reimplement my32_mkstemps64

* Signal header to use exported function
2025-11-27 11:26:05 +01:00
Yang Liu 36b4fbae85 [LA64_DYNAREC] Enable nativeflags optimization for more patterns (#3230) 2025-11-27 10:39:24 +01:00
Yang Liu f6b6066509 [LA64_DYNAREC] Enabled native flags optimization for SETcc opcodes (#3229) 2025-11-27 08:08:31 +01:00
Yang Liu d5d4cc0951 [LA64_DYNAREC] Fixed an incomplete macro (#3226) 2025-11-26 13:53:44 +01:00
Yang Liu 57b9f6ca3c [CORE] Slightly better help message (#3225) 2025-11-26 13:16:13 +01:00
Yang Liu a1945549ad [LA64_DYNAREC] Added more opcodes (#3224) 2025-11-26 10:41:43 +01:00
Yang Liu e8e25b3f01 [LA64_DYNAREC] Added more opcodes (#3223)
* [LA64_DYNAREC] Added more opcodes

* fix
2025-11-26 10:06:02 +01:00
ptitSeb 8491e0d4db [WRAPPER] Added 1 more Vulkan extension (for #3222) 2025-11-26 10:05:11 +01:00
Yang Liu b66c932fbc [WRAPPER][LA64] Added basic simple wrapper support (#3221) 2025-11-26 08:08:59 +01:00
ptitSeb 589d042c34 [TRACE] Reworked a bit how trace are written to files/console 2025-11-25 17:42:06 +01:00
Yang Liu 0add723460 [LA64_DYNAREC] Added more opcodes (#3219) 2025-11-25 17:03:23 +01:00
ptitSeb 024bdffb02 [WRAPPER] Refactored dlsym / dlvsym, removing duplicated code 2025-11-25 12:53:04 +01:00
Yang Liu 12580e593d [LA64_DYNAREC] Added an unaligned path to 16bit XCHG opcode (#3218) 2025-11-24 19:49:55 +01:00
Yang Liu c5ce123d4d [WRAPPER] Re-wrapped libtasn1 (#3217) 2025-11-24 19:16:21 +01:00
Yang Liu c272dd95ec [RCFILE] Added discord profile (#3216) 2025-11-24 17:07:51 +01:00
Yang Liu be8a3bdfdd [SYSCALL] Added io_uring syscalls (#3215) 2025-11-24 17:03:45 +01:00
Yang Liu 8a40b11574 [LA64_DYNAREC] Added a few more 66 opcodes (#3214) 2025-11-24 15:59:50 +01:00
ptitSeb 2fd3238187 [RCFILE] Adjusted one game profile 2025-11-24 13:44:35 +01:00
ptitSeb 1371a34e0d [INTERP] Fixed some rare occurence of 66 8F opcodes 2025-11-24 13:30:10 +01:00
ptitSeb ee345ae46d [COSIM] Introduced BOX64_DYNAREC_TEST_NODUP to filter duplicate IP address in cosim output, and reenabled LOCK prefixed opcodes 2025-11-24 12:29:13 +01:00
ptitSeb cd645f7d7d [STEAM] Removed use of system ldconfig and create needed symlinks instead 2025-11-24 10:56:28 +01:00
phorcys a814aeeb37 [LA64_DYNAREC] Some small fixes. (#3212) 2025-11-24 08:26:12 +01:00
Yang Liu e8611d2f38 [RV64_DYNAREC] Fixed some scratch register conflictions, [LA64_DYNAREC] too (#3213) 2025-11-24 08:24:53 +01:00
Yang Liu c75c8eb4fa [STEAM] Enabled x86_64 python workaround only for Arm (#3211) 2025-11-23 20:00:02 +01:00
ptitSeb 3ec07fa5df [STEAM] Added another potential sources of python3 binary 2025-11-23 17:47:20 +01:00
ptitSeb 6d7b649bcd [BOX32][WRAPPER] Added 1 more 32bit wrapped function to libfreetype 2025-11-23 16:17:20 +01:00
ptitSeb d4f72f8bf5 [STEAM] Added a workaround to use x86_64 python for the proton script, needed for latest experimental version 2025-11-23 16:05:21 +01:00
ptitSeb 7befdcf0a9 [RCFILE] Introduce BOX64_PYTHON3 to have a x86_64 version of python3 running python scripts 2025-11-23 16:02:23 +01:00
ptitSeb 22197b3540 [BOX32][WRAPPER] Fixed 32bits wrapped glob/glob64 functions 2025-11-23 13:21:31 +01:00
Yang Liu 8aa23c5629 [RCFILE] Disabled libcef detection by default (#3209) 2025-11-23 12:11:21 +01:00
Yang Liu 07ef276274 [WRAPPER] Fixed a regression in myStackAlignGVariantNew (#3208)
* [WRAPPER] Fixed a regression in myStackAlignGVariantNew

* push unsaved file
2025-11-23 12:02:21 +01:00
ptitSeb 7988fca992 [BOX32][WRAPPER] Improved wrapeed glob(64) handling 2025-11-23 11:19:28 +01:00
Yang Liu 31db9ecfbc Small optimization to steam_vulkan hack (#3207)
* Small optimization to steam_vulkan hack

* try to fix old gcc build
2025-11-23 10:59:25 +01:00
ptitSeb 3ad3873d80 [BOX32][WRAPPER] Improved wrapping of XChangeProperty 2025-11-23 10:59:08 +01:00
ptitSeb 5b27657166 [BOX32][WRAPPER] Added libtcmalloc to wrapped libs 2025-11-23 10:58:20 +01:00
Yang Liu 984c9d4f2f Reverted some commits (#3206)
* Revert "[BOX32] Added some sanity check on 32bit thread cancel unwind buffers"

This reverts commit fa874dbc0b.

* Revert "[TRACE] Reverted thread local Dump CPU buffer, as it seems to break some tests"

This reverts commit e4a8d7f5c4.
2025-11-23 08:40:36 +01:00
ptitSeb e4a8d7f5c4 [TRACE] Reverted thread local Dump CPU buffer, as it seems to break some tests 2025-11-22 23:17:11 +01:00
ptitSeb 9d0d825f9f [TRACE] Made the static Dump CPU buffer thread local 2025-11-22 17:39:44 +01:00
ptitSeb fa874dbc0b [BOX32] Added some sanity check on 32bit thread cancel unwind buffers 2025-11-22 17:39:04 +01:00
ptitSeb d328d6390b [TRACE] Added thread to the Emit Signal trace 2025-11-22 17:38:16 +01:00
docgalaxyblock 0c405897d3 Fix spelling of 'Snapdragon' in CMakeLists.txt (#3205) 2025-11-22 15:55:00 +01:00
Yang Liu 187b9af1b6 [CMAKE] Fixed a typo (#3204) 2025-11-22 09:45:50 +01:00
Yang Liu cae4502731 [RCFILE] Added a new option BOX64_STEAM_VULKAN (#3203) 2025-11-22 08:50:41 +01:00
Yang Liu a91f6d82d7 Fixed my___tls_get_addr (#3202) 2025-11-21 23:05:43 +01:00
Yang Liu cc389b3ec3 [RCFILE] Updated an obsolete steam option (#3201) 2025-11-21 16:52:20 +01:00
ptitSeb 4b24f51e2d [BOX32][WRAPPER] Fixed some functions signature for wrapped libtcminimal (fix original The Stanley Parable) 2025-11-21 15:53:41 +01:00
ptitSeb e6cbf0975a [DYNAREC] Improved DIRTY=2, making HOTPAGE_ALT useless (will be remove soon) 2025-11-21 14:00:38 +01:00
ptitSeb dc9c82db25 [BOX32][WRAPPER] Added one more symbol to 32bits libc (for #3200) 2025-11-21 13:40:37 +01:00
ptitSeb 63b0debcf1 [WRAPPER] Fixed typo from previous commit ([BOX32] too) 2025-11-21 12:01:21 +01:00
ptitSeb f8cc9de4f8 [BOX32][WRAPPER] New custom implementation for 32bits pthread_once, with some workaround 2025-11-21 11:07:18 +01:00
ptitSeb cfb8879410 [WRAPPER] New custom implementation for pthread_once, with some workaround 2025-11-21 11:07:02 +01:00
ptitSeb 6f7519b36e [TRACE] Slightly better trace for code that write on protected executable pages 2025-11-21 11:06:23 +01:00
Yang Liu 85bcfadfd6 Implemented a few more libc syscalls (#3199) 2025-11-21 10:13:59 +01:00
Yang Liu c71e688663 Fixed a typo introduced in last block optimisation (#3198) 2025-11-21 08:16:31 +01:00
Yang Liu de69cb4f7b [CMAKE] Fixed git_head dependencies (#3197) 2025-11-21 08:15:20 +01:00
Yang Liu 9efde7809c [CI] Removed os from the matrix (#3196) 2025-11-21 08:14:33 +01:00
Yang Liu a170660a81 [WRAPPER] Wrapped more symbols (#3195) 2025-11-20 20:39:15 +01:00
ptitSeb ad90eaef8d Introducing EmuRun, to have proper handling of LongJump on CallBack and on Interpreter only build 2025-11-20 13:14:47 +01:00
Yang Liu 05c75d7182 [LA64_DYNAREC] Added more opcodes (#3194) 2025-11-20 12:12:19 +01:00
ptitSeb a1e8ff3faf [INTERP] Fixed 0F C7 non REX.W opcode 2025-11-20 12:11:51 +01:00
ptitSeb 3cea6dab34 [BOX32][WRAPPER] Added some more X11 symbols (for SDL3) 2025-11-20 11:28:55 +01:00
ptitSeb 27fba0e0eb [BOX32][WRAPPER] Added a couple of libc symbols 2025-11-20 09:43:43 +01:00
442d727f5e Add support for NVIDIA GB10/DGX Spark platform (#3191)
* Add support for NVIDIA GB10/DGX Spark platform

- Add NVIDIA_GB10 cmake option with -mcpu=gb10 and -mtune=gb10 flags
- Add compilation documentation for GB10 (Cortex-A725 + Cortex-X925)
- Include fallback march flags for GCC 14 and older
- Requires GCC 15.2.0+ for optimal gb10 support

* Update CMakeLists.txt

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: ptitSeb <[email protected]>
Co-authored-by: Copilot <[email protected]>
2025-11-20 08:53:53 +01:00
ptitSeb cb26e7f3fe Improved the last_bock optimisation 2025-11-19 16:26:23 +01:00
ptitSeb f74b67ed8f [TRACE] Name the rb_tree when printing it's unstable 2025-11-19 15:37:32 +01:00
phorcys 0a37916aa3 [LA64_DYNAREC] Fix 8-bit lock macros, Add F0 08 LOCK OR Eb, Gb. (#3188)
*  Fix 8-bit lock macros.
  *  Fix 0F 00 LOCK ADD Eb, Gb
  *  Add 0F 08 LOCK OR Eb, Gb
2025-11-19 11:11:58 +01:00
ptitSeb 41bdb5db66 [BOX32] Another attempt to fix build on older system 2025-11-18 16:54:10 +01:00
ptitSeb 13d0814c4d [BOX32] Try to fix build on older system 2025-11-18 16:23:16 +01:00
ptitSeb cc00818d1d [BOX32][WRAPPER] Added 1 more extension to libGL 2025-11-18 15:43:09 +01:00
ptitSeb c5aa4e7d49 [WRAPPER] Added 1 more extension to libGL 2025-11-18 15:42:31 +01:00
Yang Liu 82fbf9db7d [BOX32] Slient some warnings on padding fields (#3189) 2025-11-18 15:18:11 +01:00
ptitSeb 7b456fe1fa [BOX32][WRAPPER] Better wrapping for input event files (fixing some 32bits games and SteamInput in general) 2025-11-18 15:11:24 +01:00
phorcys b2db02a5a8 [LA64_DYNAREC] Fix avx VCVTPH2PS,VCVTDQ2PD. (#3187)
LoongArch xvffint{l,h}.d.w  xvfcvt{l,h}.s.h operate cross per 128bits channel.
2025-11-18 08:22:39 +01:00
phorcys e3b13ebd7d [LA64_DYNAREC] Fix avx VAES{IMC,INC,INCLAST,DEC,DECLAST}. (#3186)
Fix for missing 256-bits width aes.
2025-11-18 08:16:05 +01:00
phorcys 2d5b7bf979 [LA64_DYNAREC] Fix avx V{P,}GATHER{DD,DPD,QPS,QD}. (#3185)
Fix wrong xmm/ymm register width.
2025-11-18 08:06:06 +01:00
Chi-Kuan Chiu 5d7a86551e [DYNAREC_PURGE] Decrement in_used before longjmp (#3184)
Signal handlers that use siglongjmp() to escape from dynarec blocks were
abandoning blocks without decrementing their in_used reference count,
causing blocks to remain permanently marked as in-use and preventing
them from being freed even when they're no longer needed.
2025-11-17 21:48:41 +01:00
ptitSeb f69ab5733c [BOX32][WRAPPER] Improved XFixes XEvent wrapping 2025-11-17 20:03:04 +01:00
ptitSeb 3f7facd8e0 [BOX32][WRAPPER] Wrapped XINput2 XEvents 2025-11-17 19:33:00 +01:00
ptitSeb 60cea01eb5 [STEAM] Use elulated libgnutls when using a steam runtime 2025-11-17 19:32:23 +01:00
ptitSeb 809d51bd8a [DYNAREC] Speedup sequence of mmap/munmap when prot is 0 2025-11-17 16:23:44 +01:00
ptitSeb f6bec4e201 [BOX32][WRAPPER] Added 3 more wrapped functions to libfontconfig 2025-11-17 16:10:22 +01:00
ptitSeb 2bf6aa8648 [WRAPPER] Removed custom implementationof pthread_once as it did handled the 'inprogress' state 2025-11-17 14:24:10 +01:00
ptitSeb db03c644e9 [WRAPPER] Removed custom implementationof pthread_once as it did handled the 'inprogress' state 2025-11-17 14:24:03 +01:00
ptitSeb bffc81e547 [ELFLOADER] Improved a comment 2025-11-17 13:55:33 +01:00
ptitSeb c723d10dc2 [TRACE] Better trace for a dbus function 2025-11-17 13:55:11 +01:00
Leslie Zhai a453563f02 [LA64_DYNAREC] Fix incorrect stack alignment (#3183) 2025-11-17 11:31:04 +01:00
ptitSeb 6489fc199b [STEAM] Improved pressure_vessel handling 2025-11-16 17:39:47 +01:00
ptitSeb 3d378366df [DYNAREC] Better log when writing on active code page 2025-11-16 17:39:16 +01:00
Yang Liu ad60ba9fe2 [WRAPPER] Wrapped 2 more symbols (#3181) 2025-11-16 16:16:00 +01:00
ptitSeb 871259b47d [DYNACACHE] Some small improvment in dynablocks relocations at load 2025-11-16 14:42:21 +01:00
ptitSeb 22c7db557a [DYNAREC] Fixed a potential SIGFAULT when AllocDynarecMap fails 2025-11-16 14:41:47 +01:00
ptitSeb f2058e56f6 [DYNAREC] Some small fixes for when a dynablocks has a prefix 2025-11-16 14:25:14 +01:00
ptitSeb c5444fc67d [DYNAREC][ARM64_DYNAREC] Fixed some regression with getX64Address utility function 2025-11-16 14:23:08 +01:00
ptitSeb 66c09a7f7f [DYNAREC] Improved the unity3d strongmem hack 2025-11-16 11:24:41 +01:00
Yang Liu 8d3b6c5423 [LA64_DYNAREC] Refined IMUL opcodes flags computation (#3180) 2025-11-15 17:55:01 +01:00
ptitSeb 3e8c02d645 [RCFILE] Added 1 more game profile 2025-11-15 16:52:27 +01:00
ptitSeb e34da3a466 [ARM64_DYNAREC][DYNAREC_PURGE] Changed how dynablocks are checked for purge 2025-11-15 16:50:44 +01:00
Yang Liu 476592df7c [INTERP] Fixed 67 prefix handling for LEA opcode (#3179) 2025-11-15 16:40:06 +01:00
Yang Liu 9939760901 [LA64_DYNAREC] Fixed a regression introduced in 14e3d05 (#3178) 2025-11-15 16:21:56 +01:00
Yang Liu 510966a8f9 [WRAPPER] Wrapped 1 more glib2 function (#3177) 2025-11-15 16:21:27 +01:00
ptitSeb 751c229c00 [ARM64_DYNAREC][DYNAREC_PURGE] Decrement in_used when leaving block via CALLRET return too 2025-11-15 14:42:18 +01:00
Yang Liu 0a84ed5dae [DOCS] Refined usage documentation with recent changes (#3176) 2025-11-15 14:39:15 +01:00
Yang Liu f3d3f1a84e [LA64_DYNAREC] Added more opcodes (#3175) 2025-11-15 13:00:22 +01:00
Yang Liu d37b843ee9 [LA64_DYNAREC] Optimized some emit functions (#3174) 2025-11-15 12:59:27 +01:00
ptitSeb ccac55667d Fix non ARM64 Dynarec build 2025-11-15 11:06:35 +01:00
ptitSeb 81b080eb5d [ARM64_DYNAREC] Introduced DYNAREC_PURGE to allow purging old unsed dynablock and save memory 2025-11-15 10:42:56 +01:00
Yang Liu cc541b08c3 [RV64_DYNAREC] Added a few more 16bit opcodes and some fixes too (#3173) 2025-11-14 13:38:14 +01:00
ptitSeb e90676213a [ARM64_DYNAREC] Added preload of xmm/ymm regs mcanism for internal loops 2025-11-14 11:41:58 +01:00
a9ix adef248942 [WRAPPER] Wrap libicu76 (#3172) 2025-11-14 08:22:12 +01:00
Yang Liu c6e9b87ef3 [RV64_DYNAREC] Added more lock opcodes (#3171) 2025-11-13 16:10:54 +01:00
ptitSeb ca9da1855a [ARM64_DYNAREC] Avoid some visiting dynablocks when unneeded (like no x87 is used) 2025-11-13 11:01:19 +01:00
Chi-Kuan Chiu b6fb4865fb [Docs] Update outdated information in rbtree.h (#3170)
The descriptions were incorrect.
2025-11-12 22:18:10 +01:00
Yang Liu 6af34e0c43 [BOX32] Implemented getdents syscall (#3168)
* [BOX32] Implemented getdents syscall

* fix
2025-11-12 14:05:50 +01:00
Yang Liu f4ce7a0893 [BOX32] Silence a false warning (#3169) 2025-11-12 13:08:04 +01:00
Yang Liu 6f658a9b2c [TRACE][BOX32] Fixed a crash in nanosleep tracing (#3167) 2025-11-12 11:39:21 +01:00
ptitSeb c35af59da9 [WRAPPER] Removed some duplicated code in libc wrapping 2025-11-12 09:36:08 +01:00
ptitSeb 3872d8df46 [ARM64_DYNAREC] Avoid dumping uneeded xmm/ymm register when purging all fetched register on internal jump 2025-11-12 09:25:17 +01:00
Yang Liu fbbf74f601 [CORE] Added back the logging prefix (#3166) 2025-11-11 19:51:38 +01:00
Yang Liu a5ec9bfc4c [RV64_DYNAREC][LA64_DYNAREC] Fixed a wrong modreg test in nativeflags (#3165) 2025-11-11 18:30:14 +01:00
Yang Liu 0adaa219bf [LA64] Fixed a typo in last PR (#3164) 2025-11-11 23:27:31 +08:00
Yang Liu 0358034389 [LA64] Optimized CRC chksum with native instructions (#3163) 2025-11-11 15:59:39 +01:00
Yang Liu c674c13114 [LA64_DYNAREC] Added a few more opcodes (#3161) 2025-11-11 11:45:50 +01:00
Chi-Kuan Chiu a1bf126d7b Add block lookup cache to optimize findBlock() (#3160)
Cache last found block to skip RB-tree lookup on consecutive accesses.
Safe during re-entrance via direct pointer dereference (reads NULL when
blocks temporarily zeroed, causing natural cache miss).

Cache hit rates measured in real workloads:
- Small program (qsort): 64.7% (249/136)
- Large game ELF: 72.7% (35,392/13,302)
- Large game PE+Wine: 85.3% (64,432/11,097)

Wine workloads benefit most due to intensive allocation patterns.
Converts 65-85% of O(log n) lookups to O(1) cache hits.
2025-11-11 11:40:02 +01:00
phorcys 36a5020d36 [LA64_DYNAREC] Add 66 87 (LOCK) XCHG Ew, Gw. (#3157)
For steamwebhelper.
2025-11-11 09:40:57 +01:00
Yang Liu 94c7dd5796 [LA64_DYNAREC] Added more opcodes (#3158) 2025-11-10 19:31:13 +01:00
ptitSeb 8c5a5d9fb5 [ELFLOADER] Some fixes of TLS data handling 2025-11-10 17:35:29 +01:00
phorcys 2f23cf5812 [LA64_DYNAREC] Add 66 8C MOV Ew, Seg. (#3155)
For wine-10.x ntdll.
2025-11-10 17:00:28 +01:00
Yang Liu 85fd15902f [LA64_DYNAREC] Refined more flags computation (#3156) 2025-11-10 17:00:00 +01:00
phorcys 96708b31d5 [LA64_DYNAREC] Add 66 F0 0F B1 LOCK CMPXCHG Ew, Gw. (#3149)
For steamwebhelper.
2025-11-10 16:58:48 +01:00
Yang Liu b1824baf2b [INTERP] Refined BSF/BSR undefined behaviour (#3154) 2025-11-10 16:00:48 +01:00
ptitSeb 53528ddd61 [BOX32][WRAPPER] A few more functions and fixes to libc 2025-11-10 15:40:23 +01:00
ptitSeb fe19ac7c6d [BOX32][WRAPPER] A few more wrapped symbols to libc, plus some fixes 2025-11-10 15:15:09 +01:00
ptitSeb 7fec355012 [BOX32][WRAPPER] Fixed/improved dbus_message_iter_append_basic 2025-11-10 14:36:34 +01:00
Yang Liu 838060f996 [RV64_DYNAREC] Fixed some typos for nativeflags (#3153) 2025-11-10 14:12:42 +01:00
Yang Liu cebeff3d3e [LA64_DYNAREC] Refined more flags computation (#3152) 2025-11-10 11:52:42 +01:00
Yang Liu d117c77247 [RV64_DYNAREC] Fixed some minor issues for 16bit SHLD/SHRD opcodes (#3150) 2025-11-10 11:10:21 +01:00
Yang Liu 901811b8f9 [LA64_DYNAREC] Refined more flags computation (#3151) 2025-11-10 10:47:49 +01:00
ptitSeb f97a25ae0c [BOX32][WRAPPER] Imrpoved wrapping for XGetICValues 2025-11-10 08:56:24 +01:00
ptitSeb 87683a18f5 [BOX32][WRAPPER] Added support for Xkb events 2025-11-09 17:43:22 +01:00
ptitSeb dfd5ed8675 [DYNAREC] Added a workaround to avoid STRONGMEM=1 in most Unity games (thanks to @ByLaws for the hint) 2025-11-09 16:32:17 +01:00
ptitSeb 1fab6582d7 [DYNAREC] Fixed a potential Fillblock issue at border of page 2025-11-09 09:54:45 +01:00
Yang Liu 164a85c18f [RCFILE] Removed some obsolete hacks on Linux Steam (#3148) 2025-11-09 09:48:53 +01:00
Yang Liu 9d6488b35d [LA64_DYNAREC] Fixed more regressions introduced in 14e3d05 and 44822bb (#3147) 2025-11-08 22:42:41 +01:00
Yang Liu 0ef66adfa9 [LA64_DYNAREC] Refined more flags computation (#3145)
* [LA64_DYNAREC] Refined more flags computation

* more
2025-11-08 19:54:32 +01:00
ptitSeb 564a75b917 Small improvment on signal handling 2025-11-08 18:50:35 +01:00
Yang Liu 05e4b4592d [LA64_DYNAREC] Refined more flags computation (#3144) 2025-11-08 18:34:57 +01:00
Yang Liu 7faeec0864 [DYNAREC] Fixed some safeflags testing code (#3143) 2025-11-08 13:43:47 +01:00
Yang Liu 08cf5fd6c3 [LA64_DYNAREC] Refined some more flags computation (#3142) 2025-11-08 13:39:06 +01:00
Yang Liu 26aae9ba3b [LA64_DYNAREC] Refined BSF/BSR opcodes and fixed some typos (#3141) 2025-11-08 12:48:46 +01:00
ptitSeb 9b7c83f885 Added 1 more 64bits syscall 2025-11-08 12:00:39 +01:00
Yang Liu b2830d3070 [LA64_DYNAREC] Refined register names (#3140) 2025-11-08 11:57:48 +01:00
phorcys b6024590ef [LA64_DYNAREC] Update lock 32/64 macro. (#3139)
use s1-s7.
2025-11-08 10:36:57 +01:00
Yang Liu 7ee7b99a84 [CORE] Print logs to stderr by default (#3137) 2025-11-08 10:36:21 +01:00
ptitSeb 93ff6ca414 [TRACE] Show FSGSBASE trace in hex in signal 2025-11-08 10:35:39 +01:00
Yang Liu 78080748e6 [RV64_DYNAREC] Refined BSR/BSF undefined behaviour (#3136) 2025-11-07 16:50:38 +01:00
ptitSeb 522f8c3dd0 [ELFLOADER][WRAPPER] Improved handling of dlsym(RTLD_NEXT, ....) 2025-11-07 16:36:14 +01:00
Yang Liu 4825b31305 [ARM64_DYNAREC] Refined BSR/BSF undefined behaviour (#3135) 2025-11-07 16:33:56 +01:00
phorcys a96f2dcda9 [LA64_DYNAREC] Add 8bits lock op macros. (#3127)
*  Add LOCK_8_ALIGNED_4BYTE, LOCK_8_IN_4BYTE macro.
  *  F0 00 LOCK ADD Eb, Gb
2025-11-07 16:12:21 +01:00
phorcys 08f2f8255d [LA64_DYNAREC] Opt rol with LBT insts. (#3130)
Opt rol with rotr.{b,h}, rotri.{b,h}.
Those insts are list in LBT section in binutils.
https://github.com/bminor/binutils-gdb/blob/58fedddb895318d72189dbae912f4902dab96b4c/opcodes/loongarch-opc.c#L2538
2025-11-07 16:10:34 +01:00
Yang Liu 3004c7f280 [RV64_DYNAREC] Small improvments on some invalid opcodes handling (#3134) 2025-11-07 15:51:26 +01:00
ptitSeb f649132b6f Reserved highest 32bits 64K memory for Box32 or Wine to reduce potential overflow addresses computations 2025-11-07 15:35:11 +01:00
ptitSeb 503cf716ec [RCFILE][WRAPPER] Some work for GigaTribe (for #1409) 2025-11-07 14:00:42 +01:00
Yang Liu 5b8f18f6bf [RV64_DYNAREC] Refined some more flags computation (#3133) 2025-11-07 13:06:34 +01:00
ptitSeb e78169bc4e [DYNAREC] Some refactor around Hotpages and SMC code 2025-11-07 13:00:26 +01:00
ptitSeb fa7a4ce29c [LA64_DYNAREC] Fixed regression introduced by 14e3d05b87 (for #3132) 2025-11-07 10:11:28 +01:00
ptitSeb 37040f3b49 [BOX32][ELFLOADER] Added support for IFUNC in PltResolver 2025-11-06 09:50:35 +01:00
ptitSeb 4a1f92a634 [ELFLOADER] Added support for IFUNC in PltResolver 2025-11-06 09:50:24 +01:00
谢致邦 (XIE Zhibang) bffca555a3 [DOCS] fix typos (#3131)
Original-author: Johannes Schauer Marin Rodrigues <[email protected]>
Link: https://salsa.debian.org/debian/box64/-/commit/ed8749048c47b20edc4c601a86ba65871bad5b74
2025-11-06 08:06:02 +01:00
Yang Liu dcd3ba0d16 [RV64_DYNAREC] Refined more flags computation (#3129) 2025-11-05 16:48:30 +01:00
ptitSeb b2e68e8032 [BOX32] Fixed hash key creation 2025-11-05 15:08:02 +01:00
ptitSeb e0a67969ca [ARM64_DYNAREC] Fixed 32bits 67 64 prefixed opcode not being decoded by dynarec 2025-11-05 12:12:18 +01:00
ptitSeb a5ef0c2ac0 [INTERP] Fixed 32bits 67 64/65 prefixed opcodes 2025-11-05 12:02:03 +01:00
phorcys 14e3d05b87 [LA64_DYNAREC] Add more 32/64 lock opcodes. (#3126)
*  87 LOCK XCHG Ed, Gd
  *  F0 09 LOCK OR Ed, Gd
  *  F0 21 LOCK AND Ed, Gd
  *  F0 31 LOCK XOR Ed, Gd
  *  F0 81/83 /1 LOCK OR Ed, Id/Ib
  *  F0 81/83 /4 LOCK AND Ed, Id/Ib
  *  F0 81/83 /6 LOCK XOR Ed, Id/Ib
  *  F0 87 LOCK XCHG Ed, Gd
  *  F0 F7 /2 LOCK NOT Ed
  *  F0 F7 /3  fix LOCK NEG, not reading CF.
  *  Guard amo op's B_MARK3_nocond with ALIGNED_ATOMICxw
2025-11-05 11:12:43 +01:00
ptitSeb 85e48644b1 [LA64_DYNAREC] Fixed issue introduced with 2b070086 2025-11-05 09:12:51 +01:00
ptitSeb ec7a898058 [LA64_DYNAREC] Fixed issue introduced with 2b070086 (for #3125) 2025-11-05 09:10:05 +01:00
ptitSeb d0dccb8e19 [LA64_DYNAREC] Fix issue introduced with #3118 2025-11-05 08:48:53 +01:00
phorcys 85125305b9 [LA64_DYNAREC] Fix avx V{/P}GATHER{DD/DQ/DPD/DPS/QD/QPS}. (#3121)
*  index should be signed extended.
*  for VEX.128 QD/QPS , DEST[127:64] should fill with zero.
2025-11-05 07:45:56 +01:00
phorcys 0c00db9851 [LA64_DYNAREC] Add rol8 opcodes. (#3120)
small fix for rol16/32/64
Add rol8.
2025-11-05 07:45:24 +01:00
phorcys 91163afd7b [LA64_DYNAREC] Add more 32/64 bits arith lock opcodes. (#3118)
*  Fix LOCK_32_IN_8BYTE
  *  F0 0F C1 /0 LOCK XADD Ed, Gd
  *  F0 11 LOCK ADC Ed, Gd
  *  F0 19 LOCK SBB Ed, Gd
  *  F0 29 LOCK SUB Ed, Gd
  *  F0 81/83 /2 LOCK ADC Ed, Id/Ib
  *  F0 81/83 /3 LOCK SBB Ed, Id/Ib
  *  F0 81/83 /5 LOCK SUB Ed, Id/Ib
  *  F0 F7 /3 LOCK NEG Ed
  *  F0 FF /0 LOCK INC Ed
  *  F0 FF /1 LOCK DEC Ed
2025-11-05 07:44:58 +01:00
The Great Wizard Azkali db20fd7e49 [BOX32][WRAPPER] Added a missing 32bits function to libc (#3124) 2025-11-04 18:57:18 +01:00
谢致邦 (XIE Zhibang) e6843dcb9f [CMAKE] Fix typo (#3122) 2025-11-04 11:54:12 +01:00
ptitSeb 2ecde96fe2 [BOX32][WRAPPING] Better wrapping for pthread_yield (for #3119) 2025-11-04 09:04:35 +01:00
ptitSeb 1a552f2105 [ARM64_DYNAREC] Some small optimisation on various x87 opcodes 2025-11-03 16:58:46 +01:00
ptitSeb 86a207cf36 [DYNAREC] Inc DynaCache version to take FSGSBASE into account 2025-11-03 16:52:30 +01:00
Yang Liu af99dd0e76 [ARM64_DYNAREC] Refined UD behaviour of 16bit ROL/ROR opcodes (#3117) 2025-11-03 15:08:48 +01:00
Yang Liu bb7d674582 [INTERP] Refined UD behaviour of 16bit ROL/ROR opcodes (#3116) 2025-11-03 11:53:53 +01:00
ptitSeb 4f37a9a7dd [DYNAREC] Small optimisation on linux syscall 2025-11-03 11:07:19 +01:00
Yang Liu 6c291548f0 [INTERP] Refined BSF/BSR ud value (#3115) 2025-11-03 09:58:31 +01:00
ptitSeb 2b070086d1 Added FSGSBASE cpu extension 2025-11-03 07:44:04 +01:00
Yang Liu 8b72b3bf70 [RV64_DYNAREC] Refined BSF/BSR opcodes flags emulation (#3114) 2025-11-02 20:15:39 +01:00
phorcys 44822bb07b [LA64_DYNAREC] Add macros help unaligned lock opcodes. (#3107)
This patch add Macro for 32/64 bits lock opcodes.
Added lock add ed, gd/lock add ed, ib/id.
2025-11-02 17:21:23 +01:00
Yang Liu 75ea309ca1 [RV64_DYNAREC] Refined LZCNT/TZCNT flags emulation (#3113) 2025-11-02 17:20:48 +01:00
Yang Liu de020c2b4c [RV64_DYNAREC] Refined MUL/DIV flags emulation (#3112)
* [RV64_DYNAREC] Refined MUL/DIV flags emulation

* hmm
2025-11-02 17:02:34 +01:00
Yang Liu 8caf35ccd8 [RV64_DYNAREC] Refined SHLD/SHRD flags emulation (#3111) 2025-11-02 15:36:11 +01:00
phorcys 0ab3d844e7 [LA64_DYNAREC] Add rol16/rol16c opcodes. (#3110)
66 C1/D1/D3 /0  ROL Ew, Ib/1/CL
2025-11-02 15:26:05 +01:00
ptitSeb 1c34a7ce38 [RCFILE] Added some new profile, and fine tuned a few existing ones 2025-11-02 13:13:34 +01:00
ptitSeb 3f0400a89b Prepend system libs to steam one (help wit Oxygen Not Included, maybe more) 2025-11-01 10:55:32 +01:00
ptitSeb cd26f27e98 [TRACE] Small improvment in elfloader dump 2025-11-01 10:55:32 +01:00
Yang Liu 713c137e09 [RV64_DYNAREC] Refined ROL/ROR opcodes OF handling (#3109) 2025-10-31 18:02:01 +01:00
Yang Liu 64a6802b5e [RV64_DYNAREC] Refined SHL/SHR opcodes OF handling (#3106) 2025-10-31 10:27:34 +01:00
phorcys 2286636386 [LA64_DYNAREC] Add ADX opcodes. (#3103)
66 0F 38 F6 ADCX
F3 0F 38 F6 ADOX
2025-10-31 09:56:42 +01:00
Yang Liu c51edca058 [TEST] Added flags checking (#3105) 2025-10-31 09:49:45 +01:00
phorcys 69a549eb8f [LA64_DYNAREC] Add more opcodes for steam. (#3104)
06 PUSH ES
07 POP ES
36 SS
C8 ENTER
CB FAR RET
D7 XLAT
E4-E7  IN/OUT
FA CLI
FB STI
0F 0D /0 /2   PREFETCH
64 00 ADD Seg:Eb, Gb
2025-10-31 09:38:09 +01:00
ptitSeb 073a8ba703 [WRAPPER] Added __udivti3 to libc (for #1269) 2025-10-31 09:29:54 +01:00
ptitSeb 4a9fbf10c4 More work on refactoring Selector/Segments 2025-10-31 08:39:34 +01:00
Yang Liu f3fbff531c [TEST] Added cputype option (#3102)
* [TEST] Added cputype option

* tweaks
2025-10-30 19:36:28 +01:00
phorcysandphorcys 894712461f [LA64_DYNAREC] Add more 64 opcodes. (#3100)
64 0F 10 /1 MOVSD Gx, Seg:Ex
64 0F 10 /2 MOVSS Gx, Seg:Ex
64 0F 11 /0 MOVUPS Seg:Ex, Gx
64 0F 11 /1 MOVSD Seg:Ex, Gx
64 0F 11 /2 MOVSS Seg:Ex, Gx
64 0F 28 /0 MOVAPS Gx, Seg:Ex
64 0F 29 /0 MOVAPS Seg:Ex, Gx
64 0F 6F /2 MOVDQU Gx, Seg:Ex
64 0F 7F /2 MOVDQU Seg:Ex, Gx
64 0F B6 /0 MOVZX Gd, Seg:Eb
64 39 CMP Seg:Ed, Gd
64 3B CMP Gd, Seg:Ed

For wine wow64

Co-authored-by: phorcys <[email protected]>
2025-10-30 17:07:04 +01:00
ptitSeb af97642dba [COSIM] More fixes to issues introduced with last commit 2025-10-30 13:26:15 +01:00
ptitSeb 425f838ee8 [COSIM] Fixed issue introduced with last commit 2025-10-30 13:09:00 +01:00
ptitSeb 9c8b92e8df Some more refactor around Segments and TLS data 2025-10-30 11:35:06 +01:00
Yang Liu 302dfbe539 [STEAM] Added docs and some tweaks for Linux Steam, also added a new env var for it (#3101)
* [STEAM] Added docs and some tweaks for Linux Steam, also added a new env var for it

* more tweaks

* refine chinese docs
2025-10-29 16:32:23 +01:00
ptitSeb 6a717bd7c6 [ARM64_DYNAREC] Fixed UD behaviour of bsr/bsf when input is 0 2025-10-29 16:11:56 +01:00
ptitSeb b2b6d12508 [LA64] Forcing BAD_PKILL configuration on Loongarch 2025-10-29 12:01:52 +01:00
ptitSeb 86e8a24d0d Added BAD_PKILL build option, and linked LA64 to it (fixes Steam download issue on Loongarch) 2025-10-29 11:58:57 +01:00
ptitSeb a9a27a93d2 [WOWBOX64] Fixed some warning 2025-10-29 11:07:39 +01:00
ptitSeb ab8731411e [DYNAREC] Introduced DYNAREC_NOARCH to save a bit of memory when strict signal register unwind is not needed 2025-10-29 10:35:08 +01:00
phorcysandphorcys 1f7a69ef31 [LA64_DYNAREC] Add LOCK BTS/BTR. (#3093)
F0 0F AB  LOCK BTS Ed, Gd
F0 0F B3  LOCK BTR Ed, Gd
F0 0F BA /5 LOCK BTS Ed, Ib
F0 0F BA /6 LOCK BTR ED, Ib
66 F0 0F AB  LOCK BTS Ew, Gw
66 F0 0F B3  LOCK BTR Ew, Gw
66 F0 0F BA /5 LOCK BTS Ew, Ib
66 F0 0F BA /6 LOCK BTR Ew, Ib

Co-authored-by: phorcys <[email protected]>
2025-10-29 09:36:00 +01:00
Yang Liu 01e906ead8 [LA64_DYNAREC] Fixed a typo in last commit (#3099) 2025-10-29 08:56:11 +01:00
Yang Liu 5d02f2cb1b [LA64_DYNAREC] Replaced the ADDSL macro from RV64 to ALSL_D (#3098)
* [LA64_DYNAREC] Replaced the ADDSL macro from RV64 to ALSL_D

* fix
2025-10-29 08:37:58 +01:00
phorcysandphorcys b066ca201c [LA64_DYNAREC] Add more ops. (#3096)
MOV Seg:Ed, Gd
MOV Gd, Seg:Ed

Needed by dxvk-2.7.1 dxgi.dll

Co-authored-by: phorcys <[email protected]>
2025-10-29 07:49:25 +01:00
ptitSeb e735a591a0 [RCFILE][LA64][RV64] Use specific profile for DG2 on LA64 & RV64 2025-10-28 15:05:17 +01:00
Leslie Zhai e49c4d78d0 [WRAPPER] Add wrapper for rintl (#3097) 2025-10-28 13:10:33 +01:00
Leslie Zhai e6c4bbcd41 [WRAPPER] Add some wrappers for libm (#3094) 2025-10-28 08:54:58 +01:00
ptitSeb 8be949ba57 [RCFILE][BOX32] Move profile for DG2 2025-10-27 11:52:44 +01:00
ptitSeb 6d74f71d96 [RCFILE] Added a profile for DG2 2025-10-27 11:51:50 +01:00
phorcysandphorcys b4adf1e8ef [LA64_DYNAREC] Add more 00 opcodes. (#3092)
For steam linux.
60 PUSHAD
61 POPAD
62 BOUND
F1 INT1
FF /5 JMP FAR Ed

Co-authored-by: phorcys <[email protected]>
2025-10-27 10:30:58 +01:00
ptitSeb 435dce44ac [DYNAREC][TRACE] Fixed default value for BOX64_NODYNAREC_DELAY 2025-10-26 18:43:48 +01:00
ptitSeb f71fd3d2c1 [BOX32][WRAPPER] Added 1 more function to 32bits wrapped SDL2 2025-10-26 16:35:14 +01:00
ptitSeb 44e4ba2d01 [DYNAREC] Create BOX64_NODYNAREC_DELAY and use it as a workaround for a race condition in UPlay launcher 2025-10-26 16:28:28 +01:00
ptitSeb 716433658c [BOX32][WRAPPER] Improved wrapping of 32bits function nftw callback 2025-10-26 15:56:31 +01:00
ptitSeb 4e80fdfaef [ARM64_DYNAREC] Remove some assert (and replaced one with a dynarec_log) 2025-10-26 13:47:20 +01:00
ptitSeb 3280f02135 [DYNAREC] Removed some unused code 2025-10-26 10:57:26 +01:00
ptitSeb c985fe1bb7 [ARM64_DYNAREC] Added 0F 20..23 opcodes 2025-10-25 15:30:23 +02:00
ptitSeb c95c16231d [INTERP] Improved handlingof 0F 20..23 opcodes 2025-10-25 15:29:58 +02:00
Yang Liu 448ee01f44 [LA64] Fixed LBT signal handling for ABI 1.0 (#3088)
* [LA64] Fixed LBT signal handling for ABI 1.0

* fix
2025-10-23 19:12:06 +02:00
ptitSeb ea86135152 [WRAPPER] Fix build 2025-10-23 17:38:43 +02:00
ptitSeb b079d85636 [WRAPPER] Fixed a potential leak with xcb_connection 2025-10-23 17:13:12 +02:00
ptitSeb 46489c3cd6 [TRACE] Fixing wrapping name print utility function 2025-10-23 14:18:28 +02:00
ptitSeb ab72625a8f [RCFILE] Added a profile for linux Steam 2025-10-23 14:10:00 +02:00
ptitSeb f1ee1933b1 [TRACE] Added a utility function to print a wrapped function name 2025-10-23 13:38:17 +02:00
ptitSeb ec39c6393e [BOX32][WRAPPER] This fhousl fix some builds 2025-10-23 13:35:01 +02:00
ptitSeb f65b57bfac [BOX32][WRAPPER] Fixed a leak with xcb_connections (for #3089) 2025-10-23 12:08:13 +02:00
phorcysandphorcys 1cd7edf172 [LA64_DYNAREC] Add more ops. (#3091)
For steam.
1E/1F  PUSH/POP DS
AC/AD  REP LODSB/LODSD
66.A1/A3  MOV EAX,0d, MOV 0d, EAX

Co-authored-by: phorcys <[email protected]>
2025-10-22 18:21:58 +02:00
ckrinitsin 5f7a1982ac [TRACE] Fix flags output for better parsing (#3090) 2025-10-22 18:20:31 +02:00
ptitSeb d42055477c [INTERP] Removed a file leftover since last interpreter refactor 2025-10-22 15:13:31 +02:00
Yang Liu 83082b081c [RCFILE] Optimized Windows Steam download speed for LA64 and RV64 (#3087) 2025-10-22 14:42:28 +02:00
Yang Liu 66e8828345 [ENV] Introduced BOX64_PCLMULQDQ (#3086)
* [ENV] Introduced BOX64_PCLMULQDQ

* review
2025-10-22 14:41:30 +02:00
Yang Liu 0850dec01f [DYNAREC] Fixed getX64Address empty block handling (#3085) 2025-10-22 14:00:21 +02:00
Yang Liu 1a27269089 [LA64_DYNAREC] Added unaligned F0 81/83 /0,5 LOCK ADD/SUB opcodes (#3084)
* [LA64_DYNAREC] Added unaligned F0 81/83 /5 LOCK SUB opcodes

* add too
2025-10-21 23:01:50 +02:00
Yang Liu 6c1fce4a01 [DYNAREC] Fixed native_fprem/native_fprem1 (fixed the camera issue of FlatOut/FlatOut2) (#3083) 2025-10-21 21:02:06 +02:00
Yang Liu 79efa2d8e5 [RV64_DYNAREC] Added DB /2 FIST opcode (#3082) 2025-10-21 20:37:39 +02:00
Yang Liu 83a37589f2 [LA64_DYNAREC] Added a few more opcodes (#3081) 2025-10-21 20:26:50 +02:00
Yang Liu fe0e3b7a9f [LA64] Fixed LBT signal handling, also refined la64noext support (#3080) 2025-10-22 01:15:18 +08:00
ptitSeb e3cd3e8347 [RCFILE] Removed INTERP_SIGNAL for VampireSurvivors, it's not needed anymore_ 2025-10-20 12:26:20 +02:00
ptitSeb d730610c02 [DYNAREC] Reversing b40cb7b84a as it generate tons of regression and it tries to fix a non-issue 2025-10-20 12:08:29 +02:00
Yang Liu b0c11ae14f [LA64_DYNAREC] Added more opcodes (#3079) 2025-10-19 23:05:47 +02:00
Yang Liu 2db2532092 [LA64_DYNAREC] Added x87 support (#3078) 2025-10-19 19:35:39 +02:00
ptitSeb 95182c9f21 [TRACE] Move the fast _exit message to dynarec_log instead 2025-10-19 19:15:26 +02:00
ptitSeb b95f0a0ffa [DYNAREC][WOWBOX64] BOX4_DYNAREC_INTERP_SIGNAL is not availble in WowBox64 for now 2025-10-19 19:10:50 +02:00
ptitSeb 0833a07a65 [DYNAREC] Introduce BOX4_DYNAREC_INTERP_SIGNAL and 1 profile that needs it 2025-10-19 19:06:38 +02:00
ptitSeb aa4dbe72c9 [BOX32][WRAPPER] Slightly better wrapping for 2 non-standard pthread functions 2025-10-19 17:47:09 +02:00
ptitSeb b76e26dc84 [BOX32] Fixed some old issue with hash useage 2025-10-19 17:46:26 +02:00
ptitSeb ed267b1a05 [LA64] Use alternate code for unaligned CMPXCHG8B in interpreter 2025-10-19 14:42:59 +02:00
ptitSeb 609d5c27b2 [WRAPPER] Added another listener to waylandclient (for #3071) 2025-10-19 11:01:09 +02:00
ptitSeb 9960128f4e [WRAPPER] Added one more listener to waylandclient (for #3071) 2025-10-19 10:53:32 +02:00
ptitSeb 58875dee13 [WRAPPER] Fixed one of waylandclient callback signature (for #3071) 2025-10-19 10:44:17 +02:00
ptitSeb 57a6c5a8b9 [WRAPPER] Added 1 egl extension to wrapped libGL, on 64bits side, not on 32bits (for #3071) 2025-10-19 10:36:03 +02:00
ptitSeb abb6446b28 [WRAPPER] Better wrapping for a libdecor function (for #3071) 2025-10-19 10:31:26 +02:00
ptitSeb 440308f604 [WRAPPER] Added 1 egl extension to wrapped libGL (for #3071) 2025-10-19 09:56:06 +02:00
ptitSeb 25134fca48 [WRAPPER] Added 1 extension to wrapped libEGL (for #3071) 2025-10-18 13:34:49 +02:00
ptitSeb f2b168e674 [WRAPPER] Added another Wayland listener (for #3071) 2025-10-18 13:20:31 +02:00
ptitSeb bd616a3779 [WRAPPER] Added 1 more Wayland listener (for #3071) 2025-10-18 11:21:47 +02:00
ptitSeb f568ae4844 [RV64_DYNAREC] Small refactor on SIGBUS special case handling 2025-10-18 10:52:07 +02:00
Yang Liu 4edbdc005b [RCFILE] Added steamwebhelper entry for RISC-V (#3077) 2025-10-17 13:12:02 +02:00
Yang Liu 88aefd44ad [ENV] Added a new BOX64_ARCH option (#3076) 2025-10-17 13:01:37 +02:00
Leslie Zhai c8f6041ab0 [WRAPPER] Fix no more slot for glib2 GSourceFunc callback (#3075) 2025-10-17 08:05:12 +02:00
Yang Liu 640e2b8bcf [BOX32] Enlarged xcb connects size again for Linux Steam (#3074) 2025-10-16 20:45:54 +02:00
ptitSeb f4aab38964 [COSIM] Disable tests fo CD opcode 2025-10-16 13:12:45 +02:00
ptitSeb 2a06a5d1c3 [DYNAREC] Remove obsolete code now that all memory of the dynarec is static 2025-10-16 11:39:05 +02:00
ptitSeb b40cb7b84a [DYNAREC] Fixed potential issue with signel not being re-enabled after FillBlock64 got canceled in a signal handler 2025-10-16 11:00:07 +02:00
ptitSeb d0045b158b Some Segments/Selector handling refactoring , removing some pthread_getspecific use 2025-10-15 20:52:16 +02:00
Yang Liu 1d4a9e8863 [TEST] Some minor fixes to the test runner (#3072) 2025-10-15 11:27:58 +02:00
Luke Short cc68021a14 [BUNDLE] Add libgcc (#3070)
* [BUNDLE] update link

to the list of libraries that cannot be emulated. It shows how
libthread_db cannot be emulated (which is already in our exclusion
list).

* [BUNDLE] Add libgcc

This provides the 'libgcc_s.so.1' library.

Related #2389
2025-10-15 08:17:09 +02:00
ptitSeb f5a64f93b6 [ARM64_DYNAREC] Better handling for invalid opcodes 2025-10-14 09:23:15 +02:00
ptitSeb 6732546e60 [INTERP] Better handling for invalid opcode 2025-10-14 09:22:44 +02:00
Luke Short 74f4fbdcb0 Bundle OpenSSL (#3069)
* [BUNDLE] sort CSV file

* [BUNDLE] Add OpenSSL libraries

including 'libcrypto.so.1.0.0', 'libcrypto.so.1.1', and
'libssl.so'.

Related #2389
2025-10-14 09:13:36 +02:00
phorcys 524c5ad47a [LA64_DYNAREC] Fix SSE CMPPD, wrong reg operand for cUN cOR. (#3068) 2025-10-14 09:12:45 +02:00
Yang Liu 3d0423acf7 Added preliminary unit test runner (#3045)
* Added preliminary unit test runner

* Set .text section address

* Added support for added custom memory regions

* Move json.h to include

* Display banner

* Added support for custom memory data

* Added the ability to include path in nasm

* Print env variables
2025-10-14 09:11:15 +02:00
ptitSeb 3ad0ddfe88 Start of a new dev. cycle 2025-10-14 09:03:47 +02:00
ptitSeb 81c56d7155 Bumped version to v0.3.8 2025-10-13 14:05:21 +02:00
Yang Liu 524bf21011 [LA64_DYNAREC] Fixed BEXTR opcode (#3067) 2025-10-13 11:26:01 +02:00
Yang Liu 6fbb827955 [LA64_DYNAREC] Fixed non-lbt path INC/DEC opcodes register conflicts (#3066) 2025-10-13 11:25:25 +02:00
Yang Liu 80610037cd [LA64_DYNAREC] Fixed some oversized load (#3065) 2025-10-13 10:19:01 +02:00
Yang Liu bbd22d76be [INTERP] Fixed 16bit PUSH/POP opcodes (#3064) 2025-10-13 09:40:58 +02:00
Yang Liu 256632ea4c [INTERP] Improved cosim handling on 16bit BT/BTS/BTR/BTC opcodes (#3063) 2025-10-12 21:02:42 +02:00
Yang Liu f5eff13acc [RV64_DYNAREC] Fixed some 16bit BT/BTS/BTR/BTC opcodes (#3062) 2025-10-12 20:29:35 +02:00
ptitSeb 7b66c024f0 [DYNACACHE] Allow Dynacache to be serialized when _exit is used 2025-10-12 14:52:49 +02:00
Yang Liu af437fa354 [ARM64_DYNAREC] Fixed a typo in iret_to_epilog (#3059) 2025-10-12 09:09:12 +02:00
Yang Liu 2a559622c9 [INTERP] Fixed GetECommon_16 truncation (#3058) 2025-10-12 09:08:43 +02:00
Yang Liu 494428dbbe [DYNAREC] Fixed negative issues with 0F/F0 A3/AB/B3/BB opcodes (#3057) 2025-10-11 20:15:10 +02:00
Yang Liu a40b6d49cb [RV64_DYNAREC] Fixed some missing sse_forget_reg for implicit xmm0 (#3056) 2025-10-11 19:27:58 +02:00
Yang Liu a5b3c0af5e [INTERP] Fixed a typo in 0F C7 /1 CMPXCHG16B opcode (#3055) 2025-10-11 17:07:29 +02:00
Yang Liu 276e67f329 [INTERP] Fixed a typo in AVX 0F 38 F5 BZHI opcode (#3054) 2025-10-11 14:27:10 +02:00
Yang Liu 56684a2f67 [RV64_DYNAREC] Fixed a typo in 16bit ROR/ROL opcodes (#3053) 2025-10-11 14:25:30 +02:00
Yang Liu 56b4de3b84 [DYNAREC] Fixed some oversized memory load (#3051)
* [DYNAREC] Fixed some oversized memory load

* review
2025-10-10 22:35:59 +02:00
ptitSeb 275c25a048 [INTERP] Fixed 66 E8/E9/EA opcodes in 32bits mode 2025-10-10 16:22:41 +02:00
ptitSeb 0a0228eae2 [ARM64_DYNAREC] Changed BSF/BSR to not changed Ed if Gd==0 (seems current cpu does this) 2025-10-10 16:21:50 +02:00
Yang Liu 65b6f716d5 [DYNAREC] Fixed 66 8D opcode and also a regression introduced in last commit (#3050) 2025-10-10 15:59:31 +02:00
Yang Liu 70ab16a6d6 [DYNAREC][INTERP] Fixed an edge case of CMPXHG (#3049) 2025-10-10 14:45:50 +02:00
ptitSeb 74d4db051b [WRAPPER] Fixed one wrapped function signature (for #3048) 2025-10-10 13:27:19 +02:00
ptitSeb 41f61cf702 [ARM64_DYNAREC] Don't assume x1 is xRIP in link_next (fix regression introduced with 685afa2302) 2025-10-10 13:19:29 +02:00
Yang Liu f0eab197be [DYNAREC] Fixed a special case of SHLD/SHRD opcodes (#3047) 2025-10-10 11:39:02 +02:00
Yang Liu 6250f03b09 [DYNAREC][INTERP] Added a few multibyte nops (#3046) 2025-10-10 10:38:04 +02:00
ptitSeb 535798a730 [BOX32][WRAPPER] Added a missing 32bits function to libc 2025-10-09 14:37:07 +02:00
ptitSeb 89e5c644d0 [BOX32][WRAPPER] Improved glob(64) support 2025-10-09 10:23:29 +02:00
ptitSeb 2ae7402fd7 [BOX32][WRAPPER] Fixed a regression with FT_Done_Face just introduced earlier 2025-10-08 17:16:56 +02:00
ptitSeb 18d95a4627 [BOX32][WRAPPER] Added some more 32bits wrapped functions to libfreetype 2025-10-08 16:57:48 +02:00
ptitSeb b6c9cc93fb [BOX32][WRAPPER] Added 1 more wrapped function to libdbus 2025-10-08 16:41:54 +02:00
ptitSeb 4cc74f45eb [BOX32][WRAPPER] Added 1 more wrapped function to libm 2025-10-08 16:37:25 +02:00
ptitSeb 9892089325 [BOX32][WRAPPER] Added a few more libc 32bits wrapped functions 2025-10-08 16:33:41 +02:00
ptitSeb a029fca7bd [BOX32][WRAPPER] more 32bits wrapped function to libxrandr 2025-10-08 16:20:41 +02:00
ptitSeb 3cfe54f8cf [BOX32][WRAPPER] Added 2 more 32bits functions to libfontconfig 2025-10-08 15:59:23 +02:00
ptitSeb 297dc34799 [BOX32][WRAPPER] Added some more libfreetype wrapped functions 2025-10-08 15:50:48 +02:00
ptitSeb c0ec7eb2bf [BOX32][WRAPPER] Added 1 more 32bits wrapped function to libmount 2025-10-08 14:22:07 +02:00
ptitSeb c33e39bd25 [BOX32][WRAPPER] Added some more libc 32bits wrapped functions 2025-10-08 14:15:05 +02:00
ptitSeb 1dd9b23022 [BOX32][WRAPPER] Added 2 wrapped functions that are misnamed in some programs 2025-10-08 13:57:56 +02:00
ptitSeb 63592011fe [ARM64_DYNAREC] Use UDF for UD2 & unsupported WBINVD 2025-10-07 15:34:20 +02:00
BrunoSX 73238883cb Fixed mmap tracking with MAP_NORESERVE flag on Android (#3044) 2025-10-06 22:14:22 +02:00
Chi-Kuan Chiu 73aed7fd0e [Docs] Add glibc capability warning and fix typo (#3043)
* Fix typo

* Add glibc capability warning
2025-10-06 20:22:49 +02:00
xctan e8ed70905c [DYNAREC] Optimized scalar AES impl in DynaRec (#3041)
* [DYNAREC] Optimized scalar AES impl

* [RV64_DYNAREC] Optimized AES with RVV

* [CI] Bump RISC-V toolchains

* [RV64_DYNAREC] Switch to scalar impl when xtheadvector is present

* [RV64_DYNAREC] Try to disable rvv aes kernels

* [RV64_DYNAREC] Reverted assembly aes functions
2025-10-05 09:56:07 +02:00
ptitSeb f9aa5651cc [BOX32][DYNAREC] Small fix on 32bits SIGILL handling 2025-10-03 18:15:21 +02:00
ptitSeb b1c10d5ccd [DYNAREC] Small fix on SIGILL handling 2025-10-03 17:37:12 +02:00
ptitSeb 7bf2caa5c4 [DYNAREC] Added BOX64_DYNAREC_NOHOTPAGE to disabled hotpage detection 2025-10-03 15:45:11 +02:00
ptitSeb 6ae0524da6 Made SIGILL traced behind BOX64_SHOWSEGV=1, like SIGSEGV 2025-10-03 15:43:19 +02:00
ptitSeb 5768989e54 [DYNAREC] Fixe a speed regression introduced with 3fe020572d (for #3038) 2025-10-03 10:35:08 +02:00
ptitSeb c4c9f1b8cd [INTERP] Fixed regression introduced with latest change on IRET opcode 2025-10-02 10:07:52 +02:00
ptitSeb d547fe4d37 [ARM64_DYNAREC] Small improvment on some invalid opcode handling 2025-10-01 15:57:49 +02:00
ptitSeb 118f4cf3b4 [INTERP] Don't print unsupported opcode on known invalid opcodes 2025-10-01 15:56:56 +02:00
ptitSeb 5ac53d6be2 [TRACE] Added tooling to check if x86/x64 opcode is valid 2025-10-01 15:56:05 +02:00
ptitSeb a02873b9ee [TRACE] Allow both v3 and v4 of libZydis to be on the system 2025-10-01 14:06:04 +02:00
ptitSeb ba9731838e [TRACE] Small improvment in x64 decoder trace when decoder fails 2025-09-30 19:07:42 +02:00
ptitSeb 7c064ef16c [INTERP] Fixed a regression with previous commit 2025-09-29 14:25:52 +02:00
ptitSeb 84756e1ada [INTERP] Better handling of boggus selector for IRET & JMP FAR 2025-09-29 13:31:42 +02:00
ptitSeb a37f7d1800 [ARM64_DYNAREC] Improved IRET handling of boggus parameters 2025-09-29 13:31:15 +02:00
ptitSeb 86dde8c1f7 Improved TF handling 2025-09-29 12:47:36 +02:00
Yang Liu e48881715a [RV64_DYNAREC] Added more scalar avx opcodes (#3037) 2025-09-29 12:12:12 +02:00
definitelyuncertain 79e3d00e35 Explicitly link standard libs through CMake (#3035)
* Explicitly link standard libs through CMake

* Also keep the original link flags
2025-09-27 14:10:12 +02:00
Yang Liu 9b2bef153b [WRAPPER] Wrapped a few more crypto3 symbols (#3034) 2025-09-27 09:46:16 +02:00
Yang Liu 4d7e9ccf51 [RV64_DYNAREC] Fixed a scratch register confliction (#3033) 2025-09-27 08:53:09 +02:00
ptitSeb 8f5613055d [ARM64_DYNAREC] Added more variant of INS/OUT opcodes 2025-09-24 21:23:48 +02:00
ptitSeb 501e8a77ec [INTERP] Added more variant of INS/OUT opcodes 2025-09-24 21:22:36 +02:00
ptitSeb 0e90b94272 [ARM64_DYNAREC] Fixed flags for 8bits imul 2025-09-24 20:38:27 +02:00
ptitSeb 7889934ffa [RCFILE][BOX32] Fine tuned steam profile 2025-09-24 11:03:37 +02:00
Yang Liu 3dfd5bf4b0 RV64_DYNAREC] Added more avx scalar opcodes (#3029) 2025-09-22 16:35:23 +02:00
ptitSeb c605e4630e [RCFILE] Added 2 more game profiles 2025-09-22 16:03:05 +02:00
Yang Liu bad4d13c09 [RV64_DYNAREC] Added more avx scalar opcodes (#3028) 2025-09-22 10:53:52 +02:00
Leslie Zhai 5bfb27d3fa [LA64_DYNAREC] Refactor register mapping (#2940)
* [LA64_DYNAREC] Refactor register mapping

* [LA64_DYNAREC] Fix typo

* [LA64_DYNAREC] Remapping xSavedSP to fp ($r22)

* [LA64_DYNAREC] Fix VPCLMULQDQ x3 and x4 issue

* [LA64_DYNAREC] Fix typo

* [LA64_DYNAREC] Fix typo
2025-09-19 08:10:41 +02:00
ptitSeb 0d355aaf01 [LA64] Do not expose AVX by default for now, there are still some issue to fix before 2025-09-17 21:47:23 +02:00
ptitSeb 220b1e6dad [RCFILE] Fine-tune 2 existing games profile 2025-09-17 18:05:49 +02:00
ptitSeb 78833500c8 [ARM64_DYNAREC] Temporarily disable Atomic path for F0 0F B1, as it avoid some games random freeze (like HorizonZeroDawn or Cyberpunk2077) 2025-09-17 17:41:48 +02:00
Yang Liu 1a58da4315 [LA64_DYNAREC] Fixed AVX 0F 17 VMOVHPS opcode (#3025) 2025-09-17 17:04:32 +02:00
ptitSeb 0f4e298142 [ARM64_DYNAREC] Fixed non-Atomic path for F0 0F C0 opcode 2025-09-17 13:47:44 +02:00
Yang Liu c5981dd11c [LA64_DYNAREC] Fixed AVX 66 0F 67 PACKUSWB opcode (#3024) 2025-09-17 12:39:38 +02:00
Yang Liu 24c15e148d [LA64_DYNAREC] Fixed avx infra (#3023) 2025-09-17 12:02:55 +02:00
ptitSeb ea48f2b823 [DYNAREC] Improved Memory Barrier handling for LOCK prefixed opcodes 2025-09-16 17:44:27 +02:00
ptitSeb 85b07f7441 [ARM64_DYNAREC] Allow use of Native flags when using UFLAG_IF macro helper 2025-09-15 19:02:42 +02:00
Yang Liu c4f5b7c062 [BOX32][TRACE] Fixed chdir tracing (#3021) 2025-09-15 18:48:11 +02:00
ptitSeb 04c1998f1c [RCFILE] Added 1 more game profile 2025-09-14 15:38:43 +02:00
ptitSeb 775c1c19ec [WRAPPER] Added wrapped libblas.so.3 and liblapack.so.3 2025-09-14 15:07:48 +02:00
ptitSeb f077b28459 Small improvment in steam handling 2025-09-14 14:11:22 +02:00
ptitSeb c08fb5d53d [DYNAREC][TRACE] Show if will run Inter or Dynarec when using LongJump to resume emulation after signal 2025-09-14 14:11:04 +02:00
ptitSeb 365b6d57df [INTERP] Better handling of Unimplemented / Invalid opcodes 2025-09-14 14:10:09 +02:00
ptitSeb ef117f726c [RCFILE] Added profile for 2 more games 2025-09-14 09:06:11 +02:00
ptitSeb 52fe2485ae [DYNAREC] Small refactor on StrongMem emulator and lock prefix 2025-09-13 12:53:55 +02:00
ptitSeb 2c6816be8f Update release.yml
Another fix for TERMUX CI
2025-09-12 19:47:38 +02:00
ptitSeb 965e2c93eb Update release.yml
Fixed TERMUX env. setup
2025-09-12 18:46:15 +02:00
ptitSeb fe343190d8 [DYNAREC] Fixed volatile metadata parser that would ignore rage[0] 2025-09-12 17:45:15 +02:00
Chi-Kuan Chiu e514f75c8e [Docs] Add practical cross-compilation details (#3017)
Previous instructions did not mention that users must rename the
`x64lib` folder before placing it in the library search path. Added
examples for x86_64 and i386 to clarify the installation process.
2025-09-12 12:44:45 +02:00
Yang Liu 1dbb057dec [RV64_DYNAREC] Added more scalar avx cmp opcodes (#3016) 2025-09-11 07:44:22 +02:00
ptitSeb 5bd7b24be3 [RCFILE] Added 1 more game profile 2025-09-10 16:44:02 +02:00
ptitSeb f216fda9c1 [ANDROID] Fixing build 2025-09-10 16:17:11 +02:00
ptitSeb 93fc3be3df [BOX32] More work on box32 memory management and threads 2025-09-10 15:44:29 +02:00
ptitSeb d509261f81 [BOX32] Some improvment to box32 memory managment and thread handling 2025-09-10 11:28:59 +02:00
ptitSeb 7862e8a3d5 [BOX32][WRAPPING] Wrapped 2 more functions on libGL (for #2826) 2025-09-10 10:24:24 +02:00
ptitSeb 7acdd87198 [DYNAREC] Fully trust volatile metadata when they are present (fixes Starfield freeze) 2025-09-09 11:59:29 +02:00
Yang Liu 4fb9c658a1 [RV64_DYNAREC] Added more scalar avx opcodes (#3010) 2025-09-09 10:17:21 +02:00
Yang Liu c6bb8b335a [RV64_DYNAREC] Added more scalar avx opcodes and fixed a typo (#3009) 2025-09-08 21:30:04 +02:00
ptitSeb 464fdc3ebe [BOX32] Various small improvments on box32, mostly on memory tracking 2025-09-08 20:45:12 +02:00
ptitSeb 6b9ed18286 [BOX32] Fixed some conversion issues 2025-09-08 19:07:05 +02:00
ptitSeb dca2b99c91 [TRACE] Fixed some typos 2025-09-08 14:21:25 +02:00
ptitSeb 6f144aa429 [ARM64_DYNAREC] A few minor fixes to some opcodes 2025-09-08 11:54:42 +02:00
ptitSeb e5c1e3a2a2 [INTERP] Small fixes in a few rarely used opcodes 2025-09-08 11:53:21 +02:00
ptitSeb e7d2cf5538 [DOCS] Some small fixing / precision in a few doc items 2025-09-08 11:27:37 +02:00
ptitSeb 427f1b8c55 [WRAPPER] Improved wayland wrapping (Unity games seems to run on Wayland now) 2025-09-05 21:08:58 +02:00
ptitSeb f639357591 [WRAPPER] Added VK_ARM_data_graph extension to vulkan wrapper (for #3008) 2025-09-05 10:39:26 +02:00
Yang Liu 49b69ad122 [BOX32] Fixed dirname (#3007) 2025-09-05 09:45:04 +02:00
Yang Liu 1ef35d5d8b [BOX32] Fixed some strange XErrorEvent case (#3006) 2025-09-04 18:18:44 +02:00
ptitSeb 65b7909f6e [BOX32][WRAPPER] Added 1 more symbol to libc 2025-09-04 16:15:13 +02:00
ptitSeb c8c707e7cc [ARM64_DYNAREC] Added some more UD handling in 64bits dynarec 2025-09-04 12:03:19 +02:00
Yang Liu 6440aac9e1 [BOX32] Fixed sign-extend issue when calling RunFunctionFmt with a pointer (#2938) 2025-09-04 11:26:39 +02:00
Yang Liu 4edba2e67a [RV64_DYNAREC] Added more scalar avx opcodes (#3005) 2025-09-04 09:35:12 +02:00
ptitSeb 6b41f28e2b [WOWBOX64] Fixed build 2025-09-03 22:19:24 +02:00
ptitSeb 5e02758713 Make sure to use custom allocator for everything Env related 2025-09-03 18:29:46 +02:00
ptitSeb ff9b2a235b [TRACE] Small improvment for memory allocator trace 2025-09-03 18:29:04 +02:00
ptitSeb be2f566fbf [DYNAREC] Better handling of 32bits 2E & 36 prefix (silent some false negative with Cosim on some multi-bytes NOP) 2025-09-03 18:28:07 +02:00
ptitSeb 08944bc7ca [DYNAREC] Use a static array for preds temporary, like all the other dynarec array 2025-09-03 18:26:20 +02:00
Yang Liu ade6843d3a Removed a useless file (#3001) 2025-09-03 10:04:04 +02:00
theofficialgmanandYang Liu 2de6058c6a [CI] Added ARM64-GCC-8 target (Ubuntu Bionic) (#2987)
* add ARM64-GCC-8 target

uses taiki-e/checkout-action@v1 instead of actions/checkout@v4 due to ubuntu bionic container not having new enough nodejs or glibc to run most github actions

does not build build Trace target due to ubuntu bionic not having the libzydis-dev package

adds cmake ppa for a newer cmake version that box64 requires

uses gcc-8 specifically (instead of bionic's default gcc-7) due to  historically better compatibility with box64 (and it has been used for years now by installation scripts and other ci such as https://github.com/Pi-Apps-Coders/box64-debs)

* comptibility for old glibc

* nodejs

* zstd

* exclude static build

---------

Co-authored-by: Yang Liu <[email protected]>
2025-09-03 08:10:28 +02:00
Yang Liu 986e271280 Minor updates to README.md (#3000) 2025-09-03 08:09:36 +02:00
ptitSeb 578009cccf [WRAPPER] Added experimental cuda wrapping 2025-09-02 21:20:00 +02:00
Yang Liu 94c40d99f6 [BASH] Use custom PS1 prefix to make box64-bash more distinguishable (#2998)
* [BASH] Use custom PS1 prefix to make box64-bash more distinguishable

* quick fix

* tweaks

* review
2025-09-02 21:18:30 +02:00
Yang Liu 28d07f9bf0 [WRAPPERHELPER] Added legacy __attribute support (#2996) 2025-09-02 12:02:42 +02:00
Yang Liu 994ce41adc [WRAPPER] Wrapped a bunch of symbols (#2997) 2025-09-02 11:34:06 +02:00
ptitSeb d890527281 [BOX32] Allow resuming signal directly on dynarec instead of interpretor when possible 2025-09-01 19:41:13 +02:00
Yang Liu 470b8664d2 [RV64_DYNAREC] Added 1 more scalar avx 0F opcode (#2994) 2025-09-01 15:48:21 +02:00
Yang Liu b31e522eb2 [CI] Speedup CI by skipping uncessary jobs when possible (#2993) 2025-09-01 15:17:42 +02:00
ptitSeb cb3cfa991f [INTERP] Fixed and improved 67 prefixed 32bits opcodes 2025-09-01 15:03:29 +02:00
ptitSeb 4b6766c84b [WRAPPER] Improved some libGL function with callback wrapping 2025-09-01 13:30:24 +02:00
Yang Liu 5e5c972cec [RV64_DYNAREC] Added more scalar avx 0F opcodes (#2992)
* [RV64_DYNAREC] Added more scalar avx 0F opcodes

* review
2025-09-01 13:24:47 +02:00
Yang Liu e5556e90df [INTERP][DYNAREC] Aligned !fastnan handling of 0F 51/52 opcodes (#2989)
* [INTERP] Added !fastnan handling to some 0F opcodes

* [RV64_DYNAREC] Fixed/refined !fastnan handling of some 0F opcodes

* la64

* more fixes
2025-09-01 11:39:21 +02:00
ptitSeb 1edd0eb47d Allow resuming signal directly on dynarec instead of interpretor when possible 2025-09-01 11:00:34 +02:00
Yang Liu f46987b6af [LA64_DYNAREC] Fixed a typo in 0F 53 RCPPS opcode (#2991) 2025-09-01 10:54:31 +02:00
phorcys 2af7492cf8 [LA64_DYNAREC] Fix 0f.A3 BT opcode, fix ALSL operand order. (#2988)
ALSL.D:
tmp = (GR[rj][63:0]<<(sa2+1)) + GR[rk][63:0]
GR[rd] = tmp[63:0]
2025-09-01 08:41:08 +02:00
ptitSeb 1b2515cd49 [ARM64_DYNAREC][TRACE] Fixed SWP B/H opcodes printer 2025-08-31 11:43:31 +02:00
Yang Liu 197f962543 [WRAPPER] Wrapped 2 more symbols for libfreetype (#2984) 2025-08-30 19:18:27 +02:00
Yang Liu 373d778f6a [WRAPPER] Wrapped mallinfo2 for libc (#2983) 2025-08-30 18:10:10 +02:00
ptitSeb fcd1aacef0 [ARM64_DYNAREC] Introduced a dynarec version of the UpdateFlags helper function 2025-08-30 16:23:53 +02:00
Yang Liu 56ae4a35e1 Fixed a misguarded box32 endif (#2982) 2025-08-30 15:44:04 +02:00
Yang Liu 1141516226 [WRAPPER] Wrapped more symbols for libresolv (#2981) 2025-08-30 15:42:47 +02:00
Yang Liu b57cafd93d [RV64_DYNAREC] Added more scalar avx opcodes (#2980) 2025-08-30 14:45:34 +02:00
ptitSeb 60ff412d60 [INTERP] Fixed another regression introduced with #cb2c29c5f992cb4e5ec481f8d99b973b90411403 2025-08-29 17:16:55 +02:00
ptitSeb 87064c15ec [RCFILE] Added 2 more game profiles 2025-08-29 15:21:41 +02:00
Yang Liu 67d6501f54 [LA64_DYNAREC] Fixed AVX VCVT[T]PS2DQ fastround path (#2979) 2025-08-29 14:34:00 +02:00
Yang Liu d0ce4ef913 [RV64_DYNAREC] Added more scalar avx opcodes (#2978) 2025-08-29 09:26:17 +02:00
ptitSeb e863acf0a8 [BOX32][TRACE] Improved trace for nanosleep 2025-08-28 11:04:23 +02:00
ptitSeb 3fe020572d Improved handling of TF flag 2025-08-27 16:17:17 +02:00
Yang Liu 234f6f2b14 [RV64_DYNAREC] Added more scalar avx opcodes (#2975)
* [RV64_DYNAREC] Added more scalar avx opcodes

* fix
2025-08-27 13:29:33 +02:00
ptitSeb bdb4aa5dc6 [INTERP] Fixed a regression introduced with cb2c29c5f9 (fixes Wukong) 2025-08-26 23:00:10 +02:00
ptitSeb cf626c580d [TRACE] Adjusted disabled debug code 2025-08-26 16:20:29 +02:00
Yang Liu 485447850c [RV64_DYNAREC] Added more scalar avx opcodes (#2974) 2025-08-26 14:25:44 +02:00
Yang Liu 709a526217 [RV64_DYNAREC] Added more scalar avx opcodes (#2973)
* [RV64_DYNAREC] Added more scalar avx opcodes

* fix
2025-08-26 10:19:51 +02:00
ptitSeb 1cddcad20a [WRAPPER] Improved pulse wrapping 2025-08-25 19:26:09 +02:00
ptitSeb aa30e665ff [TRACE] Small change on commented code (left for debugging purpose) 2025-08-25 17:00:54 +02:00
ptitSeb 9effd3f711 [INTERP] Fixed a regression introduced with a17811f4a6 2025-08-25 16:44:42 +02:00
Yang Liu d71200de69 [RV64_DYNAREC] Added more scalar avx opcodes (#2971) 2025-08-25 13:36:16 +02:00
Yang Liu 8579ef84bd [RV64_DYNAREC] Added more scalar avx opcodes (#2970) 2025-08-25 10:32:59 +02:00
ptitSeb 747882cb4e [BOX32][WRAPPER] Added one more wrapped function to libc 2025-08-24 12:00:58 +02:00
ptitSeb e76570ad7b [BOX32] Sligtly safer handling of 32bits signals 2025-08-24 12:00:24 +02:00
ptitSeb e964b45894 [BOX32][WRAPPER] Fixed some SIGBUS with 32bits smeaphores 2025-08-24 11:32:04 +02:00
ptitSeb b8526c7920 [BOX32][WRAPPER] Added ftw wrapped function to libc 2025-08-24 11:32:04 +02:00
Yang Liu 2a525b4eb2 [RV64_DYNAREC] Added YMM0 placeholder for later optim (#2968) 2025-08-24 10:29:59 +02:00
ptitSeb cb2c29c5f9 [INTERP] Refactored how 64/65/66/67 and F2/F3 prefixes are handled, removing some (mostly) duplicated code 2025-08-22 18:10:13 +02:00
Yang Liu 3b0977eee1 [RV64_DYNAREC] Fixed scalar avx VCMPPD non-ymm case (#2966) 2025-08-22 17:04:05 +02:00
Yang Liu 893ffe8205 [RV64_DYNAREC] Added more scalar avx opcodes (#2965) 2025-08-22 13:13:04 +02:00
Yang Liu 82a91e717a [ARM64_DYNAREC] Fixed an inst name typo (#2964) 2025-08-22 13:12:17 +02:00
Yang Liu 031d3def2d [RV64_DYNAREC] Added scalar SSE 66 0F 3A 60/61/62 opcodes (#2963)
* [RV64_DYNAREC] Added scalar SSE 66 0F 3A 60/61/62 opcodes

* [CI] Bump timeout
2025-08-22 13:11:51 +02:00
Yang Liu 7c32cb24a0 [RV64_DYNAREC] Added more scalar avx 66 0F opcodes (#2960) 2025-08-22 08:45:14 +02:00
Yang Liu cea8f94358 [RV64_DYNAREC] Added more scalar avx opcodes (#2961) 2025-08-21 23:44:40 +02:00
Yang Liu d476217f4c [RV64_DYNAREC] Fixed more scalar avx opcodes (#2959)
* [RV64_DYNAREC] Fixed more scalar avx opcodes

* oops
2025-08-21 19:15:59 +02:00
Yang Liu 34e789484a [CORE] Better trace_file logging (#2958) 2025-08-21 16:55:10 +02:00
Yang Liu 6a6af076dd [COSIM] Better memory diff printing (#2957) 2025-08-21 15:43:46 +02:00
Yang Liu 5327489f39 [RV64_DYNAREC] Fixed some scalar avx opcodes (#2956) 2025-08-21 15:25:42 +02:00
Yang Liu 392255594b [RV64_DYNAREC] Added more scalar avx 66 0F3A opcodes (#2955) 2025-08-21 13:19:56 +02:00
Yang Liu 8d94d21716 [RV64_DYNAREC] Added more scalar avx 66 0F38 opcodes (#2954)
* [RV64_DYNAREC] Added more scalar avx 66 0F38 opcodes

* fix
2025-08-21 13:18:38 +02:00
Yang Liu 44448774a7 [RV64_DYNAREC] Added more scaalr avx opcodes (#2952) 2025-08-19 14:17:10 +02:00
Yang Liu a280884f09 [RV64_DYNAREC] Added more scalar avx opcodes (#2951) 2025-08-19 13:17:02 +02:00
Yang Liu 7435006b7c [RV64_DYNAREC] Added more avx scalar 66 0F38 opcodes (#2950)
* [RV64_DYNAREC] Added more avx scalar 66 0F38 opcodes

* more
2025-08-19 12:26:42 +02:00
Yang Liu 1c2e763ffb [RV64_DYNAREC] Added a few more scalar AVX 66 0F38 opcodes (#2949) 2025-08-18 14:12:24 +02:00
Yang Liu 5f144d8ddd [RV64_DYNAREC] Added scalar AVX VMOVDQA opcodes (#2948) 2025-08-18 12:42:28 +02:00
Yang Liu 0a53d2223a [DYNAREC] Bump ARCH_VERSION (#2947) 2025-08-18 12:41:47 +02:00
Yang Liu fe2930cbe3 [LA64_DYNAREC] Enable AVX/AVX2 by default (#2946) 2025-08-18 12:41:10 +02:00
Yang Liu bf6c1533b3 [RV64_DYNAREC] Added more scalar AVX opcodes (#2945) 2025-08-18 12:40:11 +02:00
Yang Liu 167217c76b [LA64_DYNAREC] Added more scalar AVX opcodes (#2943) 2025-08-15 21:09:44 +02:00
Yang Liu f615a10fe1 [RV64_DYNAREC] Added more scalar AVX VMOV opcodes (#2942)
* [RV64_DYNAREC] Added more scalar AVX VMOV opcodes

* more
2025-08-15 20:13:04 +02:00
Yang Liu 2d60c8c5b9 [RV64_DYNAREC] Added scalar AVX VMOVSS opcodes (#2941) 2025-08-15 14:18:38 +02:00
phorcys 270ce3750e [LA64_DYNAREC] Add la64 BMI/BMI2 ops. (#2933)
VEX.0F.38  BLSR, BLSMSK, BLSI, BZHI, BEXTR
VEX.F2.0F.38 PDEP, MULX
VEX.F3.0F.38 PEXT
2025-08-15 14:16:58 +02:00
Yang Liu 83e2427bfe [RV64_DYNAREC] Fixed OF2 handling (#2937) 2025-08-15 00:17:31 +02:00
Yang Liu 3815c28bfe [DYNAREC] Fixed reading emu->df (#2936) 2025-08-15 00:16:34 +02:00
phorcys 5144a2e286 [LA64_DYNAREC] Fix VMOVNTDQA. (#2934) 2025-08-15 00:13:16 +02:00
phorcys febaf31b93 [LA64_DYNAREC] Add la64 avx insts using helpers. (#2935)
VEX.66.0F.38 VAESIMC, VAESENC, VAESENCLAST, VAESDEC, VAESDECLAST
VEX.66.0F.3a  VPCLMULQDQ, VAESKEYGENASSIST
2025-08-15 00:09:27 +02:00
Yang Liu af057e309a [RV64_DYNAREC] Removed a dispensable line from dump (#2932) 2025-08-13 20:37:39 +02:00
Yang Liu db864b6aa6 [LA64_DYNAREC] Fixed a typo in CMPXCHG8B opcode (#2931) 2025-08-13 13:24:01 +02:00
Yang Liu 3793e595f0 [DYNAREC] Rearranged arch-specific AVX infra code (#2930) 2025-08-13 13:21:51 +02:00
phorcys abe29cc0ba [LA64_DYNAREC] Fix B3 BTR eflags when cpuext.lbt == 1. Fix 16bits AND when cpuext.lbt == 1. (#2929) 2025-08-12 14:38:15 +02:00
Yang Liu c4e50cdbb1 [RV64_DYNAREC] Added F0 08 LOCK OR opcode (#2928) 2025-08-12 00:05:22 +02:00
Yang Liu dce81673af [RV64_DYNAREC] Fixed F0 10 LOCK ADC opcode (#2927) 2025-08-11 15:32:13 +02:00
Yang Liu df2e4f941f [RV64_DYNAREC][LA64_DYNAREC] Fixed missing zeroup in geted_32() (#2921) 2025-08-08 14:40:42 +02:00
Yang Liu efd01c1126 [LA64_DYNAREC] Fixed AVX VPMOVMSKB opcode (#2920) 2025-08-07 23:25:30 +02:00
Yang Liu 197e5e440d [LA64_DYNAREC] Fixed AVX VPERM2F128/VPERM2I128 opcodes (#2919) 2025-08-07 23:24:47 +02:00
Yang Liu eff93582a7 [LA64_DYNAREC] Fixed AVX VMASKMOVDQU opcode (#2918) 2025-08-07 23:23:33 +02:00
Yang Liu 1535907f2d [LA64_DYNAREC] Fixed AVX VPBLENDW opcodes (#2917) 2025-08-07 23:21:52 +02:00
Yang Liu 9eb1642ec8 [LA64_DYNAREC] Fixed AVX VMOVMSKPS/VMOVMSKPD opcodes (#2916) 2025-08-07 23:20:23 +02:00
Yang Liu c85072e4d3 [LA64_DYNAREC] Fixed AVX VMOVSS opcode (#2915) 2025-08-07 23:19:28 +02:00
Yang Liu e1b6976528 [LA64_DYNAREC] Fixed AVX VCMPSS/VCMPSD opcodes (#2914) 2025-08-07 23:18:32 +02:00
Yang Liu a9aff45bf2 [LA64_DYNAREC] Fixed some AVX scalar MIN/MAX opcodes (#2913) 2025-08-07 23:17:30 +02:00
Yang Liu c59b9f2686 [LA64_DYNAREC] Refined F3 0F 5D/5F MINSS/MAXSS opcodes (#2912) 2025-08-07 23:15:47 +02:00
Yang Liu 98431d8cf5 [BOX32] Enlarge xcb connects size for Linux Steam (#2910) 2025-08-07 12:35:42 +02:00
Yang Liu a083025565 [ARM64_DYNAREC] Fixed AVX VMOVMSKPD opcode (#2909) 2025-08-06 17:26:57 +02:00
Yang Liu 309dad99b4 [ARM64_DYNAREC] Fixed AVX VMOVSS opcode (#2908) 2025-08-06 17:23:40 +02:00
Yang Liu c2c5d3b836 [ARM64_DYNAREC][INTERP] Fixed AVX VPERM2F128/VPERM2I128 opcodes (#2907) 2025-08-06 17:22:32 +02:00
Yang Liu 87baa884d2 [LA64_DYNAREC] Fixed 66 0F 3A 16 PEXTRD opcode (#2906) 2025-08-06 10:42:50 +02:00
Yang Liu 442d6a262b [LA64_DYNAREC] Fixed 66 F3 0F B8 POPCNT opcode (#2905) 2025-08-06 10:41:22 +02:00
Yang Liu 47dbadb4d4 [RV64_DYNAREC] Added 1 more opcode (#2903) 2025-08-06 10:35:17 +02:00
Yang Liu 676efe4032 [LA64_DYNAREC] Added more opcodes (#2902) 2025-08-06 10:34:37 +02:00
Chi-Kuan ChiuandJim Huang dd7b99ffd1 Add O(1) early-out to eusing cached bounds (#2901)
Add a fast-path in rb_get() and rb_get_64() that checks the tree’s
cached leftmost->start and rightmost->end bounds before calling
find_addr(). If the query address lies outside the address bounds,
we return 0 immediately, avoiding an unnecessary tree walk.

This mirrors the idea used in jserv/rbtree’s rb_cached_contains(),
using cached min/max to short-circuit lookups.

Behavior is unchanged (both functions still return 0 when not found);
only negative lookups become cheaper.

Co-authored-by: Jim Huang <[email protected]>
2025-08-05 23:43:12 +02:00
Leslie Zhai f82c5440b7 [WRAPPER] Wrapped g_thread_pool some functions (#2900) 2025-08-05 14:33:45 +02:00
ptitSeb c9d5e8bfc3 [RCFILE] Added 1 more game profile 2025-08-05 13:52:52 +02:00
Leslie Zhai 7e5598d0db [WRAPPER] Wrapped g_async_queue_new_full, g_async_queue_push_sorted, (#2899)
g_thread_pool_free, g_thread_pool_new and g_thread_pool_push
2025-08-05 12:01:52 +02:00
Max Parry 9d5b2f3cc5 [DOCS] Fix typo in link (#2898)
1-byte change, I know, I know.
2025-08-05 10:24:39 +02:00
Leslie Zhai 1eba5b1af6 [WRAPPER] Wrapped g_object_add_toggle_ref, g_object_remove_toggle_ref (#2897)
and g_object_weak_unref
2025-08-05 10:23:49 +02:00
Leslie Zhai daeff6fc41 [WRAPPER] Wrapped g_type_module_use, g_type_module_register_type and g_type_module_add_interface (#2895)
* [WRAPPER] Wrapped g_type_module_use, g_type_module_register_type and g_type_module_add_interface

* [WRAPPER] Removed duplicated my_GInterfaceInfo_t
2025-08-05 08:22:01 +02:00
Yang Liu 368f14b4ce [LA64_DYNAREC] Fixed F3 0F 53 RCPSS opcode (#2892) 2025-08-04 14:35:32 +02:00
Yang Liu f480ae4459 [LA64_DYNAREC] Fixed 66 0F 3A 0F PALIGNR for case where dst==src (#2894) 2025-08-04 14:35:04 +02:00
Yang Liu bfb2d14fee [LA64_DYNAREC] Fixed 66 0F 38 06 PHSUBD opcode (#2893) 2025-08-04 14:34:12 +02:00
Yang Liu bef83b6c03 [LA64_DYNAREC] Fixed 66 0F 3A 21 INSERTPS opcode (#2891) 2025-08-04 13:56:27 +02:00
Yang Liu f4cd829c82 [LA64_DYNAREC] Added and optimized more fastround=0 cases (#2890) 2025-08-04 13:52:28 +02:00
ptitSeb 7b0ecf9f6c [STEAM] Added PROTON_USE_WOW64 to the script generated by install_steam.sh 2025-08-04 13:28:52 +02:00
phorcys c769330d92 [LA64_DYNAREC] Fix some la64 ops. (#2889)
Fix 0F.BA./7 BTS CF when cpuext.lbt == 1
Fix 66.0F.CF BSWAP 16bits ops.
Fix VEXTRACTF128, VINSERTF128
2025-08-04 13:24:50 +02:00
Yang Liu afe466b051 [LA64_DYNAREC] Fixed 66 0F 38 14 BLENDVPS opcode (#2888) 2025-08-04 11:28:11 +02:00
Yang Liu 4bb4e45836 [LA64_DYNAREC] Fixed 66 0F 3A 0C/0D BLENDPS/D opcodes (#2887) 2025-08-04 11:27:17 +02:00
Yang Liu cbd1f487c7 [LA64_DYNAREC] Fixed a few GETEX usage (#2886) 2025-08-04 10:52:23 +02:00
Yang Liu 926176c1b5 [LA64_DYNAREC] Fixed 0F E2 PSRAD opcode (#2885) 2025-08-04 10:48:37 +02:00
Yang Liu aac7345603 [LA64_DYNAREC] Fixed 0F E3 PAVGW opcode (#2884) 2025-08-04 10:48:04 +02:00
phorcys 0dc9f8cb62 [LA64_DYNAREC] Add la64 avx bit ops. (#2873)
*  VEX.66.0F.3A VPEXTRB/VPEXTRW/VPEXTRD/VPEXTRQ VPINSRB/VPINSRD/VPINSRQ
  *  VEX.66.0F.C5 VPEXTRW
  *  VEX.66.0f.C4 VPINSRW
  *  VEX.66.0F.38.41 VPHMINPOSUW
2025-08-04 08:57:32 +02:00
phorcys cb0b274c27 [LA64_DYNAREC] Fix some la64 avx/sse ops. (#2882)
Fix 66.0F.F3 PSLLQ
Fix VEX.66.0F.7E VMOVD not zero-extend
Fix Vex.66.0F.3A.06 VPERM2F128/VPERM2I128
Fix Vex.66.0F.3A.0D VBLENDPD
Fix VEX.66.0F.3A.18/38 VINSERTF128/VINSERTI128  when q0 == q1 or q0 == q2
Fix VEX.66.0F.3A.21 VINSERTPS fix u8 get pos
Fix VEX.66.0F.3A.40 VDPPS Fix VREPLVEIxy emit when vex.l
Fix VEX.66.0F.38.0C VPERMILPS
Fix VEX.66.0F.38.2B VPACKUSDW
Fix VEX.66.0F.38.93 VGATHERQPD
2025-08-02 14:42:05 +02:00
Yang Liu ebac583441 [RV64_DYNAREC] Fixed scalar version of 66 0F 3A 21 INSERTPS opcode (#2881) 2025-08-02 12:48:38 +02:00
Yang Liu 6221b01976 [RV64_DYNAREC] Fixed scalar and vector versions of mmx PSRAW/PSRAD (#2880) 2025-08-02 12:47:30 +02:00
Yang Liu caac35cc1e [RV64_DYNAREC] Fixed some mmx opcodes (#2879) 2025-08-02 12:00:04 +02:00
Yang Liu f7302ecb1b [ARM64_DYNAREC] Fixed PCMPESTRI fastpath SF flag computation (#2876) 2025-08-01 19:44:02 +02:00
Yang Liu 4c30838448 [INTERP] Fixed 16bit version POPCNT (#2877) 2025-08-01 19:30:45 +02:00
Yang Liu ded60bbabd [ARM64_DYNAREC] Fixed a typo (#2875) 2025-08-01 15:59:33 +02:00
Yang Liu c2805b0f9b [ARM64_DYNAREC] Fixed some edge cases for mmx PSRLQ (#2874) 2025-08-01 12:55:55 +02:00
phorcys 7e9775de94 [LA64_DYNAREC] Add la64 avx cvt ops, part 3. (#2869)
Double <=> Integer convert.
Half Float <=> Integer convert.
VCVT{DQ2PD, PD2DQ, TPD2DQ}
VCVT{SI2SD, SD2SI, TSD2SI}
VCVT{PH2PS, PS2PH}
2025-08-01 11:49:29 +02:00
Yang Liu ae0ac5a1d0 [INTERP] Added 66 F0 0F BA BTS opcode (#2872) 2025-08-01 11:48:02 +02:00
Yang Liu ea804a5261 [TRACE] Minor improvements to trace logging (#2871) 2025-08-01 11:46:49 +02:00
ptitSeb a17811f4a6 [INTERP] Try to improve aligned LOCK CMPXCHG8B opcode 2025-08-01 11:12:43 +02:00
ptitSeb d2c77ddb01 [RCFIEL] Improved a profile 2025-08-01 11:12:15 +02:00
Yang Liu 6c438a5e65 [WRAPPED] Wrapped more functions for libc (#2870)
* [WRAPPED] Wrapped more functions for libc

* review
2025-08-01 11:11:26 +02:00
phorcys 6da5698c02 [LA64_DYNAREC] Add la64 avx cvt ops, part2. (#2866)
Integer <=> Float convert.
VCVT{DQ2PS, PS2DQ, TPS2DQ}
VCVT{SI2SS, SS2SI, TSS2SI}
2025-08-01 08:17:23 +02:00
ptitSeb ecbe739f52 [WRAPPER] Added 1 more wrapped function to libavcodec58 2025-07-31 21:05:40 +02:00
ptitSeb 27312d7a15 [WRAPPER] Added __powl_finite wrapping to libm (for #2862) 2025-07-31 21:01:16 +02:00
Yang Liu d19a3d987b [RV64_DYNAREC] Fixed a typo (#2865) 2025-07-31 12:10:09 +02:00
phorcys d33706065d [LA64_DYNAREC] Add la64 avx cvt ops, part1. (#2859)
Double <=> Float  ops, VROUND ops.

VCVT{PD2PS,PS2PD, SD2SS, SS2SD}
Round{PD,PS,SD,SS}
2025-07-31 11:21:57 +02:00
Yang Liu 97a78f2d98 Minor improvements to trace logging (#2861) 2025-07-31 08:06:56 +02:00
Fathi Boudra ec0e1077c9 Box64 bundle x86 libs improvements (#2839)
* box64-bundle-x86-libs.csv: fix glibc i686 checksum

glibc i686 checksum is the same as the x86_64 version.
It's a copy paste error. Fix the correct checksum.
Also sort the file content so it's easier to figure out the package
source and read potential mistakes.

Signed-off-by: Fathi Boudra <[email protected]>

* box64-bundle-x86-libs.sh: rewrite the bundle libraries script

Heavily based on Luke's original work, the main improvements:
* portable:
  - it's a POSIX shell script, doesn't rely on bash anymore
  - reduce tool dependencies (use only awk, instead of awk and cut)
* more robust:
  - clean up on exit/errors
  - retry logic with curl
  - check tools availability
  - fails on checksums errors
* more readable
* fixed duplicated removal libraries that can't be emulated
* passed shellcheck analysis tool

Signed-off-by: Fathi Boudra <[email protected]>

---------

Signed-off-by: Fathi Boudra <[email protected]>
2025-07-30 20:20:41 +02:00
phorcys 127d72da17 [LA64_DYNAREC] Add la64 avx cmp ops, part3. TEST ops. (#2857)
VPTEST
VTESTPD, VTESTPS
2025-07-30 08:34:35 +02:00
Yang Liu f2baa6ed35 [RV64_DYNAREC] Added MMX handling to fpu_{push,pop}cache for vector (#2858) 2025-07-30 08:33:23 +02:00
phorcys 5fd843750f [LA64_DYNAREC] Add la64 avx int cmp ops. (#2856)
VCMP{EQ,GT}{B,W,D,Q}
VCOMISS, VUCOMISS, VCOMISD, VUCOMISD
2025-07-29 17:29:59 +02:00
Yang Liu 8180cb3218 [RV64][LA64] Added partial FLUSHTO0 support (#2855)
* [RV64][LA64] Removed obselete TODOs

* more

* more

* more

* more
2025-07-29 17:28:34 +02:00
ptitSeb 68e16f5154 [WOW64] Removed a warning 2025-07-29 11:49:43 +02:00
ptitSeb 0fd5d67fe3 [ARM+4_DYNAREC] Another fix for STMXCSR opcode when using SSE_FLUSHTO0 2025-07-29 11:44:44 +02:00
ptitSeb f628c37a61 [ARM+4_DYNAREC] Fixed (V)[LD/ST]MXCSR opcodes when using SSE_FLUSHTO0 2025-07-29 11:42:44 +02:00
phorcys 0734efea39 [LA64_DYNAREC] Add la64 avx float cmp ops. (#2854)
VCMPPD,VCMPPS,VCMPSD,VCMPSS
2025-07-29 09:55:40 +02:00
phorcys f43a221ffc [LA64_DYNAREC] Add la64 avx float ops part 3. (#2845)
*  add cpuext.frecipe for LoongArch V1.1
  *  Fix VFRSQRTE in sse op  RSQRTPS/RSQRTSS
  *  Fix VFRECIPE in sse op  RCPPS/RCPSS
  *  V{MAX,MIN}{PD,PS,SD,SS}
  *  VRCPPS,VRCPSS
  *  VRSQRTPS,VRSQRTSS
  *  VSQRT{PD,PS,SD,SS}
2025-07-29 09:08:24 +02:00
ptitSeb 397399fd30 [ARM64_DYNAREC] Improved adjust for REP MOVSx opcode on signal 2025-07-28 13:40:21 +02:00
ptitSeb 3e9f394228 [BOX32] Added some comment on arguments for a syscall 2025-07-28 13:39:24 +02:00
ptitSeb 32e2112ab0 [DYNAREC] Fixed an issue introduced with 48ae536d95 and properly address the underlying issue 2025-07-26 10:11:55 +02:00
ptitSeb f0866438fc [WRAPPER][VULKAN] Added 1 new extensions (for #2847, used by PanVK) 2025-07-25 10:20:49 +02:00
Leslie Zhai ec2edd5b3a [WRAPPER] Wrapper wrappedgobject2 g_closure_ref and g_closure_sink (#2848) (#2849)
* [WRAPPER] Wrapper wrappedgobject2 g_closure_ref and g_closure_sink (#2848)

* [WRAPPER] Add testcase for g_closure_ref and g_closure_sink

* [WRAPPER] Just use GO for g_closure_ref|sink|invoke
2025-07-25 10:07:05 +02:00
ptitSeb 4a625db27a [TRACE] More traces for LOG=2 2025-07-24 15:14:23 +02:00
ptitSeb 32cebc6137 [TRACE] Try to preserve errno when tracing 2025-07-24 14:58:35 +02:00
ptitSeb b02b9174e0 [TRACE] Some mor eimprovment to LOG=2 traces 2025-07-24 14:17:52 +02:00
ptitSeb 5b3f675c0d [LA64_DYNAREC] Fixed some issue with ADD/SUB x64 eflags when using LBT extension 2025-07-24 12:05:51 +02:00
ptitSeb a908ce881d [BOX32] Use box64path instead of argv[0] in personality relaunch sequence (could have used execvpe instead) 2025-07-23 13:23:03 +02:00
ptitSeb 49cc5eabcb Some handling of case where signal numbers differs between native and x64 archs (not complete, missing sigset conversions) 2025-07-23 11:13:37 +02:00
Yang Liu bf429a1dcf [RV64_DYNAREC][LA64_DYNAREC] Simplified defered flags handling and limited case where UpdateFlags is actualy called (#2844) 2025-07-23 11:02:23 +02:00
phorcys e1c1303d28 [LA64_DYNAREC] Add la64 avx float ops VDPP{S,D}, VH{ADD,SUB}{PS,PD} (#2842) 2025-07-23 11:01:12 +02:00
ptitSeb 4a8a373662 [BOX32] Better error on box32 personnality re-launch faillure 2025-07-22 19:15:26 +02:00
ptitSeb fff274b45f [WRAPPER] Added more slot to libdbus callback wrappers 2025-07-22 18:57:35 +02:00
ptitSeb 8e1e299395 [WRAPPER] Added 4 more symbols to libwaylandclient 2025-07-22 18:48:27 +02:00
ptitSeb b8d40a8d71 [WRAPPER] Added 1 more function to wrapped libharfbuzz 2025-07-22 18:36:28 +02:00
ptitSeb a3cad12d66 [WRAPPER] Added 2 more wrapped function to libcairo 2025-07-22 18:33:23 +02:00
ptitSeb c4521b3772 [WRAPPER] Added 1 more wrapped function to libfontconfig 2025-07-22 18:11:47 +02:00
ptitSeb 729fbb24d5 [WRAPPER] Added 3 more functions to libcairo 2025-07-22 18:07:01 +02:00
ptitSeb 6740ca196e [WRAPPER] Added some more dbus wrapped functions 2025-07-22 17:53:33 +02:00
Yang Liu 7b755bb6a2 [BOX32] Enable personality setting for RV64 and LA64 (#2841) 2025-07-22 14:37:20 +02:00
phorcys 5f7da532c4 [LA64_DYNAREC] Add la64 avx float arith ops, part 1. (#2840)
*  V{ADD,SUB,MUL,DIV}{PD,PS,SD,SS}
  *  VADDSUB{PD,PS}
2025-07-22 14:36:15 +02:00
phorcys fc1b149fed [LA64_DYNAREC] Add la64 avx FMA insts. (#2838)
* VF{MADD,MSUB,NMADD,NMSUB}{132,213,231}{PD,PS,SD,SS}
  * VFM{ADDSUB,SUBADD}{132,213,231}{PD,PS}
2025-07-22 11:14:45 +02:00
phorcys ea16e05142 [LA64_DYNAREC] add la64 avx pack/unpack ops, part5. (#2837)
INSERT/EXTRACT/BROADCAST/GATHER ops.
VEXTRACTPS,VINSERTPS
VBROADCAST{SD,SS}, VPBROADCAST{B,W,D,Q,I128}
VPGATHER{DD,DQ,QD,QQ,DPD,DPS,QPD,QPS}
2025-07-21 12:06:55 +02:00
ptitSeb 3e74454cf4 [DYNAREC] Another fix for RV64 and LA64 builds 2025-07-21 10:54:38 +02:00
ptitSeb f3a748ae8f [DYNAREC] This should fix build on RV64 and LA64 2025-07-21 10:52:56 +02:00
ptitSeb 5d90fe95e4 [DYNAREC] Consolidate access to native register in signal and register mapping acrross all 3 supported dynarec archs 2025-07-21 10:46:53 +02:00
Yang Liu 8271d37539 [DYNACACHE]LA64] Enabled dynacache for LA64 (#2836)
* [DYNACACHE]LA64] Enabled dynacache for LA64

* review
2025-07-21 08:59:40 +02:00
phorcys 206e3cd561 [LA64_DYNAREC] add la64 avx pack/unpack ops, part4. (#2830)
Shuf/Permute ops.
VSHUFPS, VSHUFPD
VPSHUFD, VPSHUFQ, VPSHUFB, VPSHUFLW, VPSHUFHW
VPERMQ, VPERMD
VPERMPD, VPERMPS
VPERMILPD, VPERMILPS
VPERM2F128, VPERM2I128
2025-07-21 08:16:17 +02:00
Luke Short 5d2a99307e [BUNDLE] Add hidapi (#2833)
Resolves #1809
2025-07-20 21:49:09 +02:00
Luke Short a55cece387 [RCFILE] Update profile for BeamNG (#2832)
Resolves #424
2025-07-20 21:48:26 +02:00
Luke Short ca24435b92 [RCFILE] Add profile for Subnautica (#2831)
Resolves #803
2025-07-20 21:47:57 +02:00
phorcys 0e97b105fe [LA64_DYNAREC] Add la64 avx pack/unpack ops , part 3 blend ops. (#2824)
VBLENDPD, VBLENDPS
VPBLENDW, VPBLENDD, VPBLENDVB
VBLENDVPD, VBLENDVPS
VPALIGNR
2025-07-20 14:25:41 +02:00
Luke Short 2d164c89e2 [BUNDLE] Check for broken symlinks (#2829)
to prevent issues such as #2825
2025-07-19 19:53:54 +02:00
ptitSeb 48ae536d95 [DYNAREC] Change an error to warning, when entering FillBlock64 and current_helper is not cleaned up 2025-07-19 12:25:33 +02:00
ptitSeb b2225e26b1 [WRAPPER] Improved myStackAlignGVariantNew(Va) helper functions, for [RV64] and [LA64] (backported from box86) 2025-07-19 12:07:45 +02:00
ptitSeb 484dc1365e [DYNAREC] Fine tuned DIRTY=1 settings and added 1 game profile to [RCFILE] 2025-07-19 09:25:43 +02:00
Luke Short c9a41ee3ac [BUNDLE] Add ncurses (#2828)
since emulation may be better than the wrapped functions currently.

Related #1942
2025-07-19 08:30:03 +02:00
Luke Short 7f6d18930c [BUNDLE] List install dependencies for Arch Linux (#2827) 2025-07-19 08:25:43 +02:00
phorcys 17ea04766e [LA64_DYNAREC] Add la64 avx pack/unpack ops , part 2. (#2823)
VUNPCK{LPS,LPD,HPS,HPD}
VPUNPCK{LBW,LWD,LDQ,LQDQ,HBW,HWD,HDQ,HQDQ}
2025-07-18 09:36:08 +02:00
Fathi Boudra b1613be0f0 box64-bundle-x86-libs.csv: fix libffi library (#2825)
libffi-devel package is empty and contains only a symlink.
Use the correct package to bundle the library binary.

Signed-off-by: Fathi Boudra <[email protected]>
2025-07-17 18:26:22 +02:00
ptitSeb cdaffe0c1f [RCFILE] Added profile for 1 more game 2025-07-17 14:25:56 +02:00
Luke Short 7fb315c356 [BUNDLE] Add usable libraries from GLIBC package (#2821)
Resolves #2703
2025-07-17 08:14:03 +02:00
phorcys a960e98394 [LA64_DYNAREC] Add la64 avx pack/unpack ops , part 1. (#2818)
VPACKSSWB
VPACKSSDW
VPACKUSWB
VPACKUSDW
2025-07-17 08:10:07 +02:00
ptitSeb ef2f960d4b [ARM64_DYNAREC] Added 64/65 F3 0F 7F opcode 2025-07-16 20:04:20 +02:00
ptitSeb e829cad612 [INTERP] Added 64/65 F3 0F 7F opcode 2025-07-16 20:04:03 +02:00
ptitSeb 609ff66c2c [ARM64_DYNAREC] Small optim on (V/F)COMI(SS/SD) opcodes 2025-07-16 18:52:51 +02:00
Luke Short 1a4bfc2feb [BUNDLE] Add sqlite3 (#2819)
Resolves #2803
2025-07-16 08:14:32 +02:00
ptitSeb e5329d6864 [ARM64_DYNAREC] Fixed a residual issue with xmm unneeded handling when unloading xmm9-xmm15 registers 2025-07-15 13:16:52 +02:00
phorcys 37b1d9ea85 [LA64_DYNAREC] Add la64 avx arith ops, part2. (#2816)
*  VEX.66.0F  VPMADDWD,VPSADBW
  *  VEX.66.0F.38 VPH{ADD,SUB}{W,D,SW}, VPABS{B,W,D} VPMADDUBSW,VPMULHRSW,
  *  VEX.66.0F.3A  VMPSADBW
2025-07-15 12:23:13 +02:00
Yang Liu 98f2460c46 [LA64_DYNAREC] Optimized PMADDUBSW opcodes (#2817) 2025-07-15 11:29:34 +02:00
phorcys 7a4583699b [LA64_DYNAREC] Add la64 avx arith ops , part 1. (#2814)
Add 1:1 avx arith ops.
  *  VP{ADD,SUB}{B,W,D,Q,SB,SW,USB,USW}
  *  VPMUL{DQ,,HW,HUW,Lw,LD,LUDQ}
  *  V{MAX,MIN}{UB,UW,UD,SB,SW,SD}
  *  VAVG{B,W}
  *  VSIGN{B,W,D}
2025-07-14 11:33:26 +02:00
phorcys 26851574ad [LA64_DYNAREC] Fix la64 VMASKMOVPS,VMOVHPD. (#2811)
*  fix la64  VMASKMOVPS,VMOVHPD.
  *  fix arm64 VMASKMOVPS,VMASKMOVPD op memo operand order.
2025-07-14 11:31:57 +02:00
ptitSeb 179cba7a28 Merge remote-tracking branch 'refs/remotes/origin/main' 2025-07-14 10:09:47 +02:00
ptitSeb 0a59321106 Improved Volatile Metadata handling 2025-07-14 10:08:47 +02:00
phorcys ce08e8e27f [LA64_DYNAREC] Add la64 avx shift ops. (#2806)
*  VEX.66.0f    VPSRLW/VPSRLDVPSRLQ/VPSRAW/VPSRAD/VPSLLW/VPSLLD/VPSLLQ
  *  VEX.66.0f.3a VPSRLVD/VPSRLVQ/VPSRAVDVPSLLVD/VPSLLVQ
2025-07-14 08:54:16 +02:00
Yang Liu 6960cfa56f [LA64_DYNAREC] Optimized some SSE shift opcodes (#2813) 2025-07-14 08:53:18 +02:00
phorcys c558bdcb69 [LA64_DYNAREC] Add la64 avx BMI2 shift ops. (#2807)
*  VEX.66.0f.38  SHLX
  *  VEX.f2.0f.38  SHRX
  *  VEX.f3.0f.38  SARX
2025-07-14 08:08:16 +02:00
ptitSeb 0674e546e1 [ANDROID] This should fix the build 2025-07-12 18:36:31 +02:00
ptitSeb 2a10ddc75b [WRAPPER] Added 1 more wrapped function to libpthreads (for #2808) 2025-07-12 17:23:02 +02:00
ptitSeb 8ed08b3bbc [INTERP] Added 64/65 AVX.0F 10/11 opcodes (for #2808) 2025-07-12 11:13:48 +02:00
ptitSeb cf5241ceb3 [ARM64_DYNAREC] Added 0F 00 /0 opcode 2025-07-12 10:52:46 +02:00
phorcys 78460724ea [LA64_DYNAREC] Add la64 avx shift ops with imm operand. (#2805)
VEX.128/256 66.0F  shift imm ops:
   *  71  VPSRLW/VPSRAW/VPSLLW
   *  72  VPSRLD/VPSRAD/VPSLLD
   *  73  VPSRLQ/VPSLLQ/VPSRLDQ/VPSLLDQ
2025-07-11 08:06:37 +02:00
phorcys 6ea020eb54 [LA64_DYNAREC] Fix/Opt la64 avx movsx/movzx ops. (#2804)
Use vext2xv to opt movsx/movzx.
For VEX.128 bw,wd,dq ops, use vsllwil(latency 2) instead of vext2xv (latency 3)
Old imp use xvsllwil is wrong, because xvsllwil operate on per 128bits channel.
But MOVSX/MOVZX VEX.256 ops only read src operand from low 128bits.
2025-07-11 08:06:03 +02:00
ptitSeb 968594ee63 [ARM64_DYNAREC] Simplified defered flags handling and limited case where UpdateFlags is actualy called (could be simplified more) (TODO on RV64 and LA64) 2025-07-10 18:32:35 +02:00
ptitSeb 3ac62c64d8 Default x64emu_t structure for thread now point to a valid IP, just in case 2025-07-10 18:29:58 +02:00
ptitSeb 5596b9ae3f [RCFILE] Fixed profile per lib/dll that was using default instead of curent env for non defined values 2025-07-09 17:21:35 +02:00
ptitSeb 64efac63c0 [ARM64_DYNAREC] Removed fastpath for (V)MINPD/MAXPD as it's too inexact 2025-07-09 11:50:58 +02:00
ptitSeb 6da287f59f [ARM64_DYNAREC] Fined tuned UD value for BSR/BSF 2025-07-09 11:44:00 +02:00
ptitSeb 1c65cdc7cb [INTERP] Fined tuned UD value for BSR/BSF 2025-07-09 11:43:43 +02:00
ptitSeb efa6ee7275 [ARM64_DYNAREC] Fixed rare sideeffect of 32bits cmpxchg opcode 2025-07-09 11:24:23 +02:00
ptitSeb 1ac4cdeae9 [ARM64_DYNAREC] Better handling of shift 0 for rcl/rct 16bits 2025-07-09 10:57:47 +02:00
phorcys 4bb1bc9ea8 [LA64_DYNAREC] Fix la64 avx->sse same reg migration. (#2801)
In current code, if an avx reg  writed reg is used by  following sse inst.
A VLD would emitted by sse_get_reg,  causing prev avx inst writed content lose.
Skip sse_get_reg's VLD  emit, when reg content is already load/changed in prev avx inst.
2025-07-09 08:56:12 +02:00
phorcys 614d142205 [LA64_DYNAREC] Opt/fix la64 avx mov ops. (#2800)
*  opt VEX.66.0F.D6 VMOVD
  *  opt VEX.F2.0F.10 VMOSD
  *  opt VEX.F3.0F.10 VMOVSS
  *  opt/fix VEX.F3.0F.7E VMOVD
2025-07-09 08:10:41 +02:00
phorcys aeec79ec00 [LA64_DYNAREC] Add la64 avx bitwise ops. (#2780)
* avx  VEX.66.0F 54/55/56/57  VANDPD/VANDNPD/VORPD/VXORPD
  * avx  VEX.0F    54/55/56/57  VANDPS/VANDNPS/VORPS/VXORPS
  * avx  VEX.66.0F DB/DF/EB/EF  VPAND/VPANDN/VPOR/VPXOR
  * bmi1 VEX.0F38    F2  ANDN
  * bmi2 VEX.F2.0F3A F0  RORX
2025-07-09 08:10:14 +02:00
ptitSeb b1971c8ef3 [WRAPPER] added one missing wrapped function to libasound (for #2796) 2025-07-08 11:36:35 +02:00
Leslie Zhai 1ed7609fe9 [WRAPPER] Wrapper xmlMemGet and xmlMemSetup (#2799)
* [WRAPPER] Wrapper xmlMemGet and xmlMemSetup

* [WRAPPER] Change GOM to GO for xmlMemGet
2025-07-05 15:31:12 +02:00
phorcys 04396f421e [LA64_DYNAREC] Fix VEX.0f.17 VMOVHPS, one break missing. (#2798) 2025-07-05 08:42:38 +02:00
ptitSeb b4d43748e5 [WRAPPER] Added a couple of libc/libm wrapped functions (for #2796) 2025-07-04 23:02:20 +02:00
Leslie Zhai 549b384c3c [WRAPPER] Add bridge for Display's resource_alloc when directly call (#2795)
XOpenIM but not XOpenDisplay
2025-07-04 08:49:35 +02:00
ptitSeb 60ea78729d [WOW64] This should fix the build 2025-07-03 19:14:14 +02:00
ptitSeb ab9b88091c [BOX32] Simplified and improved 32bits memory management 2025-07-03 18:31:03 +02:00
ptitSeb a0fb28ac55 [WRAPPER] Allow to use libFLAC.so.12 for libFLAC.so.8 2025-07-03 18:26:19 +02:00
ptitSeb 9d92aac4f5 [BOX32] Do not try to switch personality on RV64 or LA64 arch 2025-07-03 13:17:51 +02:00
ptitSeb 5923a9089f [BOX32] Relaunch box32 to set personality to 32bits 2025-07-03 12:10:44 +02:00
ptitSeb e274abf13d [INTERP] Small change in Alternate handling 2025-07-03 11:34:05 +02:00
ptitSeb e327799e62 [ARM64_DYNAREC] Small cosmetic change in indirect_lookup 2025-07-03 11:33:27 +02:00
ptitSeb d56464d01d [ARM64_DYNAREC] Added unused LRCPC emitters 2025-07-03 10:58:53 +02:00
Leslie Zhai accbbe83e2 [WRAPPER] Wrapper XCreateWindow when Display's resource_alloc is x64 entry (#2788) (#2789)
* [WRAPPER] Wrapper XCreateWindow when Display's resource_alloc is x64
entry (#2788)

* [WRAPPER] Use RunFunctionFmt to call x64 resource_alloc entry

* [WRAPPER] Remove useless include header and DBGetBlock

* [WRAPPER] Use FindElfAddress to check the function is from x64 space

* [WRAPPER] Use find_XXX_Fct mechanism
2025-07-03 09:37:13 +02:00
ptitSeb 44ff3375df [DYNAREC] Fixed a potential issue where defered flags are not computed/reset on internal jump 2025-07-02 11:55:39 +02:00
ptitSeb dacc294340 [TRACE] Fixed the jump from instruction idx for Extend blcok in trace 2025-07-02 11:10:43 +02:00
ptitSeb 569b7471f9 Simplified a bit ROLLING_LOG buffer handling 2025-07-01 13:41:35 +02:00
ptitSeb 74710cbf6a [ARM64_DYNAREC] Optimized propate XMM/YMM unused helpers 2025-07-01 10:07:26 +02:00
ptitSeb 54ea4859ec [ARM64_DYNAREC] Fixed a regression introduced with 4903177bab (for ForzaHorizon4, maybe other too) 2025-06-30 20:35:40 +02:00
ptitSeb 2278438462 [DYNAREC] Refactor hotpage detection and dynarec_dirty 1 & 2. Also adjust some launcher/games flags 2025-06-30 16:36:38 +02:00
ptitSeb a942cef1ee [ARM64_DYNAREC] Added 66 8D opcode 2025-06-29 14:07:28 +02:00
ptitSeb f6773b2489 [ARM64_DYNAREC] Added 67 9C opcode 2025-06-29 13:22:08 +02:00
ptitSeb 614c8035ef [ARM64_DYNAREC] Made (V)M(IN/AX)P(D/S) opcodes always exact, it's inexpensive and make FASTNAN=0 less usefull 2025-06-29 12:37:55 +02:00
ptitSeb b01a0ccbb4 [INTERP] Added 67 9C opcode (for LEGO2Kdrive) 2025-06-28 18:22:06 +02:00
ptitSeb c6eaae8760 [INTERP] Small imrpvoment for 0F 03 opcode 2025-06-28 18:12:48 +02:00
ptitSeb 4a447e7f94 [INTERP] Added 0F 03 opcode (for LEGO2Kdrive) 2025-06-28 18:10:39 +02:00
ptitSeb c8c2b84287 [ARM64_DYNAREC] Use Unaligned sepcial handling to handle rare case of 32bits access out of 32bits bounds (for tasty platnet 2 on steam) 2025-06-28 13:53:00 +02:00
Yang Liu 2ce7bdf321 [LA64_DYNAREC] Removed some TABLE64 usage (#2782) 2025-06-27 10:43:07 +02:00
phorcys 2302adcbb9 [LA64_DYNAREC] Add la64 avx load/store ops part 4. (#2775)
*  VEX.66.0f.38  VMOVSX{BW,BD,BQ,WD,WQ,DQ}/VMOVZX{BW,BD,BQ,WD,WQ,DQ}
2025-06-27 09:19:17 +02:00
Yang Liu f6bb7310bb [LA64_DYNAREC] Optimized GETIP macro (#2781) 2025-06-27 09:17:06 +02:00
Yang Liu d57416f4fb [LA64_DYNAREC] Removed some redundant macro definitions (#2778) 2025-06-26 14:35:00 +02:00
Yang Liu e75234c83d [DYNACACHE][LA64] More work on internal reloc (#2779) 2025-06-26 14:32:57 +02:00
phorcys 42b98f77ce [LA64_DYNAREC] Add la64 avx load/store ops part 3. (#2774)
*  VEX.0f       VMOVMSKPS
  *  VEX.66.0f    VMOVMSKPD/VPMOVMSKB/VMASKMOVDQU
  *  VEX.66.0f.38 VMASKMOVPS/VMASKMOVPD/VPMASKMOVD/VPMASKMOVQ
2025-06-26 11:02:28 +02:00
phorcys bb253f3708 [LA64_DYNAREC] Add la64 avx load/store ops part 2. (#2773)
*  VEX.0f    VMOVLPS/VMOVHPS/VMOVLHPS/VMOVHLPS
  *  VEX.66.0f VMOVLPD/VMOVHPD
2025-06-26 10:42:23 +02:00
ptitSeb 0c87fbd42c [ARM64_DYNAREC] Fixed opcode name for VDIVPD 2025-06-25 14:39:10 +02:00
ptitSeb bc210752ab [ARM64_DYNAREC] Fixed some extended instance of VCMPSD opcodes 2025-06-25 14:02:28 +02:00
ptitSeb c274475c47 [INTERP] Improved 32bits to 16bits float conversion 2025-06-25 13:54:36 +02:00
ptitSeb 48a1b11281 [INTERP] More work on UD flags 2025-06-25 10:59:15 +02:00
ptitSeb 3698763bbe [INTERP] More work on UD flags 2025-06-25 10:59:04 +02:00
ptitSeb d67bc08d2d [ARM64_DYNAREC] Adjusted some UD flags in BLSMSK opcode 2025-06-25 10:49:03 +02:00
ptitSeb e2b9776860 [INTERP] Adjusted some UD flags in BLSMSK opcode 2025-06-25 10:48:47 +02:00
ptitSeb 208a84bebb [ARM64_DYNAREC] Fixed CF flag of BLSI opcode 2025-06-25 10:24:55 +02:00
ptitSeb 6a6ad9748a [INTERP] Fixed CF flag of BLSI opcode 2025-06-25 10:24:36 +02:00
ptitSeb 70ee5f0c83 [ARM64_DYNAREC] Fixed BEXTR opcode 2025-06-25 10:16:40 +02:00
ptitSeb 266bb4aa88 [INTERP] Added 66 F0 F7 /2 opcode (aligned only) 2025-06-24 21:05:47 +02:00
ptitSeb 82016ae44f [ARM64_DYNAREC] Improved BTx opcodes (and fixed one BTC opcode) 2025-06-24 20:48:57 +02:00
ptitSeb f470fdcc90 [INTERP] Added F0 BB and improved F0 BA /7 opcodes 2025-06-24 20:48:12 +02:00
ptitSeb 09e39704ae [DYNAREC] Better check of limit for a dynablock 2025-06-24 20:17:58 +02:00
airidosas252 f14fa2f2ce [WRAPPER] additional wrapped symbols (#2765)
* [WRAPPER] Wrap libiconv library

Seems to be required with newer versions of Wine for whatever reason.

* [WRAPPER] Wrap _ctype_ symbol (ANDROID only)

For whatever reason, this symbol is used on bionic at least. Not quite sure if it's the same on Linux.

* [WRAPPER} Fix a signature typo for libiconv function
2025-06-24 20:15:21 +02:00
phorcys 7962aacc7f [LA64_DYNAREC] Add la64 avx load/store ops part 1. (#2766)
*  VEX.0f       VMOVNTPS/VLDMXCSR/VSTMXCSR
  *  VEX.66.0f    VMOVNTPD/VMOVD/VMOVNTDQ
  *  VEX.66.0f.3a VMOVNTDQA
  *  VEX.f2.0f    VMOVDDUP/VLDDQU
  *  VEX.f3.0f    VMOVSLDUP/VMOVSHDUP/VMOVD
2025-06-24 18:38:12 +02:00
ptitSeb 9195bc2d4a [ARM64_DYNAREC] Improved handling of last_ip 2025-06-24 18:25:18 +02:00
Yang Liu 5e9972f2d3 [DYNACACHE][LA64] Added const table for later use in internal relocation (#2770) 2025-06-24 16:34:49 +02:00
ptitSeb acc0d451bb [LA64_DYNAREC] This should help certain builds (for #2769) 2025-06-24 14:18:45 +02:00
Yang Liu 1f5ce7ec18 [CI] Upgraded QEMU and loongarch64 toolchains (#2768) 2025-06-24 13:55:10 +02:00
Yang Liu f8314ffb2b [DYNAREC] Removed some unused code (#2767) 2025-06-24 09:51:46 +02:00
phorcys 9b6ff79c9c [LA64_DYNAREC]Add basic avx support for la64. (#2745)
* basic infra for avx
    * some basic ops for avx
	VMOVDQU/VMOVDQA/VMOVUPS/VMOVAPS/VMOVUPD/VMOVAPD
	VZEROUPPER/VZEROALL
	VMOVD/VMOVSD/VMOVSS
	VINSERTF128/VINSERTI128/VEXTRACTF128/VEXTRACTI128
	VBROADCASTSS/VBROADCASTSD/VBROADCASTF128
2025-06-23 18:16:57 +02:00
ptitSeb 4eabf07385 Fix wowbox64 build 2025-06-23 15:16:06 +02:00
ptitSeb 0d02532dab [DYNACACHE] Added support for unaligned addresses 2025-06-23 14:52:28 +02:00
ptitSeb 8ae0b6e181 [ARM64_DYNAREC] Removed commented code 2025-06-23 14:52:03 +02:00
Chi-Kuan Chiu f6d9caf0d1 Add map64_customMalloc (#2764)
Most allocations target ~56 bytes, causing internal fragmentation
in `map128_customMalloc`. Introduce `map64_customMalloc`, a
64-byte–chunk variant of `map128_customMalloc`. The new allocator
uses a `uint16_t` “map” array: each bit in a 16-bit entry tracks
the in-use status of one 64-byte chunk (16 chunks per map entry).
The bitmap region is fixed at 256 bytes. Note that “map” here is a
fast-lookup structure, distinct from the bitmap itself. All chunk-
size, shift, and map-size calculations have been updated
accordingly.

Relates to #2740
2025-06-23 13:01:17 +02:00
ptitSeb c66630da49 [DYNAREC] Refactored a bit BARRIER_FLOAT ([ARM64] olny for now, todo for RV64 and LA64) 2025-06-23 13:00:45 +02:00
ptitSeb 0cc58732fb [ARM64_DYNAREC] Small fix in arch_build 2025-06-22 18:21:29 +02:00
ptitSeb dcb47b7df8 [DYNACACHE] Introduced B64X_DYNACACHE=2 to use cache but not create new ones, and made it default 2025-06-20 12:10:36 +02:00
ptitSeb d6c08a7511 [DYNACACHE] Fixed a Warning 2025-06-20 11:30:40 +02:00
Yang Liu f1e8841030 [DYNACACHE][RV64] Enabled dynacache for RV64 (#2762) 2025-06-20 11:26:21 +02:00
Yang Liu cfdc733e2f [DYNACACHE] Make sure dynacache folder ends with pathsep (#2761) 2025-06-20 11:23:40 +02:00
Yang Liu 168fe67904 [DOCS] Performance as the top section in USAGE.md (#2760) 2025-06-19 21:06:03 +02:00
Yang Liu 58f4cc352e [DYNACACHE][RV64] More work on internal reloc (#2759) 2025-06-19 16:19:57 +02:00
Yang Liu b840606105 [DYNACACHE][RV64] Added const table for later use in internal relocation (#2758) 2025-06-19 12:13:20 +02:00
ptitSeb f88c864fce [DYNACACHE] Another fix for non-ARM64 Dynarec build 2025-06-19 11:39:45 +02:00
ptitSeb 41a914fa5e [DYNACACHE] Fixed LA64 build 2025-06-19 11:36:05 +02:00
ptitSeb 1f710620fc [DYNACACHE] This should fix non-ARM64 Dynarec build, for good 2025-06-19 11:32:01 +02:00
ptitSeb eb110bf213 [DYNACACHE] This should fix non-ARM64 Dynarec build 2025-06-19 11:28:49 +02:00
ptitSeb 42c0f891e3 [DYNACACHE] Try to fix non Dynarec build 2025-06-19 11:18:07 +02:00
ptitSeb 725316a538 [DYNACACHE] Introduced DynaCache for ARM64 (disabled by default) 2025-06-19 11:07:30 +02:00
Yang Liu cc9ed70837 Fixed compilation errors (#2757) 2025-06-19 11:03:42 +02:00
Yang Liu c96c1ad5dd [BIONIC] Fixed some compilation warnings (#2756) 2025-06-18 17:13:34 +02:00
Yang Liu 71220b7fef [WOW64] Finished host extension detection (#2755) 2025-06-17 09:54:58 +02:00
Yang Liu ae0c91dce0 [WOW64] Refactored host extention detection and added preliminary support for WowBox64 (#2752) 2025-06-16 14:05:38 +02:00
ptitSeb ab6deeb319 [DYNACACHE] Added the ability to mark a maplist has having new blocks (instead of dirty block that are refreshed) 2025-06-16 12:07:22 +02:00
ptitSeb c1785a93ab [DYNACACHE] Made the blocklist_t part of the dynarec allocated mmap, to ease future serialize of the map 2025-06-16 11:51:00 +02:00
ptitSeb 924903e8d2 [RCFILE] Make generic setup profile less strict 2025-06-16 11:15:09 +02:00
Yang Liu d9925eb46a [RCFILE] Updated MiSide profile (#2751) 2025-06-16 11:03:58 +02:00
ptitSeb 01e997a4da [DYNACACHE] More work on dynache relocation 2025-06-15 16:20:26 +02:00
Yang Liu 51db3f1f9a [CMAKE] Limit the optim level to O1 on bionic build (#2749) 2025-06-15 13:44:18 +02:00
Yang Liu 73dfc35c99 [TERMUX] Better handling of non-exists pthread functions (#2748) 2025-06-15 11:35:21 +02:00
Yang Liu 038835c81e [WOW64] Inherit the build type from main project (#2746) 2025-06-14 17:32:44 +02:00
ptitSeb decec260b2 [DYNAREC] Make sure a dynablock does not exit a mmap backed by a file address range 2025-06-14 11:31:18 +02:00
ptitSeb ae6ec48623 [DYNACACHE] Refactored cpu extension, will be used in dynacache signature checks 2025-06-14 10:01:52 +02:00
ptitSeb 9d93770a84 [WOWBOX64] Fixed a few more warnings 2025-06-14 10:01:10 +02:00
ptitSeb 3b53d2dac7 [WOWBOX64] Fixed a few warnings 2025-06-14 09:21:52 +02:00
Yang Liu a3d153caf0 [DOCS] Reworked Wine usage guide (#2743)
* [DOCS] Reworked Wine usage guide

* review
2025-06-13 22:07:46 +02:00
ptitSeb 3f7d726c17 Fix non-box32 build 2025-06-13 18:42:29 +02:00
Yang Liu 0dedfd03a6 [ANDROID] Unimportant updates (#2741) 2025-06-13 17:52:23 +02:00
ptitSeb 099b9c2aaf [DYNACACHE] Some more preparation work for internal relocations 2025-06-13 13:51:01 +02:00
ptitSeb 2d740c91d2 [DYNACACHE] More preparation work for internal relocations 2025-06-13 13:44:05 +02:00
ptitSeb 926a59803d [DYNACACHE][WOWBOX64] This shoyld fix the build 2025-06-13 12:58:53 +02:00
ptitSeb db24d5ddb7 [DYNACACHE] More work on preparing internal reloc, plus fix non-trace build 2025-06-13 12:36:06 +02:00
ptitSeb 217c0fa4e9 [DYNACACHE] Created a const table, for later use in internal relocation ([ARM64] only, todo on RV64 and LA64) 2025-06-13 11:57:08 +02:00
Yang Liu abe3e1c4f8 [WRAPPER] Wrapped a few more functions in gio2 and libresolv (#2737)
* [WRAPPER] Wrapped a few more functions in gio2 and libresolv

* fix static build

* fix fix
2025-06-13 09:01:10 +02:00
Luke Short ffbb0a400e Bundle fix permissions (#2738)
* [DOCS] Update tar command

to extract with root permissions.

Resolves #2713

* [BUNDLE] Use AlamaLinux Vault URLs

AlmaLinux 9.5 has been archived since the release of 9.6.

* [BUNDLE] Make failed downloads fatal

This will help us track down and fix issues with the script faster.

* [BUNDLE] Use Fedora Archive URLs

for Fedora 40. It has been archived since it went end-of-life
recently.

* [BUNLDE] Add libnsl

This is used by the Steam client.
2025-06-13 08:03:01 +02:00
Yang Liu 0d10035ffd [ARM64_DYNAREC] Fixed some typos related ymm unneeded tracing (helps #2724) (#2735) 2025-06-12 15:05:38 +02:00
Yang Liu 9cacc44125 [WRAPPER] Added 2 more functions to libc (for #2731) (#2733) 2025-06-12 10:45:11 +02:00
Yang Liu 3f757df028 [CPUID] Do not warn on the Hypervisor interface query (#2732) 2025-06-12 10:07:28 +02:00
Yang Liu e0ef328402 [ARM64_DYNAREC] Added 64/65 67 89/8B 64bits opcodes (#2730)
* [ARM64_DYNAREC] Added 64/65 67 89/8B 64bits opcodes

* review
2025-06-12 09:36:03 +02:00
Yang Liu e0067667f7 [INTERP] Fixed 64/65 67 64bit rex decoding (#2729) 2025-06-12 09:18:56 +02:00
Yang Liu 44669935da [WOW64] Small improvement to grab_segdata (#2728) 2025-06-11 13:44:41 +02:00
ptitSeb e2f22310f4 [DYNACACHE] Made dynablock part of the dynarec memory 2025-06-11 12:09:27 +02:00
Yang Liu 347f90f975 [WOW64] Small refinement to tls slots usage (#2726) 2025-06-11 12:06:01 +02:00
Yang Liu cc6d5eb0d9 [TRACE] Bring back in-house zydis header for v3.x (#2727) 2025-06-11 11:57:56 +02:00
ptitSeb 4029d52a75 This should fix non-dynarec build 2025-06-11 11:42:56 +02:00
ptitSeb d0dd1c4d4f [WOWBOX64] This should fiw wowbox64 build 2025-06-11 10:23:07 +02:00
ptitSeb 5ebdab90ea [DYNACACHE] Dynarec memory is now part of MMpa file tracking when possible 2025-06-11 10:01:21 +02:00
Yang Liu d1f8458f58 [WOW64] Added a minimal Windows runtime (#2723) 2025-06-11 09:09:06 +02:00
Yang Liu 12d6d14ae2 [ARM64_DYNAREC] Removed redundant flags save/restore around call_c (#2725) 2025-06-11 09:02:23 +02:00
Yang Liu bfd0e1700b [DYNAREC] Sync indirect lookup handling and some cleanup (#2722) 2025-06-10 12:18:35 +02:00
Yang Liu 0ae6083730 [TRACE] Fixed explicit BOX64_TRACE=0 (#2721) 2025-06-10 12:17:03 +02:00
ptitSeb 64080cea81 [DYNAREC] Improved mmap'd file tracking 2025-06-10 10:41:04 +02:00
Yang Liu ab5c42f0dc [TRACE] Added support for libzydis v4.x and removed the in-house zydis header (#2720)
* [TRACE] Exclude non-trace build from relying on in-house Zydis header

* [TRACE] Upgrade zydis to version 4.x

* [TRACE] Update docs

* [TRACE] Update CI

* [TRACE] No reason to drop 3.x support
2025-06-09 17:13:14 +02:00
ptitSeb b19dc0db89 [ARM64_DYNAREC] Added 64/65 0F BF opcode (for #2716) 2025-06-09 11:07:55 +02:00
ptitSeb d886cf1d98 [INTERP] Added 64/65 0F BF opcode (for #2716) 2025-06-09 11:02:33 +02:00
ptitSeb e427c6e9cd [DYNAREC] Reset table64size before pass1 and pass2 2025-06-09 10:59:51 +02:00
Chi-Kuan Chiu caba957426 Refine the naming scheme in rbtree (#2717)
Replaced all occurrences of `rb_get_righter` with `rb_get_rightmost` and
`rb_get_lefter` with `rb_get_leftmost` for improved semantic clarity.

Also updated related function declarations, definitions, and usage
across:
- rbtree.c
- rbtree.h
- custommem.c
- dynablock.c
- env.c
- box64context.c
2025-06-09 08:16:43 +02:00
ptitSeb 873be3cf87 [RCFILE] Fixed MAXCPU so it works for wine apps too 2025-06-08 16:41:51 +02:00
ptitSeb 685afa2302 [DYNAREC] Modified JumpTable slightly so 32bits and 48bits address space jmp can be done with only 2 and 3 memory fetch (todo: RV64 and LA64 handling of 48bits) 2025-06-08 14:16:45 +02:00
ptitSeb d3f0d1c30f [DYNAREC] Small change on jumptable to have the 1st layer maching the over 48bits address space 2025-06-08 11:00:55 +02:00
ptitSeb 7de8687a79 [BOX32][WRAPPER] Added 2 more function to 32bits wrapped libxcb.so 2025-06-08 10:50:08 +02:00
Yang Liu 4fc5885d74 [WOW64] Moved things around for the future (#2712) 2025-06-07 16:17:38 +02:00
ptitSeb 4539eccd40 Start of a new dev. cycle 2025-06-07 16:16:19 +02:00
ptitSeb 03d220b1d2 Bumped version to v0.3.6 2025-06-06 15:31:49 +02:00
ptitSeb 053c4fd6bb [RCFILE] Added a new game profile 2025-06-06 14:45:43 +02:00
ptitSeb 7b0fada974 Fixed a regression on syscall 2025-06-05 16:37:01 +02:00
ptitSeb d09b46c1bf [TRACE][DYNAREC] Enlarged buffer for instruction metadata again 2025-06-05 13:00:40 +02:00
Yang Liu 294178b598 [WOW64] The official file name is wowbox64.dll (#2709) 2025-06-05 09:52:42 +02:00
Yang Liu e9242b8849 [WOW64] Added rcfile support (#2708)
* [WOW64] Fixed more compilation warnings

* [WOW64] Messing around with file APIs

* [WOW64] Added rcfile support

* [DOCS] Update rcfile usage on WowBox64
2025-06-05 09:43:30 +02:00
Yang Liu c5755c8241 [WOW64] More cleanups and implemented a few more BTCpu functions (#2702)
* [WOW64] Reformatted with our .clang-format

* [WOW64] Removed some useless code

* [WOW64] Sort wowbox64.def in alphabet order

* [WOW64] Implemented more functions to invalidate code cache

* [WOW64] Added trace log for all BTCpu* functions
2025-06-04 17:38:33 +02:00
ptitSeb 75dcfb225a [WRAPPER][BOX32] Added a couple more 32bits wrpped functions to libc 2025-06-03 16:02:19 +02:00
ptitSeb 067e84eb05 [BOX32][WRAPPER] Added/Fixed some more wrapped function to libsdl2 2025-06-02 14:21:19 +02:00
ptitSeb faffa2a4d0 [WRAPPER][TRACE] Cleanup some trace on DLSYM_ERROR=1 2025-06-02 14:20:51 +02:00
ptitSeb c3659df777 Realigned some code 2025-06-02 14:20:12 +02:00
ptitSeb 5aac024868 [BOX32][WRAPPER] Added 1 more function to libc 2025-06-02 13:33:38 +02:00
ptitSeb a4523caf81 [TRACE][BOX32] Fixed some and cleaup detailed function call trace 2025-06-02 13:33:14 +02:00
Yang Liu db1c2cedbf [DOCS] Updated COMPILE.md about WowBox64 (#2701) 2025-06-02 12:41:55 +02:00
Yang Liu 4b96a74fc3 [ENV][WOW64] Not every env var applies to WowBox64 (#2700)
* [ENV] Not every env var applies to WowBox64

* [DOCS] Updated env docs for WowBox64
2025-06-02 12:28:35 +02:00
ptitSeb 1b131d28df [BOX32][WRAPPER] Added wrapped 32bits libcurl (need testing) 2025-06-02 12:09:21 +02:00
ptitSeb ec2e94249b [TRACE][ARM64_DYNAREC] Make dynarec_log=1 less chatty 2025-06-02 12:08:49 +02:00
ptitSeb 0ffb15fce3 [RCFILE] Added 1 more game profile 2025-06-02 12:08:03 +02:00
ptitSeb 61a62645e8 Revert using getProtection_fast in CheckExec to avoid rare (or less rare in Interp) lockup 2025-06-02 12:07:36 +02:00
Yang Liu e4edb65c2b [WOW64] The name is WowBox64 (#2699) 2025-06-02 11:03:02 +02:00
Chi-Kuan Chiu b49bcbf68b [RBTREE] Update comments on red-black tree usage (#2694)
- Remove outdated information
- Document the seven red-black trees that Box64 currently uses:
  1. memprot
  2. mapallmem
  3. blockstree
  4. db_sizes
  5. envmap
  6. rbt_dynmem
  7. volatileRanges
- Clarify each tree's role

The original intention was to help future contributors who want
to propose a faster lookup mechanism to replace rbtrees in the
future, as understanding the current usage patterns is a
necessary first step.
2025-06-02 11:02:03 +02:00
Yang Liu eb69484bd6 [WOW64] Override DOS stub to Wine builtin DLL (#2698) 2025-06-01 11:35:16 +02:00
Yang Liu 195ac02ea1 [WRAPPER] Fixed some xcb-image wrappings (#2697) 2025-06-01 10:08:22 +02:00
Yang Liu 8ebe32257e [CI] Upload libwowbox64.dll to CI artifacts (#2696)
* [CI] Upload libwowbox64.dll to CI artifacts

* [CI] Remove regular Box64 binaries from artifacts
2025-06-01 08:50:42 +02:00
André Zwing 89e470d59c Merge pull request #2692 from ksco/wow64
[WOW64] Improved RIP handling on INT n
2025-05-30 23:58:48 +02:00
Yang Liu 7a76430e87 [DYNAREC] Fixed a prefix typo in dynarec dump (#2693) 2025-05-30 23:34:48 +02:00
ptitSeb 60890a550b This should fix the WoW build 2025-05-30 23:33:56 +02:00
ptitSeb 2038df85c0 [ARM64_DYNAREC] Try to optimise Windows INT n version on 64bits (TODO: Interp and 32bits and wowbox64) 2025-05-30 21:38:43 +02:00
Yang Liu ab5d2eba64 [WOW64] Improved RIP handling on INT n 2025-05-31 03:18:22 +08:00
Yang Liu b142c5a181 [DYNAREC] Ported 37ed49cb to RV64 and LA64 (#2690) 2025-05-30 16:49:10 +02:00
ptitSeb 37ed49cbb8 [TRACE][ARM64_DYNAREC] Fixed potential buffer overflow on dynarec_dump scenario 2025-05-30 14:19:16 +02:00
ptitSeb 94ed2596c0 [RCFILE] Added a couple of game profiles 2025-05-30 11:07:26 +02:00
ptitSeb 84498707dd [ARM64_DYNAREC] Small improvment on Wine INT n handling 2025-05-30 10:43:39 +02:00
Yang Liu d29be5fd14 [WOW64] Added support for cosim (#2683) 2025-05-30 10:23:10 +02:00
Leslie Zhai 53bb00a769 [WRAPPER] Implement myStackAlignGVariantNew for g_variant_new (#2687) 2025-05-30 07:57:01 +02:00
liuli 038e9511d1 fix: env BOX64_EMULATED_LIBS triggers sigsegv (#2686) 2025-05-30 07:53:02 +02:00
Yang Liu 94789d6705 [WOW64] Print banner at startup (#2685) 2025-05-29 15:15:58 +02:00
Yang Liu 67b15f09cf [WOW64] Added more missing pieces and the interpreter works (#2682)
* [WOW64] Added more missing pieces and the interpreter works

Ported from AndreRH/hangover

* review
2025-05-29 11:41:36 +02:00
ptitSeb a0693590bd [ARM64_DYNAREC] More optimisation of unused XMM/YMM purge 2025-05-28 18:19:52 +02:00
Yang Liu f1df65d88f [WOW64][ENV] Clean up a bit (#2681) 2025-05-28 17:40:00 +02:00
ptitSeb 6697c7d229 [ARM64_DYNAREC] Optimized a bit CVTTPS2DQ on fastround=0 when frintts is not supported on the cpu 2025-05-28 17:25:23 +02:00
ptitSeb 6a41f33bf3 [INTERP] Added 64/65 67 89/8B 64bits opcodes 2025-05-28 17:11:55 +02:00
Yang Liu 67f7c988d5 [ARM64_DYNAREC] Small optim to modreg CMPXCHG (#2680)
* [ARM64_DYNAREC] Small optim to modreg CMPXCHG

* review
2025-05-28 15:34:37 +02:00
Yang Liu 01da6215de [WOW64] Supported logging to stdout (#2679) 2025-05-28 14:29:58 +02:00
Yang Liu 1fc558fcab [ARM64_DYNAREC] Fixed a warning (#2678) 2025-05-28 11:08:30 +02:00
Yang Liu c835881a77 [DYNAREC] Fixed expected return address in bridged native call (#2677) 2025-05-28 08:19:46 +02:00
Yang Liu a9f4e72c4b [RV64_DYNAREC] Fixed regression introduced in #2669 (#2676) 2025-05-27 11:29:33 +02:00
ptitSeb 1f46ca81af Merge pull request #2675 from AndreRH/wowbox64
wow64 final (dont squash)
2025-05-26 23:12:44 +02:00
André Zwing 8dbeee5dcb [WOW64] Implement BTCpuNotifyMemoryFree 2025-05-26 22:03:17 +02:00
André Zwing 7a4cf9fc9e [WOW64] Implement BTCpuNotifyUnmapViewOfSection 2025-05-26 22:01:02 +02:00
André Zwing 2fdd7f6188 [WOW64] Implement BTCpuNotifyMemoryProtect 2025-05-26 21:51:51 +02:00
André Zwing 803d8ac28a [WOW64] Convert floating point values 2025-05-26 21:50:01 +02:00
Yang Liu 77c2683762 [RV64_DYNAREC] Removed useless zero-ups in some emit_* functions (#2672) 2025-05-26 13:16:54 +02:00
Yang Liu ae9ee3d9d8 [CMAKE] Fixed dependency issues introduced recently (#2673) 2025-05-26 13:16:12 +02:00
Yang Liu 6947a5bb94 [RV64_DYNAREC] Added more opcodes to printer (#2671) 2025-05-26 11:57:00 +02:00
ptitSeb 103875b487 [BOX32][WRAPPER] Added some time64 functions (for #2655) 2025-05-26 11:56:41 +02:00
Yang Liu 4c234b0418 [RV64_DYNAREC] Improved ret_to_epilog with xtheadmemidx (#2670) 2025-05-26 11:18:21 +02:00
Yang Liu abd1ebb425 [RV64_DYNAREC] Minor nativeflags optim to LEA and CMOVcc opcodes (#2669) 2025-05-26 10:39:19 +02:00
ptitSeb e994c65116 Merge pull request #2667 from AndreRH/wowbox64
wow64 part5(dont squash)
2025-05-25 22:23:42 +02:00
André Zwing c52b36abd4 [WOW64] Implement my_cpuid 2025-05-25 21:57:23 +02:00
André Zwing a42936d998 [WOW64] Implement getBoxCpuName 2025-05-25 21:41:25 +02:00
André Zwing e09adad1b9 [WOW64] Partially implement BTCpuResetToConsistentState 2025-05-25 21:41:23 +02:00
André Zwing b6429edf09 [WOW64] Implement get_random32 and get_random64 2025-05-25 18:27:42 +02:00
Yang Liu 1e2bae9237 [RV64_DYNAREC] Improved emit_pf with Zbb (#2665) 2025-05-23 17:54:36 +02:00
Yang Liu b7ddb92c80 [RV64_DYNAREC] Optimized CLZ macro with xtheadbb (#2664) 2025-05-23 16:33:02 +02:00
Yang Liu d40f51bdc5 [RV64_DYNAREC] Optimized some opcodes with xtheadbb (#2663)
* [RV64_DYNAREC] Optimized *EXTH macros with xtheadbb

* fix

* [RV64_DYNAREC] Optimized scalar version of PCMPEQB with xtheadbb
2025-05-23 13:40:13 +02:00
Yang Liu b78ffcfad8 Added -k option to kill all box64 instances (#2661) 2025-05-23 11:55:26 +02:00
ptitSeb 3f9c5c496c Merge pull request #2662 from ksco/cmake
[CMAKE] Removed the hard dependency between dynarec and main executable to speed up build
2025-05-23 10:03:46 +02:00
Yang Liu 37068c4f36 [CMAKE] Removed the hard dependency between dynarec and main executable to speed up build 2025-05-23 15:26:52 +08:00
ptitSeb 18a02fafb1 Merge pull request #2660 from AndreRH/wowbox64
wow64 part4 (dont squash)
2025-05-22 23:02:12 +02:00
André Zwing 06d4fc79ec [WOW64] Remove debug messages 2025-05-22 21:27:02 +02:00
André Zwing fa874ffcbc [WOW64] Implement syscalls 2025-05-22 21:27:02 +02:00
André Zwing b729e3e37b [WOW64] Initialize db_sizes 2025-05-22 21:27:02 +02:00
André Zwing 73e7c6b480 [WOW64] Don't check the protection on win32 2025-05-22 21:27:02 +02:00
ptitSeb 5916869329 [ARM64_DYNAREC] Try to avoid Load/Unload of XMM/YMM regs when possible on intrablock jump 2025-05-22 20:07:23 +02:00
Yang Liu c9f3b990b4 [RV64_DYNAREC] Enable nativeflags optimization for more patterns (#2659) 2025-05-22 18:57:09 +02:00
ptitSeb 6592b63800 [BOX32][WRAPPER][TRACE] Fixed some DLSYM_ERROR traces 2025-05-22 14:25:03 +02:00
ptitSeb 1898d35c53 [WRAPPER][TRACE] Fixed some DLSYM_ERROR traces 2025-05-22 14:24:46 +02:00
ptitSeb 77f7c1278b [INTERP] Added unaligned path for F0 FF /1 32bits opcode 2025-05-21 17:06:42 +02:00
ptitSeb 1c7a7c9895 [ARM64_DYNAREC] Fix (and small optim) on VPMASKMOVD/VPMASKMOVQ opcodes 2025-05-21 16:39:09 +02:00
Yang Liu bd23f259cc [RV64_DYNAREC] Fixed a typo in 66 F0 0F LOCK CMPXCHG opcode (#2658) 2025-05-21 16:25:25 +02:00
Yang Liu efe1eb73dc Reprint env configs when special libraries detected (#2657) 2025-05-21 15:38:56 +02:00
Yang Liu 8c51be6985 [RV64_DYNAREC] Implemented unaligned path for LOCK INC/DEC opcodes (#2656) 2025-05-21 12:36:36 +02:00
ptitSeb f25af13f79 Better mmap file tracking when loading multiple file with same name (like 32bits and 64bits version of a same dll in wine wow64) 2025-05-21 11:54:48 +02:00
ptitSeb 019f85e4a3 {BOX32][WRAPPER] More fixes on libdbus-1 wrapping 2025-05-20 18:27:25 +02:00
Yang Liu 7af5f625d7 [DYNAREC] Removed unnecessary volatile metadata barriers (#2653) 2025-05-20 17:17:34 +02:00
Yang Liu a1ac9cccc4 [RV64_DYNAREC] Fixed more potential scratch register conflicts (#2652) 2025-05-20 17:01:45 +02:00
ptitSeb b13811259a [BOX32][WRAPPER] Try to fix some of the issues with wrapped libdbus-1 and arrays/strings 2025-05-20 16:40:04 +02:00
ptitSeb a7f4041604 [INTERP] Small change on 0F 2E/2F opcode, and alows Interp->Dynarec on 80..8F opcodes 2025-05-20 14:52:48 +02:00
ptitSeb 72e05a52b2 [INTERP] Fixed D9 F5/F8 (for #2644) 2025-05-20 14:51:31 +02:00
Yang Liu e1e3122a1f [RV64_DYNAREC] Improved POPCNT and fixed some scratch conflicts (#2651) 2025-05-20 14:45:50 +02:00
ptitSeb 4f88b2bdd7 Merge pull request #2648 from ksco/thead
[RV64] Improved vendor extension detection to avoid conflicts (for #2645)
2025-05-20 09:44:37 +02:00
Yang Liu 5b8a71d720 [RV64] Improved vendor extension detection to avoid conflicts (for #2645) 2025-05-20 15:24:09 +08:00
ptitSeb 58021bbf42 Merge pull request #2647 from AndreRH/wowbox64
wow64 part3 (dont squash)
2025-05-20 00:39:33 +02:00
André Zwing 45d3cbd1b4 [WOW64] Implement BTCpuTurboThunkControl 2025-05-19 23:46:29 +02:00
André Zwing e07ec82344 [WOW64] Implement BTCpuSimulate 2025-05-19 23:46:29 +02:00
ptitSeb 37eb5492ba [BOX32][WRAPPER] Fixed issue with wrapping of libdbus-1 2025-05-19 16:39:16 +02:00
ptitSeb 0e7b986116 [TRACE] Slight better trace when running with custommem memory tracker 2025-05-19 16:02:15 +02:00
ptitSeb be16c14dcb [BOX32][WRAPPER] This should fix RV64 and LA64 builds 2025-05-19 15:57:11 +02:00
ptitSeb a1c29448a3 [BOX32][WRAPPER] Added 32bits wrapping for libdbus-1 2025-05-19 15:12:41 +02:00
ptitSeb 16bdcc0c93 [ARM64_DYNAREC] Added fastnan=0 handling to 0F 52 opcode 2025-05-18 19:26:32 +02:00
Yang Liu 2798c3c8cd [RV64_DYNAREC] Enabled native flags optimization for SETcc opcodes (#2640) 2025-05-16 14:12:56 +02:00
ptitSeb d7538334e0 [RCFILE] Added/modified some more profiles 2025-05-15 18:26:50 +02:00
ptitSeb 5dbcc4ad0d [TRACE] Reduce the noise when using SHOWSEGV=1 on Winde programs 2025-05-15 18:26:50 +02:00
Yang Liu 2cd4d60325 [RV64_DYNAREC] Added F2 0F F0 LDDQU opcode for vector (#2639) 2025-05-15 14:30:18 +02:00
Yang Liu 3dc00e9262 [DYNAREC] Fixed alternate address testing when retriving dynablock (#2638) 2025-05-15 14:19:33 +02:00
Yang Liu 649af04fa5 [RV64_DYNAREC] Added more opcodes for vector (#2637) 2025-05-15 13:00:09 +02:00
Yang Liu 3b97efb9ca [DYNAREC] More minor changes to missing VEX prefixed opcodes (#2636) 2025-05-15 11:08:08 +02:00
ptitSeb 8005af1387 [ARM64_DYNAREC][TRACE] Yet another small change on DYNAREC_MISSING=1 handling of missing VEX prefixed opcodes 2025-05-15 10:50:05 +02:00
ptitSeb 5b45329968 [ARM64_DYNAREC][TRACE] Anothor small change on DYNAREC_MISSING=1 handling of missing VEX prefixed opcodes 2025-05-15 10:47:47 +02:00
ptitSeb b1379c88d4 [ARM64_DYNAREC][TRACE] Improved DYNAREC_MISSING=1 handling of missing VEX prefixed opcodes 2025-05-15 10:41:21 +02:00
Yang Liu 274949f9d0 [RV64_DYNAREC] Added and optimized some SSE/MMX opcodes (#2635) 2025-05-15 09:00:50 +02:00
ptitSeb 4a70577e6f [WRAPPER] added arm64 special case to of_unconvert helper function 2025-05-14 17:55:02 +02:00
ptitSeb b818a29499 [WRAPPER] Reduce the warning on of_unconvert helper function 2025-05-14 14:39:34 +02:00
Yang Liu 69c88442b4 [RV64_DYNAREC] Fixed a typo introduced lately (#2634) 2025-05-14 14:16:51 +02:00
Yang Liu 3d0b4ac9e1 [DOCS] Align usage.json and env.h (#2633)
* [DOCS] Align usage.json and env.h

* Removed BOX64_FUTEX_WAITV

* review

* gen
2025-05-14 10:15:01 +02:00
ptitSeb 4be5149b8d [RCFILE] Made VOLATILE_METADATA default, and added/finetuned some game profiles 2025-05-14 09:27:08 +02:00
Yang Liu 76ba181d98 [RV64_DYNAREC] Added more mmx opcodes (#2629) 2025-05-14 09:06:24 +02:00
Hypothalamus 4542244c4f [DOCS] improve consistency between documentation and code (#2631)
* [fix][Docs] is `XXXX` consistantly

* [feat][Docs] add simple validation script that checks consistency between `usage.json` and `env.h`

* [DOCS] include `validate.py` in `gen.py`
2025-05-13 18:34:55 +02:00
Yang Liu a58e9d1dc9 [RV64_DYNAREC] Added more mmx opcodes (#2630) 2025-05-13 14:28:43 +02:00
Yang Liu 938a2379c6 [RV64_DYNAREC] Added more mmx opcodes (#2627) 2025-05-13 11:48:11 +02:00
Yang Liu 881814b21c [RV64_DYNAREC] Added more mmx opcodes 2025-05-13 10:24:43 +02:00
André Zwing 915c4bf3b7 rbtree needs initialized mutexes 2025-05-12 22:33:22 +02:00
André Zwing 7a8a1a7791 [WOW64] Implement BTCpuProcessInit 2025-05-12 22:33:22 +02:00
André Zwing e38d20e610 [WOW64] Implement BTCpuThreadInit 2025-05-12 22:33:22 +02:00
ptitSeb 3d18e9c9e2 Improved libdl error message handling 2025-05-12 18:25:12 +02:00
ptitSeb 27685a4680 Small improvment on printf_trace utility function 2025-05-12 18:24:17 +02:00
ptitSeb 81b26569e5 [WRAPPER] Added libOpenCL.so as synonym 2025-05-12 12:43:03 +02:00
ptitSeb 76bbca2808 [WRAPPER] Improved handling of multiple vulkan devices 2025-05-12 12:21:03 +02:00
Yang Liu b435966bd0 [CI] Check WOW64 build in the CI (#2623) 2025-05-12 09:41:18 +02:00
Chi-Kuan Chiu be0839a478 [Docs]Fix the format of Commit 816c4bd (#2622) 2025-05-11 20:15:12 +02:00
ptitSeb f81f29b19a [BOX32][WRAPPER] Added 1 more libc wrapped function 2025-05-11 18:29:28 +02:00
Chi-Kuan Chiu 816c4bdb61 [DOCS] Include RV64 and LARCH64 DynaRec options (#2621)
Previously the README only mentioned `-DARM_DYNAREC=1`.
CMakeLists.txt also defines `RV64_DYNAREC` and `LARCH64_DYNAREC`, so
this expands the docs to list all dynamic-recompilation flags.
2025-05-11 18:18:43 +02:00
André Zwing a9ddd396c4 [WOW64] Initial implementation patches (#2619)
* [WOW64] Add stub for VolatileRangesContains

* [WOW64] Implement BTCpu[GS]etContext

* [WOW64] Add env support
2025-05-11 16:55:19 +02:00
ptitSeb f0b060dadd [BOX32] Fixed an issue with *printf format handling missing # (help Borderlands 2 / PreSequel Linux version, probably other too) 2025-05-11 15:54:32 +02:00
ptitSeb b1eabd7583 [WRAPPER] Added more wrapped function to ffmpeg, and disable it with NOGTK=1, as wrapping needs more work on structure callbacks 2025-05-11 14:01:46 +02:00
ptitSeb 7a2d9967f5 Improved custom gstreamer-1.0 installation (for new Proton launched from linux Steam) 2025-05-11 10:19:21 +02:00
ptitSeb 2aeddc8829 [BOX32][WRAPPER] Added some more 32bits wrapped libGL functions 2025-05-10 17:28:46 +02:00
ptitSeb df4dcf88da [WRAPPER] Added 1 more function to wrapped fontconfig 2025-05-10 16:01:14 +02:00
ptitSeb 8160a90fd5 [ARM64_DYNAREC] Fixed a regression introduced with e7b71cba5f (fixed broken rendering with American Truck Simulator linux version, probably others too) 2025-05-10 12:03:39 +02:00
ptitSeb a8adde9234 [WRAPPER] Added a few more wrapped function to ffmpegs libs 2025-05-09 18:38:12 +02:00
ptitSeb daa3fca1f1 [RCFIEL] Fine tuned and added a few games profile 2025-05-09 16:55:40 +02:00
ptitSeb d744026819 [RCFILE] Put back WEAKBARRIER 1 as default 2025-05-09 16:55:12 +02:00
ptitSeb 689d6b9330 Fixed a potential deadlock on custom memory managment (mostly for Box32) 2025-05-09 13:39:15 +02:00
Yang Liu 22fdc90fe2 [GDBJIT] Added a new option to register debuginfo only after trapped into signalhandler (#2614) 2025-05-09 10:21:41 +02:00
Yang Liu 78193c5f1a [ENV] Refactored file-mapping handling (#2612)
* [ENV] Refactored file-mapping handling

* fix
2025-05-08 16:49:48 +02:00
ptitSeb 51d2b73cd7 [RCFILE] Fixed WEAKBARRIER=2 never taken into account 2025-05-08 16:41:02 +02:00
ptitSeb 7b5200094c [WRAPPER] Added a couple of wrapped function to glib2 (for #71) 2025-05-08 11:48:53 +02:00
Yang Liu 5d14413b89 [DYNAREC] Use PE volatile metadata in dynarec (#2610) 2025-05-07 16:50:37 +02:00
ptitSeb ec54969094 [WRAPPER] Better handling of secure_getenv, but still not perfect 2025-05-07 16:26:25 +02:00
Leslie Zhai 11513d662d [NON4KPAGE] Fix AllocLoadElfMemory multiblocks wrong alignment (#2608) (#2609) 2025-05-07 15:36:37 +02:00
ptitSeb 6487ee0eda [WRAPPER] Added 1 more wrapped function to glib2 (for #71) 2025-05-06 16:38:20 +02:00
Yang Liu 8d7db7f1fb Added a simple PE loaded dedicated for volatileMetadata (#2607) 2025-05-06 13:45:38 +02:00
ptitSeb 11563f3b62 [BOX32][WRAPPER] Fix wrapping of XGetKeyboardMapping return (for #2135) 2025-05-06 11:30:21 +02:00
ptitSeb ff566e8116 Try to fix some remaining regression with customme rbtree refactor (for #2600) 2025-05-05 16:48:57 +02:00
ptitSeb 1ddf9a0a00 [RCFILE] Fixed all regression of BOX64_ADDLIBS settings 2025-05-05 13:03:00 +02:00
ptitSeb 35fa13899a [TRACE] Better log for unsetenv and putenv functions 2025-05-03 16:57:14 +02:00
Chi-Kuan Chiu 5ee4385477 Use setProtection_mmap in NewBrick (#2599)
NewBrick() currently uses setProtection() after box_mmap(), which fails
to mark the region with the `MEM_MMAP` label. As a result, getMmapped()
returns 0, even though the memory was allocated via mmap.

Closes #2598
2025-05-03 11:40:29 +02:00
ptitSeb 25000d0903 [ARM64_DYNAREC] Fixed a regression on 256bits VBROADCAST[B/W] opcodes 2025-05-03 10:47:54 +02:00
ptitSeb b96e410f53 [ARM64_DYNAREC] Fixed generic case of VPSHUFD opcode on memory 2025-05-03 10:34:50 +02:00
ptitSeb 6203880a5f [ARM64_DYNAREC] Better log for scratch after ymm warning 2025-05-03 10:33:55 +02:00
ptitSeb 889dd64c5f [ARM64_DYNAREC] Fixed an issue introduced with fastnan=0 handling of SQRTSS (for #2593) 2025-05-02 13:26:25 +02:00
ptitSeb 198eea49a8 [ARM64_DYNAREC] Small changes in a few AVX shift opcodes 2025-05-01 12:11:10 +02:00
ptitSeb b500a6ebc2 [ARM64_DYNAREC] Added missing instruction name 2025-05-01 11:44:10 +02:00
ptitSeb cb26a742ff [INTERP] Added missing opcode nae in comment 2025-05-01 11:43:15 +02:00
ptitSeb 4b44501d17 [ARM64_DYNAREC] Fixed edge-case for VPERM2[F/I]128 opcodes 2025-05-01 11:13:25 +02:00
ptitSeb 830cc8a498 [INTERP] Fixed edge-case for VPERM2[F/I]128 opcodes 2025-05-01 11:13:01 +02:00
ptitSeb 16b0922ec5 [ARM_DYNAREC] Small improvments to VMASKMOVP[S/D] opcodes 2025-05-01 10:45:00 +02:00
ptitSeb 9791016c74 [INTERP] VMASKMOVP[S/D] opcodes have no register only path 2025-05-01 10:42:41 +02:00
ptitSeb ced1157132 [ARM64_DYNAREC] Cosmetic change to VGATHER[D/Q]P[D/S] opcodes 2025-04-30 18:35:22 +02:00
ptitSeb 56982e4c05 [ARM64_DYNAREC] Small rework on VFMAD*S[S/D] opcodes 2025-04-30 17:50:44 +02:00
ptitSeb f5e93a14a2 [INTERP] Fixed another instruction name comment 2025-04-30 17:49:48 +02:00
ptitSeb eae608f35c [ARM64_DYNAREC] Small improvment to VPBROADCAST[B/W] opcodes 2025-04-30 17:17:08 +02:00
ptitSeb 89dbd81f27 [INTERP] Improved NAN handling on VSUBPD opcode 2025-04-30 16:15:34 +02:00
ptitSeb c835227b8b [ARM64_DYNAREC] Fixed a potential issue with (V)STMXCSR opcodes 2025-04-30 15:58:09 +02:00
ptitSeb 57f07446ea [ARM64_DYNAREC] Add fastnan=0 handling in (V)SQRTSS opcodes 2025-04-30 15:47:48 +02:00
ptitSeb 7b2e084170 [INTERP] Improved NAN handling for some (V)SQRTS[S/D] opcodes 2025-04-30 15:46:08 +02:00
ptitSeb ab70523b39 [INTERP] Improve NAN handling on SQRTPS opcode 2025-04-30 15:22:01 +02:00
ptitSeb f0859e6462 [ARM64_DYNAREC] Switched RSQRTPS to precise instead of aproximate 2025-04-29 18:03:15 +02:00
ptitSeb 737a93a77c [INTERP] Improved (V)RSQRTSS opcodes 2025-04-29 17:56:08 +02:00
ptitSeb 17cbeab0be [ARM64_DYNAREC] Switched RPCPS opcode to precise 1/A instead of approximate 2025-04-29 17:33:52 +02:00
ptitSeb 313e16d2bc [ARM64_DYNAREC] Small optim on PTEST opcode 2025-04-29 15:58:28 +02:00
ptitSeb ae8b5b4239 [INTERP] Fixed some more instruction name comments 2025-04-29 15:54:00 +02:00
rajdakin 1aa29ec1d3 [WRAPPERHELPER] Fixed 02423c2 (#2584) 2025-04-28 20:33:47 +02:00
Yang Liu f72d43b77e [RV64_DYNAREC] Minor optim to 8 bit TEST opcode (#2583) 2025-04-28 20:32:54 +02:00
Yang Liu 25de8bd35c [RV64_DYNAREC] Small optimization to LEA opcode (#2582) 2025-04-28 12:31:15 +02:00
ptitSeb 5c9dc159d2 [ARM64_DYNAREC] Mostly cosmetic changes to SSE/AVX packed shift opcodes 2025-04-28 11:37:35 +02:00
ptitSeb 5a4021d72b [INTERP] Fixes and improvments to SSE/AVX packed shift opcodes 2025-04-28 11:36:50 +02:00
Yang Liu ebaea69204 [RV64_DYNAREC] Optimized rv64 printer for pseudo and jump instructions (#2581) 2025-04-28 09:40:47 +02:00
Yang Liu a221d50c17 Show Dynarec architecture in version string (#2580) 2025-04-28 09:39:22 +02:00
Yang Liu 4441be7a02 [RV64_DYNAREC] Minor adjustment to dynarec_missing=2 (#2578) 2025-04-28 08:11:28 +02:00
ptitSeb bb7dfd395f [ARM64_DYNAREC] Small optim for PSIGN[B/W/D] opcodes 2025-04-27 19:39:01 +02:00
ptitSeb b552de33f9 [ARM64_DYNAREC] Some work on UD flags on (66) F3 0F BC/BD opcodes 2025-04-27 17:37:44 +02:00
ptitSeb 35c8beb15f [ARM64_DYNAREC] More work on UD flags for (66) F3 0F BC/BD opcodes 2025-04-27 16:18:57 +02:00
ptitSeb e1fd56123c [ARM64_DYNAREC] Minor fox to F6 /7 opcode 2025-04-27 16:18:23 +02:00
ptitSeb b7ae6ebc27 [INTERP] More work on UD flags 2025-04-27 15:51:17 +02:00
ptitSeb 9b904c622a [INTERP] Fixed some potential issue with LOCK ADC/SBB on Dynarec build 2025-04-27 15:41:22 +02:00
ptitSeb 950371427d [INTERP] Added 66 F3 0F BC opcode 2025-04-27 14:15:29 +02:00
ptitSeb be63129179 [WRAPPER] Reworked libssh2 wrapping, to make it more complete 2025-04-27 14:07:31 +02:00
ptitSeb 02423c2d7d [WRAPPERHELPER] Fixed a small issue with the parser 2025-04-27 14:07:01 +02:00
ptitSeb 4add55aa45 [ELFLOADER] Fixed an issue were fail to load a library might endup unloading used libraries 2025-04-27 12:38:32 +02:00
ptitSeb 7334bb46c6 [ELFLOADER] Added lib loading/unloading logs to DLSYM_ERROR 2025-04-27 11:53:33 +02:00
ptitSeb 9c962f8b2c [RCFILE] Fixed BOX64_ROLLING_LOG not being a boolean but an integer value 2025-04-27 11:06:40 +02:00
ptitSeb 1f73944603 [ARM64_DYNAREC] Refactored (V)PSHUFD opcodes 2025-04-26 15:57:38 +02:00
ptitSeb e844c5baa3 [INTERP] Cosmetic change to VPSHUFD opocde 2025-04-26 15:43:56 +02:00
ptitSeb c849178bf8 [WRAPPER] Fixed some potential sagfault on my_backtrace wrapped function 2025-04-26 15:43:01 +02:00
ptitSeb ff4ae1f4d8 [ARM64_DYNAREC] Allow shift with saturation on (V)PMULH(U)W because it will never saturate 2025-04-26 10:46:11 +02:00
ptitSeb f7acb78743 [ARM64_DYNAREC] Small fix for edge cases on (V)PMULHUW opcodes 2025-04-26 10:39:44 +02:00
ptitSeb 6796b9ca02 [WRAPPER] Added some missing function to wrapped libgio-2 (for #2575) 2025-04-26 10:12:28 +02:00
ptitSeb e4da025dc0 [ARM64_DYNAREC] Fixed (rarely used) some edge case for (V)PMULHRSW opcode (and improved tests) 2025-04-25 20:03:58 +02:00
ptitSeb b6b069cf8d [ARM64_DYNAREC] Small optim on some 256bits VPMOV[S/Z]X* opcodes 2025-04-25 17:28:28 +02:00
ptitSeb f9475aa540 [ARM64_DYNAREC] Allow bigger block to be built 2025-04-25 16:43:23 +02:00
ptitSeb c6f0872e50 [ARM64_DYNAREC] Minor change, (V)PMOVMSKB is only valid on register, not memory 2025-04-25 16:10:16 +02:00
ptitSeb 71dc02e06f [INTERP] Another fix for a opcode name in comment 2025-04-25 16:05:50 +02:00
ptitSeb e9715e4f0f [INTERP] Fixed a small issue where VPCMP[E/I]STRM would not wipe upper 128bits of ymm0 2025-04-25 11:14:02 +02:00
ptitSeb 8f197a7c08 [ARM64_DYNAREC] Fixed a potential issue with PCMPEQQ opcodes, and many missing space in instruction name 2025-04-25 10:56:38 +02:00
ptitSeb 3542c88dc1 [ARM64_DYNAREC] Improved and fixed software fallback for (V)PCLMULQDQ opcodes 2025-04-24 19:50:32 +02:00
ptitSeb 4585b74310 [ARM64_DYNAREC] Some optimisation to some (V)(P)BLEND* opcodes 2025-04-24 19:04:42 +02:00
ptitSeb 768dfd37bb [INTERP] Yet another opcode name comment fix 2025-04-24 19:03:03 +02:00
Yang Liu d8212fab48 [SIGNAL] Better signal logging when trace enabled (#2572)
* [SIGNAL] Better signal logging when trace enabled

* fix
2025-04-24 16:40:39 +02:00
Yang Liu 740f4a19dc [RV64_DYNAREC] Fixed x87 cache swapping (#2571) 2025-04-24 16:07:43 +02:00
ptitSeb c469ed867a [ARM64_DYNAREC] Small optim on (V)PACKUSDW opcodes 2025-04-24 15:38:30 +02:00
phorcys 37dcb1a77b [LA64_DYNAREC] Add/Opt more mmx/sse ops (#2565)
* [LA64_DYNAREC] Add/Opt PEXTR{B,W,D,Q}/PINSR{B,W,D,Q} .
  * 0f.c4/c5 PINSRW/PEXTRW mmx ops.
  * 66.0f.3a.14/15/16 PEXTR{B,W,D/Q} SSE4 ops.
  * 66.0f.c4/c5 PINSRW/PEXTRW sse ops.

* [LA64_DYNAREC] Add more SSE3/SSE4 ops
66.0f.38.28 PMULDQ
66.0f.38.2a MOVNTDQA
66.0f.38.37 PCMPGTQ
66.0f.38.38/3b/3c/3f PMINSB/PMINUD/PMAXSB/PMAXUD
66.0f.3a.17 EXTRACTPS
66.0f.3a.41 DPPD
opt 66.0f.3a.40 DPPS
2025-04-24 13:26:57 +02:00
ptitSeb 2e90a5dbaf [INTERP] Cosmetic change to 0F 1C..1E opcodes 2025-04-24 12:07:45 +02:00
ptitSeb d988a39456 [INTERP] Added nan handling on AVX.F3.0F 59 opcode 2025-04-24 11:54:55 +02:00
ptitSeb fc381e744e [ARM64_DYNAREC] Simplified code for MOVS[H/L]DUP opcodes 2025-04-24 11:38:20 +02:00
ptitSeb e52b24b615 [INTERP] Fixed another opcode name comment 2025-04-24 11:37:17 +02:00
phorcys 7158405b73 [LA64_DYNAREC] Add POPCNT/TZCNT/LZCNT ops. (#2566)
66.f3.0f.b8/bc/bd POPCNT/TZCNT/LZCNT 16bits ops
f3.0f.bd LZCNT
fix f3.0f.bc TZCNT (GETED/RESTORE_EFLAGS x1 conflict)
2025-04-24 11:28:42 +02:00
ptitSeb e059506d5e [ARM64_DYNAREC] Small iùprovments to some (V)MOVQ opcodes 2025-04-24 11:15:06 +02:00
ptitSeb 6da3a1265d [INTERP] Fixed a comment 2025-04-24 11:14:28 +02:00
ptitSeb d51997bc77 [ARM64_DYNAREC] Small change and optims to various (V)MOVNT* opcodes 2025-04-24 10:58:56 +02:00
ptitSeb af555abb6f [INTERP] Small change to various (V)MOVNT* opcodes, forbidding reg -> reg form 2025-04-24 10:58:23 +02:00
Yang Liu 926e4b2da8 [DYNAREC] Added ranged Dynablock dump (#2570) 2025-04-24 10:37:24 +02:00
Yang Liu 4903177bab [ARM64_DYNAREC] Minor optim to MOVNTDQA (#2568) 2025-04-24 09:17:52 +02:00
Yang Liu d8a6fa0395 Added some missing newlines (#2567) 2025-04-24 09:16:49 +02:00
ptitSeb 69127efae9 [ARM64_DYNAREC] Small fixes and improvments to (V)MOVMSKP[S/D] opcodes 2025-04-23 18:43:13 +02:00
ptitSeb 6f0db360a4 [ARM64_DYNAREC] Few fixes and small cosmetic changes to some partial (V)MOV opcodes 2025-04-23 18:21:15 +02:00
ptitSeb 223de50ec9 [INTERP] Fex fixes and small cosmetic changes to some partial (V)MOV opcodes 2025-04-23 18:20:38 +02:00
ptitSeb 5cfad22165 [ARM64_DYNAREC] Made REP MOVSB optimisation flagless 2025-04-23 12:54:04 +02:00
ptitSeb 815836d285 [ARM64_DYNAREC] Optimized REP STOSB 2025-04-23 12:47:56 +02:00
ptitSeb 468a3c2165 [PERFMAP] Added x86 address of code when function name cannot be found, instead of ??? 2025-04-23 11:48:37 +02:00
ptitSeb 3afe87bcce [ARM64_DYNAREC] Various improvment to various SSE/AVX 128bits/256bits mov opcodes 2025-04-23 10:57:07 +02:00
ptitSeb d79d6bd6c2 [INTERP] RaZ upper 128bits on vmov* Ex, Gx if Ex is a registry (unused?) 2025-04-23 10:55:17 +02:00
rajdakin cc6500b7dd [RBTREE] Fixed an edge case (#2562) 2025-04-22 13:52:01 +02:00
Yang Liu ad494480ce [DYNAREC] Added a x87pc test and some cosmetic changes too (#2561) 2025-04-22 13:31:04 +02:00
phorcys 854f6675db [LA64_DYNAREC] Add SSSE3's mmx ops. (#2559)
0f.38.00 PSHUFB
      01 PHADDW
      02 PHADDD
      03 PHADDSW
      04 PMADDUBSW
      05 PHSUBW
      06 PHSUBD
      07 PHSUBSW
      08 PSIGNB
      09 PSIGNW
      0a PSIGND
      0b PMULHRSW
      1c PABSB
      1d PABSW
      1e PABSD
2025-04-22 13:26:51 +02:00
ptitSeb fc15743ff9 [ARM64_DYNAREC] Improved (V)[MIN/MAX][S/P][S/D] opcodes 2025-04-22 12:20:23 +02:00
ptitSeb 91ead3b12a [INTERP] Improved (V)[MIN/MAX][S/P][S/D] opcodes 2025-04-22 12:20:03 +02:00
Chi-Kuan Chiu 75aaf7aa64 [RBTREE] Cache boundary nodes and remove add_range() (#2557)
* Cache leftmost and rightmost node

Add two fields to `rbtree`: `lefter` and `righter`, to cache the
leftmost and rightmost nodes respectively. This eliminates the need for
O(log N) traversals in `rb_get_lefter()` and `rb_get_righter()`.

Motivated by the Linux kernel's use of cached pointers for `rb_first()`
and `rb_last()`, this change improves efficiency of boundary queries by
replacing repeated tree walks with direct pointer dereference.

Experiment: running `chess.exe` with Box64 + Wine (#2511)
- ~3,500 insertions into the tree
- 607 lightweight cache updates (single assignment)
- 397 full tree traversals avoided

This results in reduced runtime overhead for boundary checks, with
memory cost (+2 pointer  per tree). Expected benefits increase
in larger or more dynamic workloads.

Ref: https://docs.kernel.org/core-api/rbtree.html

* Remove redundant add_range() wrapper

The function `add_range()` was only called when `tree->root == NULL`.
In such cases, the while-loop inside `add_range()` never runs,
resulting in a call to `add_range_next_to()` with `prev == NULL`.

Replaced it with direct calls to `add_range_next_to(tree, NULL, ...)`.
2025-04-22 11:51:57 +02:00
Yang Liu 39a66e25ee [RV64_DYNAREC] Better handling of x87double=2 (#2560) 2025-04-22 11:07:34 +02:00
ptitSeb 574d6f9dab [ARM64_DYNAREC] Small improvements to (V)MASKMOVDQU opcode 2025-04-21 17:41:04 +02:00
ptitSeb c39869b770 [ARM64_DYNAREC] Better handling of x87double=2 2025-04-21 16:07:05 +02:00
ptitSeb 302b6493e2 [ARM64_DYNAREC] Fixed potential issue with (V)LDDQU opcode 2025-04-21 14:13:56 +02:00
Yang Liu 20ea2987a8 [DYNAREC] More handling of low precision x87 flag change (#2556) 2025-04-21 14:09:26 +02:00
ptitSeb eee547d50a [INTERP] More fixes to INSERTQ/EXTRQ opcodes 2025-04-21 14:01:56 +02:00
Yang Liu a19f4b9eca [RV64_DYNAREC][TRACE][COSIM] Improve x87 fiability in dynarec trace and cosim scenario (#2555) 2025-04-21 13:18:40 +02:00
ptitSeb 6f3f3e0e85 [ARM64_DYNAREC] Add/Improved (V)H[ADD/SUB]P[S/D] opcodes 2025-04-21 12:22:06 +02:00
Yang Liu 2384462f61 [ENV][COSIM] Enable x87double only if it's off (#2554) 2025-04-21 11:54:42 +02:00
ptitSeb e6e6c3ac65 [ARM64_DYNAREC] Small change to 66 0F 3A 17 opcode 2025-04-21 11:45:09 +02:00
ptitSeb 102e6a1f61 [INTERP] Fixed EXTRQ opcode 2025-04-21 11:44:11 +02:00
ptitSeb 460e6c517d [ARM64_DYNAREC] Minor cosmetic changes 2025-04-21 11:27:20 +02:00
ptitSeb 965105c08a [INTERP] Better NAN handling for (V)DIV[P/S][S/D] opcodes 2025-04-21 11:27:01 +02:00
ptitSeb 3fef880a7d [INTERP] VDPPD has no 256bits version 2025-04-21 11:26:01 +02:00
Yang Liu e7b4c79d12 [RV64_DYNAREC] Added X87DOUBLE=2 support (#2553) 2025-04-21 10:19:44 +02:00
ptitSeb 7cdfa187c5 [ARM64_DYNAREC] Another potential fix for X87DOUBLE=2 2025-04-21 09:25:24 +02:00
ptitSeb d0da57547e [ARM64_DYNAREC] Fixed some potential issues with BOX64_DYNAREC_DOUBLE=2 2025-04-21 08:58:08 +02:00
ptitSeb e60fd72672 [TRACE] Fixed an issue with a trace on dynablock exiting execution 2025-04-21 08:57:33 +02:00
ptitSeb c6ae7d36dd [TRACE] Better trace, using maplile name if available, and better write on a dynablock memory log 2025-04-20 16:23:30 +02:00
ptitSeb 3836625017 Fixed an issue with custom memory when a map is created for an blockstree node, avoiding re-entrance on blockstree handling and tree corruption 2025-04-20 16:22:32 +02:00
ptitSeb 319f67d577 [DEBUG] Exposed a debug function to print an rbtree 2025-04-20 16:19:36 +02:00
Chi-Kuan Chiu 28d12f6785 Merge mmapmem into mapallmem (#2550)
This commit removes the separate `mmapmem` red-black tree and
merges its into `mapallmem`, reducing overall memory usage.

To distinguish memory regions that were previously tracked
separately in `mmapmem`,
we now use a new `mem_flag_t` bitmask enum in the data field
of `mapallmem`:

    MEM_ALLOCATED = 1  // allocated
    MEM_RESERVED  = 2  // reserved
    MEM_MMAP      = 3  // allocated via mmap()

Resolves #2546
2025-04-20 14:24:22 +02:00
ptitSeb e7113b228f [BOX32][WRAPPER] Removed a debug leftover 2025-04-19 22:44:49 +02:00
ptitSeb bc3cfe82cf [BOX32][WRAPPER] Added a workaround on XF86VidModeGetAllModeLines for 12 labors of Hercules 6 2025-04-19 21:04:02 +02:00
ptitSeb 6ccac8ab5a [BOX32][WRAPPER] Added 32bits wrapped ftime function 2025-04-19 20:33:07 +02:00
ptitSeb c9d756eeea [RCFILE] Better profile for Cyberpunk 2077 2025-04-19 20:32:45 +02:00
ptitSeb 549b57ee30 [INTERP] Added F2 0F BA opcode (for 2547) 2025-04-19 15:44:37 +02:00
ptitSeb 660dbfc3ad Another fix for non-dynarec build 2025-04-18 18:33:00 +02:00
ptitSeb d89ad5f1b9 This should fix non-dynarec build 2025-04-18 18:17:40 +02:00
ptitSeb 00a7d321a7 [DYNAREC] Better dynablock mempry handling, and fixed a regression introduced when improving dynmem rbtree 2025-04-18 17:57:39 +02:00
ptitSeb 4c9765cd5e Also preserve flags stuffs on signal handling when needed 2025-04-18 17:57:39 +02:00
ptitSeb fe307dbc96 [DYNAREC][TRACE] Slightly better trace message on creating dynablock 2025-04-18 17:57:39 +02:00
phorcys 518c860e5d [LA64_DYNAREC]Add/opt more SSE/MMX ops (#2543)
* Add SSE2 op MASKMOVDQU.
 * Opt PSADBW.
 * Add SSE3 HSUBPD op.
 * Add mmx PALIGNR op.
 * Fix PSRLDQ.
 * Fix PSRAW Gx,Ex PSRAW Gm,Em.
     mmx/sse get COUNT from Em/Ex as an 64bit unsigned...
     testsuite with shift 0x4,0x4,0x4,0x4, result COUNT as 0x04040404.
2025-04-18 17:09:34 +02:00
ptitSeb 053c389cfb [DYNAREC] Small improvment to callret=2 handling of path to regen a block 2025-04-18 11:58:37 +02:00
ptitSeb 81be6b1f30 Removed a function not used anymore 2025-04-18 11:57:27 +02:00
ptitSeb 3d975b090e [MMAP] Better guessing of wine process mapping regions 2025-04-18 11:56:59 +02:00
Yang Liu 882d933d84 [WOW64] Finished skeleton code for PE build (#2542)
* [WOW64] Finished skeleton code for PE build

* move musl to external
2025-04-17 12:30:59 +02:00
phorcys 9579dd9ff1 [LA64_DYNAREC] Add SSE1/SSE2's cvt mmx ops. (#2538) 2025-04-17 08:12:28 +02:00
Yang Liu 46a91e0ad9 [WOW64] More tweaks to CMake PE build (#2541) 2025-04-16 15:12:02 +02:00
ptitSeb b26a20e709 [ARM64_DYNAREC] More handling of low precision x87 flag change 2025-04-16 15:08:56 +02:00
ptitSeb d7eb87129e [DYNAREC] Introduce BOX64_DYNAREC_X87DOUBLE=2 to handle Low Precision x87 ([ARM64_DYNAREC] only for now) 2025-04-16 14:53:54 +02:00
ptitSeb 7f569247d5 Motsly commetic change in internal SIGILL handling 2025-04-16 14:51:50 +02:00
ptitSeb 1ba0ea157f [INTERP] Added x87 Precision Control set to 24bits handling 2025-04-16 12:03:13 +02:00
ptitSeb 1e64476f31 [TRACE] Better x87 infos on reg dumps 2025-04-16 12:03:13 +02:00
phorcys 96080e48cf [LA64_DYNAREC] Add mmx pack/unpack ops. (#2536)
add PUNPCKL{BW,WD,DQ}, PUNPCKH{BW,WD,DQ} mmx ops.
  add PACKSSWB PACKUSWB PACKSSDW mmx ops.
  * fix some merge mistake in prev mmx commit.
2025-04-16 08:07:08 +02:00
Yang Liu 4695a4ff3c [WOW64] Added PE build to the build system (#2537) 2025-04-15 16:50:58 +02:00
ptitSeb 8f3018e10c [ARM64_DYNAREC][TRACE][COSIM] Improve x87 fiability in dynarec trace and cosim scenario 2025-04-15 14:15:03 +02:00
ptitSeb 24b0ba9885 [ARM64_DYNAREC][TRACE] Changed TBZ/TBNZ printer to print bit offset in decimal 2025-04-15 14:14:01 +02:00
ptitSeb 4f04deadfe [ARM64_DYNAREC] Added 67 0F 29 opcode 2025-04-15 14:12:29 +02:00
ptitSeb 064c2b037e [DYNAREC] Fix on strongmem mode were last write on a seq on 1 write could be ignored 2025-04-15 13:57:55 +02:00
Yang Liu 12a90ebe98 Eliminated many compilation warnings (#2535) 2025-04-15 13:35:58 +02:00
phorcys 5cd201241b [LA64_DYNAREC] Add mmx cmp ops. (#2533) 2025-04-15 09:32:19 +02:00
Yang Liu 6b2373af93 [WOW64] Added non-functional PE build (#2532) 2025-04-14 13:34:43 +02:00
phorcys cf32412f98 [RV64_DYNAREC] fix MASKMOVQ. (#2531)
maskmovq write when sign bit == 1.
if mask byte = 0x00, should skip.
replace BLT with BLE.
2025-04-14 13:32:14 +02:00
phorcys f559bc48a4 [LA64_DYNAREC] Add mmx arith ops. (#2530) 2025-04-14 13:30:37 +02:00
phorcys 0021fbbea3 [LA64_DYNAREC] Add mmx shift ops. (#2529) 2025-04-14 11:30:02 +02:00
Yang Liu ee530a7331 [WOW64] More tweaks for PE build (#2528) 2025-04-14 11:29:22 +02:00
phorcys b7cb36d362 [LA64_DYNAREC] Optimize sse_setround (#2527) 2025-04-14 09:14:45 +02:00
phorcys 1bd471bf13 [LA64_DYNAREC] Add mmx related mov op (#2526)
* [LA64_DYNAREC] Add SSE2's MOVQ2DQ/MOVDQ2Q mmx op

* [LA64_DYNAREC] Add mmx mov ops.
2025-04-14 09:14:34 +02:00
ptitSeb 21911620c8 [INTERP] Fixed pure 32bits iretd not behaving correctly 2025-04-13 10:33:43 +02:00
ptitSeb 56f58501ec [BOX32][WRAPPER] Added a few more 32bits symbols to libc 2025-04-12 18:47:34 +02:00
ptitSeb a89748e9e5 [BOX32][WRAPPER] Added wrapped libmount and libblkid, plus 1 new wrapped function on libgbm 2025-04-12 18:34:03 +02:00
ptitSeb 91f9a58b30 [BOX32][WRAPPER] Added 32bits wrapped libselinux 2025-04-12 17:53:56 +02:00
ptitSeb fea05a30e8 [BOX32][WRAPPER] Some fixes to a few 32bits wrapped libc functions 2025-04-12 17:47:27 +02:00
ptitSeb e678e8428b [BOX32][WRAPPER] Added a few more wrapped functions to libdrm 2025-04-12 16:11:41 +02:00
ptitSeb 20377b9927 [BOX32][WRAPPER] Added 32bits wrapped libGLX 2025-04-12 15:22:14 +02:00
ptitSeb 163689d2bb [BOX32][WRAPPER] Added 32bits wrapped libEGL 2025-04-12 15:08:27 +02:00
ptitSeb e49551bda5 [BOX32][WRAPPER] Added 32bits wrapped libgbm 2025-04-12 14:54:06 +02:00
ptitSeb 514427cf8a [BOX32][WRAPPER] Added 32bits wrapped pselect function 2025-04-12 14:40:43 +02:00
ptitSeb 68f5512ee7 [BOX32][WRAPPER] Fixed 32bits wrapping for XRenderQueryFilters function 2025-04-12 14:31:54 +02:00
phorcysandphorcys b3165e62ab [LA64_DYNAREC] Update la64 mmx infra. (#2524)
Co-authored-by: phorcys <[email protected]>
2025-04-12 13:12:50 +02:00
ptitSeb 0fbf5f1896 [ANDROID] Another change on some internal structure for Android 2025-04-12 09:45:42 +02:00
ptitSeb 592a2a75bb [ANDROID] Adjusted some signals structure for Android/Bionic 2025-04-11 18:13:26 +02:00
Yang Liu 6c46e3d9b1 [WOW64] Splitted freq and cleanup functions from x64emu (#2521) 2025-04-11 12:26:51 +02:00
ptitSeb fa85d4d900 [ARM64_DYNAREC] Some more FRINTTS and AVX/SSE fixes (might help #2520) 2025-04-11 11:22:27 +02:00
ptitSeb 51d9eb966d [DYNAREC] Speedup a bit DYNAREC_DIRTY=1 2025-04-10 19:00:47 +02:00
ptitSeb 310d4016fa [BOX32] Fix a potential build issue 2025-04-10 19:00:36 +02:00
Yang Liu 0bb41a73c2 [WOW64] More tweaks towards PE build (#2519) 2025-04-10 14:09:23 +02:00
Yang Liu f9f082ee53 [WOW64] More work on the PE wow64 build (#2518)
* [WOW64] More work on the PE wow64 build

* added a TODO
2025-04-10 12:14:50 +02:00
ptitSeb 66bb1aeb89 [DYNAREC] Improved handling of db_size rbtree 2025-04-09 18:05:15 +02:00
ptitSeb 91848efa34 Reduced usage of the rbtree in FindDynablockFromAddress by creating node only on first query (in response to #2511 analysis) 2025-04-09 15:51:31 +02:00
Yang Liu 5ea247b84c Made custommem OS-independent (#2517) 2025-04-09 15:21:55 +02:00
ptitSeb 8c991cb676 [DYNAREC] Better handling of self-loop and added CALLRET=2 settings (ARM64 only, RV64 and LA64 todo) 2025-04-09 15:19:45 +02:00
ptitSeb 70770db8be Small change on Steam game launch handling 2025-04-09 14:28:23 +02:00
Yang Liu d0a5352c1a Moved emit functions to seperate files from signals.h (#2516) 2025-04-09 11:57:16 +02:00
ptitSeb 7391befb7e [BOX32][WRAPPER] Added 2 more spawn_ wrapped functions 2025-04-09 11:54:29 +02:00
Yang Liu c9b6b5fbe0 Added backtrace.h for holding backtrace-related functions (#2515) 2025-04-09 11:16:32 +02:00
Yang Liu 62765f151a [ARM64_DYNAREC] Fixed some dangling else warnings (#2514) 2025-04-09 10:35:34 +02:00
Yang Liu d592c1996d [WOW64] Add wow64 PE build scaffolding (#2513) 2025-04-08 19:12:55 +02:00
ptitSeb 8b3d4404d7 [DYNAREC] Do not mark a dynablock as always_test for loop on itself that are not alive 2025-04-08 14:22:07 +02:00
ptitSeb b060fca66c [TRACE] Change log level for wine_main_preload_info not found, as it's not always relevent on later version of wine and may disturb scipt like winetricks 2025-04-07 11:09:31 +02:00
cjy880927andchenjiangyi 4aab7a02f4 [CMAKE]: Fix arm64 build (#2507)
Log: Ensure successful compilation on devices that do not support
     cortex-a77.cortex-a55, such as those with CPU Model Cortex-A55.

Signed-off-by: chenjiangyi <[email protected]>
Co-authored-by: chenjiangyi <[email protected]>
2025-04-07 09:34:42 +02:00
ptitSeb 6d7af8674a [WRAPPER] Update generated files missing from previous PR 2025-04-06 12:25:09 +02:00
Krzysztof Aleksander Pyrkosz 5fc3188bc8 Add __localtime64 and __time64 in box32 mode (#2502) 2025-04-05 16:10:17 +02:00
Krzysztof Aleksander Pyrkosz f4f868831a Corrected arguments of my_epoll_pwait2 (#2501) 2025-04-05 15:50:56 +02:00
ptitSeb 1e89ccb17e [ARM4_DYNAREC] A few changes to seem SSE/AVX comparison and convertions opcodes, and more FRINTTS usage too 2025-04-04 16:59:44 +02:00
ptitSeb e80b595e8e [INTERP] Small changes in a few SSE/AVX convertions opcodes 2025-04-04 16:58:53 +02:00
ptitSeb ecc5375615 [ARM64_DYNAREC] Small adjustement to 2 AVX opcodes 2025-04-04 11:20:52 +02:00
phorcysandphorcys 8da0fab674 [LA64_DYNAREC] Optimize la64 MAXPD/MAXPS. (#2499)
Co-authored-by: phorcys <[email protected]>
2025-04-03 19:13:12 +02:00
Yang Liu fb955a3975 Decoupled alternate functions from bridge (#2500) 2025-04-03 19:12:33 +02:00
Yang Liu 8cd3ba8c9e [INTERP] Fixed a nan propagation issue on RISC-V (#2498) 2025-04-03 18:11:32 +02:00
Yang Liu 8cba915bca Moved more functions to os.h (#2497)
* Removed some unused function declarations

* Moved more functions to os.h

* review
2025-04-03 15:48:04 +02:00
ptitSeb cd3163a785 [INTERP] Better handling of default NAN for a few opcodes, more to come 2025-04-03 13:54:07 +02:00
ptitSeb b472459a22 [ARM64_DYNAREC] Removed some condition on vex.l that shouldn't be here on a few AVX opcodes 2025-04-03 13:53:18 +02:00
Yang Liu 42c241ee4e [CI] Enable cppThreads_32bits in the CI (#2496)
* [CI] Enable cppThreads_32bits in the CI

* switch to a specific termux mirror
2025-04-03 11:18:04 +02:00
phorcysandphorcys fb6ee29539 [LA64_DYNAREC] Add more sse ops (#2493)
fix 0F.5D/5F MINPS/MAXPS    fix unordered.
    fix 66.0F.5D/5F MINPD/MAXPD	fix unordered.
    66.0F.3A.08/09/0A ROUNDPS/ROUNDPD/ROUNDSS
    66.0F.3A.0C/0D BLENDPS/BLENDPD
    66.0F.3A.21 INSERTPS
    66.0F.C2 CMPPD
    printer add VFCMP.cond.s/d, vbitsel.v:

Co-authored-by: phorcys <[email protected]>
2025-04-03 09:48:24 +02:00
ptitSeb be6104c2ed [ARM64_DYNAREC] Small optim for VBLENDPS opcode 2025-04-02 14:25:47 +02:00
ptitSeb 3f90221b18 [ARM64_DYNAREC] Fixed an optim in BLENDPS opcode 2025-04-02 14:21:46 +02:00
Yang Liu b5c792f5f0 Moved some emit functions to os.h (#2494) 2025-04-02 13:13:07 +02:00
ptitSeb b45d75f0c4 [BOX32][WRAPPER] Added wrapped 32bits wctype to libc (for steam #2478) 2025-04-02 08:49:15 +02:00
Yang Liu b68d46311d Moved more OS-dependent functions to os.h (#2491) 2025-04-01 21:12:15 +02:00
Yang Liu 2c7a2082e6 Introduced box64cpu.h for exported interpreter and dynarec functions (#2490) 2025-04-01 19:02:07 +02:00
phorcysandphorcys 3230265646 [LA64_DYNAREC] Fix f0.80.1 LOCK OR, LoongArch ANDI is zero-extended. (#2489)
Co-authored-by: phorcys <[email protected]>
2025-04-01 15:13:45 +02:00
Yang Liu c2a77fca27 Added os.h for future usage (#2488) 2025-04-01 13:50:49 +02:00
Yang Liu 670876112e Some cosmetic changes to C header files (#2487)
* [DYNAREC] Move cosim functions to a new header

* Moved isNativeCall to elfloader
2025-04-01 12:36:12 +02:00
ptitSeb 495d3cc4c0 [CMAKE] Changed how CFLAGS and ASLFLAGS are setup and applied (for #2483) 2025-03-31 17:47:08 +02:00
ptitSeb b7ab26073e [TRACE] Do not print opcode at SIGBUS if x64pc or pc is not readable 2025-03-31 13:14:26 +02:00
ptitSeb 1c3df4b92c [DEBUG] Fixed debug tool testAllBlocks() to correctly handle new map128 custom alloc 2025-03-31 13:13:48 +02:00
ptitSeb b1ba548d62 [INTERP] Added support for F2 0F A5 opcode, ignoring F2 (for #2459) 2025-03-31 11:37:44 +02:00
ptitSeb da4f574bdd [WRAPPER] Added 2 new funciton towrapped libgdkpixbuf (for #2460) 2025-03-31 11:21:34 +02:00
ptitSeb 8561a4a833 [ARM64] Use crc32 hardware support (if available) for dynablock signature 2025-03-31 10:29:57 +02:00
ptitSeb c40f9651bc Optimized and fixed custom 128bytes allocator 2025-03-30 18:35:27 +02:00
ptitSeb 104e582253 [ARM64_DYNAREC] Another attempt to get correct assembly file handling 2025-03-30 16:00:25 +02:00
ptitSeb 03c69338f5 [ARM64_DYNAREC] Added atomic support for various lock helpers 2025-03-30 14:56:16 +02:00
ptitSeb 0fa28b87f1 [INTERP] Fixed a warning 2025-03-30 14:45:18 +02:00
ptitSeb 4ae94c5168 [CI] Another atempted fix for arm64 asm handling 2025-03-30 14:23:47 +02:00
ptitSeb a429ca70e7 [CI] Try to fix arm64/Clang build 2025-03-30 13:54:40 +02:00
ptitSeb ee760fced1 [CMAKE] Small rework on how asm file are handled 2025-03-30 13:27:23 +02:00
ptitSeb a80659075d Introduced a bitmap based allocator for <= 128bits customMalloc (not lockfree yet) 2025-03-30 11:32:49 +02:00
ptitSeb da0d0c1fc2 [RV64] Improved rv64_lock_cas[b/h] helpers 2025-03-30 11:31:55 +02:00
ptitSeb 5ea2c245d6 [LA64] Fixed la64_lock_cas_[h/b]_slow helper (rarely used) 2025-03-30 11:31:18 +02:00
ptitSeb e7b71cba5f [ARM64_DYNAREC] Fixed a potential issue with SSE regs when internal jumping to a native call 2025-03-29 10:04:19 +01:00
ptitSeb d2817e7246 [BOX32] Small changes in pthread_cond_timedwait wrapping to handle malformed timespec 2025-03-29 10:03:21 +01:00
Yang Liu 7ae8e9a86f [LA64_DYNAREC] Added more MMX opcodes (#2479) 2025-03-28 19:45:38 +01:00
Yang Liu 0a59695fb3 [LA64_DYNAREC] Added more MMX opcodes (#2477) 2025-03-28 14:32:10 +01:00
Yang Liu cfdeb3685c [LA64_DYNAREC] Added preliminary MMX support (#2476) 2025-03-28 10:54:24 +01:00
Yang Liu fdf01ace3f [LA64_DYNAREC] Added more opcodes (#2475) 2025-03-28 09:08:16 +01:00
Yang Liu 30689882f0 [LA64_DYNAREC] Added more opcodes (#2473) 2025-03-27 15:43:02 +01:00
Yang Liu d2e8ff5118 [LA64_DYNAREC] Added more opcodes (#2472) 2025-03-27 14:37:00 +01:00
Yang Liu ec385c8e75 [INTERP] Fixed Interpreter to have new test30 running on RISC-V (#2470) 2025-03-27 10:21:34 +01:00
ptitSeb 3aed032738 Some fixes to ncurses / tinfo wrapped lib (for dialog shell helper, used in some installer) 2025-03-27 10:16:37 +01:00
ptitSeb 409b5a37fb [INTERP] More NA Sign fixes for a few AVX.0F opcodes 2025-03-26 19:57:55 +01:00
ptitSeb 9587e490cc [INTERP] Fixed Interpreter to have new test30 running 2025-03-26 19:27:19 +01:00
ptitSeb ad40638345 [CI] Improved test30 (might break rv64/la64 dynarec) 2025-03-26 18:42:57 +01:00
ptitSeb 443fe043e4 [ARM64_DYNAREC] Added fastnan=0 path for HSUBPS opcode 2025-03-26 18:29:53 +01:00
ptitSeb 6d9560870d [ARM64_DYNAREC] Improved VHSUBPS opcode, and added fastnan=0 path 2025-03-26 18:29:24 +01:00
ptitSeb 95d6106e3a [ARM64_DYNAREC] Commented a message that doesn't seems relevent 2025-03-26 18:15:10 +01:00
ptitSeb 5fb1ee033e [COSIM] Changed how F0 LOCK opcodes are skipped in COSIM 2025-03-26 18:14:23 +01:00
ptitSeb fed73858c6 [ARM64_DYNAREC] Improved (V)HADDPS with fastnan=0 2025-03-26 17:59:25 +01:00
ptitSeb cb5a52bf40 [ARM64_DYNAREC] Addedfastnan=0 code to (V)SQRTPS opcodes 2025-03-26 17:41:44 +01:00
ptitSeb eaa5f8feec [ARM64_DYNAREC] Improved (V)MAXP[S/D] and (V)MINP[S/D] opcodes to more closely match x6 behavior when using fastnan=0 (for #1046) 2025-03-26 17:33:37 +01:00
ptitSeb 8c6d9f04ec [ARM64_DYNAREC] Small change on AVX.66.0F38 BA opcode to more closely match x86 behavior (for #1046) 2025-03-26 17:26:51 +01:00
Yang Liu 45f7b4991f [RV64_DYNAREC] Fixed 66 0F 6A PUNPCKHDQ opcodes (#2468) 2025-03-26 16:15:06 +01:00
Yang Liu 98151eaebf [RV64_DYNAREC] Minor improvement to DD /7 FNSTSW opcode (#2467) 2025-03-25 13:51:03 +01:00
Yang Liu 933381f5fa [RV64_DYNAREC] Fixed D9 E5 FXAM opcode (#2466) 2025-03-25 12:25:56 +01:00
Yang Liu a021fc2005 [RV64_DYNAREC] Small optim to vsetvli usage (#2465) 2025-03-25 08:59:34 +01:00
Yang Liu 75e9aae281 [RV64_DYNAREC] Fixed scratch conflicts with fastround=0 in some x87 opcodes (#2464)
* [RV64_DYNAREC] Fixed scratch conflicts with fastround=0 in some x87 opcodes

* another fix

* more fix
2025-03-24 20:23:34 +01:00
Yang Liu b0de73852c [RV64_DYNAREC] Fixed some DD prefixed x87 opcodes (#2463) 2025-03-24 13:54:01 +01:00
ptitSeb d7744ea22d [DYNAREC] Better handling of blocksize limit when generating very large dynablocks 2025-03-24 12:03:18 +01:00
ptitSeb d3d3fa25f5 [ARM64_DYNAREC] Better log for arch_populate buffer being undersized 2025-03-22 22:26:50 +01:00
ptitSeb 98162e395f [ARM64_DYNAREC] Fixed potential issue on unligned path being marked while dynablock is building 2025-03-22 22:25:56 +01:00
ptitSeb 9511d83955 [ARM64_DYNAREC][TRACE] Added a message on Dump for Unaligned path on opcodes 2025-03-22 22:24:41 +01:00
ptitSeb 10cbb3c8a9 [ARM64_DYNAREC] Added 67 66 0F 76/EF opcodes (for #1046) 2025-03-21 11:30:50 +01:00
ptitSeb 0a3fa1c918 [RCFILE] Added a few more game profiles 2025-03-21 11:30:04 +01:00
ptitSeb 75e8b9961b [WRAPPER] Reverted previus commit 2025-03-20 18:38:47 +01:00
ptitSeb 5ab56ee172 [WRAPPER] Forgot those file in previous commit 2025-03-20 18:34:33 +01:00
ptitSeb 7873b70306 [WRAPPER] Added wrapping for libavutil.so.56, libavformat.so.58 and libavcodec.so.58 (for new winedmo.so MediaFundation ffmpeg backend) 2025-03-20 18:33:42 +01:00
rajdakin 86d9d851c6 [WRAPPERHELPER] Fixed a bug due to variadic arguments (#2455) 2025-03-20 17:30:01 +01:00
ptitSeb aed08d428e [RCFILE] Fixed BOX64_EMULATED_LIBS that was broken when used inside an rcfile 2025-03-20 11:01:18 +01:00
ptitSeb affeef2380 [WRAPPER] Added a couple of GL extensions 2025-03-20 10:44:03 +01:00
Yang Liu a6c1e4126e [RCFILE] Update steamwebhelper profile (#2452) 2025-03-20 07:57:14 +01:00
Yang Liu ba630300b6 [RV64_DYNAREC] Fixed many minor issues (#2451) 2025-03-19 13:51:04 +01:00
shenmo 0e32c17076 [RCFILE] Added profile for HSR Game (#2450) 2025-03-19 12:41:26 +01:00
Yang Liu 14569db74d [DYNAREC] Fixed minor issues for F0 0F B0/B1 LOCK CMPXCHG opcodes (#2448) 2025-03-19 08:51:04 +01:00
ptitSeb c519556962 [BOX32] Small change on memory managment again 2025-03-18 17:04:06 +01:00
Yang Liu c7280d9312 [RV64_DYNAREC] Added 66 F0 0F B1 LOCK CMPXCHG opcode (#2447) 2025-03-18 12:10:24 +01:00
FZXO11 daca99017b Note about binfmt_misc (#2445)
* Note about binfmt_misc

* Notify its working on CHRoot
2025-03-18 08:10:57 +01:00
Yang Liu 546238681e [RV64_DYNAREC] More minor changes and fixes to x87 opcodes (#2443) 2025-03-17 21:58:29 +01:00
ptitSeb 87327b182f This should fix non-Dynarec build 2025-03-17 17:17:27 +01:00
ptitSeb 5b9951e1bd [BOX32] Small refactor on memory managment 2025-03-17 16:10:09 +01:00
ptitSeb 6ce22546fe [DYNAREC] Small change in strongmem to end a SEQ with a Brrier at last_write directly 2025-03-17 16:08:07 +01:00
ptitSeb 2da064d04d [DYNAREC] Change in strongmem managment to end a SEQ on jump arrival and not forget the SEQ 2025-03-17 15:54:36 +01:00
ptitSeb 77141304f6 [BOX32] Change to get all created bricks to be conitgus on 32bits, as address space is pretty small 2025-03-17 15:52:45 +01:00
ptitSeb 3336cb6248 [ARM64_DYNAREC] Small optim on special case of LOCK OR [RSP], 0 2025-03-17 15:40:20 +01:00
ptitSeb 7fa3a1e627 [ARM64_DYNAREC] Simplified 8F opcode, so special cases will be handled in signal directly if needed 2025-03-17 15:39:02 +01:00
ptitSeb d28c8aa41a [ARM64_DYNAREC] Added missing SMWRITE2 to another AVX opcode 2025-03-17 15:37:37 +01:00
ptitSeb 7b065eb17a [TRACE] Improved native backtrace, and create a function so it can be use elsewhere 2025-03-17 15:36:23 +01:00
ptitSeb 7f23664566 [ARM64_DYNAREC] Added some missing SMWRITE2 for strongmem=2 on a few AVX opcodes 2025-03-17 15:30:52 +01:00
ptitSeb d555d9661f [ARM64_DYNAREC] Added printer for RET opcodes 2025-03-17 15:29:44 +01:00
Yang Liu 18888e404e [RV64_DYNAREC] Minor D8..DF opcodes refactor (#2442) 2025-03-17 10:46:30 +01:00
Yang Liu 394513971c [RV64_DYNAREC] Minor x87 changes to enable test31 (#2441) 2025-03-17 08:12:31 +01:00
Yang Liu 8b75020036 [DOCS] Added ranged gdbjit documentation (#2440) 2025-03-17 08:09:39 +01:00
ptitSeb e1d121aa6b [BOX32][WRAPPER] Fixed signature of the ctime wrapped function 2025-03-15 15:45:56 +01:00
ptitSeb 30285d9ec6 [SYSCALL] Don't make it fatal when a unkown syscall is called, like for libc syscall 2025-03-14 11:12:32 +01:00
ptitSeb 9795027988 [RCFILE] Added one more game profile 2025-03-13 19:23:08 +01:00
ptitSeb d49fb1568e [RCFILE] Added profile for Linux Paradox Launcher 2025-03-13 18:32:29 +01:00
ptitSeb ea067beac2 [BOX32] Small changes in Signal32 handling 2025-03-13 18:09:25 +01:00
ptitSeb 8905a31469 [SYSCALL] Fixed/Improved a few syscall (help Go programs) 2025-03-13 18:08:55 +01:00
ptitSeb e6fd9c05f1 [INTERP] Fixed AVX.F2.0F38 F0 opcode 2025-03-13 15:42:14 +01:00
ptitSeb a79128e951 [CI] Repeat test for all Box32 build instead of just ARM64 one 2025-03-13 11:21:43 +01:00
Yang Liu 1793c2a182 [RV64_DYNAREC] Fixed some x87 rounding cases for fastround=0 (#2437) 2025-03-13 10:37:22 +01:00
Yang Liu b72002703e [COSIM] Show hex values in STx diff logs (#2436) 2025-03-13 10:34:29 +01:00
ptitSeb a17a97a545 [CI] Made ARM64 Box32 test to repeat a bit to avoid false negative 2025-03-13 10:27:11 +01:00
ptitSeb 0d73fc7228 [BOX32][WRAPPER] Small change on glGetStringi signature 2025-03-13 09:48:43 +01:00
Luke Short 8aab7296b8 Bundle more libs (#2419)
* [DOCS] Arch Linux does have an archive

* [BUNDLE] Simplify unsupported package message

* [BUNDLE] Archive Void Linux XBPS packages

This was an oversight to not include these but not XBPS packages
are used (yet).

* [DOCS] Fedora dependencies

List Fedora dependencies for the 'box64-bundle-x86-libs.sh' script.

* [DOCS] Fedora 34 hints

Use Fedora 34 to find missing 32-bit packages that are compatible
with Enterprise Linux 9.

* [DOCS] Add better 'dnf provides' hint

Use wildcards. This works on all versions of DNF.

* [BUNDLE] Add common libraries

as reported by various GitHub Issues.

Resolves #2390

* [DOCS] Mention essential libraries

and libraries with large dependencies. These should not be bundled.

* [BUNDLE] Remove essential libraries

and libraries with large dependencies.
2025-03-13 09:21:26 +01:00
ptitSeb 4aa7eb1187 [VULKAN] Added support for Vulkan 1.4 2025-03-12 18:53:46 +01:00
ptitSeb 1af85c69a1 [DYNAREC] Introduced DYNAREC_DIRTY=2 and changed a profile to use it 2025-03-12 14:39:07 +01:00
ptitSeb 3087ea0e61 [ENV] Fixed a crash when BOX64_ROLLING_LOG is used on command line 2025-03-11 17:38:47 +01:00
ptitSeb b0ad333ea4 [TRACE] Better logs for vulkan functions wrappers 2025-03-11 17:38:19 +01:00
ptitSeb 835ecf8a19 [WRAPPER] Added a few more Vulkan extensions 2025-03-11 16:50:00 +01:00
ptitSeb 470ff6e652 [TRACE] Small work on trace 2025-03-11 16:30:35 +01:00
ptitSeb 3ef6d28108 [RCFILE] Added 1 more game profile 2025-03-11 16:30:18 +01:00
ptitSeb fb701d8e39 [DOCS] Added BOX32 option in COMPILE.md 2025-03-11 13:00:30 +01:00
ptitSeb d4a539b957 [WRAPPER] Completed and fixed VK_NV_cooperative_vector extension 2025-03-11 10:40:25 +01:00
airidosas252 7c4c6823fe [WRAPPER] missing functions and features (#2434)
* [WRAPPER] add missing Android specific shmem symbols

It can't create X server without these symbols, it works after adding them.

* [WRAPPER] add missing android_set_abort_message symbol

* [WRAPPER] wrap VK_NV_cooperative_vector

Seems like it's needed for newer versions of Wine
2025-03-11 10:37:34 +01:00
ptitSeb 3fc677cb85 Start of a new dev. cyvcle 2025-03-11 10:09:06 +01:00
ptitSeb 2b300bd199 Bumped version to v0.3.4 2025-03-10 17:01:37 +01:00
ptitSeb 9c69ebd717 [RV64_DYNAREC] Added 66 F0 81/83 /4 opcode 2025-03-10 14:55:23 +01:00
ptitSeb ea01b56422 [RV64_DYNAREC] Reduce the number of false-positive for dynarec missing opcode 2025-03-10 14:41:40 +01:00
ptitSeb 216cf51d4a [RV64_DYNAREC] Added 66 F0 81/83 /1 opcode 2025-03-10 14:33:40 +01:00
ptitSeb 1476b502a2 [RV64_DYNAREC] Small change in F0 0F C7 opcode 2025-03-10 14:21:18 +01:00
ptitSeb bc53ae8925 [RCFIEL] Add/Adjust more game profiles 2025-03-10 12:18:24 +01:00
ptitSeb 9cef52a1fc [DYNAREC] Reduced lifetime of hotpage when using DIRTY=1 2025-03-10 12:16:05 +01:00
ptitSeb 5ed60d99a8 [DYNAREC] Don't continue a dynablock if entering an hotpage 2025-03-10 12:15:30 +01:00
Yang Liu d7c7a716fe [RV64_DYNAREC] Optimized PMOVZX and PMOVSX opcodes for vector 1.0 (#2430) 2025-03-10 09:54:20 +01:00
ptitSeb 41bee35634 [DYNAREC] Fixed some potential issue with NEVERCLEAN on memory mapping tracking 2025-03-09 11:19:52 +01:00
ptitSeb e764029cae [LA64_DYNAREC] This should fix the build 2025-03-09 07:58:50 +01:00
ptitSeb b110623103 [ARM64_DYNAREC] Improced arch_build helpers function to only compute build steps 1 time per dynablock 2025-03-08 22:38:22 +01:00
ptitSeb 35c1f97115 [ARM64_DYNAREC] Removed obsolete comment 2025-03-08 20:59:08 +01:00
ptitSeb e8a7bef5a0 [ARM64_DYNAREC] Fixed a potential issue with AVX.0F 50 opcode 2025-03-08 20:58:04 +01:00
ptitSeb c2f73e6de0 [ARM64_DYNAREC] Fixed a few potential issue with some AVX opcodes 2025-03-08 20:57:21 +01:00
ptitSeb 0724f52d5f [ARM64_DYNAREC] Fixed inlined ClearCache, re-enabling it 2025-03-08 20:33:32 +01:00
ptitSeb 61a605a2dc [ARM64_DYNAREC] Disabled inlined ClearCache as it seems not 100% efficient 2025-03-08 20:30:52 +01:00
ptitSeb 7a058c9194 [RCFILE] More game profile plus adjustment to existing ones 2025-03-08 16:03:13 +01:00
ptitSeb 99971e94c0 [TRACE] Improved a bit a few traces 2025-03-08 13:46:28 +01:00
ptitSeb 445d885090 [RCFILE] Added a game profile 2025-03-08 10:43:29 +01:00
ptitSeb fc02f0d140 [BOX32][WRAPPER] Fixed some gnutls wrapped functions (help NFS Payback from Steam) 2025-03-08 10:43:12 +01:00
ptitSeb c2d02977f8 Added F0 F7 /2 opcode ([ARM64_DYNAREC] too) 2025-03-07 20:13:41 +01:00
Yang Liu 946c999e25 [RV64_DYNAREC] Rollback some falsy optimization in the xtheadvector path (#2426) 2025-03-07 16:36:53 +01:00
ptitSeb c8b6f80f99 Removed isDBFromAddressRange and added that function to cleanDBFromAddressRange as it was used only 1 time and followed by that function anyway 2025-03-07 13:45:41 +01:00
ptitSeb 9444ce0b89 Use getProtection_fast for check_exec test, as it can be used a lot on interpreter mode 2025-03-07 11:24:27 +01:00
ptitSeb 401d2ae0b9 [WRAPPER] Do not reference epoll_pwait2 directly, to fix issues with Android and old glibc based system (also for #2425) 2025-03-07 10:59:44 +01:00
ptitSeb 8dde796103 [ARM64_DYNAREC] Small change to AVX.66.0F 7F opcode 2025-03-06 20:04:22 +01:00
ptitSeb 7ba0e7a055 [DOC] Fixed default for strongmem in docs 2025-03-06 20:03:08 +01:00
Leslie Zhai eb039c0449 Fix undefined reference to `epoll_pwait2' for LA64 ABI 1.0 (#2422) 2025-03-06 08:08:09 +01:00
ptitSeb 0c0f5263e1 [ARM64_DYNAREC] Added unaligned path for AVX.F3.0F 7F opcode 2025-03-05 11:50:35 +01:00
ptitSeb ad70febaac [ANDROID] Fixed wrapping of epoll_pwait2 to epoll_pwait timeout parameter 2025-03-04 22:44:18 +01:00
ptitSeb 39583c6da4 [ANDROID] Fix build, as epoll_pwait2 doesn't seems to exist 2025-03-04 14:36:25 +01:00
ptitSeb 1bf4851cf6 [WRAPPER] Added epoll_pwait2 wrapped function 2025-03-04 14:11:42 +01:00
liuli 2129e98b0e [WRAPPER] add gnutls_fips140_set_mode (#2417)
Change-Id: I8e9db9b5bbc16459154f30c4c29a4b1ec77c416a
2025-03-04 10:41:22 +01:00
Yang Liu b015f33376 [RV64_DYNAREC] Minor optimizations to sign mask extraction instructions for vector (#2416) 2025-03-04 08:07:45 +01:00
Yang Liu 2636e7e8b5 [RCFILE] Added range gdbjit support (#2414) 2025-03-03 10:08:50 +01:00
Yang Liu b0e726d953 [RCFILE] Fixed load addr parse issue (#2413) 2025-03-03 10:07:00 +01:00
Yang Liu eb40c49132 [CORE] Limited some syscalls for Android build (#2412) 2025-03-03 10:05:58 +01:00
ptitSeb 5dadc513db [WRAPPER] Updated auto-generated files 2025-02-26 17:56:29 +01:00
alexvorxx 4120dc10bd Fixed Box32 for Winlator Glibc (#2404)
* 1

* 2

* 3

* 4

* Fix

* 5

* 6

* 7

* 8

* revert 8

* 9
2025-02-26 17:47:42 +01:00
ptitSeb 48f51bd5fe [BOX32][WRAPPER] Use a temp xcb when converting an unknown xcb_connection instead of adding it 2025-02-25 11:46:37 +01:00
Yang Liu 940317949a [RV64_DYNAREC] Fixed some minor typos (#2406) 2025-02-23 20:29:49 +01:00
Yang Liu f9b6ea48e9 [RV64_DYNAREC] Fixed swapCache scratch register usage (#2405) 2025-02-23 19:29:59 +01:00
Hugh Cole-Baker 3567c6da2b [DEBIAN] fix typo and add box64-bash in shlibdeps excludes (#2403) 2025-02-22 22:23:51 +01:00
ptitSeb f3fe72b541 [RCFILE] Added 1 more game profile 2025-02-21 20:47:00 +01:00
ptitSeb 14966e48a6 [ARM64_DYNAREC] Fixed potential issue with SUBSET with a DF still present 2025-02-21 20:43:48 +01:00
ptitSeb 91b282235b [BOX32][ANDROID][TERMUX] revert previous commit and added a new test for shmat wrapped function (still for #2227) 2025-02-21 15:42:21 +01:00
ptitSeb 63c3e4fcf5 [INTERP] Fixed ror/rol flags on cputype=0 2025-02-21 15:28:31 +01:00
ptitSeb c740590bcd [BOX32][ANDROID][TERMUX] Use simple wrapper for shmat function on Android/Termux (for #2227) 2025-02-21 12:13:43 +01:00
ptitSeb e868c89233 [INTERP] Work on UD flags 2025-02-21 11:40:15 +01:00
Yang Liu c517d7196d [RV64_DYNAREC] Added more opcodes (#2400)
* [RV64_DYNAREC] Added more 66 0F 38 opcodes for vector

* [RV64_DYNAREC] Added more opcodes
2025-02-21 10:50:08 +01:00
Yang Liu cb42b3b00f [RV64_DYNAREC] Added more MMX opcodes for vector and fixes too (#2399)
* [RV64_DYNAREC] Fixed fallback to scalar messge

* [RV64_DYNAREC] Added more MMX opcodes for vector and fixes too
2025-02-21 09:03:19 +01:00
Yang Liu 61362b06ec Made some tweaks to banner and help message (#2397)
* Made some tweaks to banner and help message

* more tweaks

* fix nobanner
2025-02-20 18:55:37 +01:00
Yang Liu bb8559933f Made error logs prefix has red color (#2396) 2025-02-20 15:25:14 +01:00
ptitSeb c2cb333261 [ARM64_DYNAREC] More work on UD flags 2025-02-20 13:47:04 +01:00
ptitSeb b7e4cc4f50 [ARM64_DYNAREC] Fixed a typo in flag computation for PCMPESTRI and BZHI opcodes 2025-02-20 13:29:50 +01:00
Yang Liu a4908f1407 [ARM64_DYNAREC] Fixed a regression in LOCK XADD opcode (#2394) 2025-02-20 12:24:34 +01:00
ptitSeb a252e87fa9 [BOX32][INTERP] Added some support for BOUND opcode ([ARM64_DYNAREC] too) 2025-02-20 10:45:11 +01:00
ptitSeb ee3ee539e0 [BOX32][WRAPPING] Do not convert stream private field of FT_FaceRec structure 2025-02-19 20:31:28 +01:00
Yang Liu c4b79374fe [RCFILE] Added support for perfile dynarec dump (#2393) 2025-02-19 15:54:40 +01:00
Yang Liu 5dfa27ea58 [DYNAREC] Minor optimizations to SHL/SHR Ed, CL fastpath (#2392)
* [DYNAREC] Minor optimizations to SHL/SHR Ed, CL fastpath

* Fixed build

* Partially revert some fake optimizations
2025-02-19 15:04:20 +01:00
Yang Liu 49cba432c2 [CORE] Rework on function hookMangoHud (#2387) 2025-02-18 20:59:02 +01:00
Yang Liu 39a9cf903f [CORE] Display Box64 version info in mangohud (#2386)
* [CORE] Display Box64 version info in mangohud

* check for config files
2025-02-18 20:00:31 +01:00
ptitSeb 611ac3933c [LA64][WRAPPING][BOX32] Added alt name for libnsl 2025-02-18 18:12:38 +01:00
xctan fdd1509ee5 [WRAPPER] Display Box64 version in Vulkan driver info (#2385) 2025-02-18 17:33:55 +01:00
Yang Liu 52a9443f53 [RV64_DYNAREC] Fixed a regression introduced recently ([LA64_DYNAREC] too) (#2384) 2025-02-18 15:46:32 +01:00
Yang Liu 0d1488b016 Fixed dlsym_error logs prefix (#2383) 2025-02-18 10:41:48 +01:00
Yang Liu fb4662cb28 [RV64_DYNAREC] Small changes to SET_DFNONE to make it safer ([LA64_DYNAREC] too) (#2382) 2025-02-18 10:40:03 +01:00
Yang Liu 32a747979a [RV64_DYNAREC] Optimized REP MOVSB (#2381) 2025-02-18 09:26:33 +01:00
ptitSeb 362a92c158 [RCFILE] Added a setting to Talos2 2025-02-17 22:19:19 +01:00
Luke Short c27b659bce [BUNDLE] Add script to bundle x86 libraries (#2380)
This manages both x86_64 and x86 libraries. It helps with improving
emulation in all of the Box projects.
2025-02-17 21:32:12 +01:00
ptitSeb 049cbd3783 [ARM64_DYNAREC] More work on UD flags 2025-02-17 17:46:03 +01:00
Yang Liu 8b5b5aa3a7 [INTERP] Added more nops ([DYNAREC] too) (#2378) 2025-02-17 17:38:11 +01:00
Yang Liu f85b9ac664 [INTERP] Added more nops ([DYNAREC] too) (#2377) 2025-02-17 17:06:47 +01:00
Yang Liu ee5a41e21e [INTERP] Added 0F 19 NOP opcode ([DYNAREC] too) (#2376) 2025-02-17 16:29:42 +01:00
ptitSeb d49fc43791 [ARM64_DYNAREC] Continue work on UD flags 2025-02-17 14:18:49 +01:00
Yang Liu 9ec7930eb1 [INTERP] Added 66 0F 19 NOP opcode ([DYNAREC] too) (#2375) 2025-02-17 14:14:10 +01:00
Yang Liu 26dd597a1b [LA64_DYNAREC] Added more opcodes (#2374) 2025-02-17 13:49:12 +01:00
Yang Liu 040f8d9a9f [DYNAREC] Print decoded instruction mnemonics for missing opcodes if trace enabled (#2373) 2025-02-17 13:46:07 +01:00
wannacu f107321d06 [ARM64_DYNAREC] Added more AVX opcodes (#2372)
* [ARM64_DYNAREC] Fixed AVX.F2.0F 12 opcode

* [ARM64_DYNAREC] Added more AVX opcodes
2025-02-17 13:42:43 +01:00
Yang Liu 64313d5aa6 [LA64_DYNAREC] Minor optims and fixes to some opcodes (#2371) 2025-02-17 09:16:15 +01:00
Yang Liuandphorcys 71845a11bb [LA64_DYNAREC] Added more SSE4 opcodes (#2370)
Co-authored-by: phorcys <[email protected]>
2025-02-17 08:13:49 +01:00
Yang Liu e3adda8ff9 [LA64_DYNAREC] Added more opcodes (#2366)
* [LA64_DYNAREC] Added more opcodes

* fix
2025-02-17 08:13:18 +01:00
ptitSeb 85e79a8224 [ARM64_DYNAREC] Improved safeflags=2 2025-02-16 14:41:08 +01:00
ptitSeb 9ef3e080fa [ARM64_DYNAREC] More work on UD flags 2025-02-15 13:54:50 +01:00
ptitSeb 4b5f63dc6d [RCFILE] Added 1 more game profile 2025-02-15 09:47:59 +01:00
Lily 730e9d215c [BOX64RC] Add Zenless Zone Zero Config (#2363) 2025-02-15 08:57:29 +01:00
wannacu efa1cbd49a [ARM64_DYNAREC] Add some opcodes (#2358)
* [ARM64_DYNAREC] Added 66 0F 3A 41 opcode

* [ARM64_DYNAREC] Added AVX.66.0F38 DB opcode

* [ARM64_DYNAREC] Added AVX.66.0F3A DF opcode

* [ARM64_DYNAREC] Added AVX.F2.0F38 F5 opcode

* [ARM64_DYNAREC] Added 66 F3 0F BC,B8 opcode
2025-02-14 14:29:43 +01:00
ptitSeb 91798194d5 [ARM64_DYNAREC] Fixed some issue with DF handling on mayset instructions 2025-02-13 22:12:59 +01:00
Yang Liu d550f9384c [COSIM] Print decoded instruction mnemonics if trace enabled (#2357) 2025-02-13 19:08:53 +01:00
Yang Liu d59d531f14 [RV64_DYNAREC] Fixed F3 0F 11,12 opcodes for vector (#2356) 2025-02-13 18:48:33 +01:00
Yang Liu c9369c5ea1 [RV64_DYNAREC] Added a fastpath to SHL/SHR CL opcodes (#2355) 2025-02-13 17:43:59 +01:00
Yang Liu 05fd25d3bb [RV64_DYNAREC] Minor optimization to CMOV opcodes (#2354) 2025-02-13 16:58:15 +01:00
Yang Liu 2b75a0de55 [RV64_DYNAREC] Minor fixes and improvements to CMP opcodes (#2353)
* [RV64_DYNAREC] Minor fixes and improvements to CMP opcodes

* review
2025-02-13 13:51:16 +01:00
ptitSeb 59e1da5f74 [ARM64_DYNAREC] The check on REP MOVSB overlapping memory is done with saflags=1 now 2025-02-13 13:10:24 +01:00
wannacu 639466d45a [ARM64_DYNAREC] Added some BMI.0F38 opcodes (#2347)
* [ARM64_DYNAREC] Fixed BMI.0F38 F5 ocpode

* [ARM64_DYNAREC] Added BMI.0F38 F3 /2,/3 ocpode

* Added BMI.0F38 F7 opcode

* Fixed emitter mistake about CSINVxw
2025-02-13 13:07:36 +01:00
Yang Liu 95bdaf6eca [RV64_DYNAREC] Minor fixes and improvements to TEST opcodes (#2352) 2025-02-13 11:38:19 +01:00
ptitSeb 9dc10bdc47 [ARM64_DYNAREC] Small optims to AVX.66.0F38 16/18/19/36 opcodes 2025-02-13 10:20:40 +01:00
ptitSeb bf212a7b52 [ARM64_DYNAREC] Fixed LD1R and CBN/CBNZ printer 2025-02-13 10:07:36 +01:00
ptitSeb 40d83ad882 [ARM64_DYNAREC] Fixed regression introduced with b8cc8594f6 2025-02-13 09:29:09 +01:00
ptitSeb baa9efeaa6 [RCFILE] Added 2 more game profiles 2025-02-12 19:28:06 +01:00
ptitSeb 0c17b55e28 [ARM64_DYNAREC] Fixed some issue with DF and mayset opcodes 2025-02-12 19:27:39 +01:00
ptitSeb e2f4ab7700 [COSIM] Added commented way to dumps regs whe printing a difference 2025-02-12 19:26:44 +01:00
ptitSeb 84982ff86f Limit to 11 the number of cpuid invalid parameter message 2025-02-12 19:25:59 +01:00
ptitSeb cfd17e59ac [ARM64_DYNAREC] Removed obsolete comment 2025-02-12 19:25:02 +01:00
ptitSeb af0b0c6c9d [ARM64_DYNAREC] Improved some 66 F0 opcode, especially unaligned path 2025-02-12 19:24:27 +01:00
ptitSeb 0e588e444f [RCFILE] Added 2 game profiles 2025-02-12 16:26:44 +01:00
ptitSeb f575a7846e [ARM64_DYNAREC] Improved many LOCK prefixed opcodes, espcialy unaligned path 2025-02-12 15:17:01 +01:00
ptitSeb c7ff0f658b [ARM64_DYNAREC] More work on flag 2025-02-12 11:04:46 +01:00
ye-yeshun b8cc8594f6 fix VPMASKMOV and VMASKMOVP (#2342)
* fix: 0x2C: 'VMASKMOVPS Gx, Vx, Ex'

Log: VMASKMOVPS读取内存时, 如果某些mask位是0则不进行读写避免访问越界

Signed-off-by: YeshunYe <[email protected]>
Change-Id: I197fc356edcac202b5a329c50c334d0166532e93

* fix: 0x2D: 'VMASKMOVPD Gx, Vx, Ex'

Log: VMASKMOVPD读取内存时, 如果某些mask位是0则不进行读写避免访问越界

Signed-off-by: YeshunYe <[email protected]>
Change-Id: Ie11d93971aa92b141540a37bfdae0b3b060e3aea

* fix: 0x2E: 'VMASKMOVPS Ex, Gx, Vx'

Log: VMASKMOVPS写入内存时, 如果某些mask位是0则不进行读写避免访问越界

Signed-off-by: YeshunYe <[email protected]>
Change-Id: Ide5cb36dc03fc56480fdd45e7d96daed8557d849

* fix: 0x2F: 'VMASKMOVPD Ex, Gx, Vx'

Log: VMASKMOVPD写入内存时, 如果某些mask位是0则不进行读写避免访问越界

Signed-off-by: YeshunYe <[email protected]>
Change-Id: I037de8568e9d2d29597fdf08f991d54e3cb2f6d9

* fix: 0x8E: 'VPMASKMOVD/Q Ex, Vx, Gx'

Log: VPMASKMOVD/Q写入内存时, 如果某些mask位是0则不进行读写避免访问越界

Signed-off-by: YeshunYe <[email protected]>
Change-Id: I0dc98a29ed933d953e137e777bc296149d94b10b

* tests: add test for VPMASKMOV and VMASKMOVP

Log:

Signed-off-by: YeshunYe <[email protected]>

---------

Signed-off-by: YeshunYe <[email protected]>
2025-02-12 10:32:57 +01:00
ptitSeb 6197b70a9a [RCFILE] Improved support for windows setup 2025-02-12 09:20:04 +01:00
ptitSeb 60396f58c0 [ARM64_DYNAREC] Fixed F0 0F B1 ocpode (emit_cmp32 can only be used once per opcode, because of the df flags handling) 2025-02-11 22:52:52 +01:00
wannacu ee83ef4c01 [ARM64_DYNAREC] Fixed wrong COUNT operand in VPSLL{W,D,Q} (#2344) 2025-02-11 13:26:24 +01:00
Yang Liu 4b7e116aa7 [LA64_DYNAREC] Added F3 0F 52 RSQRTSS opcode (#2343) 2025-02-11 10:53:33 +01:00
ptitSeb 785d3ed5ab [ARM64_DYNAREC] Added code on safeflags=2 to check if SI/DI memory overlap on fast rep movsb opcode 2025-02-11 09:59:45 +01:00
Yang Liu 33d1727925 [LA64_DYNAREC] Added F2 0F 7D HSUBPS opcode (#2341) 2025-02-11 08:12:50 +01:00
ptitSeb a50d34e4ba [ARM64_DYNAREC] Some changes on shift opcode and OF handling, and added some new profiles 2025-02-10 15:36:43 +01:00
ptitSeb 7e0c4dcee5 [ARM64_DYNAREC] Mostly cosmetic change on (I)DIV 8bits opcode 2025-02-10 15:10:39 +01:00
Yang Liu f5174d12aa [LA64_DYNAREC] Added preliminary optimization for REP MOVSB (#2340) 2025-02-10 11:44:35 +01:00
Yang Liu 2cb25c095a [LA64_DYNAREC] Added more opcodes (#2339) 2025-02-10 08:35:38 +01:00
ptitSeb d0039c65b4 [DYNAREC] Fixed inst_size building that could be wrong when dynablock was stopped for unknown opcode or other various reason 2025-02-09 20:46:46 +01:00
Yang Liu 099bd148cb [LA64_DYNREC] Added more opcodes (#2338) 2025-02-09 16:41:58 +01:00
Yang Liu 20885702b9 [DYNAREC] Fixed diff logging prefix of pass2&3 (#2337) 2025-02-09 14:32:28 +01:00
Yang Liu 751582df05 [LA64_DYNAREC] Fixed newly added 66 0F BA /4 BT opcode (#2336) 2025-02-09 14:24:12 +01:00
ptitSeb 5212de0d66 [ARM64_DYNAREC] Fixed a potential segfault when signal happens while running Interpreter 2025-02-09 09:55:00 +01:00
Yang Liu 056bb38607 [LA64_DYNAREC] Added more opcodes (#2333) 2025-02-08 19:18:12 +01:00
Yang Liu 1a01adb2ef [ARM64_DYNAREC] Minor simplifications with the usage of GETEX (#2332) 2025-02-08 19:16:22 +01:00
Yang Liu 797731e9e2 [RV64_DYNAREC] Minor fixes and improvements on various opcodes (#2331) 2025-02-08 19:14:36 +01:00
Yang Liu 3e2c698710 [LA64_DYNAREC] Added more opcodes (#2330) 2025-02-08 18:01:53 +01:00
Yang Liu 58b24c85a2 [LA64_DYNAREC] Added more opcodes (#2328) 2025-02-08 15:45:21 +01:00
Yang Liu 28ebc1a0b7 [RV64_DYNAREC] Added aligned optim case for REP MOVSB (#2327)
* [RV64_DYNAREC] Added aligned optim case for REP MOVSB

* fixed a typo
2025-02-08 11:30:02 +01:00
ptitSeb 65487dac51 [ARM64_DYNAREC] Optimized unaligned path for REP MOVSB 2025-02-08 10:51:39 +01:00
Yang Liu 592af6db3b [ARM64_DYNAREC] Added more aligned optim cases for REP MOVSB (#2326) 2025-02-08 09:04:50 +01:00
ptitSeb 997140f500 [RCFILE] Fixed ROLLING_LOG when setup in a profile only 2025-02-07 18:55:43 +01:00
Yang Liu 16f0adec6f [LA64_DYNAREC] Added more opcodes (#2324) 2025-02-07 17:01:08 +01:00
Yang Liu ba6ff73c69 [LA64_DYNAREC] Added more opcodes (#2323) 2025-02-07 13:28:02 +01:00
Yang Liu 2bf78ea18c [LA64_DYNAREC] Added more 66 0F 38 opcodes (#2322) 2025-02-07 12:32:05 +01:00
Yang Liu fc6efb220b [LA64_DYNAREC] Fixed F3 0F MOVSLDUP opcode (#2321) 2025-02-07 12:30:04 +01:00
ptitSeb 523bfbdf3b [RCFILE] Added a new profile 2025-02-07 12:20:37 +01:00
ptitSeb 46ad2261e7 [ARM64_DYNAREC] Optimized REP MOVSB 2025-02-07 12:13:21 +01:00
Yang Liu 6c60ad4695 [RV64_DYNAREC] Small optim to 64 A1/A3 opcodes (#2320) 2025-02-07 09:57:56 +01:00
Yang Liu 37697e2ec7 [DYNAREC] Optimized grab_segdata calls on MODREG (#2319) 2025-02-07 09:38:30 +01:00
Yang Liu f5eb3c1e9b [LA64_DYNAREC] Added 64 88 MOV opcode (#2318) 2025-02-07 08:32:53 +01:00
ptitSeb 5cfd379e97 [ARM64_DYNAREC] Small optims/fixes for a few F2 0F prefixed opcodes 2025-02-06 18:11:04 +01:00
ptitSeb fecaf3111b [ARM64_DYNAREC] Added a comment in emitter on FCMP behaviour 2025-02-06 18:06:37 +01:00
ptitSeb ff6f34aadf [INTERPRETER] Small optim on HADDPS and HSUBPS 2025-02-06 18:04:52 +01:00
ptitSeb 4c3d55fb5c [ARM64_DYNAREC] Fixed fstp long double when fastround==0 2025-02-06 17:58:48 +01:00
ptitSeb d2a5005dcc [RCFILE] Adjusted MALLOC_HACK to be an integer between 0 and 2 instead of a Boolean 2025-02-06 14:46:55 +01:00
Yang Liu 05e1b422d3 [DOCS] Added per-file settings documentation (#2317) 2025-02-06 09:22:52 +01:00
ptitSeb 69f49f79e4 [DYNAREC] Fixed a potential SEGFAULT in FindDynablockFromNativeAddress, and added aprofile for BeamNG.drive linux version (for #424) 2025-02-05 23:29:43 +01:00
ptitSeb 2453eb9b2d [RCFILE] Added a new profile 2025-02-05 11:25:58 +01:00
ptitSeb 93b4813ee2 Remove memory location test for traping wine syscall, box64 doesn't need that 2025-02-05 09:48:07 +01:00
ptitSeb 7cbe71c218 [DYNAREC] Fixed a rare issue when flags would not be computed on 1st opcode of a block if a jump go there (and added a profile for fixed MGSV:TPP)" 2025-02-04 21:12:53 +01:00
ptitSeb 8bb53e1001 [ARM64_DYNAREC] Reduce the number of false positive for DYNAREC_MISSING=1 by showing only null-sized block missing opcode 2025-02-03 15:54:32 +01:00
ptitSeb f79af5afd4 [ARM64_DYNAREC] Optmized RCR Eb, CL, and fixed RCL Eb, CL opcode 2025-02-03 13:45:04 +01:00
ptitSeb 7c27085bd3 [ARM64_DYNAREC] Optimized RCL Eb, CL opcode 2025-02-03 12:18:44 +01:00
ptitSeb 53834f2b29 [ARM64_DYNAREC] Added more details on Need optim message for easier grep 2025-02-03 11:47:55 +01:00
ptitSeb 7c09957263 [ARM64_DYNAREC] Small optims on a few 66 prefixed opcodes 2025-02-03 11:34:11 +01:00
Yang Liu 242832fa3c Added auto-generated x64Int3 printer (#2311)
* Added auto-generated x64Int3 printer

* Fixed minor type errors
2025-02-02 16:46:21 +01:00
ptitSeb 9beb6b4f63 [ARM64_DYNAREC] Small improvment on 64 prefixed opcodes 2025-02-02 16:14:33 +01:00
ptitSeb 0861a88d6e [COSIM] Don't do div by 0 signal on interpreter part when testing 2025-02-02 16:11:39 +01:00
ptitSeb 1c0dc8ec7c [COSIM] Reduce false negative on rcl/rcr OF flag 2025-02-02 16:10:56 +01:00
ptitSeb b21776f9b0 [RCFILE] Add some print of NODYNAREC and DYNAREC_TEST when applyed 2025-02-02 16:10:03 +01:00
Yang Liu 998f164aa3 [ENV] More tweaks on recoding env mapping (#2309)
* [ENV] More tweaks on recoding env mapping

* review
2025-02-01 20:03:01 +01:00
Yang Liu 58d8627cea [RV64_DYNAREC] Fixed F2 0F E6 opcode for vector (#2310) 2025-02-01 19:43:10 +01:00
Yang Liu 877ca41451 [ENV] Fixed crash when rcfile does not exist (for #2295) (#2307)
* [ENV] Fixed crash when rcfile does not exist (for #2295)

* review
2025-02-01 17:29:39 +01:00
Yang Liu 94dedd47c6 [CI] Fixed xuantie-qemu build (#2306) 2025-02-01 16:04:15 +01:00
ptitSeb 1173c1d23f [ARM64_DYNAREC] Small optim and fixes to a few MMX opcodes 2025-02-01 12:06:55 +01:00
ptitSeb d9c9575e6a [RCFILE] Added one more profile 2025-02-01 12:04:43 +01:00
ptitSeb 2239f92816 [ARM64_DYNAREC] Various small fixes and optims in a few AVX opcodes 2025-01-31 16:50:51 +01:00
ptitSeb 637e177408 [ARM64_DYNAREC] Fixed mxcsr sync with fpsr on SSE_SLUSHTO0, and added a profile that needs it 2025-01-31 16:31:10 +01:00
ptitSeb bb653e6888 [ARM64_DYNAREC] Small change on defered flag handling to make sure it's marked to None when needed 2025-01-31 16:30:10 +01:00
ptitSeb 09e07973dd [INTERPRETER] Fixed some AVX opcode that would not zero upper part of register when not using vex.w 2025-01-31 16:29:09 +01:00
ptitSeb 6b7afd7f8e [DOCS] Fixed BIGBLOCK is 2 by default now 2025-01-31 14:30:19 +01:00
ptitSeb eb7858d23a [BOX32][WRAPPER] Fixed a 32bits libcups wrapped function 2025-01-30 15:23:23 +01:00
ptitSeb 1db09fe897 More improvmnet to map with fd tracking 2025-01-29 20:37:08 +01:00
ptitSeb 22a5b573d5 [RCFILE] Added some more profiles 2025-01-29 18:36:37 +01:00
ptitSeb f12f366a3d [DYNAREC] Make BIGBLOCK=2 default 2025-01-29 18:35:57 +01:00
ptitSeb b51ab081ae [ANDROID] Nope, re-disable map with fd tracking on Android 2025-01-29 18:22:09 +01:00
ptitSeb 50fcaf04b4 [ANDROID] Try to re-enable map with fd tracking on Android 2025-01-29 18:14:51 +01:00
ptitSeb 96bca6eac3 Improved map with fd tracking 2025-01-29 18:12:29 +01:00
ptitSeb ed7147e598 [WRAPPER] Added 1 wrapped function and fixed one on gstreamer 2025-01-29 11:45:23 +01:00
xctan 4892c68f17 [RV64_DYNAREC] Fixed lui/auipc immediate in the printer (#2299) 2025-01-28 08:07:42 +01:00
ptitSeb 3ab56994da Improved file map tracking, and use file map info in dynarec for bigblock setting 2025-01-27 16:35:50 +01:00
ptitSeb a54afc8e04 [ANDROID] Disable file map tracking on Android for now, as it seems to segfault 2025-01-27 16:05:43 +01:00
ptitSeb 01b5ee9c78 Improved generic mmap tracking 2025-01-27 15:03:52 +01:00
ptitSeb a513cd847b Added elf support to mmap tracking 2025-01-27 15:03:33 +01:00
ptitSeb 06b6871c80 [RCFILE] Add/Modify a few profiles 2025-01-27 13:28:14 +01:00
ptitSeb f5dc038621 [ENV] Improved a bit env var handling and per file env var 2025-01-27 13:27:58 +01:00
ptitSeb 38dce9138d [DYNAREC] Small change on DIRTY=1 to reduce hotpage effect 2025-01-27 13:27:13 +01:00
xctan 2aa5c5f337 [ENV] Fixed the type of BOX64_DYNAREC_STRONGMEM (#2298) 2025-01-27 11:36:07 +01:00
ptitSeb e6d2c12792 [INTERPRETER] Fixed a few warning 2025-01-26 16:46:23 +01:00
ptitSeb c3dbdf419d [BOX32][WRAPPER] Added some minium 32bits wrapping for libcups (helps wine) 2025-01-26 16:42:27 +01:00
ptitSeb c566ba970d [BOX32][WRAPPER] Add some minimum 32bits gnutls wrapping (helps wine) 2025-01-26 14:14:58 +01:00
ptitSeb 81925643e8 [BOX32][WRAPPER] Added some more 32bits wrapped function, and improved wrapping of 32bits ld-linux.so 2025-01-26 13:21:47 +01:00
ptitSeb 285c874e53 [AR64_DYNAREC] Removed a few more use of TABLE64 2025-01-26 13:12:37 +01:00
ptitSeb ba078c63a8 [WRAPPER] Added a few more wrapped function (to emulate recent SDL2) 2025-01-26 13:11:25 +01:00
ptitSeb a54959a6e3 [ARM64_DYNAREC] Added AVX.F3.0F38 F5 opcode 2025-01-26 13:10:36 +01:00
ptitSeb c573742845 Expanded file mapping tracking for future use (might help #2295) 2025-01-25 18:57:02 +01:00
ptitSeb dab01b8b9f [ARM64_DYNAREC] Added experimental synch of fpsr and mxcsr for the flags, when BOX64_SSE_FLUSHTO0 is used 2025-01-25 18:52:02 +01:00
xctan 9e58047980 [RV64_DYNAREC] Added unaligned codegen for MOVSW (#2296) 2025-01-25 16:03:15 +01:00
Yang Liuandxctan 6f8f37e8ff [RV64_DYNAREC] Optimized GETIP (#2294)
Co-authored-by: xctan <[email protected]>
2025-01-24 21:35:47 +01:00
Yang Liu 3ec950726b [RV64_DYNAREC] Removed some TABLE64 usage (#2291) 2025-01-24 16:02:32 +01:00
Yang Liu cec62dad44 [RV64_DYNAREC] Force priv opcode flags to be at least defered if safeflags=2 ([LA64_DYNREC] too) (#2293) 2025-01-24 15:19:18 +01:00
Yang Liu 89eca28d3a [RV64_DYNAREC] Restricted add/sub RSP optimization ([LA64_DYNAREC] too) (#2292) 2025-01-24 15:08:17 +01:00
ptitSeb 313e4854a0 Added syscall 439 (for #2290) 2025-01-24 09:54:14 +01:00
xctan 8c1ffca530 [RV64_DYNAREC] Added codegen for unaligned stores (#2289)
* [RV64_DYNAREC] Added another special SIGBUS case

* [RV64_DYNAREC] Added codegen for unaligned stores
2025-01-24 08:10:45 +01:00
Yang Liu 7099774a3c [DYNAREC] Added preliminary per-file settings (#2288) 2025-01-23 18:46:18 +01:00
ptitSeb 925f6a9922 [WRAPPER] Improved libpcap wrapping (still for #2282) 2025-01-23 14:59:22 +01:00
Yang Liu 356200159a [ENV] Fixed zydis initialization regression (#2287) 2025-01-23 14:07:38 +01:00
Yang Liu f0d8712275 Clean up UnityPlayer.dll detection from my_mmap64 (#2286) 2025-01-23 11:43:24 +01:00
ptitSeb fe3b66b018 [WRAPPER] Reworked libatk wrapping with new wrapperhelper (will help #2280) 2025-01-23 10:19:50 +01:00
ptitSeb 83af8c6cdf [WRAPPER] Added 1 more wrapped function to libnss3 (for #2280) 2025-01-23 10:11:54 +01:00
ptitSeb ad5b5ea617 [WRAPPER] Reworked libcap wrapping with new wrapperhelper 2025-01-23 10:09:58 +01:00
ptitSeb b439817467 [WRAPPER] Added wrapped libpcap with new wrapper helper (should help #2282) 2025-01-23 10:04:26 +01:00
Yang Liu 276191cdcf [LA64_DYNAREC] Added fastnan handling to more 0F opcodes (fixes CI) (#2285) 2025-01-23 08:58:30 +01:00
Yang Liu 8438b61747 [RV64_DYNAREC] Added fastnan handling to more 0F opcodes (fixes CI) (#2284) 2025-01-23 08:08:00 +01:00
ptitSeb f4a9f8dd79 [ARM64_DYNAREC] Added a few AVX opcode and Improved/Fixed some existing SSE and AVX ones 2025-01-22 20:37:17 +01:00
ptitSeb f235c7f702 [INTERPRETER] Improved (V)ADD/MUL/SUB/DIV P(S/D), and improved avx test too 2025-01-22 20:36:31 +01:00
ptitSeb 8e1e2c7840 [ARM64_DYNAREC] Remove another use of Table64 2025-01-22 17:44:52 +01:00
Yang Liu 0b632afbfe [DOCS] Auto-generated USAGE.md and box64.pod (#2283) 2025-01-22 11:56:31 +01:00
Yang Liu 89dcd2566b Fixed various issues introduced in the env infra refactor (#2281)
* Open trace file again after apply env files

* dynrec_df=1 by default

* more fixes

* more fixes

* more
2025-01-22 10:29:21 +01:00
Yang Liu 314edea645 Added [BOX64] prefix for all the stdout logs (#2279)
* Added [BOX64] prefix for all the stdout logs

* Remove some hardcoded prefix

* review
2025-01-21 19:08:09 +01:00
Yang Liu fe28bd93bd Changed some functions name and visibility (#2278) 2025-01-21 17:44:53 +01:00
Yang Liu d882a5c8fe [ENV] Optimized BOX64ENV log a bit (#2277) 2025-01-21 17:13:12 +01:00
Yang Liu 044dec0bfa [ENV] Initial refactor of env variables infrastructure (#2274)
* [ENV] Initial refactor of env variables infrastructure

* Ported BOX64_DYNAREC_LOG

* Ported more options

* Ported BOX64_MALLOC_HACK

* Ported BOX64_DYNAREC_TEST

* Ported more options

* Ported more options

* Ported more options

* Ported all options

* Removed old rcfile parser

* Fix

* review

* fix

* fix

* more fixes
2025-01-21 16:13:51 +01:00
Pablo Labs ed8b6fe9db [RCFILE] Add MiSide Profile (#2276) 2025-01-21 08:12:59 +01:00
ptitSeb c98b4c8f45 [RCFILE] Added 2 new profiles 2025-01-20 19:42:11 +01:00
ptitSeb b78d81d319 [ARM64_DYNAREC] Removed many use of TABLE64 that would just slowdown build of the dynablock for not much memory saved 2025-01-20 19:41:43 +01:00
ptitSeb 9f3be89e12 [ANDROID] Removed the forced NOLOADADDRESS build parameter for Android builds 2025-01-20 16:50:18 +01:00
ptitSeb 9e0b300354 [CI] Fixed a typo 2025-01-20 16:49:14 +01:00
ptitSeb dde6d26236 [CI] Try to use gihub arm runner on linux arm build 2025-01-20 16:41:57 +01:00
ptitSeb e6eac39759 [ARM64_DYNAREC] Small optim for DB E2 opcode 2025-01-19 15:20:43 +01:00
ptitSeb 5654e77625 [INTERPRETER] Fixed AVX.66.0F38 0E/0F opcodes 2025-01-19 13:58:06 +01:00
ptitSeb c9f01d975d [ARM64_DYNAREC] Added 64/65 1B opcode 2025-01-18 15:47:08 +01:00
ptitSeb 1fe213f900 [ARM64_DYNAREC] Fixed OF flags for rcr 8bits and 16bits 2025-01-18 15:46:48 +01:00
ptitSeb 802002b7a3 [TRACE] Added TID on Strange SIGSEGV with Access Error message 2025-01-18 12:20:34 +01:00
ptitSeb 69a7c00841 [ARM64_DYNAREC] Fixed AVX.66.0F38 17 opcode 2025-01-18 12:19:53 +01:00
ptitSeb c24f040888 [INTERPRETER] Fixed AVX.66.0F38 17 opcode and improved AVX.66.0F38 0E/0F opcodes 2025-01-18 12:19:33 +01:00
ptitSeb 0f225fc1a0 [ARM64_DYNAREC] Fixed F0 0F BA opcodes with ip relative addressing 2025-01-18 12:18:31 +01:00
ptitSeb 666506e834 [BOX32] Fixed some issue with previous commit on box32 loading wine/proton 2025-01-17 15:08:41 +01:00
ptitSeb 21c0a2e7d7 Added some hack to simulate seccomp/bpf Windows syscalls handling in proton 2025-01-17 12:24:10 +01:00
ptitSeb 03204f709e [TRACE] Fixed a typo in a debug message 2025-01-17 12:06:19 +01:00
Yang Liu 6827fc6cc9 [RV64_DYNAREC] Refined printer for more thead instructions (#2272) 2025-01-17 11:40:18 +01:00
Yang Liu cff4798249 [RV64_DYNAREC] Optimized 16bit constant RCL/RCR opcodes (#2270) 2025-01-16 13:36:23 +01:00
Yang Liu 93bf308179 [RV64_DYNAREC] Optimized 16bit constant ROR opcodes (#2268) 2025-01-16 13:18:31 +01:00
Yang Liu 166c4858a1 [RV64_DYNAREC] Optimized 16bit constant ROL opcodes (#2267) 2025-01-16 10:20:31 +01:00
Yang Liu 4b8fb02198 [ARM64_DYNAREC] Removed an unused arg in SET_DFNONE (#2266) 2025-01-16 08:20:55 +01:00
ptitSeb 8432f7d8e2 [DYNAREC] Introduce BOX64_DYNAREC_DIRTY and some profile to use it 2025-01-15 18:24:54 +01:00
ptitSeb ec675564c6 [ARM64_DYNAREC] Added one more case of fastround=2 for AVX.F2.0F 5A opcode 2025-01-15 17:05:29 +01:00
ptitSeb 8c71178238 [ARM64_DYNAREC] Added unaligned code for F3 0F 7F opcode 2025-01-15 14:23:37 +01:00
ptitSeb 72df0bd1a0 Fixed dlsym with RTLD_NEXT and preloaded libs 2025-01-15 11:48:58 +01:00
ptitSeb 6035cbd5c1 [ARM64_DYNAREC] Allow new ClearCache also for Android 2025-01-14 20:41:16 +01:00
ptitSeb d7007dd3cc Small changes on envv and arv managment 2025-01-14 20:38:00 +01:00
ptitSeb 9c5daf5954 [RCFILE] Log before applying the change 2025-01-14 20:38:00 +01:00
Yang Liu a57bc9e780 [RV64_DYNAREC] Fixed simm12 overflow in some places ([LA64_DYNAREC] too) (#2264) 2025-01-14 19:04:35 +01:00
ptitSeb 2e2bed4374 [DYNAREC] Better handling of Clear Instruction Cache, also [ARM64_DYNAREC] inlined instruction cache clear (but not for [ANDROID] to keep it safe) 2025-01-14 16:16:21 +01:00
ptitSeb 4eeaddf490 Small improvment on signal handling and db/x64pc fetching 2025-01-14 16:14:51 +01:00
Yang Liu 0cd53ca748 [RV64_DYNAREC] Fixed stack out of sync in native call (#2263) 2025-01-14 14:51:25 +01:00
Yang Liu fa2bd920bd [RV64_DYNAREC] Fixed offsetof(x64emu_t, scratch) usage overflow ([LA64_DYNAREC] too) (#2262) 2025-01-14 12:47:23 +01:00
Yang Liu 613f2cccf1 [CORE] Simplified xhead* detection and standardized extension display (#2261) 2025-01-14 09:20:25 +01:00
Yang Liu d91461f468 [RV64_DYNAREC] Fixed SET_ELEMENT_WIDTH (#2260)
... also removed some unnecessary instructions in vector_loadmask
2025-01-14 08:13:18 +01:00
ptitSeb bcc497c865 This should fix the non-dynarec build 2025-01-13 17:27:36 +01:00
ptitSeb 2414f82c38 Try to improve full x86 state gathering on Signal 2025-01-13 16:12:44 +01:00
Pablo Labs fd7d811b29 [CI] Create Box64 Packages for MiceWine (.rat) (#2256)
* [CI] Create Box64 Packages for MiceWine (.rat)

* Use Default Name on Generated .rat file
2025-01-12 08:33:56 +01:00
Yang Liu e533cd0ea1 [SIGNAL][RV64] Supported more opcodes for special cases (#2253) 2025-01-11 17:07:59 +01:00
ptitSeb 9b7e5d69b2 This should fix non-Dynarec builds 2025-01-11 13:50:54 +01:00
ptitSeb 0c5e6d867f Another attempt at fixing non-Dynarec builds 2025-01-11 13:41:27 +01:00
ptitSeb 32c646d0d2 This should fix non-Dynarec builds 2025-01-11 12:48:36 +01:00
ptitSeb 35a6828209 [ARM64_DYNAREC] Better handling unaligned access to device memory, with regeration of code 2025-01-11 12:38:35 +01:00
Yang Liu 2b66675a08 [RV64_DYNAREC] Fixed a 16bit SHR pastpath edge case (#2251) 2025-01-11 12:03:55 +01:00
ptitSeb 93638ac95a [BOX32][WRAPPER] Added 1 32bits function to libc 2025-01-11 10:26:02 +01:00
ptitSeb f489761e68 [BOX32] Improved elf memory managment for 32bits process 2025-01-11 10:26:02 +01:00
Yang Liu 56ccde005e [RV64_DYNAREC] Disabled dynamic sew on MOVDQA as a workaround (#2249) 2025-01-10 19:51:33 +01:00
Yang Liu 47e4aa0b84 [SIGNAL][RV64] Added special unaligned cases handling (#2248) 2025-01-10 15:56:43 +01:00
ptitSeb b977d84f11 [ARM64_DYNAREC] Reworked a bit DB / 7 opcode 2025-01-10 15:51:08 +01:00
ptitSeb b7f14ff338 [INTERPRETER] Small cosmetic fix for D2LD helper function 2025-01-10 15:50:32 +01:00
ptitSeb 86211e5970 [USAGE] Added some missing settings in documentation 2025-01-10 14:49:48 +01:00
ptitSeb d8669d7c7d [ARM64_DYNAREC] Fixed SQXT(U)N printer 2025-01-10 13:04:28 +01:00
ptitSeb 0d8e02a3fe Don't try to use free a custom block if init is not done 2025-01-10 12:10:57 +01:00
ptitSeb 1e681cead0 Creating an emu structure for a thread will use a minimal stack now ([BOX32] too, also using MAP_32BIT attribute) 2025-01-10 12:10:20 +01:00
ptitSeb 53f2423578 [BOX32] Better handling of pthread_mutex 2025-01-10 12:08:49 +01:00
Yang Liu 6cdfa05604 [RV64_DYNAREC] Fixed MOVMSKPS RVV 1.0 path (#2246) 2025-01-09 18:45:58 +01:00
ptitSeb d55e879879 [BOX32][WRAPPER] Added support of BOX64_MAXCPU in 32bits wrapped SDL2 2025-01-09 16:56:07 +01:00
ptitSeb d377433997 [WRAPPER] Added support of BOX64_MAXCPU in wrapped SDL2, plus some various other CPUInfo fixes 2025-01-09 16:56:07 +01:00
xctan 207073bf36 [RV64_DYNAREC] Fixed some typos (#2244)
* [RV64_DYNAREC] Fixed CMPXCHG8B

* [RV64_DYNAREC] Fixed typo
2025-01-09 08:10:41 +01:00
ptitSeb 316f31a4bb [ARM64_DYNAREC] Small fixes for some 8bits OR and XOR opcodes on regs with no flags (should help #2243 again) 2025-01-08 23:05:42 +01:00
ptitSeb ada8efcdef [ARM64_DYNAREC] Small fix for 80 /4 opcode on regs with no flags (should help #2243) 2025-01-08 19:51:46 +01:00
ptitSeb 99d0889cfd [INTERPRETER] Removed some useless tests on x87 comp 2025-01-08 15:59:14 +01:00
Hagb (Junyu Guo 郭俊余) 653a67c8ad Port rounding of some x87 instructions from Box86 (#2242)
* Port rounding of some x87 instructions from Box86

Ported from https://github.com/ptitSeb/box86/pull/951. The original pull
request and this commit also contain some improvements on precision of
`F2XM1` and `FYL2XP1`.

* Run fpu_rounding test with dynarec only for ARM64

They have been implemented on dynarec only for ARM64.
2025-01-08 15:34:15 +01:00
ptitSeb b99893d1c3 [ARM64_DYNAREC] Remove bloated x87 comp code 2025-01-08 15:08:42 +01:00
ptitSeb a5c4d01649 Updated 32bits test19 too 2025-01-08 15:08:17 +01:00
ptitSeb 82105a1543 [INTERPRETER] Improved x87 emulation a bit ([ARM64_DYNAREC] too) 2025-01-08 14:43:14 +01:00
Leslie Zhai c65910fd25 [WRAPPED] Added monstartup (#2241)
* [WRAPPED] Added monstartup

* [WRAPPED] Added monstartup for not defined STATICBUILD

* [WRAPPED] Fix monstartup wrong signature

* [WRAPPED] Change monstartup signature about STATICBUILD

* [WRAPPED] monstartup is WEAK symbol.
2025-01-08 13:46:02 +01:00
ptitSeb b5de464e85 [ARM64_DYNAREC] Added FCMEQ printer 2025-01-07 20:40:09 +01:00
ptitSeb 81eb0b45b3 [ARM64_DYNAREC]Small optimisation for 8bits and 16bits NOT opcode on register 2025-01-07 20:39:47 +01:00
ptitSeb c772d1ab49 Small fix to program break tracking 2025-01-07 15:39:02 +01:00
ptitSeb 1af7c15801 Trace program program to not allocate memory over there (help TalosPrinciple2, probably other UE5 games too) 2025-01-07 15:34:11 +01:00
ptitSeb e11901a7a6 [TRACE] Small change in Double segfault trace 2025-01-07 15:33:22 +01:00
ptitSeb 0b2f84df54 [ARM64_DYNAREC] Small optim to 8bits AND opcodes with constant and without flags 2025-01-07 15:17:42 +01:00
ptitSeb a1ff40733b [ARM64_DYNAREC] Optimized 8bits XOR when no flags is needed 2025-01-07 10:40:46 +01:00
ptitSeb a61888e06c [ARM64_DYNAREC] Optimized 8bits OR when no flags is needed 2025-01-07 09:58:13 +01:00
ptitSeb 691259ec0d [BOX32] Use 32bits malloc when building LinkMaplib 2025-01-06 20:26:44 +01:00
ptitSeb 91e678da5b [BOX32][WRAPPER] Added a few more 32bts wrapped functions to libc and libresolv 2025-01-06 20:25:54 +01:00
ptitSeb 8a7c2b5228 [INTERPRETER] Added a check of CS validity on IRET opcode 2025-01-06 17:07:19 +01:00
ptitSeb e7710f59fa [BOX32] Fixed some signature issues with wrapped libXrender 2025-01-06 17:06:44 +01:00
Leslie Zhai 4039f3c249 [WRAPPED] Added xdr_string and xdr_free (#2235)
* [WRAPPED] Added xdr_string

* [WRAPPED] Added check rpc/xdr header file

* [WRAPPED] Add xdr_free

* [WRAPPED] Use my->Func instead

* [WRAPPED] Change GOM(xdr_string) to GO(xdr_string)
2025-01-06 10:29:59 +01:00
ValdikSS 6f46ccdd5a Fix crash with incorrect argv[0]: rewrite it only if "box64" is present (#2233) 2025-01-06 08:42:08 +01:00
ptitSeb b79ba11d95 [DYNAREC] Imroved log on signal and flags/sse info gathering. [ARM64_DYNAREC] Fixed some case of nat flags being incorectly used 2025-01-05 14:59:59 +01:00
ptitSeb 5a35184ba7 [INTERPRETER] Added a few more cpu extension and associated opcodes ([ARM64_DYNAREC] added some of the new opcodes too) 2025-01-05 14:57:24 +01:00
ptitSeb db801da658 [ARM64_DYNAREC] Added a new emiter 2025-01-05 14:55:28 +01:00
ptitSeb f160fe3300 [ARM64_DYNAREC] Small improvments on (V)PMOVMSKB opcodes 2025-01-05 14:55:28 +01:00
ValdikSS 5d5dd3a3bc Document BOX64_ARG0 argv[0] rewriting variable (#2234) 2025-01-05 14:08:27 +01:00
ptitSeb 5fa65a4b38 [ARM64_DYNAREC] Small optim on specific case of XOR with -1 const 2025-01-04 12:30:28 +01:00
ptitSeb cc34c75fc3 [INTERPRETER] Fixed opcode name in comment 2025-01-04 12:30:28 +01:00
ptitSeb 7fb1a34947 [ARM64_DYNAREC] Don't simplify flags for add rsp, const when safeflags=2 is used 2025-01-04 12:30:28 +01:00
ptitSeb d087020139 [ARM64_DYNAREC] Small improvment on edge cases double to int x87 conversions 2025-01-04 12:30:28 +01:00
Leslie Zhai 4065e61ec5 [DYNAREC] Appended instruction name to symbol (#2228) 2025-01-03 14:33:45 +01:00
ptitSeb da6b799a10 [ARM64_DYNAREC] Small fixes to sse info retreiving on signal 2025-01-02 20:41:36 +01:00
ptitSeb 967c73efd1 [ARM64_DYNAREC] Fixed native flags with signal, and added sse handling 2025-01-02 19:00:49 +01:00
ptitSeb 6a35cd2a56 [ARM64_DYNAREC] Change native flags handling in signal to make it more extensible 2025-01-02 17:35:43 +01:00
ptitSeb ebf03f8878 [ARM64_DYNAREC] Improved ADCX opcode 2025-01-01 16:39:30 +01:00
ptitSeb d7dbee5126 [ARM64_DYNAREC] Improved native flags handling 2025-01-01 16:39:00 +01:00
ptitSeb 08930381e9 [ARM64_DYNAREC] Improved a bit MULX opcode 2025-01-01 12:12:19 +01:00
ptitSeb 495c98a488 [ARM64_DYNAREC] Small improvements to POPCNT and ADOX opcodes 2025-01-01 09:46:19 +01:00
ptitSeb 80a4b61e5c [BOX32] Fixed build 2024-12-31 22:34:08 +01:00
ptitSeb 1d20968f82 [ARM64_DYNAREC] Improved signal handling and flags handling (tbd on other archs) 2024-12-31 22:27:55 +01:00
ptitSeb ca8d569e63 [ARM64_DYNAREC] Fixed some issue with shrd/shld opcodes 2024-12-31 22:05:42 +01:00
ptitSeb 670770e24a [ARM64_DYNAREC] Small improvement to MULX opcode 2024-12-30 20:38:23 +01:00
ptitSeb b55b138303 [WRAPPER] Fixed a small mystake with latest ALTNAME work 2024-12-28 22:39:13 +01:00
olegos2 d0c7cb46e7 [WRAPPED][ANDROID] Add libGL ALTNAME (#2225) 2024-12-28 22:03:36 +01:00
olegos2 6e1e7de52b [ANDROID] Add a few ALTNAMEs and unwrap ifdefs for lib names (#2224)
* [WRAPPED][ANDROID] A few more ALTNAMEs

* [WRAPPED][ANDROID] Unwrap ifdefs for lib names
2024-12-28 20:13:17 +01:00
olegos2 bb0a445a6b Spelling/typo fixes in code and documentation updates (#2223)
* Fix typo DLOpenned->DLOpened

* Fix a typo in comments: versionned->versioned

* Fix a typo in comment: cleanning->cleaning

* Update COMPILE.md and USAGE.md

* A few more typos in comments
2024-12-28 17:06:51 +01:00
Chi-Kuan Chiu 7157803c03 [DOCS] Improve cross-build instructions (#2196)
Include a note for users utilizing environments
where only the box64 binary is available.
This addition ensures that users can install
the necessary libraries before running box64.
2024-12-28 16:38:11 +01:00
東雲なの b7c5adae3d Use uname -m to get CPU architecture (#2222)
Use uname -m to get CPU architecture is simplier than lscpu
2024-12-28 16:34:19 +01:00
Yang Liu 809b663350 [LA64_DYNAREC] Some minor fixes on bad variable usage (#2221) 2024-12-28 15:37:30 +01:00
ptitSeb 1c4f1cb8c2 [ARM64_DYNAREC][TRACE] Added printer for CNT opcode 2024-12-28 14:33:10 +01:00
ptitSeb cace5f0ccb [INTERPRETER] Fixed 32bits ADCX/ADOX opcodes 2024-12-28 13:50:32 +01:00
ptitSeb 4aaa0b5d24 [ARM64_DYNAREC] Fixed and improved flags for F3 0F B8 opcode 2024-12-28 12:10:13 +01:00
ptitSeb c0829b807c [INTERPRETER] Added 66 F3 0F B8 opcode 2024-12-28 12:05:31 +01:00
ptitSeb 7d3cdb06e3 [INTERPRETER] Small (mostly cosmetic) change to POCNT opcode 2024-12-28 12:05:11 +01:00
ptitSeb 42f3884478 Update README.md 2024-12-28 09:19:44 +01:00
ptitSeb fcd46e2cdc [ANDROID] Another attempt at fixing the build 2024-12-27 22:54:13 +01:00
ptitSeb f36f9d290d [ANDROID] Fix build 2024-12-27 22:43:49 +01:00
ptitSeb ae512cc4ed [ANDROID] Fixed definition of android_sigaction_t 2024-12-27 22:15:01 +01:00
ptitSeb 4fd59da003 [ANDROID] Try to fix signal handling on android 2024-12-27 22:10:24 +01:00
ptitSeb e2d7cc5011 Exposed MMXext for CPUTYPE=1 2024-12-27 18:47:32 +01:00
ptitSeb 79413a4147 [INTERPRETER] Exposed SSE4a for CPUTYPE=1, implemented all 4 opcodes 2024-12-27 18:32:37 +01:00
ptitSeb 80b357da41 [BOX32] Adapted signatures of 2 32bits libc wrapped functions 2024-12-27 18:08:06 +01:00
ptitSeb a54f516447 Introduce BOX64_CPUTYPE to choose emulating Intel or AMD cpus (no AMD specific extension yet) 2024-12-27 18:07:25 +01:00
ptitSeb 26ba1148e8 [ARM64_DYNAREC] Small optim for some specific case of slhd32 emiter 2024-12-27 13:50:19 +01:00
Yang Liu 8b2b96d5c5 [LA64_DYNAREC] Fixed some minor issues on LBT path (#2218) 2024-12-27 10:06:19 +01:00
ptitSeb e21a506936 [WRAPPER] Added 3 more wrapped functions to libxcb and freetype (for #2217) 2024-12-26 19:18:41 +01:00
ptitSeb e86c6359d6 [INTERPRETER] Improved some shift operands nd [AR64_DYNAREC] Improved shift operands and [COSIM] reduce noise on shift operands 2024-12-26 19:10:27 +01:00
ptitSeb acce64b268 [ARM64_DYNAREC] Fixed 67 8D opcode 2024-12-26 17:32:42 +01:00
Leslie Zhai 89713993cb [DYNAREC] Implement perf map (#2212)
* [DYNAREC] Implement perf map

* [DYNAREC] Use function name as the Symbol
2024-12-26 14:43:19 +01:00
Yang Liu cf24eaf9d2 [LA64_DYNAREC] Added hardware wall-clock support (#2216)
* [LA64_DYNAREC] Added hardware wall-clock support

* Refined multi-language support
2024-12-26 14:40:04 +01:00
Yang Liu cd1ac51b79 [LA64_DYNAREC] Added more opcodes (#2215) 2024-12-26 14:37:55 +01:00
Yang Liu a7ded59393 [LA64_DYNAREC] Added more opcodes (#2214) 2024-12-26 10:14:54 +01:00
Yang Liu 205ef4ddeb [LA64_DYNAREC] Added more opcodes (#2213) 2024-12-26 09:30:10 +01:00
Yang Liu 145689783f [LA64_DYNAREC] Added more opcodes and fixed CVTTPD2DQ (#2211) 2024-12-25 21:00:20 +01:00
Yang Liu 21a21b04e6 [LA64_DYNAREC] Added IRET opcode (#2210) 2024-12-25 18:52:32 +01:00
Yang Liu 87e19076ad [DYNAREC] Cleanup modreg (#2209) 2024-12-25 16:59:18 +01:00
Leslie Zhai 9492b6ca66 [LA64_DYNAREC] Added MOVLPD and MOVHPD opcodes (#2198)
* [LA64_DYNAREC] Added MOVLPD and MOVHPD opcodes

* [LA64_DYNAREC] Fix VSTELM_D idx
2024-12-25 15:56:54 +01:00
Yang Liu 4a45db781f [LA64_DYNAREC] Added more opcodes (#2208) 2024-12-25 15:40:45 +01:00
Yang Liu 0329d5fcc2 [RV64_DYNAREC] Added more opcodes ([LA64_DYNAREC] too) (#2205)
* [RV64_DYNAREC] Added 66 8E MOV opcode ([LA64_DYNAREC] too)

* Added more opcodes
2024-12-25 15:40:21 +01:00
Yang Liu f39b5514c5 [RV64_DYNAREC] Fixed various lock usage in geted ([LA64_DYNAREC] too) (#2207) 2024-12-25 15:35:47 +01:00
Yang Liu 4700a6322e [RCFILE] Added sekiro.exe entry (#2206) 2024-12-25 15:30:28 +01:00
Yang Liu 91a8fef1bb [WRAPPED] Always return ENOSYS in the deprecated sysctl (#2204) 2024-12-25 15:28:29 +01:00
Yang Liu a56a66a227 [RV64_DYNAREC] Fixed a regression in #2187 (#2203) 2024-12-24 19:38:00 +01:00
Yang Liu 1b262dac29 [LA64_DYNAREC] Added nativeflags support (#2202) 2024-12-24 18:58:49 +01:00
Yang Liu 3b15ef1cb5 [LA64_DYNAREC] Fixed 66 0F PTEST opcode (#2201) 2024-12-24 17:50:41 +01:00
Yang Liu 9ac695b9be [LA64_DYNAREC] Small optim to MOVHPS (#2200) 2024-12-24 14:19:20 +01:00
Yang Liu 05060803b2 [RV64_DYNAREC] Fixed nativeflags tmp register usage (#2199) 2024-12-24 14:06:52 +01:00
ptitSeb e84f2e4a8b [ARM64_DYNAREC] a bit more work on df=0 (still WIP) 2024-12-24 11:30:32 +01:00
DragonSWDev 6fac9ee35b Add SDL_RenderGeometryRaw wrapped function to SDL2 (#2195)
* Add SDL_RenderGeometryRaw wrapped function to SDL2

* Add missing files
2024-12-23 22:26:53 +01:00
Yang Liu 93cc31bc48 [LA64_DYNAREC] Fixed various issues in LBT path (#2197) 2024-12-23 21:29:49 +01:00
Yang Liu 13ee4acd59 [WRAPPED][BOX32] Redirected a few old symbols (#2194)
* [WRAPPED] Redirected a few old symbols

* More
2024-12-23 18:43:47 +01:00
ptitSeb 1360e7112c [ARM64_DYNAREC] Added work in progress BOX64_DYNAREC_DF env. var. 2024-12-23 13:26:52 +01:00
ptitSeb 12987af561 Fixed a warning 2024-12-23 13:26:04 +01:00
ptitSeb e071a70ec2 [DYNARC] Forgot this file from previous commit 2024-12-23 13:25:38 +01:00
ptitSeb 48db75961e [DYNAREC] Some light rework of the hotpage handling 2024-12-23 12:48:35 +01:00
ptitSeb da0820ce0a Added more rbtrees in dynarec managment, to speedup FindDynablockFromNativeAddress function 2024-12-23 12:25:56 +01:00
ptitSeb ac81132435 Try to improve clone syscal handling ([BOX32] too) 2024-12-23 12:23:18 +01:00
Yang Liu 946da43038 [LA64_DYNAREC] Fixed some LBT path issues (#2193) 2024-12-23 11:32:35 +01:00
Yang Liu cad9450e16 [LA64_DYNAREC] Optimized some 16bit shift opcodes (#2192) 2024-12-23 10:05:05 +01:00
Yang Liu 0c7cc657cc [LA64_DYNAREC] Fixed 32bit ADDIz and SUBz (#2191) 2024-12-23 08:25:29 +01:00
ptitSeb ce4590f5ba Fix build for older system (for #2190) 2024-12-23 08:24:25 +01:00
Yang Liu cd3f5ca97d [RV64_DYNAREC] Small optim to emit_and32c (#2189) 2024-12-22 21:50:05 +01:00
Yang Liu fc2a6d4dd1 [RV64_DYNAREC] Added a fast path to SHR Ew, Ib (#2188) 2024-12-22 21:41:43 +01:00
Yang Liu 85fe4c628e [RV64_DYNAREC] Made nativeflags works with 8/16bit fast path (#2187) 2024-12-22 20:30:40 +01:00
ptitSeb 1bb7d9efd8 [ARM64_DYNAREC] Reworked MUL/IMUL opcodes a bit 2024-12-22 15:22:44 +01:00
Yang Liu 25b4dd1457 [GDBJIT] Display register mapping annotations (#2185) 2024-12-22 11:17:49 +01:00
Yang Liu ea13414083 [GDBJIT] Unified the experience for all the backends (#2183) 2024-12-21 16:20:48 +01:00
ptitSeb 3e745474d3 Improved memory tracking and 32bits memory allocation 2024-12-21 15:32:17 +01:00
ptitSeb 5ad2f155c1 Changed customme block resize to lower the number of realloc 2024-12-21 12:33:22 +01:00
ptitSeb 945b4192b1 [WRAPPER] Fixed a few uninitized value used warning from Vamgrind 2024-12-21 12:33:22 +01:00
ptitSeb 3b71ba6090 [ARM64_DYNAREC] Improved DMB/DSB printer 2024-12-21 12:33:22 +01:00
Leslie Zhai 9fc4697233 [LA64_DYNAREC] Added ROUNDSD and CVTDQ2PD opcodes (#2173)
* [LA64_DYNAREC] Added ROUNDSD and CVTDQ2PD opcodes

* [LA64_DYNAREC] Added round_round

* [LA64_DYNAREC] Remove redundant instruction

* [LA64_DYNAREC] Remove useless assembler

* [LA64_DYNAREC] Made round_round more readable
2024-12-20 16:47:18 +01:00
ptitSeb 8a37b12f81 Simplified ucontext uc_link managment (closer to glibc handling) ([BOX32] too) 2024-12-20 15:39:27 +01:00
Yang Liu 6ac7d7a1db [GDBJIT] Display DynaRec info in source file (#2179)
* [GDBJIT] Display DynaRec info in source file

* fix
2024-12-20 12:59:03 +01:00
ptitSeb 291db1530c [LA64] This should fix static build 2024-12-20 12:38:57 +01:00
ptitSeb e77ea1b45c [WRAPPER] Added 1 more libc wrapped function 2024-12-20 11:43:52 +01:00
ptitSeb 80db0175e0 [WRAPPER] Added a few glib2 wrapped functions 2024-12-20 11:42:14 +01:00
ptitSeb 15f90899eb [BOX32] Don't abort when stack pointer is not correct on new thread, but return an error 2024-12-20 11:21:40 +01:00
ptitSeb e2ce483e0d [BOX32][WRAPPER] Improved obstack handling 2024-12-20 11:04:28 +01:00
ptitSeb 41b31dc58d [BOX32] use malloc_trim when it gives non 32bits pointers 2024-12-20 11:04:28 +01:00
Yang Liu f8b9c7b2b7 [LA64_DYNAREC] A few minor optimizations (#2174) 2024-12-19 16:20:16 +01:00
ptitSeb a8000cb629 [BOX32] More fixes on libc wrapping 2024-12-19 13:57:33 +01:00
ptitSeb 17f2371804 [BOX32] Boosted xcbconnection slot from 8 to 16 2024-12-19 10:35:00 +01:00
Leslie Zhai 4d377de5ab [LA64_DYNAREC] Added CLC and PMOVZXBW opcodes (#2172) 2024-12-19 09:34:54 +01:00
Leslie Zhai 956f6ffc15 [LA64_DYNAREC] Fix VPICKVE2GR_WU typo (#2171)
* [LA64_DYNAREC] Fix VPICKVE2GR_WU typo

* [LA64_DYNAREC] Fix VPICKVE2GR_BU|HU_DU typo
2024-12-19 08:11:39 +01:00
Yang Liu 600ae18d4b [RV64_DYNAREC] Fixed 32bits SUBz (#2170) 2024-12-18 21:47:06 +01:00
Yang Liu 39aa02c19c [RV64_DYNAREC] Added more LOCK prefix opcodes (#2169) 2024-12-18 21:38:17 +01:00
Yang Liu 7dcb86f500 [RV64_DYNAREC] Fixed 32bit ADDIz (#2168) 2024-12-18 20:54:08 +01:00
Yang Liu f873255a19 [RV64_DYNAREC] Fixed CMPXCHG8B (#2167) 2024-12-18 18:43:06 +01:00
Yang Liu 4662ab1c80 [RV64_DYNAREC] Added unaligned support to CMPXCHG8B opcode (#2166) 2024-12-18 18:13:52 +01:00
ptitSeb b0b34e3a2a Improved handling of stack size and addresses attribute for threads ([BOX32] too) 2024-12-18 17:18:26 +01:00
ptitSeb 631da8a532 Added an helper function to abort and backtrace (used in [BOX32] when pointer address not 32bits compatible) 2024-12-18 17:15:21 +01:00
ptitSeb f80886fd68 [ELFLOADER] Do not fornul dlclose remaining libs at exit, just lest dependancies do the unload (help gogdl and nile) 2024-12-18 17:14:04 +01:00
ptitSeb cbe7ced335 Simplfied env var and trace file initial managment 2024-12-18 16:13:30 +01:00
Yang Liu 955f6e74ab [GDBJIT] Refined RV64 and LA64 support (#2165) 2024-12-18 15:26:17 +01:00
Yang Liu 8a982e8b5e [LA64_DYNAREC] Added POPCNT opcode and fixed an issue too (#2164) 2024-12-18 09:15:21 +01:00
Yang Liu 47f5fe7caf [GDBJIT] Show x64pc in gdb, also added documentation (#2163)
* [GDBJIT] Show x64pc in gdb

* Add env. variable and documentation

* typo

* oops
2024-12-18 08:11:09 +01:00
Yang Liu 6e0f32f4ca Added initial GDBJIT support (#2162)
* Added GDBJIT support

* fix

* fix
2024-12-17 22:01:33 +01:00
ptitSeb 62eca11bee [BOX32][TRACE] Improved trace of wrapped functions 2024-12-17 14:49:08 +01:00
ptitSeb 13f5ec1524 [BOX32] Small change on how tls memory is allocated 2024-12-17 14:48:05 +01:00
ptitSeb e751d41ba7 Some (mostly) cosmetic change to x64emu initializers 2024-12-17 14:46:09 +01:00
ptitSeb 7fd884b9c1 [BOX32][WRAPPER] More fixes to sendmsg/rcvmsg wrapping (fixes some wine 32bits stuffs) 2024-12-17 14:42:53 +01:00
ptitSeb a98887589d [BOX32] Improved pre-reserve highmem, and use that memory for dynablocks 2024-12-17 13:22:20 +01:00
ptitSeb 0882f910df [BOX32][WRAPPING] Added 32bits wrapped libxcb-res and fixes some wrapped functions from libxcb 2024-12-17 09:15:59 +01:00
xctan f65c22d329 [RV64_DYNAREC] Extended simple wrapper for more int types (#2160) 2024-12-17 08:23:51 +01:00
xctan 485959195e [CMAKE] Fixed linking issue with mold (#2159) 2024-12-17 08:19:53 +01:00
ptitSeb 28fb1bb0c0 [BOX32][WRAPPER] Silence some conversion warnings 2024-12-16 14:41:44 +01:00
ptitSeb cc12620868 [WRAPPER] Added wrapped libxcb-res with new wrapperhelper 2024-12-16 13:18:26 +01:00
ptitSeb 9c89e64691 [WRAPPER] Reworked libxcb wrapping with new wrapperhelper 2024-12-16 12:52:19 +01:00
ptitSeb d432b18d23 [BOX32][WRAPPER] Added 32bits wrapped libxcb 2024-12-16 12:41:05 +01:00
ptitSeb 98c0811525 [BOX32][WRAPPER] Prepare xcb_connection_t* align functions 2024-12-16 10:52:27 +01:00
ptitSeb 77b16ae30d [BOX32][WRAPPER] Prepare xcb_connection_t* as n on box32 2024-12-16 10:51:41 +01:00
ptitSeb f4a4bdd006 [BOX32][WRAPPER] Added 32bits wrapped libx11-xcb 2024-12-16 10:04:51 +01:00
Leslie Zhai ed7dddc3d8 [LA64_DYNAREC] Added PTEST opcode (#2158) 2024-12-16 15:26:20 +08:00
Yang Liu 4c6401c66b [RV64_DYNAREC] Fixed more regressions (#2157) 2024-12-15 20:05:37 +01:00
ptitSeb 42441c99cc [BOX32][WRAPPER] More fixes on 32bits libc wrapping 2024-12-15 17:48:49 +01:00
ptitSeb f775474062 [BOX32] Try to impove pthread_cond_t handling 2024-12-15 17:04:58 +01:00
ptitSeb c30e012e8d [BOX32][WRAPPER] Some fixes to struct msghdr alignment functions 2024-12-15 17:04:26 +01:00
ptitSeb d90522bc4e [BOX32] Rollback simplied alignment of msghdr as cmsg also needs alignment (some docs are eroneous about cmsg_len field type) 2024-12-15 16:07:25 +01:00
ptitSeb 0f7bec0d38 [BOX32][WRAPPER] Moved all function wrapped from wrappedresolv.c to libc_net32.c (still should help #2156) 2024-12-15 15:39:50 +01:00
ptitSeb 201b971ad7 [BOX32][WRAPPER] Try to fix build issue for older system (for #2156) 2024-12-15 15:36:53 +01:00
ptitSeb 1c72527dc8 [BOX32][WRAPPER] Some work on 32bits xcb_connection 2024-12-15 14:57:07 +01:00
ptitSeb 5ce3e29913 [BOX32][WRAPPER] More work on libc wrapping, and some new syscall too 2024-12-15 14:15:34 +01:00
ptitSeb 1a7cff559a [BOX32][WRAPPER] Added mtrace and muntrace to 32bits wrapped libc (for #2155) 2024-12-15 11:19:04 +01:00
Yang Liu c28b0629fa [WRAPPER] Made gtkclass.c less likely to be recompiled (#2153) 2024-12-15 10:00:22 +01:00
ptitSeb 6a3c56c131 [BOX32][WRAPPER] More fixes to libc and libX11 wrapping 2024-12-14 22:51:31 +01:00
ptitSeb d03c85da90 [BOX32][WRAPPER] More fixes to libc and X11 wrapping 2024-12-14 20:56:07 +01:00
ptitSeb 6a5d831331 [BOX32][WRAPPER] Fixes and improves libc wrapping 2024-12-14 19:43:20 +01:00
ptitSeb 2164c564f2 [DYNAREC] Revert default BOX64_DYNAREC_PAUSE to 0 (for #2152) 2024-12-14 17:05:48 +01:00
ptitSeb 2a33cf4e60 [BOX32][WRAPPER] Many fixes and improvments to X11 wrapping 2024-12-14 17:04:17 +01:00
ptitSeb 6698a844f6 [BOX32][WRAPPER] Added more 32bits wrapped functions 2024-12-13 17:50:05 +01:00
ptitSeb 1c5ccefdef [BOX32][WRAPPER] Added a few more libc 32bits wrapped functions 2024-12-13 16:54:54 +01:00
ptitSeb 64bfd06be4 [BOX32][WRAPPER] Added a few 32bits wrapped function libnsl 2024-12-13 16:46:12 +01:00
ptitSeb 5bf154195d [BOX32][WRAPPER] Added a few more 32bits wrapped libc functions 2024-12-13 16:42:21 +01:00
ptitSeb 0239305f69 [BOX32][WRAPPER] Added empty 32bits wrapped libnsl 2024-12-13 16:31:37 +01:00
ptitSeb 3ee5558c70 [BOX32][WRAPPER] Added a 32bits dummy libvdpau wrapped lib 2024-12-13 16:19:12 +01:00
ptitSeb 059dc12adc [BOX32][WRAPPER] Added 32bits wrapped libdrm with new wrapperhelper 2024-12-13 16:05:50 +01:00
ptitSeb 610c63cd15 [BOX32][WRAPPER] Added a few more libc and libresolv 32bits wrapped functions 2024-12-13 15:38:13 +01:00
ptitSeb fa3db3df11 [BOX32][WRAPPER] Added a arge batch of 32bits wrapped function to X11 and friends 2024-12-13 15:24:11 +01:00
Yang Liu 4b4c0143d9 [RV64_DYNAREC] Optimize push/pop with xtheadmemidx (#2150)
* [RV64_DYNAREC] Optimize push/pop with xtheadmemidx

* fix
2024-12-13 14:57:28 +01:00
ptitSeb fa76ce1f05 [BOX32][WRAPPER] Added 3 more 32bits wrapped function to libcairo 2024-12-13 11:16:37 +01:00
ptitSeb 59bb9c2083 [BOX32][WRAPPER] Added more SDL2 32bts wrapped functions 2024-12-13 10:51:15 +01:00
ptitSeb 689d64b62a [BOX32][WRAPPER] Added 1 more libc 32bits wrapped funciton, and fixed an existing one 2024-12-13 10:30:43 +01:00
Yang Liu f6c3386960 [RV64_DYNAREC] Fixed some TO_NAT usages (#2149) 2024-12-13 08:13:33 +01:00
Yang Liu 5055866a5a [RV64_DYNAREC] Reinitialize sew after callret (#2148) 2024-12-13 08:12:18 +01:00
xctan 9f7d0c4404 [RV64_DYNAREC] Reworked ZEROUP and freed t0 (#2147)
* [RV64_DYNAREC] Reworked ZEROUP and freed t0

* [RV64_DYNAREC] Removed the definition of xMASK
2024-12-12 19:54:08 +01:00
ptitSeb 7e5aa3e7c6 [BOX32][WRAPPER] Added a few more 32bits wrapped function to libc 2024-12-12 13:34:59 +01:00
ptitSeb c7afc0b3df [BOX32][WRAPPER] Added 32bits wrapped libXdamage 2024-12-12 13:15:43 +01:00
ptitSeb 566ff08109 [BOX32][WRAPPER] Added 32bits wrapped libcairo 2024-12-12 13:09:07 +01:00
ptitSeb 2247b61ed3 [BOX32][WRAPPER] Added a few more 32bits wrapped function to libfontconfig 2024-12-12 11:53:13 +01:00
Yang Liu 55d6971a23 [RV64_DYNAREC] New register mapping (#2139)
* [RV64_DYNAREC] New register mapping

* Fix
2024-12-12 11:51:24 +01:00
Leslie Zhai 7168167400 [LA64_DYNAREC] Added more opcodes (#2145)
* [LA64_DYNAREC] Added more opcodes

* [LA64_DYNAREC] Optimize MOVZX Gw, Eb
2024-12-12 11:23:17 +01:00
ptitSeb 7e17c862cf [WRAPPER] Checked pangoft2 wrapping with new wrapperhelper 2024-12-12 10:58:27 +01:00
ptitSeb bb60cc8568 [BOX32][WRAPPER] Added more libc and libresolv 32bits wrapped functions 2024-12-12 10:48:14 +01:00
ptitSeb 857c4600dc [BOX32][WRAPPER] Another fix for older / strict compiler (for #2141) 2024-12-11 20:11:39 +01:00
ptitSeb 88bd65998f [BOX32][WRAPPER] Added one more 32bits libX11 wrapped function 2024-12-11 18:14:28 +01:00
ptitSeb ecbd382ae4 [BOX32] added a few more libc 32bits wrapped functions 2024-12-11 18:09:44 +01:00
ptitSeb 16f63a94c3 [BOX32][WRAPPER] Try to fix some build issue on older system (for #2140) 2024-12-11 18:03:30 +01:00
ptitSeb bd7ff2efd6 [ARM64_DYNAREC] Force flags to be at least defered when priv opcode is run on safeflags=2 2024-12-11 17:56:05 +01:00
ptitSeb ed21342995 [DYNAREC] Small improvments on flags when end of block if trigger early 2024-12-11 17:55:13 +01:00
ptitSeb 4c238f0e17 [ARM64_DYNAREC] Better hadnling of flags on btx opcode familly ([COSIM] and improved undefined flags when running with cosim) 2024-12-11 17:54:17 +01:00
ptitSeb 7c000adb87 [INTERPRETER][COSIM] Better flags for btx opcode familly when running cosim 2024-12-11 17:53:17 +01:00
ptitSeb 2d4f073925 [COSIM] Try to get more stable result on x87 stacks by unwinding status before calling cosim 2024-12-11 11:39:03 +01:00
ptitSeb a25aab1426 [BOX32] Added a workaround for older system (should help #2138) 2024-12-11 10:10:02 +01:00
Leslie Zhai 54f593fa75 [WRAPPER] Added libcairo.so.2 as one of NEEDED_LIBS for gtk3 (#2136) (#2137) 2024-12-11 09:23:17 +01:00
Leslie Zhai 054de8e83f [LA64] SIGRTMAX is 127 for ABI 1.0 (#2134)
* [LA64] SIGRTMAX is 127 for ABI 1.0

* [LA64] Added LARCH64_ABI_1 CMake option

* [LA64] Change MAX_SIGNAL to 128 for ABI 1.0
2024-12-11 08:10:58 +01:00
ptitSeb e6d1bf78a6 [BOX32][WRAPPER] Added 1 more 32bits libX11 wrapped function 2024-12-10 18:19:48 +01:00
ptitSeb b4b8617a92 [BOX32][WRAPPER] Fixed time signature (now steamcmd connect) 2024-12-10 18:06:10 +01:00
ptitSeb 20bad4e126 [BOX32][WRAPER] Improved pthread_mutex handling, and better trace for mutex wrapped on LOG_DEBUG 2024-12-10 18:05:14 +01:00
ptitSeb 3650609975 [BOX32][TRACE] Improved trace for a few libc calls 2024-12-10 18:03:16 +01:00
ptitSeb fe3b30ccbb [RCFILE] Added 1 more profile 2024-12-10 15:25:33 +01:00
ptitSeb ccae82e1f5 [DOC] Small improment on USAGE.md 2024-12-10 15:25:33 +01:00
Leslie ZhaiandYang Liu f1addb8b28 [LA64_DYNAREC] Added more 660F opcodes (#2127)
* [LA64_DYNAREC] Added more 660F opcodes

* [LA64_DYNAREC] Change VREPLGR2VR_D to VXOR_V

* [LA64_DYNAREC] Optimize PMULHRSW

Co-authored-by: Yang Liu <[email protected]>

---------

Co-authored-by: Yang Liu <[email protected]>
2024-12-10 10:48:24 +01:00
ptitSeb 96f5108a37 [INTERPRETER] Added 64bits 67 A1 opcode ([ARM64_DYNAREC] Too) 2024-12-09 13:16:13 +01:00
ptitSeb 3eeb10c0a6 [BOX32][WRAPPER] Better wrapping for shmat 2024-12-09 13:06:50 +01:00
ptitSeb ce3d2afad2 Change log level to INFO for Wine prereserve issues (for #2123) 2024-12-08 16:12:15 +01:00
ptitSeb bdee719767 [BOX32] Improved mutex handling, again 2024-12-08 14:51:29 +01:00
ptitSeb 42263e0be9 [BOX32][WRAPPER] Fixed some more typo on Xcursor wrapping (might help #2109) 2024-12-08 12:03:54 +01:00
ptitSeb ca08012bbf [BOX32][WRAPPER] Added a couple of 32bits wrapped functions to libc 2024-12-08 09:41:31 +01:00
Jim Huang ca47ee273e [CORE] Refine runtime messages (#2125)
This commit addresses inconsistent runtime messages by correcting
grammatical errors and typos, and properly handling singular and plural
forms.
2024-12-07 17:07:14 +01:00
Leslie Zhai eb299f500b [LA64_DYNAREC] Added AES opcodes (#2122)
* [LA64_DYNAREC] Added AES opcodes

* [LA64_DYNAREC] Use LSX instruction instead
2024-12-07 09:58:20 +01:00
ptitSeb a25b50d3aa Start of a new dev. cycle 2024-12-07 09:50:11 +01:00
ptitSeb b735a8663e Update README.md 2024-12-06 16:19:58 +01:00
1037 changed files with 171505 additions and 49546 deletions

No files matched your search

+1 -1
View File
@@ -12,7 +12,7 @@ MaxEmptyLinesToKeep: 2
IndentCaseLabels: true
AlignConsecutiveMacros: true
WhitespaceSensitiveMacros: ['QUOTE']
IfMacros: ['IFX', 'IFXORNAT', 'IFX2', 'IFXA', 'IFX_PENDOR0', 'IFXX', 'IFX2X', 'IFXN', 'UFLAG_IF', 'PASS2IF']
IfMacros: ['IFX', 'IFXORNAT', 'IFX2', 'IFXA', 'IFX_PENDOR0', 'IFXX', 'IFX2X', 'IFXN', 'UFLAG_IF', 'PASS2IF', 'IF_UNALIGNED', 'IF_ALIGNED']
UseTab: Never
IndentPPDirectives: None
---
+257 -41
View File
@@ -1,6 +1,9 @@
### Auto build Box64 and release its binary with Github Action
name: Build and Release Box64
permissions:
actions: 'write'
on:
workflow_dispatch:
release:
@@ -22,14 +25,18 @@ on:
- "CMakeLists.txt"
- "**/*.yml"
defaults:
run:
# needed on container images which could default to sh
shell: bash
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [X64, RISCV, RK3588, ARM64, ANDROID, TERMUX, LARCH64, ANDROID_GLIBC]
platform: [X64, RISCV, RK3588, ARM64, ANDROID, TERMUX, LARCH64, PPC64LE, ANDROID_GLIBC, WOW64, ARM64-GCC-8]
type: [Release, Trace, StaticBuild, Box32]
os: [ubuntu-latest]
exclude:
- platform: ANDROID
type: StaticBuild
@@ -41,20 +48,155 @@ jobs:
type: Box32
- platform: TERMUX
type: Box32
- platform: WOW64
type: Trace
- platform: WOW64
type: StaticBuild
- platform: WOW64
type: Box32
- platform: ARM64-GCC-8
type: Trace
- platform: ARM64-GCC-8
type: StaticBuild
- platform: ANDROID
type: Trace
- platform: TERMUX
type: Trace
- platform: LARCH64
type: Trace
- platform: PPC64LE
type: Trace
include:
- platform: X64
os: ubuntu-latest
- platform: RISCV
os: ubuntu-latest
- platform: RK3588
os: ubuntu-22.04-arm
- platform: ARM64
os: ubuntu-22.04-arm
- platform: ANDROID
os: ubuntu-latest
- platform: TERMUX
os: ubuntu-latest
- platform: LARCH64
os: ubuntu-latest
- platform: PPC64LE
os: ubuntu-latest
- platform: ANDROID_GLIBC
os: ubuntu-22.04-arm
- platform: WOW64
os: ubuntu-22.04-arm
- platform: ARM64-GCC-8
os: ubuntu-22.04-arm
image: arm64v8/ubuntu:18.04
runs-on: ${{ matrix.os }}
container:
image: ${{ matrix.image || '' }}
steps:
- name: "Checkout Box64 Repository"
if: ${{ matrix.platform != 'ARM64-GCC-8' }}
uses: actions/checkout@v4
- name: "Environment preparation"
- name: "Checkout Box64 Repository (No NodeJS)"
if: ${{ matrix.platform == 'ARM64-GCC-8' }}
uses: taiki-e/checkout-action@v1
- name: Get all the unique changed directory names
id: changed-files-dir-names
if: ${{ matrix.platform != 'ARM64-GCC-8' }}
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46
with:
dir_names: "true"
- name: Early exit other jobs if this is a ARM64-only change
id: early-exit-arm64
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/arm64'
continue-on-error: true
run: |
sudo apt-get update
if [[ ${{ matrix.platform }} != 'X64' && ${{ matrix.platform }} != 'RISCV' && ${{ matrix.platform }} != 'LARCH64' ]]; then
sudo apt-get -y install git cmake make python3 patchelf
if [[ ${{ matrix.platform }} != 'RISCV' && ${{ matrix.platform }} != 'LARCH64' && ${{ matrix.platform }} != 'PPC64LE' && ${{ matrix.platform }} != 'X64' ]]; then
exit 1
fi
- name: Early exit other jobs if this is a LA64-only change
id: early-exit-la64
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/la64'
continue-on-error: true
run: |
if [[ ${{ matrix.platform }} == 'LARCH64' ]]; then
exit 1
fi
- name: Early exit other jobs if this is a RV64-only change
id: early-exit-rv64
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/rv64'
continue-on-error: true
run: |
if [[ ${{ matrix.platform }} == 'RISCV' ]]; then
exit 1
fi
- name: Early exit other jobs if this is a PPC64LE-only change
id: early-exit-ppc64le
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/ppc64le'
continue-on-error: true
run: |
if [[ ${{ matrix.platform }} == 'PPC64LE' ]]; then
exit 1
fi
- name: Do not early exit otherwise
id: early-exit-never
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DIRS: ${{ steps.changed-files-dir-names.outputs.all_modified_files }}
if: env.DIRS != 'src/dynarec/arm64' && env.DIRS != 'src/dynarec/la64' && env.DIRS != 'src/dynarec/rv64' && env.DIRS != 'src/dynarec/ppc64le'
continue-on-error: true
run: exit 1
- name: Merge early exit conditions
id: early-exit
if: steps.early-exit-arm64.outcome == 'failure' || steps.early-exit-la64.outcome == 'failure' || steps.early-exit-rv64.outcome == 'failure' || steps.early-exit-ppc64le.outcome == 'failure' || steps.early-exit-never.outcome == 'failure'
continue-on-error: true
run: exit 1
# Use `steps.early-exit.outcome == 'failure'` to check whether the current step should be processed.
- name: "Environment preparation"
if: steps.early-exit.outcome == 'failure'
run: |
if [[ ${{ matrix.platform }} == 'ARM64-GCC-8' ]]; then
apt-get update
apt install -y sudo
else
sudo apt-get update
zydis_package=libzydis-dev
fi
if [[ ${{ matrix.platform }} != 'X64' && ${{ matrix.platform }} != 'RISCV' && ${{ matrix.platform }} != 'LARCH64' && ${{ matrix.platform }} != 'PPC64LE' ]]; then
sudo apt-get -y install git cmake make python3 patchelf $zydis_package
if [[ ${{ matrix.platform }} == 'ANDROID' || ${{ matrix.platform }} == 'TERMUX' ]]; then
wget https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
unzip android-ndk-r26b-linux.zip
sudo apt-get -y install p7zip
wget -q https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
unzip -qq android-ndk-r26b-linux.zip
echo "BOX64_COMPILER=$PWD/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android31-clang" >> $GITHUB_ENV
echo "BOX64_PLATFORM_MARCRO=-DANDROID=1 -DARM_DYNAREC=1 -DBAD_SIGNAL=1" >> $GITHUB_ENV
git clone https://github.com/termux/termux-docker.git
@@ -63,17 +205,36 @@ jobs:
sudo chmod 755 -R /system
elif [[ ${{ matrix.platform }} == 'ANDROID_GLIBC' ]]; then
sudo apt-get -y install git gcc-aarch64-linux-gnu
echo "BOX64_PLATFORM_MARCRO=-DARM64=1 -DARM_DYNAREC=1 -DBAD_SIGNAL=1" >> $GITHUB_ENV
echo "BOX64_PLATFORM_MARCRO=-DARM64=1 -DWINLATOR_GLIBC=1 -DARM_DYNAREC=1 -DBAD_SIGNAL=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
elif [[ ${{ matrix.platform }} == 'WOW64' ]]; then
sudo apt-get -y install git gcc-aarch64-linux-gnu
echo "BOX64_PLATFORM_MARCRO=-DWOW64=1 -DARM_DYNAREC=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
export LLVM_MINGW_VERSION=20250430
wget -q https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VERSION}/llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64.tar.xz
tar -xf llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64.tar.xz
echo "MINGW_COMPILER_PATH=$PWD/llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64/bin" >> $GITHUB_ENV
elif [[ ${{ matrix.platform }} == 'ARM64-GCC-8' ]]; then
# some of these dependencies may be unnecessary to explicitly install depending on the image
sudo apt-get -y install git software-properties-common lsb-release \
wget curl build-essential autoconf automake \
pkg-config ca-certificates \
python3 make gettext zstd \
gcc-8 g++-8
sudo add-apt-repository ppa:theofficialgman/cmake-bionic -y
sudo apt update
sudo apt install -y cmake
echo "BOX64_PLATFORM_MARCRO=-DARM64=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc-8" >> $GITHUB_ENV
else
sudo apt-get -y install git gcc-aarch64-linux-gnu
echo "BOX64_PLATFORM_MARCRO=-D${{ matrix.platform }}=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
fi
if [[ ${{ matrix.platform }} == 'TERMUX' ]]; then
sudo apt-get -y install p7zip
wget https://mirrors.utermux.dev/termux/termux-main/pool/main/liba/libandroid-sysv-semaphore/libandroid-sysv-semaphore_0.1_aarch64.deb
7z x libandroid-sysv-semaphore_0.1_aarch64.deb
wget https://packages.termux.dev/apt/termux-main/pool/main/liba/libandroid-sysv-semaphore/libandroid-sysv-semaphore_0.1-1_aarch64.deb
7z x libandroid-sysv-semaphore_0.1-1_aarch64.deb
tar -xf data.tar.xz
sudo cp -rf data /
sudo chmod 755 -R /data
@@ -88,14 +249,14 @@ jobs:
if [[ ${{ matrix.platform }} == 'X64' ]]; then
echo "BOX64_PLATFORM_MARCRO=-DLD80BITS=1 -DNOALIGN=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=gcc" >> $GITHUB_ENV
sudo apt-get -y install git cmake make python3
sudo apt-get -y install git cmake make python3 libzydis-dev
elif [[ ${{ matrix.platform }} == 'RISCV' ]]; then
echo BOX64_PLATFORM_MARCRO="-DRV64=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=riscv64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-riscv64-linux-gnu cmake make python3 ninja-build
echo "BOX64_COMPILER=riscv64-linux-gnu-gcc-14" >> $GITHUB_ENV
sudo apt-get -y install git gcc-14-riscv64-linux-gnu cmake make python3 ninja-build libglib2.0-dev libzydis-dev
elif [[ ${{ matrix.platform }} == 'LARCH64' ]]; then
sudo mkdir /usr/local/larch
wget -O- -q https://github.com/loongson/build-tools/releases/download/2023.08.08/CLFS-loongarch64-8.1-x86_64-cross-tools-gcc-glibc.tar.xz | sudo tar -C /usr/local/larch --strip-components=1 --xz -xf -
wget -O- -q https://github.com/loongson/build-tools/releases/download/2025.02.21/x86_64-cross-tools-loongarch64-binutils_2.44-gcc_14.2.0-glibc_2.41.tar.xz | sudo tar -C /usr/local/larch --strip-components=1 --xz -xf -
sudo ln -sf /usr/local/larch/target /usr/loongarch64-linux-gnu
sudo cp -r /usr/local/larch/loongarch64-unknown-linux-gnu/lib/* /usr/loongarch64-linux-gnu/lib64/
for i in objdump objcopy strip; do
@@ -107,11 +268,15 @@ jobs:
echo BOX64_PLATFORM_MARCRO="-DLARCH64=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=loongarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git cmake make python3
sudo apt-get -y install git cmake make python3 libzydis-dev
elif [[ ${{ matrix.platform }} == 'PPC64LE' ]]; then
echo BOX64_PLATFORM_MARCRO="-DPPC64LE=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=powerpc64le-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-powerpc64le-linux-gnu cmake make python3 libzydis-dev
else
echo BOX64_PLATFORM_MARCRO="-DARM_DYNAREC=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3 libzydis-dev
fi
fi
if [[ ${{ matrix.type }} == 'Release' ]]; then
@@ -135,15 +300,20 @@ jobs:
echo BOX64_STATICBUILD=0 >> $GITHUB_ENV
echo BOX64_BOX32=0 >> $GITHUB_ENV
fi
if [[ ${{ matrix.os }} == 'ubuntu-22.04-arm' ]]; then
echo "BOX64_ZYDIS3=1" >> $GITHUB_ENV
else
echo "BOX64_ZYDIS3=0" >> $GITHUB_ENV
fi
- name: "Get XuanTie QEMU Cache Key"
if: matrix.platform == 'RISCV'
if: matrix.platform == 'RISCV' && steps.early-exit.outcome == 'failure'
id: get-xuantie-qemu-cache-key
run: |
echo "key=f2dfdd13014d51f957c7172acc2e791cb42dc400" >> $GITHUB_OUTPUT
- name: "Cache XuanTie QEMU"
if: matrix.platform == 'RISCV'
if: matrix.platform == 'RISCV' && steps.early-exit.outcome == 'failure'
id: cache-xuantie-qemu
uses: actions/cache@v3
with:
@@ -151,7 +321,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.get-xuantie-qemu-cache-key.outputs.key }}-xuantie-qemu
- name: "Checkout XuanTie QEMU"
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true'
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true' && steps.early-exit.outcome == 'failure'
uses: actions/checkout@v3
with:
repository: revyos/qemu
@@ -159,7 +329,7 @@ jobs:
ref: f2dfdd13014d51f957c7172acc2e791cb42dc400
- name: "Build XuanTie QEMU for XTheadVector"
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true'
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true' && steps.early-exit.outcome == 'failure'
run: |
cd xuantie_qemu
./configure --prefix=$GITHUB_WORKSPACE/xuantie_qemu_install --target-list=riscv64-linux-user --disable-system
@@ -167,6 +337,7 @@ jobs:
make install
- name: "Display Build info"
if: steps.early-exit.outcome == 'failure'
run: |
echo "CMake Platform Macro: ${{ env.BOX64_PLATFORM_MARCRO }}"
echo "CMake C Compiler: ${{ env.BOX64_COMPILER }}"
@@ -176,7 +347,9 @@ jobs:
echo "Box32 Enabled: ${{ env.BOX64_BOX32 }}"
- name: "Build Box64"
if: steps.early-exit.outcome == 'failure'
run: |
export PATH=$PATH:${{ env.MINGW_COMPILER_PATH }}
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=${{ env.BOX64_COMPILER }}\
@@ -184,6 +357,7 @@ jobs:
${{ env.BOX64_PLATFORM_MARCRO }}\
-DCMAKE_BUILD_TYPE=${{ env.BOX64_BUILD_TYPE }}\
-DHAVE_TRACE=${{ env.BOX64_HAVE_TRACE }}\
-DZYDIS3=${{ env.BOX64_ZYDIS3 }}\
-DSTATICBUILD=${{ env.BOX64_STATICBUILD }}\
-DBOX32=${{ env.BOX64_BOX32 }}\
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON\
@@ -191,19 +365,23 @@ jobs:
make -j$(nproc) VERBOSE=1
- name: "Test Box64"
if: steps.early-exit.outcome == 'failure'
run: |
if [[ ${{ matrix.platform }} != 'X64' ]]; then
mkdir qemu9
wget -O- -q https://archive.archlinux.org/packages/q/qemu-user-static/qemu-user-static-9.0.2-1-x86_64.pkg.tar.zst | tar -I zstd -C qemu9 -xf -
sudo cp qemu9/usr/bin/* /usr/bin/
mkdir qemu10
wget -O- -q https://archive.archlinux.org/packages/q/qemu-user-static/qemu-user-static-10.0.0-7-x86_64.pkg.tar.zst | tar -I zstd -C qemu10 -xf -
sudo cp qemu10/usr/bin/* /usr/bin/
fi
cd build
export CTEST_OPTIONS="-j$(nproc) --timeout 120 --output-on-failure --repeat until-pass:20"
export CTEST_OPTIONS="-j$(nproc) --timeout 300 --output-on-failure --repeat until-pass:20"
if [[ ${{ matrix.platform }} == 'RISCV' ]]; then
export INTERPRETER=qemu-riscv64-static
export QEMU_LD_PREFIX=/usr/riscv64-linux-gnu/
if [[ ${{ env.BOX64_BOX32 }} == '1' ]]; then
export BOX32_PERSONA32BITS=1 # hack to disable personality setting
fi
ctest $CTEST_OPTIONS
QEMU_CPU=rv64,v=false BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
QEMU_CPU=rv64,v=false,zba=true,zbb=true,zbc=true,zbs=true ctest $CTEST_OPTIONS
@@ -224,10 +402,23 @@ jobs:
export INTERPRETER=qemu-loongarch64-static
export QEMU_LD_PREFIX=/usr/loongarch64-linux-gnu/
BOX64_DYNAREC_LA64NOEXT=1 ctest $CTEST_OPTIONS -E nocosim
if [[ ${{ env.BOX64_BOX32 }} == '1' ]]; then
export BOX32_PERSONA32BITS=1 # hack to disable personality setting
fi
ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC_NOHOSTEXT=1 ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC_TEST=1 BOX64_DYNAREC_LA64NOEXT=1 ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC_TEST=1 ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC_TEST=1 BOX64_DYNAREC_NOHOSTEXT=1 ctest $CTEST_OPTIONS -E nocosim
elif [[ ${{ matrix.platform }} == 'PPC64LE' ]]; then
export INTERPRETER=qemu-ppc64le-static
export QEMU_LD_PREFIX=/usr/powerpc64le-linux-gnu/
ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS -E nocosim
BOX64_DYNAREC_TEST=1 ctest $CTEST_OPTIONS -E nocosim
elif [[ ${{ matrix.platform }} == 'ANDROID' ]]; then
export INTERPRETER=qemu-aarch64-static
export QEMU_LD_PREFIX=/system/lib64
@@ -241,23 +432,23 @@ jobs:
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
ctest $CTEST_OPTIONS
elif [[ ${{ matrix.platform }} != 'X64' ]]; then # AArch64
export INTERPRETER=qemu-aarch64-static
export QEMU_LD_PREFIX=/usr/aarch64-linux-gnu/
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
elif [[ ${{matrix.type}} == 'Box32' ]]; then
ctest $CTEST_OPTIONS
BOX64_DYNAREC_TEST=1 ctest $CTEST_OPTIONS -E nocosim
else
ctest -j$(nproc)
fi
- name: "Get short Git commit"
id: git-info
if: steps.early-exit.outcome == 'failure'
run: echo "SHORT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: "Get Box64 Version"
if: steps.early-exit.outcome == 'failure'
run: echo "BOX64_VERSION=$(cat src/box64version.h | grep BOX64_MAJOR | cut -d " " -f 3).$(cat src/box64version.h | grep BOX64_MINOR | cut -d " " -f 3).$(cat src/box64version.h | grep BOX64_REVISION | cut -d " " -f 3)" >> $GITHUB_ENV
- name: "Packaging WCP file for Winlator"
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type != 'StaticBuild'
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type != 'StaticBuild' && steps.early-exit.outcome == 'failure'
run: |
cd build
cat <<EOF > profile.json
@@ -277,15 +468,40 @@ jobs:
patchelf --set-interpreter /data/data/com.winlator/files/imagefs/usr/lib/ld-linux-aarch64.so.1 ./box64
tar --zstd -cf box64-latest.wcp box64 profile.json
- name: "Upload Artifact"
uses: actions/upload-artifact@v4
with:
name: box64-${{ matrix.platform }}-${{ matrix.type }}
path: build/box64
- name: "Package Rat File for MiceWine"
if: matrix.platform == 'ANDROID' && matrix.type != 'StaticBuild' && steps.early-exit.outcome == 'failure'
run: |
cd build
mkdir -p files/usr/bin
cp box64 files/usr/bin
echo "name=Box64 (CI Build)" > pkg-header
echo "category=Box64" >> pkg-header
echo "version=${BOX64_VERSION}-${SHORT_COMMIT}" >> pkg-header
echo "architecture=aarch64" >> pkg-header
echo "vkDriverLib=" >> pkg-header
7z -tzip -mx=5 a box64-latest.rat files pkg-header
- name: "Upload WCP file"
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type != 'StaticBuild'
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: box64-latest-${{ matrix.type }}-wcp
path: build/box64-latest.wcp
- name: "Upload Rat File"
if: matrix.platform == 'ANDROID' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: box64-MiceWine-${{ matrix.type }}
path: build/box64-latest.rat
- name: "Upload WowBox64 file"
if: matrix.platform == 'WOW64' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: wowbox64-${{ matrix.type }}
path: build/wowbox64-prefix/src/wowbox64-build/wowbox64.dll
+15
View File
@@ -0,0 +1,15 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '* * * * 0'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v10
with:
stale-issue-message: 'This issue is stale because it has been open 1 year with no activity. Remove "Stale" label or comment or this will be closed in 30 days.'
days-before-stale: 365
days-before-close: 30
exempt-issue-labels: 'long-term'
+16
View File
@@ -68,8 +68,24 @@ backup/
/wrapperhelper/sanleak
/wrapperhelper/sanundefined
/wrapperhelper/src/machine.gen
/wrapperhelper/src/machine_x86.gen
/wrapperhelper/src/machine_x86_64.gen
/wrapperhelper/*.h
!/wrapperhelper/example-libc.h
# macOS
.DS_Store
# Archives
*.7z
*.deb
*.eopkg
*.gz
*.rar
*.rpm
*.tar*
*.xbps
*.xz
*.zip
*.zst
*.zstd
-24
View File
@@ -1,24 +0,0 @@
language: c
arch:
- amd64
- arm64-graviton2
os: linux
dist: focal
compiler:
- gcc
addons:
apt:
packages:
- python3
#Build steps
before_script:
- mkdir build
- cd build
- if [ "$TRAVIS_CPU_ARCH" = "arm64" ]; then cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; else cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; fi
script:
- make
- ctest --output-on-failure
+332 -118
View File
@@ -15,11 +15,13 @@ option(ODROIDN2 "Set to ON if targeting an Odroid-N2 device" ${ODROIDN2})
option(TEGRAX1 "Set to ON if targeting an Tegra X1 based device" ${TEGRAX1})
option(TEGRA_T194 "Set to ON if targeting an Tegra Xavier based device" ${TEGRA_T194})
option(TEGRA_T234 "Set to ON if targeting an Tegra Orin based device" ${TEGRA_T234})
option(NVIDIA_GB10 "Set to ON if targeting a DGX Spark(GB10) based device" ${NVIDIA_GB10})
option(PHYTIUM "Set to ON if targeting an Phytium (D2000 or FT2000/4) based device" ${PHYTIUM})
option(SD845 "Set to ON if targeting a Snapragon 845 based device" ${SD845})
option(SD865 "Set to ON if targeting a Snapragon 865 based device" ${SD865})
option(SD888 "Set to ON if targeting a Snapragon 888 based device" ${SD888})
option(SD8G2 "Set to ON if targeting a Snapragon 8 Gen 2 based device" ${SD8G2})
option(SD845 "Set to ON if targeting a Snapdragon 845 based device" ${SD845})
option(SD865 "Set to ON if targeting a Snapdragon 865 based device" ${SD865})
option(SD888 "Set to ON if targeting a Snapdragon 888 based device" ${SD888})
option(SD8G2 "Set to ON if targeting a Snapdragon 8 Gen 2 based device" ${SD8G2})
option(SD8EG5 "Set to ON if targeting a Snapdragon 8 Elite Gen 5 (SM8850) based device" ${SD8EG5})
option(SDORYON1 "Set to ON if targeting a Snapdragon Oryon 1 (X1E80100/X1E78100) based device" ${SDORYON1})
option(ADLINK "Set to ON if targeting an ADLink AmpereAltra based device" ${ADLINK})
option(M1 "Set to ON if targeting a AppleM1 running on Asahi computer" ${M1})
@@ -30,28 +32,49 @@ option(LX2160A "Set to ON if targeting an LX2160A based device" ${LX2160A})
option(ARM64 "Set to ON if targeting a generic ARM64 based device" ${ARM64})
option(ANDROID "Set to ON if targeting an Android device" ${ANDROID})
option(TERMUX "Set to ON if targeting an Android device with Termux" ${TERMUX})
option(WINLATOR_GLIBC "Set to ON if targeting an Android device with Winlator Glibc" ${WINLATOR_GLIBC})
option(USE_CCACHE "Set to ON to use ccache if present in the system" ${USE_CCACHE})
option(HAVE_TRACE "Set to ON to have Trace ability (needs ZydisInfo library)" ${HAVE_TRACE})
option(SAVE_MEM "Set to ON to build dynarec with some slower memory saving optimisations" ${SAVE_MEM})
option(HAVE_TRACE "Set to ON to have Trace ability (needs libzydis-dev)" ${HAVE_TRACE})
option(ZYDIS3 "Set to ON if you have trace and an old libzydis v3.x" ${ZYDIS3})
option(SAVE_MEM "Set to ON to build dynarec with some slower memory saving optimizations" ${SAVE_MEM})
option(NOLOADADDR "Set to ON to avoid fixing the load address of Box64" OFF)
option(NOGIT "Set to ON if not building from a git clone repo (like when building from a zip download from github)" ${NOGIT})
option(BAD_SIGNAL "Set to ON to activate the workaround for incoherent si_info on SIGSEGV" ${BAD_SIGNAL})
option(BAD_PKILL "Set to ON to activate the workaround for incoherent pthread_kill" ${BAD_PKILL})
option(SW64 "Set ON if targeting an SW64 based device" ${SW64})
option(CI "Set to ON if running in CI" ${CI})
option(WITH_MOLD "Set to ON to use with mold" ${WITH_MOLD})
option(BOX32 "Set to ON to add Linux 32bits support (experimental, do not use)" ${BOX32})
option(BOX32_BINFMT "Also setup binfmt integration for box32" ${BOX32_BINFMT})
option(LARCH64_ABI_1 "Set to ON if building for Loongarch64 ABI 1.0 system" ${LARCH64_ABI_1})
option(GDBJIT "Set to ON to enable GDB JIT support" ${GDBJIT})
option(WOW64 "Set to ON if you want a WOW64 PE build in addition")
if(TERMUX)
set(TERMUX_PATH "/data/data/com.termux/files")
set(ANDROID ON CACHE BOOL "")
endif()
# Hack: limit the optimization level to -O1 for some platforms
if(TERMUX OR ANDROID)
set(CMAKE_C_FLAGS_RELEASE "-O1")
set(CMAKE_CXX_FLAGS_RELEASE "-O1")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O1 -g")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -g")
endif()
if(LARCH64)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC OFF CACHE BOOL "")
set(RV64_DYNAREC OFF CACHE BOOL "")
set(LARCH64_DYNAREC ON CACHE BOOL "")
set(PPC64LE_DYNAREC OFF CACHE BOOL "")
set(BAD_PKILL ON CACHE BOOL "")
if(LARCH64_ABI_1)
message(STATUS "Build for Loongarch64 ABI 1.0 system")
add_definitions(-DLA64_ABI_1)
endif()
endif()
if(RV64)
set(LD80BITS OFF CACHE BOOL "")
@@ -59,6 +82,7 @@ if(RV64)
set(ARM_DYNAREC OFF CACHE BOOL "")
set(RV64_DYNAREC ON CACHE BOOL "")
set(LARCH64_DYNAREC OFF CACHE BOOL "")
set(PPC64LE_DYNAREC OFF CACHE BOOL "")
endif()
if(PPC64LE)
set(LD80BITS OFF CACHE BOOL "")
@@ -66,13 +90,15 @@ if(PPC64LE)
set(ARM_DYNAREC OFF CACHE BOOL "")
set(RV64_DYNAREC OFF CACHE BOOL "")
set(LARCH64_DYNAREC OFF CACHE BOOL "")
set(PPC64LE_DYNAREC OFF CACHE BOOL "")
endif()
if(RK3399 OR RK3588 OR ODROIDN2 OR RPI3ARM64 OR RPI4ARM64 OR RPI5ARM64 OR RK3326 OR TEGRAX1 OR TEGRA_T194 OR TEGRA_T234 OR PHYTIUM OR SD845 OR SD865 OR SD888 OR SD8G2 OR SDORYON1 OR LX2160A OR M1 OR ARM64 OR ADLINK)
if(RK3399 OR RK3588 OR ODROIDN2 OR RPI3ARM64 OR RPI4ARM64 OR RPI5ARM64 OR RK3326 OR TEGRAX1 OR TEGRA_T194 OR TEGRA_T234 OR NVIDIA_GB10 OR PHYTIUM OR SD845 OR SD865 OR SD888 OR SD8G2 OR SDORYON1 OR SD8EG5 OR LX2160A OR M1 OR ARM64 OR ADLINK)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC ON CACHE BOOL "")
set(RV64_DYNAREC OFF CACHE BOOL "")
set(LARCH64_DYNAREC OFF CACHE BOOL "")
set(PPC64LE_DYNAREC OFF CACHE BOOL "")
endif()
if(RK3399 OR ODROIDN2 OR RPI3ARM64 OR RPI4ARM64 OR RPI5ARM64)
set(SAVE_MEM ON CACHE BOOL "")
@@ -86,15 +112,21 @@ if(SW64)
endif()
if(ANDROID)
set(TERMUX_PATH "/data/data/com.termux/files")
set(NOLOADADDR ON CACHE BOOL "")
#set(NOLOADADDR ON CACHE BOOL "") #no need to force this setting it seems now
set(BAD_SIGNAL ON CACHE BOOL "")
endif()
if(GDBJIT)
message(STATUS "Build with GDBJIT support")
add_definitions(-DGDBJIT)
endif()
option(LD80BITS "Set to ON if host device have 80bits long double (i.e. i386)" ${LD80BITS})
option(NOALIGN "Set to ON if host device doesn't need re-align (i.e. i386)" ${NOALIGN})
option(ARM_DYNAREC "Set to ON to use ARM Dynamic Recompilation" ${ARM_DYNAREC})
option(RV64_DYNAREC "Set to ON to use RISC-V Dynamic Recompilation" ${RV64_DYNAREC})
option(LARCH64_DYNAREC "Set to ON to use LOONGARCH64 Dynamic Recompilation" ${LARCH64_DYNAREC})
option(PPC64LE_DYNAREC "Set to ON to use PPC64LE Dynamic Recompilation" ${PPC64LE_DYNAREC})
option(STATICBUILD "Set to ON to have a static build (Warning, not working)" ${STATICBUILD})
option(NO_LIB_INSTALL "Set ON to not install a few x86_64 libs that are used by many program" ${NO_LIB_INSTALL})
option(NO_CONF_INSTALL "Set ON to not install config files" ${NO_CONF_INSTALL})
@@ -129,68 +161,67 @@ endif()
if(RPI3ARM64)
add_definitions(-DRPI)
add_definitions(-DRPI3ARM64)
add_definitions(-pipe -march=armv8-a+crc -mtune=cortex-a53)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc -mtune=cortex-a53")
set(CFLAGS -pipe -march=armv8-a+crc -mtune=cortex-a53)
elseif(RPI4ARM64)
add_definitions(-DRPI)
add_definitions(-DRPI4ARM64)
add_definitions(-pipe -march=armv8-a+crc -mtune=cortex-a72)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc -mtune=cortex-a72")
set(CFLAGS -pipe -march=armv8-a+crc -mtune=cortex-a72)
elseif(RPI5ARM64)
add_definitions(-DRPI)
add_definitions(-DRPI5ARM64)
add_definitions(-pipe -march=armv8.2-a+crc+crypto+fp16+rcpc+dotprod -mtune=cortex-a76)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+crc+crypto+fp16+rcpc+dotprod -mtune=cortex-a76")
set(CFLAGS -pipe -march=armv8.2-a+crc+crypto+fp16+rcpc+dotprod -mtune=cortex-a76)
elseif(RK3326)
add_definitions(-DRK3326)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a35+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a35+crypto")
set(CFLAGS -pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a35+crypto)
elseif(RK3399)
add_definitions(-DRK3399)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72.cortex-a53+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72.cortex-a53+crypto")
set(CFLAGS -pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72.cortex-a53+crypto)
elseif(RK3588)
add_definitions(-DRK3588)
add_definitions(-pipe -mcpu=cortex-a76.cortex-a55+crypto)
add_definitions(-DBAD_SIGNAL)
set(CMAKE_ASM_FLAGS "-pipe -mcpu=cortex-a76.cortex-a55+crypto")
set(CFLAGS -pipe -mcpu=cortex-a76.cortex-a55+crypto)
elseif(ODROIDN2)
add_definitions(-DODROIDN2)
add_definitions(-march=armv8-a+crc+simd+crypto -mcpu=cortex-a73.cortex-a53+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a73.cortex-a53+crypto")
set(CFLAGS -march=armv8-a+crc+simd+crypto -mcpu=cortex-a73.cortex-a53+crypto)
elseif(TEGRAX1)
add_definitions(-DTEGRAX1)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a57+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a57+crypto")
set(CFLAGS -pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a57+crypto)
elseif(TEGRA_T194)
add_definitions(-DTEGRA_T194)
add_definitions(-pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a76+crypto -mtune=cortex-a76)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a76+crypto -mtune=cortex-a76")
set(CFLAGS -pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a76+crypto -mtune=cortex-a76)
elseif(TEGRA_T234)
add_definitions(-DTEGRA_T234)
add_definitions(-pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a78ae+crypto -mtune=cortex-a78ae)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a78ae+crypto -mtune=cortex-a78ae")
set(CFLAGS -pipe -march=armv8.2-a+fp16+simd+crypto+predres -mcpu=cortex-a78ae+crypto -mtune=cortex-a78ae)
elseif(NVIDIA_GB10)
add_definitions(-DNVIDIA_GB10)
set(CFLAGS -pipe -mcpu=gb10 -mtune=gb10)
elseif(PHYTIUM)
add_definitions(-DPHYTIUM)
add_definitions(-pipe -march=armv8.1-a+crc+simd+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.1-a+crc+simd+crypto+aes")
set(CFLAGS -pipe -march=armv8.1-a+crc+simd+crypto)
elseif(SD845)
add_definitions(-DSD845)
add_definitions(-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55")
set(CFLAGS -pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55)
elseif(SD865)
add_definitions(-DSD865)
#note that cortex-a77.cortex-a55 is not supported, so fall back to a76 instead
add_definitions(-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a76.cortex-a55)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a76.cortex-a55")
set(CFLAGS -pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a76.cortex-a55)
elseif(SD888)
add_definitions(-DSD888)
add_definitions(-pipe -march=armv8.4-a+simd+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.4-a+simd+crypto")
set(CFLAGS -pipe -march=armv8.4-a+simd+crypto)
elseif(SD8G2)
add_definitions(-DSD8G2)
add_definitions(-pipe -march=armv9-a+i8mm+sm4+sha3+rcpc+crypto+nosve+nosve2)
set(CMAKE_ASM_FLAGS "-pipe -march=armv9-a+i8mm+sm4+sha3+rcpc+crypto+nosve+nosve2")
set(CFLAGS -pipe -march=armv9-a+i8mm+sm4+sha3+rcpc+crypto+nosve+nosve2)
elseif(SD8EG5)
add_definitions(-DSD8EG5)
# NOTE
# Even though Qualcomm Snapdragon 8 Elite Gen 5 relies on 3rd generation Oryon cores, it seems like the support for them
# is not yet present in GCC and Clang, so for now we will use mostly the same optimization flags as SDORYON1, which houses
# 1st generation Oryon cores. This should still be fine since the main difference between the
# two is the presence of SVE and SVE2, which are not yet used in Box64's ARM64 dynarec.
#
# As noted in the SDORYON1 section, GCC 14 and Clang 19 support oryon-1 as a -mcpu/-mtune argument, however it seems like
# Fedora does not like them very much, so this option should be taken with a grain of salt. It worked in my test case just fine.
set(CFLAGS -pipe -march=armv8.7-a+crypto+sm4+sha3+fp16+sve+sve2 -mtune=oryon-1)
elseif(SDORYON1)
add_definitions(-DSDORYON1)
# NOTE
@@ -207,37 +238,41 @@ elseif(SDORYON1)
# * the 3rd positional argument is represented as the "scheduler"
# * the 6th positional argument is represented as the "cost"
# I've chosen the a57 because I don't know if I should choose the a72
add_definitions(-pipe -march=armv8.6-a+crypto+sm4+sha3+fp16 -mtune=cortex-a57)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.6-a+crypto+sm4+sha3+fp16 -mtune=cortex-a57")
set(CFLAGS -pipe -march=armv8.6-a+crypto+sm4+sha3+fp16 -mtune=cortex-a57)
elseif(ADLINK)
add_definitions(-DADLINK)
add_definitions(-pipe -mcpu=neoverse-n1 -fuse-ld=gold -fuse-linker-plugin)
set(CMAKE_ASM_FLAGS "-pipe -mcpu=neoverse-n1")
set(CFLAGS -pipe -mcpu=neoverse-n1 -fuse-ld=gold -fuse-linker-plugin)
elseif(M1)
add_definitions(-DM1)
add_definitions(-pipe -march=armv8.5-a+simd+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.5-a+simd+crypto")
set(CFLAGS -pipe -march=armv8.5-a+simd+crypto)
elseif(LARCH64)
add_definitions(-DLA64)
add_definitions(-pipe -march=loongarch64)
set(CMAKE_ASM_FLAGS "-pipe -march=loongarch64")
add_definitions(-DBAD_PKILL)
set(CFLAGS -pipe -march=loongarch64)
set(ASMFLAGS -pipe -march=loongarch64)
elseif(RV64)
add_definitions(-DRV64)
add_definitions(-pipe -march=rv64gc)
set(CMAKE_ASM_FLAGS "-pipe -march=rv64gc")
set(CFLAGS -pipe -march=rv64gc)
set(ASMFLAGS -pipe -march=rv64gc)
elseif(PPC64LE)
add_definitions(-DPPC64LE)
set(CFLAGS -pipe -mcpu=power9)
set(ASMFLAGS -pipe -mcpu=power9)
elseif(LX2160A)
add_definitions(-DLX2160A)
add_definitions(-pipe -march=armv8-a+crypto+crc -mcpu=cortex-a72+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crypto+crc -mcpu=cortex-a72+crypto")
set(CFLAGS -pipe -march=armv8-a+crypto+crc -mcpu=cortex-a72+crypto)
elseif(SW64)
add_definitions(-DSW64)
elseif(ARM64)
#add_definitions(-pipe -march=native)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+simd")
elseif(ARM_DYNAREC)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto")
endif()
if(ARM_DYNAREC)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "9.0")
set(ASMFLAGS -pipe -march=armv8.2-a+crc+simd+crypto)
else()
#putting a random cpu that have 8.2 architecture so assembly can be build. the use of the feature are conditionnal anyway
set(ASMFLAGS -pipe -mcpu=cortex-a76)
endif()
endif()
if(ANDROID)
add_definitions(-DANDROID)
@@ -245,9 +280,15 @@ endif()
if(TERMUX)
add_definitions(-DTERMUX)
endif()
if(WINLATOR_GLIBC)
add_definitions(-DWINLATOR_GLIBC)
endif()
if(BAD_SIGNAL)
add_definitions(-DBAD_SIGNAL)
endif()
if(BAD_PKILL)
add_definitions(-DBAD_PKILL)
endif()
if(SAVE_MEM)
add_definitions(-DSAVE_MEM)
endif()
@@ -256,8 +297,11 @@ if(STATICBUILD)
add_definitions(-DSTATICBUILD)
add_definitions(-Wno-deprecated-declarations) #by-design, deprecated function can be used
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static")
set(CMAKE_EXE_LINKER_FLAGS -static)
set(HAVE_TRACE OFF)
if(PPC64LE)
add_definitions(-fno-stack-protector)
endif()
endif()
if(BOX32)
add_definitions(-DBOX32)
@@ -292,6 +336,10 @@ if(HAVE_TRACE)
add_definitions(-DHAVE_TRACE)
endif()
if(ZYDIS3)
add_definitions(-DZYDIS3)
endif()
if(ARM_DYNAREC)
add_definitions(-DDYNAREC)
add_definitions(-DARM64)
@@ -345,8 +393,23 @@ set_source_files_properties(
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)
set(OS_LINUX_SRC
"${BOX64_ROOT}/src/os/backtrace.c"
"${BOX64_ROOT}/src/os/emit_signals_linux.c"
"${BOX64_ROOT}/src/os/hostext_common.c"
"${BOX64_ROOT}/src/os/hostext_linux.c"
"${BOX64_ROOT}/src/os/freq_linux.c"
"${BOX64_ROOT}/src/os/os_linux.c"
"${BOX64_ROOT}/src/os/perfmap.c"
"${BOX64_ROOT}/src/os/symbolfuncs_linux.c"
"${BOX64_ROOT}/src/os/random_linux.c"
"${BOX64_ROOT}/src/os/my_cpuid.c"
"${BOX64_ROOT}/src/os/sysinfo.c"
)
set(ELFLOADER_SRC
"${BOX64_ROOT}/src/main.c"
"${BOX64_ROOT}/src/test.c"
"${BOX64_ROOT}/src/core.c"
"${BOX64_ROOT}/src/box64context.c"
"${BOX64_ROOT}/src/build_info.c"
@@ -354,12 +417,15 @@ set(ELFLOADER_SRC
"${BOX64_ROOT}/src/custommmap.c"
"${BOX64_ROOT}/src/dynarec/dynarec.c"
"${BOX64_ROOT}/src/elfs/elfloader.c"
"${BOX64_ROOT}/src/elfs/elfhacks.c"
"${BOX64_ROOT}/src/elfs/elfparser.c"
"${BOX64_ROOT}/src/elfs/elfhash.c"
"${BOX64_ROOT}/src/elfs/elfload_dump.c"
"${BOX64_ROOT}/src/elfs/elfdwarf_private.c"
"${BOX64_ROOT}/src/emu/entrypoint.c"
"${BOX64_ROOT}/src/emu/x64compstrings.c"
"${BOX64_ROOT}/src/emu/x64emu.c"
"${BOX64_ROOT}/src/emu/x64printer.c"
"${BOX64_ROOT}/src/emu/x64int3.c"
"${BOX64_ROOT}/src/emu/x87emu_private.c"
"${BOX64_ROOT}/src/emu/x64primop.c"
@@ -375,18 +441,22 @@ set(ELFLOADER_SRC
"${BOX64_ROOT}/src/libtools/auxval.c"
"${BOX64_ROOT}/src/libtools/myalign.c"
"${BOX64_ROOT}/src/libtools/signals.c"
"${BOX64_ROOT}/src/libtools/sigtools.c"
"${BOX64_ROOT}/src/libtools/decopcode.c"
"${BOX64_ROOT}/src/libtools/threads.c"
"${BOX64_ROOT}/src/tools/bitutils.c"
"${BOX64_ROOT}/src/tools/box64stack.c"
"${BOX64_ROOT}/src/tools/bridge.c"
"${BOX64_ROOT}/src/tools/alternate.c"
"${BOX64_ROOT}/src/tools/callback.c"
"${BOX64_ROOT}/src/tools/my_cpuid.c"
"${BOX64_ROOT}/src/tools/cleanup.c"
"${BOX64_ROOT}/src/tools/gdbjit.c"
"${BOX64_ROOT}/src/tools/fileutils.c"
"${BOX64_ROOT}/src/tools/pathcoll.c"
"${BOX64_ROOT}/src/tools/rbtree.c"
"${BOX64_ROOT}/src/tools/rcfile.c"
"${BOX64_ROOT}/src/tools/env.c"
"${BOX64_ROOT}/src/tools/wine_tools.c"
"${BOX64_ROOT}/src/tools/pe_tools.c"
"${BOX64_ROOT}/src/wrapped/generated/wrapper.c"
)
if(NOT STATICBUILD)
@@ -409,8 +479,10 @@ if(BOX32)
"${BOX64_ROOT}/src/tools/box32stack.c"
"${BOX64_ROOT}/src/emu/x86int3.c"
"${BOX64_ROOT}/src/librarian/globalsymbols32.c"
"${BOX64_ROOT}/src/libtools/box32_inputevent.c"
"${BOX64_ROOT}/src/libtools/myalign32.c"
"${BOX64_ROOT}/src/libtools/myalign64_32.c"
"${BOX64_ROOT}/src/libtools/myalignxcb32.c"
"${BOX64_ROOT}/src/libtools/signal32.c"
"${BOX64_ROOT}/src/libtools/threads32.c"
"${BOX64_ROOT}/src/libtools/libc_net32.c"
@@ -433,25 +505,23 @@ if(NOT ANDROID)
)
endif()
if(NOT STATICBUILD AND NOT ANDROID)
list(APPEND ELFLOADER_SRC
"${BOX64_ROOT}/src/libtools/libdl.c"
"${BOX64_ROOT}/src/libtools/vulkanoverlay.c"
)
endif()
set(INTERPRETER
"${BOX64_ROOT}/src/emu/x64run.c"
"${BOX64_ROOT}/src/emu/x64run0f.c"
"${BOX64_ROOT}/src/emu/x64run64.c"
"${BOX64_ROOT}/src/emu/x64run66.c"
"${BOX64_ROOT}/src/emu/x64run660f.c"
"${BOX64_ROOT}/src/emu/x64run66f20f.c"
"${BOX64_ROOT}/src/emu/x64run66f30f.c"
"${BOX64_ROOT}/src/emu/x64run6664.c"
"${BOX64_ROOT}/src/emu/x64run66d9.c"
"${BOX64_ROOT}/src/emu/x64run66dd.c"
"${BOX64_ROOT}/src/emu/x64run66f0.c"
"${BOX64_ROOT}/src/emu/x64run67.c"
"${BOX64_ROOT}/src/emu/x64run67avx.c"
"${BOX64_ROOT}/src/emu/x64run67_32.c"
"${BOX64_ROOT}/src/emu/x64run6764_32.c"
"${BOX64_ROOT}/src/emu/x64run670f.c"
"${BOX64_ROOT}/src/emu/x64run6766.c"
"${BOX64_ROOT}/src/emu/x64run67660f.c"
"${BOX64_ROOT}/src/emu/x64rund8.c"
"${BOX64_ROOT}/src/emu/x64rund9.c"
"${BOX64_ROOT}/src/emu/x64runda.c"
@@ -499,8 +569,13 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedatomic.c"
"${BOX64_ROOT}/src/wrapped/wrappedatspi.c"
"${BOX64_ROOT}/src/wrapped/wrappedayatanaappindicator3.c"
"${BOX64_ROOT}/src/wrapped/wrappedayatanaindicator3.c"
"${BOX64_ROOT}/src/wrapped/wrappedayatanaido3.c"
"${BOX64_ROOT}/src/wrapped/wrappedavahiclient.c"
"${BOX64_ROOT}/src/wrapped/wrappedavahicommon.c"
"${BOX64_ROOT}/src/wrapped/wrappedbz2.c"
"${BOX64_ROOT}/src/wrapped/wrappedcap.c"
"${BOX64_ROOT}/src/wrapped/wrappedcuda.c"
"${BOX64_ROOT}/src/wrapped/wrappedcairo.c"
"${BOX64_ROOT}/src/wrapped/wrappedcairogobject.c"
"${BOX64_ROOT}/src/wrapped/wrappedcrashhandler.c"
@@ -554,15 +629,21 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedgthread2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgtk3.c"
"${BOX64_ROOT}/src/wrapped/wrappedgtkx112.c"
"${BOX64_ROOT}/src/wrapped/wrappedharfbuzzsubset.c"
"${BOX64_ROOT}/src/wrapped/wrappedkrb5.c"
"${BOX64_ROOT}/src/wrapped/wrappedlcms2.c"
"${BOX64_ROOT}/src/wrapped/wrappedldlinux.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibasound.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibavcodec58.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibavformat58.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibavutil56.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibblas.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibbsd.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibc.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcmusl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcrypt.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcups.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcupsimage.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdrm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdrmamdgpu.c"
@@ -574,9 +655,12 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedlibgl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibglu.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibglx.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibglxnvidia.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibgpgme.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibharfbuzz.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibibus.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibice.c"
"${BOX64_ROOT}/src/wrapped/wrappedliblapack.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncurses.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncurses6.c"
@@ -584,9 +668,11 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedlibncursesw6.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibnuma.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibogg.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibomp.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpanel.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpci.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpcre.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpcre216.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpthread.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibresolv.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibrt.c"
@@ -603,6 +689,7 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedlibvawayland.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvax11.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvdpau.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvpx.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvorbis.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibx11.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibx11xcb.c"
@@ -620,6 +707,7 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrandr.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrender.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrenderutil.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbres.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbshape.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbshm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbsync.c"
@@ -654,12 +742,14 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappednspr4.c"
"${BOX64_ROOT}/src/wrapped/wrappednss3.c"
"${BOX64_ROOT}/src/wrapped/wrappednssutil3.c"
"${BOX64_ROOT}/src/wrapped/wrappednvml.c"
"${BOX64_ROOT}/src/wrapped/wrappedopenal.c"
"${BOX64_ROOT}/src/wrapped/wrappedopencl.c"
"${BOX64_ROOT}/src/wrapped/wrappedpango.c"
"${BOX64_ROOT}/src/wrapped/wrappedpangocairo.c"
"${BOX64_ROOT}/src/wrapped/wrappedpangoft2.c"
"${BOX64_ROOT}/src/wrapped/wrappedpam.c"
"${BOX64_ROOT}/src/wrapped/wrappedpcap.c"
"${BOX64_ROOT}/src/wrapped/wrappedplc4.c"
"${BOX64_ROOT}/src/wrapped/wrappedplds4.c"
"${BOX64_ROOT}/src/wrapped/wrappedpng16.c"
@@ -680,6 +770,8 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedsdl2mixer.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2net.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2ttf.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl3.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl3ttf.c"
"${BOX64_ROOT}/src/wrapped/wrappedselinux.c"
"${BOX64_ROOT}/src/wrapped/wrappedsmime3.c"
"${BOX64_ROOT}/src/wrapped/wrappedsmpeg2.c"
@@ -721,6 +813,8 @@ set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedicui18n74.c"
"${BOX64_ROOT}/src/wrapped/wrappedicuuc75.c"
"${BOX64_ROOT}/src/wrapped/wrappedicui18n75.c"
"${BOX64_ROOT}/src/wrapped/wrappedicuuc76.c"
"${BOX64_ROOT}/src/wrapped/wrappedicui18n76.c"
"${BOX64_ROOT}/src/wrapped/wrappedidn2.c"
"${BOX64_ROOT}/src/wrapped/wrappedanl.c"
"${BOX64_ROOT}/src/wrapped/wrappedpsl5.c"
@@ -767,7 +861,7 @@ if(NOT CI)
OUTPUT "${BOX64_ROOT}/src/wrapped/generated/functions_list.txt"
COMMAND "${PYTHON_EXECUTABLE}" "${BOX64_ROOT}/rebuild_wrappers.py"
"${BOX64_ROOT}"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "ANDROID" "TERMUX" "STATICBUILD" "--"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "ANDROID" "TERMUX" "STATICBUILD" "LA64" "PPC64LE" "--"
${WRAPPEDS_HEAD}
MAIN_DEPENDENCY "${BOX64_ROOT}/rebuild_wrappers.py"
DEPENDS ${WRAPPEDS} ${WRAPPEDS_HEAD}
@@ -808,6 +902,7 @@ if(BOX32)
"${BOX64_ROOT}/src/wrapped32/wrappedcrashhandler.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibgl.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibglu.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibglxnvidia.c"
"${BOX64_ROOT}/src/wrapped32/wrappedsdl1.c"
"${BOX64_ROOT}/src/wrapped32/wrappedsdl2.c"
"${BOX64_ROOT}/src/wrapped32/wrappedsdl2image.c"
@@ -816,6 +911,7 @@ if(BOX32)
"${BOX64_ROOT}/src/wrapped32/wrappedfreetype.c"
"${BOX64_ROOT}/src/wrapped32/wrappedfontconfig.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibx11.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxdamage.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxext.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxfixes.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxrender.c"
@@ -827,10 +923,30 @@ if(BOX32)
"${BOX64_ROOT}/src/wrapped32/wrappedlibxxf86vm.c"
"${BOX64_ROOT}/src/wrapped32/wrappedxinerama.c"
"${BOX64_ROOT}/src/wrapped32/wrappedexpat.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibx11xcb.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxcb.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibxcbres.c"
"${BOX64_ROOT}/src/wrapped32/wrappedudev0.c"
"${BOX64_ROOT}/src/wrapped32/wrappedudev1.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibuuid.c"
"${BOX64_ROOT}/src/wrapped32/wrappedgnutls.c"
"${BOX64_ROOT}/src/wrapped32/wrappedtcmallocminimal.c"
"${BOX64_ROOT}/src/wrapped32/wrappedcairo.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibdrm.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibvdpau.c"
"${BOX64_ROOT}/src/wrapped32/wrappednsl.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibcups.c"
"${BOX64_ROOT}/src/wrapped32/wrappedgbm.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibegl.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibglx.c"
"${BOX64_ROOT}/src/wrapped32/wrappedselinux.c"
"${BOX64_ROOT}/src/wrapped32/wrappedblkid.c"
"${BOX64_ROOT}/src/wrapped32/wrappedmount.c"
"${BOX64_ROOT}/src/wrapped32/wrappeddbus.c"
"${BOX64_ROOT}/src/wrapped32/wrappedcurl.c"
"${BOX64_ROOT}/src/wrapped32/wrappednvml.c"
"${BOX64_ROOT}/src/wrapped32/wrappedpulsesimple.c"
"${BOX64_ROOT}/src/wrapped32/wrappedlibogg.c"
)
endif()
string(REPLACE ".c" "_private.h" MODROOT ${BOX64_ROOT})
@@ -841,7 +957,7 @@ if(BOX32)
set(WRAPPEDS32_HEAD ${WRAPPEDS32_HEAD} ${B})
set_source_files_properties(${A} PROPERTIES OBJECT_DEPENDS ${B})
endforeach()
set(WRAPPER32 "${BOX64_ROOT}/src/wrapped32/generated/wrapper32.c" "${BOX64_ROOT}/src/wrapped32/generated/wrapper32.h")
if(NOT CI)
@@ -849,7 +965,7 @@ if(BOX32)
OUTPUT "${BOX64_ROOT}/src/wrapped32/generated/functions_list.txt"
COMMAND "${PYTHON_EXECUTABLE}" "${BOX64_ROOT}/rebuild_wrappers_32.py"
"${BOX64_ROOT}"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "ANDROID" "TERMUX" "STATICBUILD" "--"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "ANDROID" "TERMUX" "WINLATOR_GLIBC" "STATICBUILD" "--"
${WRAPPEDS32_HEAD}
MAIN_DEPENDENCY "${BOX64_ROOT}/rebuild_wrappers_32.py"
DEPENDS ${WRAPPEDS32} ${WRAPPEDS32_HEAD}
@@ -868,6 +984,7 @@ if(DYNAREC)
"${BOX64_ROOT}/src/dynarec/dynablock.c"
"${BOX64_ROOT}/src/dynarec/dynarec_native.c"
"${BOX64_ROOT}/src/dynarec/dynarec_native_functions.c"
"${BOX64_ROOT}/src/dynarec/dynacache_reloc.c"
"${BOX64_ROOT}/src/emu/x64test.c"
)
endif()
@@ -877,10 +994,15 @@ if(ARM_DYNAREC)
${DYNAREC_SRC}
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_functions.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_arch.c"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_immenc.c"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_printer.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_jmpnext.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_consts.c"
"${BOX64_ROOT}/src/dynarec/arm64/updateflags_arm64.c"
)
set(DYNAREC_ASM
${DYNAREC_ASM}
"${BOX64_ROOT}/src/dynarec/arm64/arm64_prolog.S"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_epilog.S"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_next.S"
@@ -895,13 +1017,7 @@ if(ARM_DYNAREC)
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_shift.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_00.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_0f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_64.c"
#"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_65.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67_32.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67_avx.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_6764_32.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d8.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d9.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_da.c"
@@ -914,7 +1030,6 @@ if(ARM_DYNAREC)
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_660f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f20f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f30f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_6664.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f0.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f20f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f30f.c"
@@ -929,6 +1044,8 @@ if(ARM_DYNAREC)
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f2_0f38.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f2_0f3a.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f3_0f38.c"
"${BOX64_ROOT}/src/dynarec/arm64/updateflags_arm64_pass.c"
)
endif()
@@ -937,10 +1054,13 @@ if(RV64_DYNAREC)
${DYNAREC_SRC}
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_functions.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_arch.c"
"${BOX64_ROOT}/src/dynarec/rv64/rv64_printer.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_jmpnext.c"
"${BOX64_ROOT}/src/rv64detect.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_consts.c"
)
set(DYNAREC_ASM
${DYNAREC_ASM}
"${BOX64_ROOT}/src/dynarec/rv64/rv64_prolog.S"
"${BOX64_ROOT}/src/dynarec/rv64/rv64_epilog.S"
"${BOX64_ROOT}/src/dynarec/rv64/rv64_next.S"
@@ -960,12 +1080,7 @@ if(RV64_DYNAREC)
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_00_3.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_0f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_0f_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_64.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_64_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67_32.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d8.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d9.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_da.c"
@@ -980,13 +1095,17 @@ if(RV64_DYNAREC)
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_660f_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f20f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f30f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_6664.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f0.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f20f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f20f_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f30f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f30f_vector.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_0f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_66_0f3a.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_f2_0f.c"
"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c"
)
endif()
@@ -998,7 +1117,10 @@ if(LARCH64_DYNAREC)
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_functions.c"
"${BOX64_ROOT}/src/dynarec/la64/la64_printer.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_jmpnext.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_consts.c"
)
set(DYNAREC_ASM
${DYNAREC_ASM}
"${BOX64_ROOT}/src/dynarec/la64/la64_prolog.S"
"${BOX64_ROOT}/src/dynarec/la64/la64_epilog.S"
"${BOX64_ROOT}/src/dynarec/la64/la64_next.S"
@@ -1013,17 +1135,41 @@ if(LARCH64_DYNAREC)
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_emit_logic.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_00.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_0f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_64.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_66.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_6664.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_67.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_f30f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_660f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_66f0.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_66f20f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_66f30f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_f0.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_f20f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_f30f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_0f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_0f38.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_66_0f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_66_0f38.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_66_0f3a.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_f2_0f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_f2_0f38.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_f2_0f3a.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_f3_0f.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_avx_f3_0f38.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_d8.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_d9.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_da.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_db.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_dc.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_dd.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_de.c"
"${BOX64_ROOT}/src/dynarec/la64/dynarec_la64_df.c"
)
endif()
if(GDBJIT)
set(GDBJITREADER "${BOX64_ROOT}/gdbjit/reader.c")
endif()
if(DYNAREC)
set(DYNAREC_PASS
"${BOX64_ROOT}/src/wrapped/generated/wrapper.h"
@@ -1036,18 +1182,22 @@ if(DYNAREC)
)
endif()
add_library(dynarec_native OBJECT ${DYNAREC_SRC})
set_source_files_properties(${DYNAREC_PASS} PROPERTIES COMPILE_OPTIONS "${CFLAGS}")
set_source_files_properties(${DYNAREC_ASM} PROPERTIES COMPILE_OPTIONS "${ASMFLAGS}")
set_source_files_properties(${INTERPRETER} PROPERTIES COMPILE_OPTIONS "${CFLAGS}")
add_library(dynarec_native OBJECT ${DYNAREC_SRC} ${DYNAREC_ASM})
add_library(native_pass0 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass0 PROPERTIES COMPILE_FLAGS "-DSTEP=0")
set_target_properties(native_pass0 PROPERTIES COMPILE_DEFINITIONS "STEP=0")
add_library(native_pass1 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass1 PROPERTIES COMPILE_FLAGS "-DSTEP=1")
set_target_properties(native_pass1 PROPERTIES COMPILE_DEFINITIONS "STEP=1")
add_library(native_pass2 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass2 PROPERTIES COMPILE_FLAGS "-DSTEP=2")
set_target_properties(native_pass2 PROPERTIES COMPILE_DEFINITIONS "STEP=2")
add_library(native_pass3 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass3 PROPERTIES COMPILE_FLAGS "-DSTEP=3")
set_target_properties(native_pass3 PROPERTIES COMPILE_DEFINITIONS "STEP=3")
add_library(test_interpreter OBJECT ${INTERPRETER})
set_target_properties(test_interpreter PROPERTIES COMPILE_FLAGS "-DTEST_INTERPRETER")
set_target_properties(test_interpreter PROPERTIES COMPILE_DEFINITIONS "TEST_INTERPRETER")
add_dependencies(native_pass0 WRAPPERS)
add_dependencies(native_pass1 WRAPPERS)
add_dependencies(native_pass2 WRAPPERS)
@@ -1067,26 +1217,42 @@ if(DYNAREC)
$<TARGET_OBJECTS:native_pass3>
$<TARGET_OBJECTS:test_interpreter>
)
if(GDBJIT)
add_library(box64gdbjitreader SHARED ${GDBJITREADER})
endif()
endif()
set_source_files_properties(${OS_LINUX_SRC} ${ELFLOADER_SRC} ${INTERPRETER} ${WRAPPEDS} ${WRAPPEDS32} PROPERTIES COMPILE_OPTIONS "${CFLAGS}")
# creates git_head.h
if(DYNAREC)
add_custom_command(
OUTPUT "${BOX64_ROOT}/src/git_head.h"
COMMAND sh -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
DEPENDS dynarec ${ELFLOADER_SRC} ${INTERPRETER} ${WRAPPEDS} ${WRAPPEDS32}
DEPENDS ${DYNAREC_SRC} ${DYNAREC_ASM} ${DYNAREC_PASS} ${ELFLOADER_SRC} ${INTERPRETER} ${WRAPPEDS} ${WRAPPEDS32} ${WRAPPEDS_HEAD} ${WRAPPEDS32_HEAD}
VERBATIM)
else()
add_custom_command(
OUTPUT "${BOX64_ROOT}/src/git_head.h"
COMMAND sh -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
DEPENDS ${ELFLOADER_SRC} ${INTERPRETER} ${WRAPPEDS} ${WRAPPEDS32}
DEPENDS ${ELFLOADER_SRC} ${INTERPRETER} ${WRAPPEDS} ${WRAPPEDS32} ${WRAPPEDS_HEAD} ${WRAPPEDS32_HEAD}
VERBATIM)
endif()
add_custom_target(generate_git_head_target
DEPENDS "${BOX64_ROOT}/src/git_head.h"
)
add_custom_target(functions_list DEPENDS "${BOX64_ROOT}/src/wrapped/generated/functions_list.txt" "${BOX64_ROOT}/src/wrapped32/generated/functions_list.txt")
add_dependencies(generate_git_head_target functions_list)
add_library(interpreter OBJECT ${INTERPRETER})
add_executable(${BOX64} ${ELFLOADER_SRC} ${WRAPPEDS} ${WRAPPEDS32} "${BOX64_ROOT}/src/git_head.h")
add_library(mainobj OBJECT ${OS_LINUX_SRC} ${ELFLOADER_SRC} ${WRAPPEDS} ${WRAPPEDS32})
add_dependencies(mainobj generate_git_head_target)
add_executable(${BOX64})
target_link_libraries(${BOX64} mainobj)
set_target_properties(${BOX64} PROPERTIES ENABLE_EXPORTS ON)
add_dependencies(${BOX64} WRAPPERS)
if(BOX32)
@@ -1105,7 +1271,8 @@ else()
target_link_libraries(${BOX64} c m dl)
endif()
else()
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-Wl,--no-as-needed -lc -lm -ldl -lrt -lpthread -lresolv -lutil -Wl,--as-needed -pthread")
set_property(TARGET ${BOX64} APPEND_STRING PROPERTY LINK_FLAGS "-Wl,--no-as-needed -lc -lm -ldl -lrt -lpthread -lresolv -lutil -Wl,--as-needed -pthread ")
target_link_libraries(${BOX64} c m dl pthread resolv util c)
endif()
endif()
if(DYNAREC)
@@ -1116,9 +1283,9 @@ target_link_libraries(${BOX64} interpreter)
if(${CMAKE_VERSION} VERSION_LESS "3.13")
if(NOT NOLOADADDR)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR WITH_MOLD)
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-no-pie -Wl,--image-base=${BOX64_ELF_ADDRESS}")
set_property(TARGET ${BOX64} APPEND_STRING PROPERTY LINK_FLAGS "-no-pie -Wl,--image-base=${BOX64_ELF_ADDRESS} ")
else()
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-Wl,-Ttext-segment,${BOX64_ELF_ADDRESS}")
set_property(TARGET ${BOX64} APPEND_STRING PROPERTY LINK_FLAGS "-Wl,-Ttext-segment,${BOX64_ELF_ADDRESS} ")
endif()
endif()
else()
@@ -1126,7 +1293,7 @@ else()
if(NOT NOLOADADDR)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR WITH_MOLD)
if(WITH_MOLD) # --image-base requires -no-pie in mold!
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-no-pie -lm")
set_property(TARGET ${BOX64} APPEND_STRING PROPERTY LINK_FLAGS "-no-pie -lm ")
endif()
target_link_options(${BOX64} PUBLIC LINKER:--image-base=${BOX64_ELF_ADDRESS})
else()
@@ -1139,8 +1306,12 @@ string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "i686" _x86)
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "x86_64" _x86_64)
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "aarch64" _aarch64)
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "riscv64" _riscv64)
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "ppc64le" _ppc64le)
if(NOT _ppc64le)
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "powerpc64le" _ppc64le)
endif()
if(_x86_64 OR _aarch64)
if(_x86_64 OR _aarch64 OR _ppc64le)
add_definitions(-DCONFIG_64BIT)
endif()
@@ -1156,6 +1327,9 @@ if(NOT _x86 AND NOT _x86_64)
install(PROGRAMS ${CMAKE_SOURCE_DIR}/tests/box64-bash DESTINATION ${TERMUX_PATH}/usr/bin)
endif()
endif()
if (GDBJIT)
install(TARGETS box64gdbjitreader RUNTIME DESTINATION lib)
endif()
if(NOT NO_CONF_INSTALL)
configure_file(system/box64.conf.cmake system/box64.conf)
if(NOT TERMUX)
@@ -1251,6 +1425,28 @@ if(NOT TARGET uninstall)
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
string(REPLACE ";" "," DYNAREC_ASM_STR "${DYNAREC_ASM}")
string(REPLACE ";" "," DYNAREC_PASS_STR "${DYNAREC_PASS}")
string(REPLACE ";" "," INTERPRETER_STR "${INTERPRETER}")
if(WOW64 AND ARM_DYNAREC)
include(ExternalProject)
ExternalProject_Add(
wowbox64
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/wine/wow64"
CMAKE_ARGS
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/wine/toolchain_mingw.cmake
-DDYNAREC_PASS_STR=${DYNAREC_PASS_STR}
-DDYNAREC_ASM_STR=${DYNAREC_ASM_STR}
-DINTERPRETER_STR=${INTERPRETER_STR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
INSTALL_COMMAND ""
TEST_COMMAND ""
BUILD_ALWAYS ON
)
add_dependencies(wowbox64 generate_git_head_target)
endif()
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ptitSeb")
set(CPACK_PACKAGE_CONTACT "[email protected]")
@@ -1282,8 +1478,10 @@ if(_aarch64)
else()
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
endif()
elseif(__riscv64)
elseif(_riscv64)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "riscv64")
elseif(_ppc64le)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "ppc64el")
elseif(_x86_64)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "x86_64")
else()
@@ -1407,7 +1605,7 @@ add_test(irelative_reloc ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref20.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(longjumpInSignals ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
add_test(longjumpInSignals_nocosim ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test21 -D TEST_OUTPUT=tmpfile21.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref21.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
@@ -1462,6 +1660,25 @@ add_test(avx_intrinsics ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${B
set_tests_properties(avx_intrinsics PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0;BOX64_AVX=2")
add_test(fpu_rounding ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test31 -D TEST_OUTPUT=tmpfile31.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref31.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
set_tests_properties(fpu_rounding PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTROUND=0")
add_test(x87pc ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test32 -D TEST_OUTPUT=tmpfile32.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref32.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
set_tests_properties(x87pc PROPERTIES ENVIRONMENT "BOX64_DYNAREC_X87DOUBLE=2")
add_test(Boundary ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test33 -D TEST_OUTPUT=tmpfile33.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref33.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
else()
add_test(bootSyscall ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
@@ -1549,7 +1766,7 @@ add_test(irelative_reloc ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref20.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
# add_test(longjumpInSignals ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# add_test(longjumpInSignals_nocosim ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test21_android -D TEST_OUTPUT=tmpfile21.txt
# -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref21.txt
# -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
@@ -1676,14 +1893,11 @@ if(BOX32)
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref09.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
if(NOT CI)
add_test(NAME cppThreads_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
add_test(NAME cppThreads_32bits_nocosim COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test10 -D TEST_OUTPUT=tmpfile32_10.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref10.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
set_tests_properties(cppThreads_32bits PROPERTIES ENVIRONMENT "BOX64_LD_LIBRARY_PATH=${CMAKE_SOURCE_DIR}/x86lib")
endif()
set_tests_properties(cppThreads_32bits_nocosim PROPERTIES ENVIRONMENT "BOX64_LD_LIBRARY_PATH=${CMAKE_SOURCE_DIR}/x86lib")
add_test(NAME tlsData_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test11 -D TEST_OUTPUT=tmpfile32_11.txt
@@ -1724,7 +1938,7 @@ if(BOX32)
set_tests_properties(sse_32bits PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0")
add_test(NAME longjumpInSignals_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
add_test(NAME longjumpInSignals_32bits_nocosim COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test18 -D TEST_OUTPUT=tmpfile32_18.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref18.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
@@ -1741,8 +1955,8 @@ if(BOX32)
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref20.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(NAME multiple_dlopen_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test21 -D TEST_OUTPUT=tmpfile32_21.txt
add_test(NAME multiple_dlopen_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test21 -D TEST_OUTPUT=tmpfile32_21.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref21.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
@@ -1755,13 +1969,13 @@ if(BOX32)
-P ${CMAKE_SOURCE_DIR}/runTest.cmake)
endforeach()
#add_test(NAME sse_optimized_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test17_o2 -D TEST_OUTPUT=tmpfile32_17_o2.txt
#add_test(NAME sse_optimized_32bits COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test17_o2 -D TEST_OUTPUT=tmpfile32_17_o2.txt
# -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref17_o2.txt
# -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
#set_tests_properties(sse_optimized_32bits PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0")
#set_tests_properties(sse_optimized_32bits PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0")
add_test(bswap_32bits ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests32/test23 -D TEST_OUTPUT=tmpfile32_23.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests32/ref23.txt
+28 -27
View File
@@ -2,22 +2,21 @@
# Box64: Linux Userspace x86-64 Emulator with a Twist
[Changelog](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/README_CN.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
[Website](https://box86.org/) | [Changelog](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/README_CN.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
![Build Status](https://app.travis-ci.com/ptitSeb/box64.svg?branch=main) ![Stars](https://img.shields.io/github/stars/ptitSeb/box64) ![Forks](https://img.shields.io/github/forks/ptitSeb/box64) ![Contributors](https://img.shields.io/github/contributors/ptitSeb/box64) ![Pull Requests](https://img.shields.io/github/issues-pr/ptitSeb/box64) ![Issues](https://img.shields.io/github/issues/ptitSeb/box64)
![Build Status](https://github.com/ptitSeb/box64/actions/workflows/release.yml/badge.svg) ![Stars](https://img.shields.io/github/stars/ptitSeb/box64) ![Forks](https://img.shields.io/github/forks/ptitSeb/box64) ![Contributors](https://img.shields.io/github/contributors/ptitSeb/box64) ![Pull Requests](https://img.shields.io/github/issues-pr/ptitSeb/box64) ![Issues](https://img.shields.io/github/issues/ptitSeb/box64)
---
**Check out our game compatibility list at [https://box86.org/app/](https://box86.org/app/), please help us [improve it](https://github.com/ptitSeb/box86-compatibility-list/issues)!**
---
Box64 enables running x86_64 Linux programs, including games, on non-x86_64 Linux systems such as Arm (64-bit little-endian host system required).
Check out Box64 in action on YouTube:
- [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)
- [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)
- [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
Box64 leverages native system libraries (libc, libm, SDL, OpenGL), offering ease of integration and surprising performance in many applications. For performance benchmarks, check [this analysis](https://box86.org/index.php/2021/06/game-performances/).
With DynaRec for ARM64, RV64 and LA64 platforms, Box64 achieves a speed boost 5-10x faster than the interpreter alone. For a deeper look at DynaRec, see [Inner workings](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
With DynaRec for Arm, RISC-V and LoongArch platforms, Box64 achieves a speed boost 5-10x faster than the interpreter alone. For a deeper look at DynaRec, see [Inner workings](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
<img src="docs/img/Box64Icon.png" width="96" height="96" alt="Box64 Icon">
@@ -25,45 +24,53 @@ _Logo and icon by @grayduck - Thank you!_
---
## 📖 Usage
## Usage
Box64 offers environment variables to control its behavior. For details, see [Usage Documentation](docs/USAGE.md).
- `$ box64 ./program [args]` to run Linux x86_64 programs.
- `$ box64 -k` to kill all the emulated processes.
- `$ box64-bash` to have an x86_64 bash environment.
- Want to use wine? see [Wine Documentation](docs/WINE.md).
Box64 also offers environment variables and rcfile to control its behavior. For details, see [Usage Documentation](docs/USAGE.md).
---
## 🚀 Compiling and Installation
## Compiling and Installation
- [Compilation Instructions](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md)
- [Wine Installation for Box64](https://github.com/ptitSeb/box64/blob/main/docs/X64WINE.md)
- [Bundle x86 Libraries](https://github.com/ptitSeb/box64/blob/main/docs/BUNDLE-X86-LIBS.md)
- [Wine Installation for Box64](https://github.com/ptitSeb/box64/blob/main/docs/WINE.md)
---
## 🔄 Version History
## Version History
See the [Changelog](docs/CHANGELOG.md) for version updates.
---
## 🖥️ Platform Compatibility Notes
## Platform Compatibility Notes
Box64 requires 64-bit libraries on the host system, as it directly translates x86_64 function calls. For 32-bit binaries, use Box86.
Box64 requires 64-bit libraries on the host system, as it directly translates x86_64 function calls. For 32-bit binaries, use Box86 or Box32.
**Notes**
1. Box32 mode is in the making, which aims to support 32-bit binaries on Box64, you can enable it at build time, but do not expect everything to work. There is actually a few things that works, amny that don't. It's a known issue, no need to create tickets about it for now.
2. Some installers may default to x86 on 64-bit host OSes, causing compatibility issues. Workaround: Use a fake `uname` that returns "x86_64" for `-m`.
1. Box32 is still experimental.
2. Some shell scripts (such as the GOG game installer) may rely on `uname -m` to determine the current architecture. Please run them as `box64 script.sh` to allow Box64 to take over.
---
## ⚙️ Configuration
## Configuration
Box64 has configuration files located in `/etc/box64.box64rc` and `~/.box64rc`, both formatted as `.ini` files. If you don’t want to use the default `/etc/box64.box64rc` file, copy it to `~/.box64rc` to ensure compatibility.
Settings priority: `~/.box64rc` > `/etc/box64.box64rc` > Command line.
For more information, check [Usage Documentation](docs/USAGE.md).
---
## 📄 Additional Platform-Specific Notes
## Additional Platform-Specific Notes
### Unity Game Emulation
@@ -71,13 +78,9 @@ Settings priority: `~/.box64rc` > `/etc/box64.box64rc` > Command line.
- **Tip for Pi4 and Pi5 Users**: Set `MESA_GL_VERSION_OVERRIDE=3.2` with `BOX64_DYNAREC_STRONGMEM=1` to prevent freezes and enable strong memory mode.
- **Using Panfrost**: For better compatibility on ARM, enable `PAN_MESA_DEBUG=gl3` to force higher OpenGL profiles. This can help if a game starts but quits unexpectedly before showing any content.
### GTK Programs
Box64 wraps GTK libraries, supporting both gtk2 and gtk3.
### Steam
Steam requires Box86 due to its 32-bit client app, but uses 64-bit local server binaries. Systems with less than 6GB RAM may need a swap file for optimal performance.
See [Steam Documentation](docs/STEAM.md).
### Wine
@@ -85,9 +88,7 @@ Box64 supports Wine64 and Proton. For 32-bit components, Box86 is required. Syst
**Note**: You can use Wine WOW64 build to run x86 Windows programs in Box64-only environments, this is still experimental, but it works in most cases.
### Vulkan
Box64 wraps Vulkan libraries.
For more information, check [Wine Documentation](docs/WINE.md).
----
Final word
+28 -26
View File
@@ -2,22 +2,21 @@
# Box64:Linux 用户空间 x86-64 模拟器(支持原生库)
[更新日志](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [English](https://github.com/ptitSeb/box64/blob/main/README.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
[官网](https://box86.org/) | [更新日志](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [English](https://github.com/ptitSeb/box64/blob/main/README.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
![Build Status](https://app.travis-ci.com/ptitSeb/box64.svg?branch=main) ![Stars](https://img.shields.io/github/stars/ptitSeb/box64) ![Forks](https://img.shields.io/github/forks/ptitSeb/box64) ![Contributors](https://img.shields.io/github/contributors/ptitSeb/box64) ![Pull Requests](https://img.shields.io/github/issues-pr/ptitSeb/box64) ![Issues](https://img.shields.io/github/issues/ptitSeb/box64)
---
Box64 可以在非 x86_64 Linux 主机系统(比如 Arm)上运行 x86_64 Linux 程序(比如游戏),目前仅支持 64 位小端主机系统。
**请查看我们的游戏兼容性列表:[https://box86.org/app/](https://box86.org/app/),并请帮助我们[改进它](https://github.com/ptitSeb/box86-compatibility-list/issues)!**
在 YouTube 上查看 Box64 的运行效果:
- [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)
- [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)
- [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
---
Box64 可以在非 x86_64 Linux 主机系统(比如 Arm)上运行 x86_64 Linux 程序(比如游戏),目前仅支持 64 位小端主机系统。
Box64 可以使用本机原生的系统库(libc、libm、SDL、OpenGL),有着易于集成的特性和令人惊讶的性能。如需性能基准测试,请查看[此分析](https://box86.org/index.php/2021/06/game-performances/)。
借助适用于 ARM64,RV64 以及 LA64 平台的 DynaRec,Box64 的速度比单独使用解释器快 5-10 倍。如需深入了解 DynaRec,请参考[此文章](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/)。
借助适用于 Arm,RISC-V 以及龙架构平台的 DynaRec,Box64 的速度比单独使用解释器快 5-10 倍。如需深入了解 DynaRec,请参考[此文章](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/)。
<img src="docs/img/Box64Icon.png" width="96" height="96" alt="Box64 Icon">
@@ -25,58 +24,63 @@ _Logo 由 @grayduck 制作,感谢!_
---
## 📖 使用方法
## 使用方法
Box64 提供了环境变量来控制其行为。有关详细信息请参阅[使用文档](docs/USAGE.md)。
- `$ box64 ./program [args]` 运行 Linux x86_64 程序。
- `$ box64 -k` 杀死所有模拟的进程。
- `$ box64-bash` 进入 x86_64 bash 环境。
- 想要使用 wine?请参阅 [Wine 使用说明](docs/WINE.md)。
Box64 还提供了环境变量和 Rc 文件来控制其行为。有关详细信息请参阅[使用文档](docs/USAGE.md)。
---
## 🚀 编译和安装
## 编译和安装
- [编译说明](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md)
- [安装 Wine](https://github.com/ptitSeb/box64/blob/main/docs/X64WINE.md)
- [安装 Wine](https://github.com/ptitSeb/box64/blob/main/docs/WINE.md)
---
## 🔄 版本历史
## 版本历史
请参阅[变更日志](docs/CHANGELOG.md)了解版本更新说明。
---
## 🖥️ 平台兼容性说明
## 平台兼容性说明
Box64 直接转换 x86_64 函数调用到本机原生库,因此需要主机系统上的 64 位库。对于 32 位二进制文​​件,请使用 Box86。
Box64 直接转换 x86_64 函数调用到本机原生库,因此需要主机系统上的 64 位库。对于 32 位二进制文​​件,请使用 Box86 或 Box32。
**注意事项**
1. Box32 模式正在制作中,旨在支持 Box64 上运行 32 位二进制文​​件,敬请期待!
2. 某些安装程序可能会将 64 位的主机操作系统判定为 x86 导致兼容性问题。解决方法:使用假的 `uname` ,并使它在运行参数为 `-m` 时返回 `x86_64`。
1. Box32 仍然是实验性质。
2. 某些 Shell 脚本(比如 GOG 游戏安装脚本)可能会依赖 `uname -m` 判断当前架构,请使用 `box64 script.sh` 的方式运行以便让 Box64 接管。
---
## ⚙️ 配置
## 配置
Box64 的配置文件位于 `/etc/box64.box64rc` 和 `~/.box64rc`,均为 `.ini` 格式的文件。如果您不想使用默认的 `/etc/box64.box64rc` 文件,请将其复制到 `~/.box64rc` 以确保兼容性。
配置项的优先级:`~/.box64rc` > `/etc/box64.box64rc` > 命令行。
更多信息,请参阅[使用文档](docs/USAGE.md)。
---
## 📄 特定平台的其他说明
## 特定平台的其他说明
### Unity 游戏
- 许多 Unity 游戏需要 OpenGL 3+,这对 ARM/RISC-V SBC 来说可能具有挑战性。
- **对 Pi4 和 Pi5 用户的提示**:设置 `MESA_GL_VERSION_OVERRIDE=3.2` 和 `BOX64_DYNAREC_STRONGMEM=1` 以防止卡死并启用强内存模式。
- **Panfrost**:为了在 ARM 上实现更好的兼容性,启用 `PAN_MESA_DEBUG=gl3` 以强制更高的 OpenGL Profile。如果游戏可以启动但在显示任何内容之前意外退出,这个设置可能会有所帮助。
### GTK 程序
Box64 包装了 GTK 库,支持 gtk2 和 gtk3。
### Steam
由于 Steam 客户端应用是 32 位的,需要使用 Box86,但其本地服务器是 64 位的二进制文件。对于内存少于 6GB 的系统,可能需要使用交换文件以获得最佳性能。
Box64 支持 Linux Steam 和 Windows Steam,更多细节请参考[Steam 文档](docs/STEAM.md)。
> 由于 Linux Steam 客户端应用是 32 位的,需要使用 Box86 或 Box32,但其本地服务器是 64 位的二进制文件。对于内存少于 6GB 的系统,可能需要使用交换文件以获得最佳性能。
### Wine
@@ -84,9 +88,7 @@ Box64 支持 Wine64 和 Proton。对于 32 位组件,需要 Box86。配备 Box
**提示**:您可以使用 Wine WOW64 版本在仅限 Box64 的环境中运行 x86 Windows 程序,这项支持仍处于实验阶段,但在大多数情况下都可以工作。
### Vulkan
Box64 包装了 Vulkan 库。
有关更多信息,请参阅 [Wine 使用说明](docs/WINE.md)。
----
+3 -3
View File
@@ -1,3 +1,5 @@
> Внимание: Этот документ устарел. Пожалуйста, помогите нам его перевести.
![Official logo](docs/img/Box64Logo.png "Official Logo")
Емулятор простіра користувача x86_64 із родзинкою
@@ -10,8 +12,6 @@
Box64 дозволяє запускати x86_64 Linux програми (наприклад, ігри) на системах Linux відмінних від x86_64, наприклад ARM (хост-система має мати 64-розрядний порядок редагування).
Ви можете знайти багато відео про Box64 в YouTube каналах [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ), [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g) або [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
Оскільки Box64 використовує рідні версії деяких «системних» бібліотек, таких як libc, libm, SDL і OpenGL, його легко інтегрувати та використовувати з більшістю програм, а продуктивність у багатьох випадках може бути напрочуд високою. Подивіться на цей стендовий аналіз для прикладу [тут](https://box86.org/index.php/2021/06/game-performances/).
Box64 інтегрується з DynaRec (динамічний рекомпілятор) для платформ ARM64 і RV64 забезпечуючи підвищення швидкості в 5-10 разів, ніж використання лише інтерпретатора. Деякі високорівневі відомості про те, як працює DynaRec, можна знайти [тут](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
@@ -37,7 +37,7 @@ Box64 інтегрується з DynaRec (динамічний рекомпіл
Компіляція/Встановлення
----
> Інструкцію зі складання Box64 можна знайти [тут](docs/COMPILE.md).\
> Інструкцію з встановлення Wine для Box64 можна знайти [тут](docs/X64WINE.md).
> Інструкцію з встановлення Wine для Box64 можна знайти [тут](docs/WINE.md).
----
Історія версій/Журнал змін
+89
View File
@@ -0,0 +1,89 @@
https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_amd64.deb,d5ae55e3a9838d12358530cd03218cc0d18127a84e9cfc73bdf79dacd40b25e4
https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_i386.deb,625e5189304d4d3bfb27cb821e257816c5ce761b1696b5da5ca4fa1035c48463
https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb,6e85968afe1a6643f4e82e1cc168f848c5967a131bb1c7392f11974953db0e67
https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_i386.deb,4e8b924286a064c257ca50b8ecd44fe71226443daef62b6836010590e2157329
https://archives.fedoraproject.org/pub/archive/epel/9.5/Everything/x86_64/Packages/m/mbedtls-2.28.8-1.el9.x86_64.rpm,54cb7e43e902a7378e912ecfec470ee30fe69af323d3812cbc39ddebd64790ff
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libpng12-1.2.57-13.fc34.i686.rpm,5e4f525f44d538e3467dd13c66010d54f3d12ec4a319829e15a23ff2d0195b5b
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libpng12-1.2.57-13.fc34.x86_64.rpm,49f956ad143399c29f5ddf6da6b6fc108ce130d1ed598b4ec5a68b1ff26091de
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.i686.rpm,eb518e9d073c36fd29862c7afd00a8a7cb186074a0e162983f18fb6c9dc71d2c
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.x86_64.rpm,0f44e37e4eb472508e0dba8505ebbb04c2c1390c6a43970a6af80aad886037e3
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.i686.rpm,386040fc502e2f02b4b072e0cd90c034dc0a30831fbd2ddb116d17c080b6f9a4
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.x86_64.rpm,2a13461c7d5fcf72ffd682b3eb04833aea8306d61c3b8bdeb42a5081d96d5478
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.i686.rpm,4a3bce6e6358ddd05ed2941e7b8fcc4c8cc02df20741d3f0f9295facbc687769
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.x86_64.rpm,9524803ef42d80dc1b15190d5bb5925200995d5a6152eca04471383ff891af17
https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-3.0.3-21-1-x86_64.eopkg,c92f19d446b4c2450306f13b1a908f2552400da09301996fe349fee243d964d2
https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-32bit-3.0.3-21-1-x86_64.eopkg,5624990281f6520026aa2252c711f02d4916099aeac63accc83bd2135b9d3220
https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.i686.rpm,13bc8758355c3ec885f414e0e86efad29a7fe82c0999cdb3754d666949c06cc5
https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.x86_64.rpm,fb4aaa22b2e2f2fc0c451b87ac464e8746d240397d64e79f6bfd38f4e9128a5a
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.i686.rpm,6b9d8e1b34dcc5a5cb1196d746022b04677b7f9a105508392446508c6ae9b4cc
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.x86_64.rpm,102eb4355d2dfc8093ed59dd2ebc6bf8616965524faf7e886212fd542f4c1b4b
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.i686.rpm,75f808f0f5f93aceb4e477aa5f302edbed07a605a0644f0ea929d4ea609e36a0
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.x86_64.rpm,b4763ca410f8479b2775efb55ba09e6722948af7526180a56309e3e090c27010
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.i686.rpm,fe35e8de9b68c8d7e7b6b525580fc36cf9c86412cdb2b022dc01f95801771981
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.x86_64.rpm,b6d1e7f1c832882ceb05187cbc2d8fe1f459bcd88c7160487ee6f734e1a5d017
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.i686.rpm,d9c44bb34c990fdcc6987feefacfc9e1e7997ca25f1e0a59c9adc9c16f2266d1
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.x86_64.rpm,d0b867203384942985c3c4ad6fc9ec0000fcc9965408451a6cdef8df06a3833c
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.i686.rpm,9e4ff6fa0251c5357ae8f648b3e396d0043d5b3f2fb28d23325f5bd592c67aee
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.x86_64.rpm,83b4b333e335654674032d1cda4d7deb328b5a409f95e3952c3dc482b684fd8f
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.i686.rpm,7c33f4c18cbd51dc0a7c9ae0190b1a27d0540ce2fd92ced4776dde66162d1a88
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.x86_64.rpm,8600132b9e4efadfe23d3125e90287f5a7114165fd9ecb064d9930fcca446ef2
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.i686.rpm,ec68b3def828ba442248f3cff495f42c4af3dd58f38c8daad07dfddc109d999a
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.x86_64.rpm,d00318843a50138829b470a97b8db1a00723b10bca23c16a8386d9ab670e4c64
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.i686.rpm,2155c688b516ab359d0c47be6d73e51d3c65f199ed5591f7bb7ce6d5d9799977
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.x86_64.rpm,25ab4a8ad997b450b4a34a777f5a0678eea72ca1665944a7a461ac63de4b25bf
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.i686.rpm,e38c5185fea611330ea253db020315dd564507bf95c48a81dbe7db186ce4214b
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.x86_64.rpm,3c340337a073975636d198a282503f32a54bf85fb5345522a2c22e530b8d6c9e
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.i686.rpm,af1aba8e6fa5ccf33032d58a3acc59368c07d532293396db205fb9a4bc1241ae
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.x86_64.rpm,49c273813b4616240acdae8dae893192658c7541482f9bbb2c46dfe19b61877d
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.i686.rpm,28bc1088e39483d145849e8804c5a0f2524faeb4f76631ae46c41100f40e08b9
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.x86_64.rpm,1848b9ced2dfec6c206791b23a5a8a6356939c5ed0492fc91c86bf1d3a255c1d
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.i686.rpm,fe352f7d197ebdf2c92bbd6e548f9f6b7ac9e69e7a9d6c9861a6274482e79d73
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.x86_64.rpm,babe0b1385e723476a216d5f4b72453e031c3d683b19344786c2bddf7203cb04
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.i686.rpm,64cf0b0136d3f9b80b07ce2d4b8ce6a4ab86617e8ef9baf560bdfa5edef825ea
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.x86_64.rpm,16c48c504fe62f8e19cac7c6442d3e08bba487f610c2f533116dac32357cda86
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.i686.rpm,5157daf2ab0a03b403d37c60b150b8f0f866754714f81e3d96368e06a16339ce
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.x86_64.rpm,1f81073019abe4176d4496723a89b55a349c31f507e96397a0b3efa7cea0ff61
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.i686.rpm,f9e62d2768c31948b53268b7de51bd1c7342cdf39a328a0d89d933b4aa0c5dd1
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.x86_64.rpm,ed02d978a36488b38bad62af21d4045367c1f0b00d00c90ded01e2fc8e190536
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.i686.rpm,d18c20fccbb9497222059d475161a55c0c6279344f214fe551b8b0f87d3c054a
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.x86_64.rpm,77906ae44bcd42a9f6646d814874768e8befaabf413133d44f71a95ac6c6d68c
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.i686.rpm,70daa216ed2a6540e41c455efc95d2b5671db164137f854bceae07e348f58645
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.x86_64.rpm,1cf2d122e5c423681394c1bc599ee2281d2eafff5a3749842bc93c37db4bed5e
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-2.el9.alma.1.i686.rpm,fed64dfadf74bd132ac2675f625ec601ca9d7ae9d05b8d7ff492a204260d0174
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-5.el9_5.alma.1.x86_64.rpm,7bd3ec130e1712442121b61b27164386006b9bfa6f0fa188316ecb35575a768f
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.i686.rpm,686ac26afe2073a3607f26fd1592a8ccd9b78f6eec6e872528634b43c4e04dd7
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.x86_64.rpm,9a2bdc6807b22ffb6294b30dcc13e20198abe5facaeefcf1bfacec3e1013e3c2
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.i686.rpm,23f828674bc30752687452dacf4a25ca8c25ef0d25e3e6953d0714b5b33cef08
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.x86_64.rpm,f28fabeb02add41b8156c394427da9dbf99882d8c42055367f872130ee424c97
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.i686.rpm,4458e2d416b5e6714ec664c4f88791eee7d1e707026a5854d948a6159911465b
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.x86_64.rpm,c3ff43237c05258ee0dd77c28540fc8d0d824f1567b115ddfd555b78d2ee0e7a
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.i686.rpm,7f4d1552b6036c49028db959f82fc0bc30773cd7ed0a62c3906da0e2388f4dc5
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.x86_64.rpm,7d0e521ab087807ee71d79da66a2829b827bf5080bb5d080dfab108e31cf218b
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.i686.rpm,66bf967e84f0d8e7a0059f2b7dda33482ff5e4fe088d0e3bc86dc54e6c7c97be
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.x86_64.rpm,ebb3e927dfafa0b199e00e2bef4c10c85fc82a70c359faf9aeb599eda70bfa5e
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc++-11.5.0-5.el9_5.alma.1.i686.rpm,05fd29569c312a661374aa69e28ed5cad20812822070a3138265c92a446e2c80
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc++-11.5.0-5.el9_5.alma.1.x86_64.rpm,7efb1ded0ec2763589dd3bc6a9d52fa9f898cc1f3db6e8761e1d223ce4506424
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.i686.rpm,9cbd11277e89bd0d4a80900bee01ca71b0c582c9cb5744f5035135b2ed907c85
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.x86_64.rpm,2dd3a1ad2785df642cb03dfed6dfbeec929ff8b14e52e61272ca7e89f86ba3cd
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.i686.rpm,792600a879fbd94ce4bf249713b0cb3a166c147cfad397e8a15e6b4f01c75997
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.x86_64.rpm,d2f86fbee729a4900a433a6c52a3cb95d9b52b1d79c9e719ee3ef509813eb6d9
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.i686.rpm,e98f253d6f5f9acf2ded628cd98f50a54a031e354bf7bb2efc3fe39f9899fe49
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.x86_64.rpm,2e5215e225cec2db43d92c3b3380812a6f8684e881ed415670299e1e0fe7d1ce
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.i686.rpm,c308ba7380a3b5c5337c919150f0234342b64c1ea696d6207c2b790b82ba4669
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.x86_64.rpm,439e701491af6a957ac4d7dc69cccee1a945333f19d8bfcbd896b5119af01aab
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.i686.rpm,285db6dc6f610f75ef6863dcb0a383eae394c2b33bff283189cb49ac7fae4c58
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.x86_64.rpm,d06b0e491481a345faf21a69666cbdc302d19b54fb29ae1aa78fa6b205f9e604
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.i686.rpm,e5610fe3b25cfca1616440e1a8a7489fd37b0852f182fdda87ab8e196d981970
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.x86_64.rpm,9786b6610d17aa495fb640ba6d046bf73704915b82d12e6d8339090ff4891de5
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.i686.rpm,abe4ab924b405c236eaf3fa067fed50ac66d15d0ef42c782a745788c1a9c5b91
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.x86_64.rpm,0e1bd97e697a9fa3b4e508b945cf352b73b06e4e8218c14ac5fb912b0022c646
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.i686.rpm,f2ae4441fc667cdcb930e7a2cfe90f7342e7d1c8848d6d18cb350ba68e025862
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.x86_64.rpm,15bfe177d3c10982c75e81d7b274883a9fb53322011c8d829667c983ee419b18
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.i686.rpm,2cf468da5ecf307cc325c9a5da0a288aafd25dec0951af2b4d0954a77bdf900d
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.x86_64.rpm,308bd897d8f9a36020d70edc79089a3595b22b149200d67c37e2d4e6147a9f75
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.i686.rpm,dc6946a8344b8f4f476fef9479d1786c86fdcd045e988ab5d85fef7780e1fae4
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.x86_64.rpm,e7f87444f24a03b37caa02942082b6d4283067ecbbd3f7798f882d22b55713cf
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/zlib-1.2.11-40.el9.i686.rpm,659ee5222028744806be3f822369a726c721aa346eed2882dcf019d83c111e67
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/zlib-1.2.11-40.el9.x86_64.rpm,90d7d5d145c6d397645ffefdff40e3d2783e3bf3bfa7b6c1f089c2cad81a3191
https://vault.centos.org/6.10/os/x86_64/Packages/compat-libstdc++-33-3.2.3-69.el6.i686.rpm,894abcc5f0b28e39c71d4b0ca27d19540e7eb9d3c32664d5621324c9efbfe11e
https://vault.centos.org/6.10/os/x86_64/Packages/compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm,41ea0fec16c0ca62722a32b7ffd70bb716beec8b6dd32b57f076be02a5aee00c
1 https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_amd64.deb d5ae55e3a9838d12358530cd03218cc0d18127a84e9cfc73bdf79dacd40b25e4
2 https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_i386.deb 625e5189304d4d3bfb27cb821e257816c5ce761b1696b5da5ca4fa1035c48463
3 https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb 6e85968afe1a6643f4e82e1cc168f848c5967a131bb1c7392f11974953db0e67
4 https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_i386.deb 4e8b924286a064c257ca50b8ecd44fe71226443daef62b6836010590e2157329
5 https://archives.fedoraproject.org/pub/archive/epel/9.5/Everything/x86_64/Packages/m/mbedtls-2.28.8-1.el9.x86_64.rpm 54cb7e43e902a7378e912ecfec470ee30fe69af323d3812cbc39ddebd64790ff
6 https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libpng12-1.2.57-13.fc34.i686.rpm 5e4f525f44d538e3467dd13c66010d54f3d12ec4a319829e15a23ff2d0195b5b
7 https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libpng12-1.2.57-13.fc34.x86_64.rpm 49f956ad143399c29f5ddf6da6b6fc108ce130d1ed598b4ec5a68b1ff26091de
8 https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.i686.rpm eb518e9d073c36fd29862c7afd00a8a7cb186074a0e162983f18fb6c9dc71d2c
9 https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.x86_64.rpm 0f44e37e4eb472508e0dba8505ebbb04c2c1390c6a43970a6af80aad886037e3
10 https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.i686.rpm 386040fc502e2f02b4b072e0cd90c034dc0a30831fbd2ddb116d17c080b6f9a4
11 https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.x86_64.rpm 2a13461c7d5fcf72ffd682b3eb04833aea8306d61c3b8bdeb42a5081d96d5478
12 https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.i686.rpm 4a3bce6e6358ddd05ed2941e7b8fcc4c8cc02df20741d3f0f9295facbc687769
13 https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.x86_64.rpm 9524803ef42d80dc1b15190d5bb5925200995d5a6152eca04471383ff891af17
14 https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-3.0.3-21-1-x86_64.eopkg c92f19d446b4c2450306f13b1a908f2552400da09301996fe349fee243d964d2
15 https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-32bit-3.0.3-21-1-x86_64.eopkg 5624990281f6520026aa2252c711f02d4916099aeac63accc83bd2135b9d3220
16 https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.i686.rpm 13bc8758355c3ec885f414e0e86efad29a7fe82c0999cdb3754d666949c06cc5
17 https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.x86_64.rpm fb4aaa22b2e2f2fc0c451b87ac464e8746d240397d64e79f6bfd38f4e9128a5a
18 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.i686.rpm 6b9d8e1b34dcc5a5cb1196d746022b04677b7f9a105508392446508c6ae9b4cc
19 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.x86_64.rpm 102eb4355d2dfc8093ed59dd2ebc6bf8616965524faf7e886212fd542f4c1b4b
20 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.i686.rpm 75f808f0f5f93aceb4e477aa5f302edbed07a605a0644f0ea929d4ea609e36a0
21 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.x86_64.rpm b4763ca410f8479b2775efb55ba09e6722948af7526180a56309e3e090c27010
22 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.i686.rpm fe35e8de9b68c8d7e7b6b525580fc36cf9c86412cdb2b022dc01f95801771981
23 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.x86_64.rpm b6d1e7f1c832882ceb05187cbc2d8fe1f459bcd88c7160487ee6f734e1a5d017
24 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.i686.rpm d9c44bb34c990fdcc6987feefacfc9e1e7997ca25f1e0a59c9adc9c16f2266d1
25 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.x86_64.rpm d0b867203384942985c3c4ad6fc9ec0000fcc9965408451a6cdef8df06a3833c
26 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.i686.rpm 9e4ff6fa0251c5357ae8f648b3e396d0043d5b3f2fb28d23325f5bd592c67aee
27 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.x86_64.rpm 83b4b333e335654674032d1cda4d7deb328b5a409f95e3952c3dc482b684fd8f
28 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.i686.rpm 7c33f4c18cbd51dc0a7c9ae0190b1a27d0540ce2fd92ced4776dde66162d1a88
29 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.x86_64.rpm 8600132b9e4efadfe23d3125e90287f5a7114165fd9ecb064d9930fcca446ef2
30 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.i686.rpm ec68b3def828ba442248f3cff495f42c4af3dd58f38c8daad07dfddc109d999a
31 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.x86_64.rpm d00318843a50138829b470a97b8db1a00723b10bca23c16a8386d9ab670e4c64
32 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.i686.rpm 2155c688b516ab359d0c47be6d73e51d3c65f199ed5591f7bb7ce6d5d9799977
33 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.x86_64.rpm 25ab4a8ad997b450b4a34a777f5a0678eea72ca1665944a7a461ac63de4b25bf
34 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.i686.rpm e38c5185fea611330ea253db020315dd564507bf95c48a81dbe7db186ce4214b
35 https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.x86_64.rpm 3c340337a073975636d198a282503f32a54bf85fb5345522a2c22e530b8d6c9e
36 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.i686.rpm af1aba8e6fa5ccf33032d58a3acc59368c07d532293396db205fb9a4bc1241ae
37 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.x86_64.rpm 49c273813b4616240acdae8dae893192658c7541482f9bbb2c46dfe19b61877d
38 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.i686.rpm 28bc1088e39483d145849e8804c5a0f2524faeb4f76631ae46c41100f40e08b9
39 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.x86_64.rpm 1848b9ced2dfec6c206791b23a5a8a6356939c5ed0492fc91c86bf1d3a255c1d
40 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.i686.rpm fe352f7d197ebdf2c92bbd6e548f9f6b7ac9e69e7a9d6c9861a6274482e79d73
41 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.x86_64.rpm babe0b1385e723476a216d5f4b72453e031c3d683b19344786c2bddf7203cb04
42 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.i686.rpm 64cf0b0136d3f9b80b07ce2d4b8ce6a4ab86617e8ef9baf560bdfa5edef825ea
43 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.x86_64.rpm 16c48c504fe62f8e19cac7c6442d3e08bba487f610c2f533116dac32357cda86
44 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.i686.rpm 5157daf2ab0a03b403d37c60b150b8f0f866754714f81e3d96368e06a16339ce
45 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.x86_64.rpm 1f81073019abe4176d4496723a89b55a349c31f507e96397a0b3efa7cea0ff61
46 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.i686.rpm f9e62d2768c31948b53268b7de51bd1c7342cdf39a328a0d89d933b4aa0c5dd1
47 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.x86_64.rpm ed02d978a36488b38bad62af21d4045367c1f0b00d00c90ded01e2fc8e190536
48 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.i686.rpm d18c20fccbb9497222059d475161a55c0c6279344f214fe551b8b0f87d3c054a
49 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.x86_64.rpm 77906ae44bcd42a9f6646d814874768e8befaabf413133d44f71a95ac6c6d68c
50 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.i686.rpm 70daa216ed2a6540e41c455efc95d2b5671db164137f854bceae07e348f58645
51 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.x86_64.rpm 1cf2d122e5c423681394c1bc599ee2281d2eafff5a3749842bc93c37db4bed5e
52 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-2.el9.alma.1.i686.rpm fed64dfadf74bd132ac2675f625ec601ca9d7ae9d05b8d7ff492a204260d0174
53 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-5.el9_5.alma.1.x86_64.rpm 7bd3ec130e1712442121b61b27164386006b9bfa6f0fa188316ecb35575a768f
54 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.i686.rpm 686ac26afe2073a3607f26fd1592a8ccd9b78f6eec6e872528634b43c4e04dd7
55 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.x86_64.rpm 9a2bdc6807b22ffb6294b30dcc13e20198abe5facaeefcf1bfacec3e1013e3c2
56 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.i686.rpm 23f828674bc30752687452dacf4a25ca8c25ef0d25e3e6953d0714b5b33cef08
57 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.x86_64.rpm f28fabeb02add41b8156c394427da9dbf99882d8c42055367f872130ee424c97
58 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.i686.rpm 4458e2d416b5e6714ec664c4f88791eee7d1e707026a5854d948a6159911465b
59 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.x86_64.rpm c3ff43237c05258ee0dd77c28540fc8d0d824f1567b115ddfd555b78d2ee0e7a
60 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.i686.rpm 7f4d1552b6036c49028db959f82fc0bc30773cd7ed0a62c3906da0e2388f4dc5
61 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.x86_64.rpm 7d0e521ab087807ee71d79da66a2829b827bf5080bb5d080dfab108e31cf218b
62 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.i686.rpm 66bf967e84f0d8e7a0059f2b7dda33482ff5e4fe088d0e3bc86dc54e6c7c97be
63 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.x86_64.rpm ebb3e927dfafa0b199e00e2bef4c10c85fc82a70c359faf9aeb599eda70bfa5e
64 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc++-11.5.0-5.el9_5.alma.1.i686.rpm 05fd29569c312a661374aa69e28ed5cad20812822070a3138265c92a446e2c80
65 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc++-11.5.0-5.el9_5.alma.1.x86_64.rpm 7efb1ded0ec2763589dd3bc6a9d52fa9f898cc1f3db6e8761e1d223ce4506424
66 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.i686.rpm 9cbd11277e89bd0d4a80900bee01ca71b0c582c9cb5744f5035135b2ed907c85
67 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.x86_64.rpm 2dd3a1ad2785df642cb03dfed6dfbeec929ff8b14e52e61272ca7e89f86ba3cd
68 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.i686.rpm 792600a879fbd94ce4bf249713b0cb3a166c147cfad397e8a15e6b4f01c75997
69 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.x86_64.rpm d2f86fbee729a4900a433a6c52a3cb95d9b52b1d79c9e719ee3ef509813eb6d9
70 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.i686.rpm e98f253d6f5f9acf2ded628cd98f50a54a031e354bf7bb2efc3fe39f9899fe49
71 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.x86_64.rpm 2e5215e225cec2db43d92c3b3380812a6f8684e881ed415670299e1e0fe7d1ce
72 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.i686.rpm c308ba7380a3b5c5337c919150f0234342b64c1ea696d6207c2b790b82ba4669
73 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.x86_64.rpm 439e701491af6a957ac4d7dc69cccee1a945333f19d8bfcbd896b5119af01aab
74 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.i686.rpm 285db6dc6f610f75ef6863dcb0a383eae394c2b33bff283189cb49ac7fae4c58
75 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.x86_64.rpm d06b0e491481a345faf21a69666cbdc302d19b54fb29ae1aa78fa6b205f9e604
76 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.i686.rpm e5610fe3b25cfca1616440e1a8a7489fd37b0852f182fdda87ab8e196d981970
77 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.x86_64.rpm 9786b6610d17aa495fb640ba6d046bf73704915b82d12e6d8339090ff4891de5
78 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.i686.rpm abe4ab924b405c236eaf3fa067fed50ac66d15d0ef42c782a745788c1a9c5b91
79 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.x86_64.rpm 0e1bd97e697a9fa3b4e508b945cf352b73b06e4e8218c14ac5fb912b0022c646
80 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.i686.rpm f2ae4441fc667cdcb930e7a2cfe90f7342e7d1c8848d6d18cb350ba68e025862
81 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.x86_64.rpm 15bfe177d3c10982c75e81d7b274883a9fb53322011c8d829667c983ee419b18
82 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.i686.rpm 2cf468da5ecf307cc325c9a5da0a288aafd25dec0951af2b4d0954a77bdf900d
83 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.x86_64.rpm 308bd897d8f9a36020d70edc79089a3595b22b149200d67c37e2d4e6147a9f75
84 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.i686.rpm dc6946a8344b8f4f476fef9479d1786c86fdcd045e988ab5d85fef7780e1fae4
85 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.x86_64.rpm e7f87444f24a03b37caa02942082b6d4283067ecbbd3f7798f882d22b55713cf
86 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/zlib-1.2.11-40.el9.i686.rpm 659ee5222028744806be3f822369a726c721aa346eed2882dcf019d83c111e67
87 https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/zlib-1.2.11-40.el9.x86_64.rpm 90d7d5d145c6d397645ffefdff40e3d2783e3bf3bfa7b6c1f089c2cad81a3191
88 https://vault.centos.org/6.10/os/x86_64/Packages/compat-libstdc++-33-3.2.3-69.el6.i686.rpm 894abcc5f0b28e39c71d4b0ca27d19540e7eb9d3c32664d5621324c9efbfe11e
89 https://vault.centos.org/6.10/os/x86_64/Packages/compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm 41ea0fec16c0ca62722a32b7ffd70bb716beec8b6dd32b57f076be02a5aee00c
+134
View File
@@ -0,0 +1,134 @@
#!/bin/sh
set -ex
trap cleanup_exit INT TERM EXIT
cleanup_exit()
{
echo "Running cleanup_exit..."
rm -rf /tmp/box64-bundle.*
}
# we must have few tools
awk=$(which awk) || { echo "E: You must have awk" && exit 1; }
cpio=$(which cpio) || { echo "E: You must have cpio" && exit 1; }
curl=$(which curl) || { echo "E: You must have curl" && exit 1; }
curl_cmd="${curl} --connect-timeout 5 --retry 5 --retry-delay 1 --create-dirs -fsSLo"
rpm2cpio=$(which rpm2cpio) || { echo "E: You must have rpm2cpio" && exit 1; }
sha256sum=$(which sha256sum) || { echo "E: You must have sha256sum" && exit 1; }
unzip=$(which unzip) || { echo "E: You must have unzip" && exit 1; }
current_dir=$(pwd)
dir_tmp="$(mktemp -d /tmp/box64-bundle.XXXXXX)"
# download the packages
while IFS= read -r line; do
# shellcheck disable=SC2016
pkg_url=$(echo "${line}" | ${awk} -F',' '{print$(NF-1)}')
# shellcheck disable=SC2016
pkg_checksum=$(echo "${line}" | ${awk} -F',' '{print$(NF)}')
# shellcheck disable=SC2016
pkg_name=$(echo "${pkg_url}" | ${awk} -F'/' '{print$(NF)}')
${curl_cmd} "${dir_tmp}/bundle-pkgs/${pkg_name}" "${pkg_url}"
checksum="$(${sha256sum} "${dir_tmp}/bundle-pkgs/${pkg_name}" | awk '{print $1}')"
if [ "${pkg_checksum}" != "${checksum}" ]; then
echo "E: Invalid checksum for ${pkg_name}"
echo "Expected: ${pkg_checksum}"
echo "Computed: ${checksum}"
exit 1
fi
done < box64-bundle-x86-libs.csv
# generate the bundle packages archive
tar -C "${dir_tmp}"/bundle-pkgs -czvf "${current_dir}"/box64-bundle-x86-pkgs.tar.gz .
# extract the packages
cd "${dir_tmp}"/bundle-pkgs
for file in *.deb *.eopkg *.rpm *.xbps; do
# handle the case of no files, e.g. xbps
[ -e "${dir_tmp}"/bundle-pkgs/"${file}" ] || break
# shellcheck disable=SC2016
extension=$(echo "${file}" | ${awk} -F'.' '{print$(NF)}')
mkdir -p "${dir_tmp}"/bundle-libs
cd "${dir_tmp}"/bundle-libs
case "${extension}" in
deb)
echo "I: DEB (Debian) package detected (${file})"
ar x "${dir_tmp}"/bundle-pkgs/"${file}"
tar -xf data.tar*
;;
eopkg)
echo "I: EOPKG (Solus Linux) package detected (${file})"
${unzip} -o "${dir_tmp}"/bundle-pkgs/"${file}"
tar -xf install.tar.xz
;;
rpm)
echo "I: RPM (Fedora) detected (${file})"
${rpm2cpio} "${dir_tmp}"/bundle-pkgs/"${file}" | ${cpio} -idmv
;;
xbps)
echo "I: XBPS (Void Linux) package detected (${file})"
tar -xf "${dir_tmp}"/bundle-pkgs/"${file}"
;;
esac
done
# reorganize the files
cd "${dir_tmp}"/bundle-libs
mkdir -p "${dir_tmp}"/bundle-libs/box64-i386-linux-gnu
mv lib/*.so* usr/lib/*.so* usr/lib/i386-linux-gnu/*.so* usr/lib32/*.so* \
"${dir_tmp}"/bundle-libs/box64-i386-linux-gnu
mkdir -p "${dir_tmp}"/bundle-libs/box64-x86_64-linux-gnu
mv lib64/*.so* usr/lib/x86_64-linux-gnu/*.so* usr/lib64/*.so* \
"${dir_tmp}"/bundle-libs/box64-x86_64-linux-gnu
rm -f ./*.tar.* debian-binary files.xml metadata.xml
rm -rf ./lib* etc run sbin usr var
mkdir -p usr/lib
mv box64-*-linux-gnu usr/lib
# remove libraries that cannot be emulated
# https://github.com/ptitSeb/box64/blob/v0.3.8/src/librarian/library.c#L433
set -- libc libpthread librt libGL libX11 libasound libdl libm libbsd libutil \
libresolv libXxf86vm libXinerama libXrandr libXext libXfixes libXcursor \
libXrender libXft libXi libXss libXpm libXau libXdmcp libX11-xcb libxcb \
libxcb-xfixes libxcb-shape libxcb-shm libxcb-randr libxcb-image \
libxcb-keysyms libxcb-xtest libxcb-glx libxcb-dri2 libxcb-dri3 libXtst libXt \
libXcomposite libXdamage libXmu libxkbcommon libxkbcommon-x11 \
libpulse-simple libpulse libvulkan ld-linux-x86-64 crashhandler \
libtcmalloc_minimal libanl ld-linux libthread_db
for file in "$@"; do
rm -f "${dir_tmp}"/bundle-libs/usr/lib/box64-*-linux-gnu/"${file}".so*
done
# check broken symlinks
if find "${dir_tmp}"/bundle-libs -type l ! -exec test -e {} \; -print | grep bundle-libs; then
echo "E: Broken symlinks found"
exit 1
fi
# Manually create additional symlinks that are useful to have.
cd "${dir_tmp}"/bundle-libs/usr/lib/box64-x86_64-linux-gnu/
ln -s libmbedcrypto.so.7 libmbedcrypto.so.3
ln -s libmbedtls.so.14 libmbedtls.so.12
ln -s libmbedx509.so.1 libmbedx509.so.0
# create shared libraries (.so) symlinks
# if multiple libraries of the same name exist, it will symlink the oldest version
# e.g. libcurl-gnutls soname with versioned symbols (CURL_GNUTLS_3, CURL_GNUTLS_4)
# libcurl-gnutls.so -> libcurl-gnutls.so.3
# libcurl-gnutls.so.3 -> libcurl-gnutls.so.4
# libcurl-gnutls.so.4 -> libcurl-gnutls.so.4.7.0
# libcurl-gnutls.so.4.7.0
for dir_lib in "${dir_tmp}"/bundle-libs/usr/lib/box64-*-linux-gnu; do
cd "${dir_lib}"
for lib in lib*.so*; do
lib_base="$(echo "${lib}" | awk -F'.' '{print $1"."$2}')"
if ! ls "${dir_lib}/${lib_base}" 2> /dev/null; then
ln -s "${lib}" "${lib_base}"
fi
done
done
# generate the bundle libraries archive
tar -C "${dir_tmp}"/bundle-libs -czvf "${current_dir}"/box64-bundle-x86-libs.tar.gz .
+7 -7
View File
@@ -7,15 +7,15 @@ string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
exec_program(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
execute_process(
COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
RESULT_VARIABLE rm_retval
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
ERROR_VARIABLE rm_out
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
endif(NOT "${rm_retval}" STREQUAL 0)
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
endif()
endif()
endforeach(file)
+43
View File
@@ -1,3 +1,46 @@
box64 (0.4.0) unstable; urgency=low
This version added many important refactors: the opcode prefix decoder for Dynarec, libGL and Vulkan, the FSGSBASE support, making segments handling easier and faster.
=> Improved compatibility accross all architecture, allowing more DRM protected game to run
=> the prefix refactor helped removed lots of redundant source file, simplifying maintenance
=> BOX32 is getting more and more stable, even if still not 100% ok. But Steam is more stable than before, runs on all architecture. And some gameoverlay UI works, on OpenGL games. gameoverlay (and fossilize) support for Vulkan is planned for later.
-- Sebastien Chevalier <[email protected]> Mon, 3 Jan 2026 10:30:33 -0100
box64 (0.3.8) unstable; urgency=low
This version introduce DynaCache, a disk cache for the generated native code. It's not enabled by default for now (but it will use cache file if present by default). It can dramaticaly speedup the load of program (try with linux factorio for example). This version also improve in the volatile metadata handling. There is a massive compatiblity improvment for box32 and on all dynarec in general too. And few more function wrapping...
=> DynaCache for faster loading of program, and avoid runtime hicups
=> Batter box32 compatibility (much less "Out of Memory" error)
=> Unity3D games on Wayland are working now
=> Volatile Metadata fully supported and handled, making games like Starfield to just work.
=> More work on AVX support for RV64 & LA64. LA64 almost there, while RV64 has Scalar only support (no hardware vector support yet for AVX)
-- Sebastien Chevalier <[email protected]> Mon, 10 Oct 2025 10:30:33 -0100
box64 (0.3.6) unstable; urgency=low
This version introduces wowbox64.dll for Hangover; the ability to use the Volatile Metadata of Windows executables for x64 wine; and some better x87/SSE/AVX handling
=> WowBox64 can be built directly from Box64 repo, and can be found in the CI artifacts also
=> it also supports a subset of BOX64_XXXX settings, which can be set from command line or via a setting file ".box64rc" in the Wine prefix home
=> Volatile Metadata, when present, allows only applying strong memory ordering when needed, as marked by the compiler, giving overall better performances
=> The precision control bit of x87 is now handled, allowing some older games to run correctly
=> More work has been done in the handling of precise NaN and Round handling in SSE & AVX opcodes
-- Sebastien Chevalier <[email protected]> Thu, 6 Jun 2025 10:30:33 -0100
box64 (0.3.4) unstable; urgency=low
* This version is Faster and more compatible
* => The RV64 backend got faster and more stable, with lots of RVV 1.0 / xThreadVector support to emulate SSE/SSE2+ opcode (no AVX yet)
* => On ARM64, Box64 now support more DRM types than before.
* => BOX32 can run steam now. At least on ARM64 backend, it's still not working on RV64 and LA64 for now.
* Please check CHAGELOG.md for more details
-- Sebastien Chevalier <[email protected]> Thu, 10 Mar 2025 10:30:33 -0100
box64 (0.3.2) unstable; urgency=low
* Introduced Box32 to run 32bits apps on 64bits OS
Vendored Regular → Executable
+30 -5
View File
@@ -1,13 +1,33 @@
#!/usr/bin/make -f
%:
dh $@
dh $@
DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH 2>/dev/null || echo "unknown")
override_dh_auto_configure:
@echo "Configuring for architecture: $(DEB_HOST_ARCH)"
ifeq ($(DEB_HOST_ARCH),riscv64)
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DARM_DYNAREC=1 \
-DNOGIT=1
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DRV64=1 \
-DRV64_DYNAREC=1 \
-DNOGIT=1
else ifeq ($(DEB_HOST_ARCH),arm64)
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DARM_DYNAREC=1 \
-DNOGIT=1
else ifeq ($(DEB_HOST_ARCH),aarch64)
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DARM_DYNAREC=1 \
-DNOGIT=1
else
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DNOGIT=1
endif
override_dh_shlibdeps:
dh_shlibdeps --exclude=libgcc_s.so.1 \
@@ -21,4 +41,9 @@ override_dh_shlibdeps:
--exclude=libcrypto.so.1.1 \
--exclude=libmbedx509.so.1 \
--exclude=libcrypto.so.1.0.0 \
--exclude=libssl.1.0.0
--exclude=libssl.so.1.0.0 \
--exclude=box64-bash
override_dh_strip:
dh_strip --exclude=/usr/lib/box64-x86_64-linux-gnu/ \
--exclude=box64-bash
+80
View File
@@ -0,0 +1,80 @@
# Bundling x86 Libraries
The script `box64-bundle-x86-libs.sh` is provided to download, extract, and re-bundle x86_64 and x86 libraries for use with Box64/Box32 and Box86. This bundle improves Box emulation by providing libraries that are not wrapped yet. In a perfect world, the application or game would already provide these libraries but that is not always the case. The bundle archive provides a much smaller size compared to using a full root file system of an operating system.
## Usage
### Administrator
Install required dependencies for the bundle script.
- Arch Linux
```
sudo pacman -S -y -u
sudo pacman -S binutils coreutils curl rpm-tools tar zstd
```
- Debian
```
sudo apt-get update
sudo apt-get install binutils coreutils curl rpm2cpio tar zstd
```
- Fedora
```
sudo dnf install binutils coreutils curl tar zstd
```
Run `box64-bundle-x86-libs.sh`. This will create two archives:
- `box64-bundle-x86-libs.tar.gz` = All of the extracted library files in the directory structure of `usr/lib/box64-i386-linux-gnu` and `usr/lib/box64-x86_64-linux-gnu`.
- `box64-bundle-x86-pkgs.tar.gz` = All of the Linux distribution packages used to extract the library files. This is only created for preservation purposes and is otherwise unused.
Extract the library archive. Box will automatically search these paths for library files to emulate.
```
sudo tar --extract --no-same-owner --file box64-bundle-x86-libs.tar.gz --directory /
```
### Developer
Add new packages to the `box64-bundle-x86-libs.csv` file in the format of `<PACKAGE_URL>,<SHA256_CHECKSUM>`.
Supported packages:
- DEB (Debian)
- EOPKG (Solus)
- RPM (Fedora)
- XBPS (Void Linux)
Preference of operating system packages that provide a library:
1. RPMs from AlmaLinux 9 provide 10 years of updates.
2. DEBs from Debian 11 provide 5 years of updates.
3. EOPKG from Solus provide old variants of obscure 32-bit libraries.
4. XBPS from Void Linux provide updated variants of obscure 32-bit libraries.
5. Other (whereever a library is packaged)
Some essential libraries will always be emulated and should be bundled. The full list can be found in the [in the core source code](https://github.com/ptitSeb/box64/blob/v0.4.0/src/core.c#L413).
Some essential library files will never be emulated (only natively wrapped instead) and should not be bundled. This includes glibc, OpenGL, Vulkan, and X11/Xorg libraries. The full list can be found [in the library source code](https://github.com/ptitSeb/box64/blob/v0.4.0/src/librarian/library.c#L440). Other libraries with lots of dependencies, such as GTK, require all dependencies to be installed for emulation to work. This becomes dependency hell and should be avoided.
For finding package names that contian a specific library file, use the [pkgs.org website](https://pkgs.org/). Otherwise, use one of these package manager commands on a x86_64 Linux distribution:
- DEB
- `apt-file <LIBRARY_FILE>`
- EOPKG
- Does not support file search. Use pkgs.org instead.
- RPM
- `dnf provides "*/<LIBRARY_FILE>*"`
- XBPS
- `xbps-query --repository --ownedby <LIBRARY_FILE>`
Once the package name is found, find the exact URL for downloading it.
- DEB = Explore "main" and "contrib". Search for packages with the name "deb11" in it. Use the "amd64.deb" and "i386.deb" packages.
- https://archive.debian.org/debian/pool/
- EOPKG = Use the "`<VERSION>-<RELEASE>-x86_64.eopkg`" and "`32bit-<VERSION>-<RELEASE>-x86_64.eopkg`" packages.
- https://cdn.getsol.us/repo/shannon/
- RPM = Navigate to the "`<MAJOR>.<MINOR>`" version directory first. Then explore "AppStream" and "BaseOS". Use the "x86_64.rpm" and "i686.rpm" packages.
- https://repo.almalinux.org/almalinux/
- Enterprise Linux (EL) distributions, such as AlamaLinux, sometimes are missing 32-bit packages. Use the Fedora 34 [update](https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/) and [release](https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/) archives for compatible packages with EL 9.
- XBPS = There are too many files in the repository to display on a web browser. Use pkgs.org instead to find the exact URL for downloading it.
- https://repo-default.voidlinux.org/current/
Download the package and then find the checksum with the `sha256sum` command.
Major Linux distributions such as AlmaLinux and Debian provide archives of packages. Most rolling distributions such as Solus and Void Linux do not (one exception is Arch Linux which has the [Arch Linux Archive (ALA)](https://wiki.archlinux.org/title/Arch_Linux_Archive)). In those cases, use the [Internet Archive](https://web.archive.org/) to archive any rolling release package used by Box by using the "Save Page Now" feature. If the error "Save Page Now browser crashed" appears, it can be safely ignored. The archive will still have been saved.
+183
View File
@@ -1,3 +1,186 @@
v0.4.0
======
Highlights:
* This version added many important refactors: the opcode prefix decoder for Dynarec, libGL and Vulkan, the FSGSBASE support, making segments handling easier and faster.
=> Improved compatibility accross all architecture, allowing more DRM protected game to run
=> the prefix refactor helped removed lots of redundant source file, simplifying maintenance
=> BOX32 is getting more and more stable, even if still not 100% ok. But Steam is more stable than before, runs on all architecture. And some gameoverlay UI works, on OpenGL games. gameoverlay (and fossilize) support for Vulkan is planned for later.
Version summary:
* Added new BOX64_ARCH to have settings specific to one of the supported cpu architecture (arm64, rv64, la64)
* Added BAD_PKILL build option, to workaround missing non-mandatory behaviour of pthread_kill (needed on LA64)
* Improved the handling of invalid opcodes
* Refactored handling of Selector, Segments and TLS data
* Added FSGSBASE cpu extension
* Added support for IFUNC relocation type to ElfLoader (64bits & 32bits)
* Refactored some internal behaviour to get better Interpreter only build
* Added BOX64_STEAM_VULKAN to have Vulkan renderer option injected when steamwebhelper is called
* Introduce BOX64_PYTHON3 to force using an X64 version of python (and use that on arm64 steam)
* Fixed signal handling when using Wine v10.19+
* Added some cache to customMalloc / customFree internal functions
* Some refactor on the cpuid helper function
* Wrapping: most Wayland listener for wider compatibility
* Wrapping: refactored libGL & libVulkan wrapping
* Wrapping: more wrapped functions, reworked some existing one with wrapperhelper
* Wrapping: Added a few more wrapped libs
* Wrapping: Better handling of RTLD_NEXT in dlsym function call
* Wrapping: Reworked wrapping of pthread_one (on Box32 too)
* Wrapping: a few new syscall implemented
* Wrapping: Make BOX64_EMULATED_LIBS to also affect gstreamer hacked loading of plugins
* Wrapping: BOX32: more wrapped function and some fixes to existing ones
* Wrapping: BOX32: a few new syscall implemented
* Interpreter: Added LOCK prefix to the generic opcode prefix handling
* Interpreter: A few fixes to existing opcodes
* Interpreter: Added F3 0F 40..4F opcodes
* Dynarec: Refactored HotPages Detection & Handling
* Dynarec: Introduced DYNAREC_PURGE to allow purging of old (unused?) Dynarec block and save memory
* Dynarec: Refactored prefix decoding, similar to the Interpreter
* Dynarec: ARM64: Added detection of loops and preload of xmm/ymm regs before entering
* Dynarec: ARM64: Refactored the handling of deferred flags
* Dynarec: ARM64: A few optimisation in some existing opcodes
* DYnarec: ARM64: Some fixes to existing opcodes
* Dynarec: LA64: Added x87 opcodes
* Dynarec: LA64: Added a few missing LOCK prefixed opcodes
* Dynarec: LA64: Added some more shift/roll opcodes
* Dynarec: LA64: Added support for native CRC opcodes
* Dynarec: LA64: Many fixes to some AVX opcodes
* Dynarec: LA64: Various fixes to some opcodes
* Dynarec: LA64: Addes a few 66 prefixed opcodes
* Dynarec: LA64: Added some "simple wrapper" support (allowing direct call of wrapped functions)
* Dynarec: LA64: Added some more native flags optimisations
* Dynarec: LA64: optimized REP MOVSB
* Dynarec: RV64: Fixed/Fine tunning flags on existing opcodes
* Dynarec: RV64: Various fixes to some opcodes
v0.3.8
======
Highlights:
* This version introduce DynaCache, a disk cache for the generated native code. It's not enabled by default for now (but it will use cache file if present by default). It can dramaticaly speedup the load of program (try with linux factorio for example). This version also improve in the volatile metadata handling. There is a massive compatiblity improvment for box32 and on all dynarec in general too. And few more function wrapping...
=> DynaCache for faster loading of program, and avoid runtime hicups
=> Batter box32 compatibility (much less "Out of Memory" error)
=> Unity3D games on Wayland are working now
=> Volatile Metadata fully supported and handled, making games like Starfield to just work.
=> More work on AVX support for RV64 & LA64. LA64 almost there, while RV64 has Scalar only support (no hardware vector support yet for AVX)
Version summary:
* Improved and fixed memory tracking
* Improved volatile metadata handling, and some light refactor on StrongMem emulation
* Improved handling of TF flag
* DynaCache: Introducing a way to cache on disk native generated code for faster startup time on subsequent release
* DynaCache: Support for all 3 backends ARM64, RV64 & LA64
* Interpreter: refactor opcodes decoding to have prefixes handled in a generic way
* Interpreter: many small fixes
* Dynarec: some optimisations in the jump table, to remove one memory fetch on each jump
* Dynarec: create infrastructure to be able to change easily the reg mapping
* Dynarec: optimised defered flag handling to limit cases where UpdateFlags is needed
* Dynarec: Introduced BOX64_DYNAREC_NOHOTPAGE to disable detection of hotpages
* Dynarec: ARM64: A few more opcode added
* Dynarec: ARM64: Some small fixes and better handling of undefined behavior in opcodes, as well as undefined opcodes
* Dynarec: ARM64: Implemented a Dynarec version of UpdateFlags, for improved performances
* Dynarec; ARM64: Fixes/Improved SSE_FLUSHTO0 support
* Dynarec: LA64: Added support for AVX (& friends) opcodes. Still need some debugging so AVX still disabled by default on LA64
* Dynarec: LA64: Changed register mapping to be closer to the x86_64 ABI
* Dynarec: LA64: RV64: Added limited support to SSE_FLUSHTO0
* Dynarec: RV64: Many fixes and improvments for MMX opcodes
* Dynarec: RV64: many Scalar version of AVX opcodes added
* Dynarec: Many fixes to various OpCodes, on all 3 backends
* WowBox64: Added minimal runtime, improved overall stability
* BOX32: Wrapper: many new functions added, plus many fixes
* BOX32: Improved memory hadnling, using 32bits personality and other tunning to get more reliable 32bits memory allocations
* BOX64: Wrapper: some more wrapped functions added, including wayland (for Unity games on Wayland) and vulkan (more extensions)
* BOX64: Wrapper: improved handling of some VarArg wrapped functions on non-ARM64 backend
* RCFILE: Fixed MAXCPU not working properly with Wine programs
* RCFILE: Generic Setup profile refined, and more games profile added
* Trace: Added support for current libZydis
v0.3.6
======
Highlights:
* This version introduces wowbox64.dll for Hangover; the ability to use the Volatile Metadata of Windows executables for x64 wine; and some better x87/SSE/AVX handling
=> WowBox64 can be built directly from Box64 repo, and can be found in the CI artifacts also
=> it also supports a subset of BOX64_XXXX settings, which can be set from command line or via a setting file ".box64rc" in the Wine prefix home
=> Volatile Metadata, when present, allows only applying strong memory ordering when needed, as marked by the compiler, giving overall better performances
=> The precision control bit of x87 is now handled, allowing some older games to run correctly
=> More work has been done in the handling of precise NaN and Round handling in SSE & AVX opcodes
Version summary:
* Added/fixed some Syscalls, helping Go programs
* Wrapper: more functions added, and some fixes too. Vulkan is 1.4 now, among other things
* Wrapper: Added a few more wrapped libs (like some avcodec and friends)
* Improve internal memory allocator (with a dedicated allocator for small memory allocations), and fixed some issues around it
* Improve internal mmaped file tracking
* Box32: Some small refactoring around memory management and internal memory allocations
* Box32: More functions wrapped
* Box32: More libraries wrapped
* ARM64: Added support for Atomic extension in many internal functions (not related to Dynarec).
* ARM64: Added support for CRC2 extension for internal CRC functions
* Interp: A few fixes to some opcodes, and better NAN handling on some selected SSE/AVX opcodes
* Interp: Added a few opcodes with exotic prefixes
* Dynarec: Introcude BOX64_DYNAREC_ROUND=2 to handle x87 precision control bit (ARM64 and RV64, LA64 still doesn't handle x87 yet)
* Dynarec: Some small optimizations on Strongmem emulation, making it more efficient
* Dynarec: Some speed optimizations on code that do SMC and waiting slot
* Dynarec: Added CALLRET=2 to improve call/ret optimization compatibility with SMC code
* Dynarec: ARM64: Various optimizations and fixes on some opcodes, especially AVX ones
* Dynarec: ARM64: Added missing FASTNAN=0 handling on some SSE/AVX opcodes
* Dynarec: ARM64: Added some exotic prefixed opcodes
* Dynarec: ARM64: Avoid purging XMM/YMM register on intra-block loop if possible
* Dynarec: RV64: Many fixes and improvments around x87 emulation
* Dynarec: RV64: Added some more missing opcodes, especially some LOCK prefixed ones and many MMX ones
* Dynarec: RV64: Various fixes on some existing opcodes
* Dynarec: RV64: Improved nativeflags handling, allowing for more cases to use it
* Dynarec: LA64: Added some more opcodes and MMX handling
* Dynarec: LA64: Various fixes to some existing opcodes
* Android: Improved signal handling, structure alignment, and transformation
* WowBox64: Created the dll, with RcFile, Env. Var. handling and log printout (both ARM64 Dynarec and Interpreter available)
* Cosim: Various fixes and improvements to limit false negatives and improve readability of logs
* RcFile: A few fixes for some values that would be ignored
v0.3.4
======
* This version is Faster and more compatible:
=> The RV64 backend got faster and more stable, with lots of RVV 1.0 / xThreadVector support to emulate SSE/SSE2+ opcode (no AVX yet)
=> On ARM64, Box64 now support more DRM types than before.
=> BOX32 can run steam now. At least on ARM64 backend, it's still not working on RV64 and LA64 for now.
* Added support to emulate Windows Syscall (needs Proton and a 48bits address space for now)
* Added BOX64_DYNAREC_DIRTY to have a faster (but less safe) way to handle code that write in it's current page
* Added a few rarely used opcodes
* Added experimental support for GDBJIT, that allow an x86/x86_64 program to be debugged on ARM/RV64/LA64 platform with x86 regs and opcode view (might generate a lot of file tho)
* Added support for Perf tools in a similar way if GDBJIT, to have an x86 fine view of the performances
* Reworked undefined flags for common operations, to be similar to real CPU
* Reworked cpuid handling, adding BOX64_CPUTYPE support to select Intel/AMD emulation (no 3DNow! support on AMD for now)
* Reworked ucontext link to be closer to the real thing (and make it more simple)
* Improved memory traking, file descriptor backed memory map, and detect wine loaded dll
* Introduced settings per library and dll (mostly for Dynarec)
* Wrapper: More functions addes, and some fixes too
* BOX32: Many fixes around pthreads wrapping
* BOX32: More functions wrapped.
* BOX32: More libraies wrapped.
* BOX32: Some reworks on how high memory (higher than 32bits) is masked, and can be used for Dynarec blocks.
* Dynarec: The usual batch of fixes, improvments and opcodes additions on all 3 supported backend
* Dynarec: Some fixes to NativeFlags handling, both on ARM64 and RV64
* Dynarec: Added optimized REP MOVSB (expected for default CPUTYPE=0, according to new cpuid return)
* Dynarec: LA64: more opcoded addes, using hardware extensions like AES
* Dynarec: RV64: More work on using RVV 1.0 and xTheadVector extension to emulate SSE/SSE2+ opcodes
* Dynarec: RV64: Added informations on flags when building blocks, to be used when a signal happens to rebuild a x86 context more accurate
* Dynarec: ARM64: Reworked undefined flags for common operations, to be similar to real CPU
* Dynarec: ARM64: Added informations on flags and xmm/ymm/x87 register when building blocks, to be used when a signal happens to rebuild a x86 context 100% accurate
* TRACE: Reworked how trace for wrapped function call is printed.
* TRACE: Reworked logs to prefix each line with a (optionaly colored) BOX32 or BOX64
* COSIM: Some rework on cosim to limit false negative, especialy when handling x87 operations
* LA64: Added limited support for ABI 1.0
* CI: github CI now also generate MiceWine .rat archive, along with Winlator .wcp archive and regular linux builds.
* RCFile: Added many new games profiles (both for speed improvment or for compatibilty)
v0.3.2
======
* Introduced Box32 to run 32bits apps on 64bits OS
+153 -48
View File
@@ -1,14 +1,16 @@
Compiling/Installing
----
If you don't want to compile box64 yourself and prefer to use third-party pre-build version, go to the [end of the document](#pre-build-packages) for alternatives.
If you don't want to compile box64 yourself and prefer to use third-party pre-build version, go to the [end of the document](#pre-built-packages) for alternatives.
You can also generate your own package using the [instructions below](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#debian-packaging).
Additional installation steps may be necessary when copying only the box64 executable file without running make install in cross-build environments. See [Cross-Compiling](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#Cross-Compiling)
## Per-platform compiling instructions
----
### The general approach
### The general approach is:
```
git clone https://github.com/ptitSeb/box64
cd box64
@@ -20,10 +22,30 @@ If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
- You can use `make -j1`, `make -j2` to prevent running out of memory
- You can also add `-DBAD_SIGNAL=ON` to the cmake command if you are on Linux Kernel mixed with Android, like on RK3588.
- You can use `make -j1`, `make -j2` with less jobs to prevent running out of memory
- You can also add `-DBAD_SIGNAL=ON` to the cmake command if you are on a Linux Kernel mixed with Android, like on RK3588.
### Note about Box32
If you want to build Box64 with the Box32 option, you will need to add `-DBOX32=ON` to the cmake command. That will enable 32bits process to be run with Box64.
If you also want binfmt integration on 32bits binaries, you also need to add `-DBOX32_BINFMT=ON` to the cmake command.
### Note about WowBox64
A highly experimantal subproject named WowBox64 has been added as a build option, add `-DWOW64=ON` to the cmake command to enable it.
It will build alongside the regular Box64, and produce a `wowbox64.dll` file in `build/wowbox64-prefix/src/wowbox64-build/` directory.
### Note about binfmt_misc on Android
[binfmt_misc](https://en.wikipedia.org/wiki/Binfmt_misc) is a capability of the Linux kernel which allows arbitrary executable file formats to be recognized and passed to certain user space applications such as Box64 usually used with systemd but systems like Android can't run/use systemd so you will need to register Box64 manually, this will also work inside a CHRoot.
```
sudo mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
sudo echo ':box64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/box64:' | sudo tee /proc/sys/fs/binfmt_misc/register
```
#### Example of generic ARM64 build for linux platforms
#### For Instance, if you want to build box64 for Generic ARM64 Linux platforms, it would look like this:
```
git clone https://github.com/ptitSeb/box64
cd box64
@@ -32,25 +54,37 @@ make -j4
sudo make install
sudo systemctl restart systemd-binfmt
```
#### Example of generic ARM64 build for linux platforms with full box32 integration
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -D ARM_DYNAREC=ON -D CMAKE_BUILD_TYPE=RelWithDebInfo -D BOX32=ON -D BOX32_BINFMT=ON
make -j4
sudo make install
sudo systemctl restart systemd-binfmt
```
----
#### for RK3399
Using a 64bit OS:
On a 64bit OS:
```
-D RK3399=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for RK3588 / RK3588S
Using a 64bit OS:
On a 64bit OS:
```
-D RK3588=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for Raspberry Pi 3
Warning, you need a 64bit OS:
On a 64bit OS:
If building on the Pi, you will also need a large swap (3 GB+)
[optionally reduce GPU memory to a minimum (e.g. 16 MB) using `raspi-config`
@@ -66,7 +100,7 @@ Still, this can be faster if your build is attended.
#### for Raspberry Pi 4
Warning, you need a 64bit OS:
On a 64bit OS:
```
-D RPI4ARM64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -80,7 +114,7 @@ Warning, you need a 64bit OS:
#### for TEGRA X1
Using a 64bit OS:
On a 64bit OS:
```
-D TEGRAX1=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -88,7 +122,7 @@ Using a 64bit OS:
#### for Jetson Xavier/T194
Using a 64bit OS:
On a 64bit OS:
```
-D TEGRA_T194=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -96,16 +130,32 @@ Using a 64bit OS:
#### for Jetson Orin/T234
Using a 64bit OS:
On a 64bit OS:
Caution: please use gcc-11 or higher, older gcc doesn't know cortex-a78ae
Note: use gcc-11 or higher, older gcc doesn't know cortex-a78ae
```
-D TEGRA_T234=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for DGX Spark/GB10 based devices
On a 64bit OS:
Note: Requires GCC 15.2.0 or higher. Older GCC versions do not support gb10, cortex-a725, or cortex-x925.
For GCC 14 or older, you can use the following march equivalent:
```
-march=armv9.2-a+crc+sve2-aes+sve2-bitperm+sve2-sha3+sve2-sm4+memtag+profile
```
With GCC 15.2.0 or higher:
```
-D NVIDIA_GB10=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for ODROID N2/N2+
Using a 64bit OS:
On a 64bit OS:
```
-D ODROIDN2=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -113,30 +163,38 @@ Using a 64bit OS:
#### for Snapdragon
Using a 64bit OS:
On a 64bit OS:
Targeting Snapdragon 845:
```
-D SD845=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
or
Targeting Snapdragon 888:
```
-D SD888=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
Depending how recent your Snapdragon is
Targeting Snapdragon 8 Elite Gen 5:
```
-D SD8EG5=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
Depending on how recent your Snapdragon is
#### for Phytium
Using a 64bit OS:
On a 64bit OS:
```
-D PHYTIUM=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for ADLink machines
Using a 64bit OS:
On a 64bit OS:
```
-D ADLINK=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
@@ -151,7 +209,7 @@ Only test on Asahi with Fedora, using the default "16K page" kernel
#### for LoongArch
Using a 64bit OS:
On a 64bit OS:
```
-D LARCH64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -159,7 +217,7 @@ Using a 64bit OS:
#### for RISC-V
Using a 64bit OS:
On a 64bit OS:
```
-D RV64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -167,7 +225,7 @@ Using a 64bit OS:
#### for PowerPC 64 LE
Using a 64bit OS:
On a 64bit OS:
```
-D PPC64LE=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -175,7 +233,7 @@ Using a 64bit OS:
#### for LX2160A
Using a 64bit OS:
On a 64bit OS:
```
-D LX2160A=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -183,7 +241,7 @@ Using a 64bit OS:
#### for Termux
You must have ARM64 Device for build box64.
You must have ARM64 machine to build box64.
##### in CHRoot/PRoot
@@ -193,15 +251,16 @@ You must have ARM64 Device for build box64.
##### in Termux (Native)
NOTE: BUILDING BOX64 IN TERMUX NATIVE IS EXPERIMENTAL AND DOESN'T GONNA RUN LINUX BINARIES IN NATIVE TERMUX BOX64!!!
Note: Box64 in native termux is experimental and won't run linux binaries!
You also needed have `libandroid-sysv-semaphore` and `libandroid-spawn` libraries:
You also need `libandroid-sysv-semaphore` and `libandroid-spawn` libraries.
```
-D TERMUX=1 -DCMAKE_C_COMPILER=clang -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
#### for x86_64 Linux
```
-D LD80BITS=1 -D NOALIGN=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
```
@@ -215,58 +274,60 @@ Alternatively, you can **use the curses-based ccmake (or any other gui frontend
### Customize your build
#### Use ccache if you have it
#### Use ccache when present
Add `-DUSE_CCACHE=1` if you have ccache (it's better if you plan to touch the sources)
Add `-DUSE_CCACHE=1` option if you have ccache and plan to touch the sources.
#### To have some debug info
#### Include debug information
The `-DCMAKE_BUILD_TYPE=RelWithDebInfo` argument makes a build that is both optimized for speed, and has debug information embedded. That way, if you have a crash or try to analyse performance, you'll have some symbols.
Add `-DCMAKE_BUILD_TYPE=RelWithDebInfo` option for an optimized build with debug information embedded. That way, if you want to debug a crash or analyze performance, you have symbols.
#### To have a Trace Enabled build
#### Build with trace
To have a trace enabled build (***the interpreter will be slightly slower***), add `-DHAVE_TRACE=1`. But you will need to have the [Zydis library](https://github.com/zyantific/zydis) in your `LD_LIBRARY_PATH` or in the system library folders at runtime. Use version v3.2.1, as later version changed the API and will no longer work with box64
To have a trace enabled build (***the interpreter will be slightly slower***), add `-DHAVE_TRACE=1`. You will need the [Zydis library](https://github.com/zyantific/zydis) devel package installed (`apt install libzydis-dev` on Debian for example).
#### To have ARM Dynarec
#### Build DynaRec
Dynarec is only available on ARM (for the meantime), Activate it by using `-DARM_DYNAREC=1`.
Add `-D ARM_DYNAREC=ON` option to enable DynaRec on ARM machines.
Add `-D RV64_DYNAREC=ON` option to enable DynaRec on RV64 machines.
Add `-D LARCH64_DYNAREC=ON` option to enable DynaRec on LARCH64 machines.
#### To have a build using less memory
#### Save memory at run time
You can use `-DSAVE_MEM` to have a build that will try to save some memory. It's, for now, only increasing the jumptable from 4 level to 5 levels. The added granularity avoid wasting space, but the 1 level more to the jumptable means there is on read from memory more when jumping between blocks.
You can use `-DSAVE_MEM` to have a build that will try to save some memory. For now, it only increases the jumptable from 4 levels to 5. The added granularity avoids wasting space, but adds one more read from memory when jumping between blocks.
#### Not building from a git clone
#### Build outside of a git repo
If you are not building from a git clone (for example, downloading a release source code zip from github), you need to use `-DNOGIT=1` from cmake to be able to build (box64 uses git SHA1 to show last commit in version number).
Box64 uses git SHA1 to show last commit in version number, use `-DNOGIT=1` option when building outside of a git repo (for example, downloading a release source code zip from github).
#### Use faster linker
You need to add `-DWITH_MOLD=1` if GNU ld is extremely slow. Then run `mold -run make -j4` to build (make sure [Mold](https://github.com/rui314/mold) is installed).
Add `-DWITH_MOLD=1` option when GNU ld is extremely slow. Then run `mold -run make -j4` to build (make sure [Mold](https://github.com/rui314/mold) is installed).
#### Build a statically linked box64
You can now build box64 statically linked, with `-DSTATICBUILD`. This is to use inside an x86_64 chroot. Note that this version of box64 will have just the minimum of wrapped libs. So only libc, libm and libpthread basically are wrapped. Other libs (like libGL or libvulkan, SDL2, etc...) will not be wrapped and x86_64 version will be used. It's designed to be used in docker image, or in headless server.
Also, the Static Build is highly experimental, but feedback are always welcomed.
You can now build box64 statically linked, with `-DSTATICBUILD` to use inside of a x86_64 chroot. Note that this version of box64 will only have the minimal wrapped libs, such as libc, libm and libpthread. Other libs (like libGL or libvulkan, SDL2, etc...) will use x86_64 versions. A static build is intended to be used in a docker image, or in a headless server. It is highly experimental, but feedback is always welcome.
----
## Testing
----
A few tests are included with box64.
They can be launched using the `ctest` command.
The tests are very basic and only tests some functionality for now.
The tests are very basic and only test some functionality for now.
----
## Debian Packaging
----
Box64 can also be packaged into a .deb file ***using the source code zip from the releases page*** with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`. Configure any additional cmake options you might want in `debian/rules`.
## Pre-build packages
----
Box64 can also be packaged into a .deb file ***using the source code zip from the releases page*** with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`. Configure any additional cmake options you want in `debian/rules`.
## Pre-built packages
### Debian-based Linux
You can use the [Pi-Apps-Coders apt repository](https://github.com/Pi-Apps-Coders/box64-debs) to install precompiled box64 debs, updated every 24 hours.
```
@@ -296,3 +357,47 @@ Signed-By: /usr/share/keyrings/box64-archive-keyring.gpg" | sudo tee /etc/apt/so
sudo apt update
sudo apt install box64-generic-arm -y
```
## Cross-Compiling
----
### Set Up the Cross-Compiler
For example, to compile Box64 for RISC-V on an x86 machine, you can get prebuilt GNU toolchain from the [riscv-gnu-toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/releases)
### Run CMake with Cross-Compilation Options
Follow the per-platform compilation instructions to configure the CMake options for your target architecture.
In particular, you must specify the cross-compiler. For example:
```
-DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc # Or whichever cross-compiler you use
```
Be aware of potential glibc capability errors when choosing a cross-compiler.
To avoid this, run `ldd --version` on your target machine to check its glibc version.
### Running tests with QEMU (optional)
To do a quick check, run:
```
qemu-riscv64 -L path/to/your/riscv64/sysroot box64 --help
```
You can run `dirname $(find -name libc.so.6)` to determine whether sysroot is provided by the prebuilt GNU toolchain or not.
To run CTest-based tests under QEMU:
```
ctest -j$(nproc)
```
### Installing on the Target Machine
After successfully cross-compiling, copy the box64 executable to your RISC-V device. Note that simply copying the binary does not automatically install Box64’s shared libraries. Because `make install` does not run on the target during cross-compilation, libraries required for emulation may be missing.
To resolve this, copy the shared libraries folder from the Box64 repository (`x64lib` or `x86lib`) to your target device, then rename it and place it in the appropriate library search path (e.g., `/usr/lib`).
For `x86_64`:
```shell
$ mv x64lib box64-x86_64-linux-gnu
$ mv box64-x86_64-linux-gnu /usr/lib
```
For `i386`:
```shell
$ mv x86lib box64-i386-linux-gnu
$ mv box64-i386-linux-gnu /usr/lib
```
+19
View File
@@ -0,0 +1,19 @@
# The guide on running Steam with Box64
Steam works with Box64, both Linux version and Windows version. Systems with less than 6GB RAM may need a swap file for optimal performance.
## Install and run Linux Steam
Linux Steam requires Box86 or Box32 and it's binfmt enabled, check [Compilation Instructions](COMPILE.md) for details.
```bash
# This file can be found in the project root directory
./install_steam.sh
# And then, just run
steam
```
## Install and run Windows Steam
It's simple, just download it from Steam website and install it like other Windows applications.
+903 -426
View File
File diff suppressed because it is too large. Load diff
+55
View File
@@ -0,0 +1,55 @@
# The guide on using Wine with Box64
<ins>W</ins>ine <ins>I</ins>s <ins>N</ins>ot an <ins>E</ins>mulator, but Box64 is. Box64 supports Wine in multiple ways. Before continuing reading, you should have a basic understanding of Wine.
## Wine variants
Wine ships in multiple forms:
1. **x86 Wine**
The executable architecture of **x86 Wine** is x86, and it runs x32 Windows executables.
**x86 Wine** requires a 32-bit environment (read 32-bit Linux libraries), which is usually available on x86_64 machines because of the nature of the architecture.
However, when you try to run it via an emulator on RISC architectures, the situation is a bit different. For Arm64, there is armhf, which is a 32-bit environment, and there is also Box86, which is made for armhf, so you can use Box86 to run **x86 Wine**.
However, for RISC-V 64, LoongArch64, and many newer Arm64 cores, a 32-bit environment is not available. Box64 introduced a new mode called Box32, which can be enabled at compile time via a CMake option `BOX32`. It essentially emulates a 32-bit environment using the 64-bit environment, so it can be used to run **x86 Wine**. But be aware that Box32 is still highly experimental and unstable.
2. **x86_64 Wine**
The executable architecture of **x86_64 Wine** is x86_64, and it runs x64 Windows executables.
It can be used with Box64. Note that **x86_64 Wine** usually ships with **x86 Wine** included. So you can use a combination of Box86 + Box64 or Box64 alone with Box32 enabled to run both x32 and x64 executables seamlessly.
3. **x86_64 Wine WOW64**
The executable architecture of **x86_64 Wine WOW64** is x86_64, and it runs both x32 and x64 Windows executables.
What's great about **x86_64 Wine WOW64** is that it does not require a 32-bit environment for x32 Windows executable, as the 32-bit environment emulation is taken care of by Wine WOW64 itself.
That means you can just use Box64 (without Box32) to run x32 Windows executables. However, the downside is that the performance of WineD3D is pretty bad for 32-bit (use DXVK!).
4. **Arm64 Wine WOW64**
The executable architecture of **Arm64 Wine WOW64** is Arm64, and it runs
x32, x64, Arm32, Arm64 Windows executables.
However, to run x32 and x64 ones, a cpu.dll is required, known as the
WOW64 (for 32-bit) and Arm64EC (for 64-bit).
Box64 now supports 32-bit WOW64 DLL. You can have it compiled by enabling the `WOW64` CMake option. And we plan to support Arm64EC in the future.
## Wine installation
For x86 Wines, there are plenty of places to download, to name a few:
- https://github.com/Kron4ek/Wine-Builds (Wine \[WOW64\])
- https://github.com/GloriousEggroll/proton-ge-custom (Proton, known as the Valve-optimized Wine)
After the download, just add the `bin` folder to your path in any way you like; Wine should work with Box64 just fine.
To install components like DXVK, d3dcompiler_xx, or cjkfonts, it's recommended to use Winetricks: https://github.com/Winetricks/winetricks
For Arm64 Wines, use of Hangover is recommended: https://github.com/AndreRH/hangover.
-177
View File
@@ -1,177 +0,0 @@
# Installing Wine64
Running Wine64/Wine with Box64/Box86 allows x64/x86 Windows programs to run on 64-bit ARM Linux devices.
- Box64 needs `wine-amd64` to be installed **manually** on ARM64 (aarch64) devices. This will run 64-bit Windows programs (aka x86_64).
- Box86 needs `wine-i386` to be installed **manually** on ARM32 (armhf) devices (or on ARM64 with multiarch or chroot). This will run 32-bit Windows programs (aka x86).
- _Note that `wine:arm64` and `wine:armhf` will not work with Box64/Box86. Your device's package manager might try to install those if you ask it to install wine._
See installation steps below (in the [Examples](#examples) section).
## Overview
The general procedure for installing Wine64 & Wine for Box64 & Box86 is to...
- Download all the install files for the version of Wine you wish to install
- Unzip or dpkg the install files into one folder
- Move that folder to the directory that you wish Wine to run from (often `~/wine/` by default)
- Go to `/usr/local/bin` and make symlinks or scripts that will point to your main wine binaries.
- Boot wine to create a new wineprefix.
- Download winetricks (which is just a complicated bash script), make it executable, then copy it to `/usr/local/bin`.
## Examples
### Installing Wine64 & Wine for Box64 & Box86 on Raspberry Pi OS from WineHQ .deb files
_Links from the [WineHQ repo](https://dl.winehq.org/wine-builds/debian/dists/)_
This install method allows you to install different versions of Wine64/Wine. You may install any version/branch of Wine that you wish.
```
# NOTE: Can only run on aarch64 (since box64 can only run on aarch64)
# box64 runs wine-amd64, box86 runs wine-i386.
### User-defined Wine version variables ################
# - Replace the variables below with your system's info.
# - Note that we need the amd64 version for Box64 even though we're installing it on our ARM processor.
# - Note that we need the i386 version for Box86 even though we're installing it on our ARM processor.
# - Wine download links from WineHQ: https://dl.winehq.org/wine-builds/
local branch="devel" #example: devel, staging, or stable (wine-staging 4.5+ requires libfaudio0:i386)
local version="7.1" #example: "7.1"
local id="debian" #example: debian, ubuntu
local dist="bullseye" #example (for debian): bullseye, buster, jessie, wheezy, ${VERSION_CODENAME}, etc
local tag="-1" #example: -1 (some wine .deb files have -1 tag on the end and some don't)
########################################################
# Clean up any old wine instances
wineserver -k # stop any old wine installations from running
rm -rf ~/.cache/wine # remove any old wine-mono/wine-gecko install files
rm -rf ~/.local/share/applications/wine # remove any old program shortcuts
# Backup any old wine installs
rm -rf ~/wine-old 2>/dev/null; mv ~/wine ~/wine-old 2>/dev/null
rm -rf ~/.wine-old 2>/dev/null; mv ~/.wine ~/.wine-old 2>/dev/null
sudo mv /usr/local/bin/wine /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wine64 /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wineboot /usr/local/bin/wineboot-old 2>/dev/null
sudo mv /usr/local/bin/winecfg /usr/local/bin/winecfg-old 2>/dev/null
sudo mv /usr/local/bin/wineserver /usr/local/bin/wineserver-old 2>/dev/null
# Wine download links from WineHQ: https://dl.winehq.org/wine-builds/
LNKA="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-amd64/" #amd64-wine links
DEB_A1="wine-${branch}-amd64_${version}~${dist}${tag}_amd64.deb" #wine64 main bin
DEB_A2="wine-${branch}_${version}~${dist}${tag}_amd64.deb" #wine64 support files (required for wine64 / can work alongside wine_i386 main bin)
#DEB_A3="winehq-${branch}_${version}~${dist}${tag}_amd64.deb" #shortcuts & docs
LNKB="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-i386/" #i386-wine links
DEB_B1="wine-${branch}-i386_${version}~${dist}${tag}_i386.deb" #wine_i386 main bin
DEB_B2="wine-${branch}_${version}~${dist}${tag}_i386.deb" #wine_i386 support files (required for wine_i386 if no wine64 / CONFLICTS WITH wine64 support files)
#DEB_B3="winehq-${branch}_${version}~${dist}${tag}_i386.deb" #shortcuts & docs
# Install amd64-wine (64-bit) alongside i386-wine (32-bit)
echo -e "Downloading wine . . ."
wget -q ${LNKA}${DEB_A1}
wget -q ${LNKA}${DEB_A2}
wget -q ${LNKB}${DEB_B1}
echo -e "Extracting wine . . ."
dpkg-deb -x ${DEB_A1} wine-installer
dpkg-deb -x ${DEB_A2} wine-installer
dpkg-deb -x ${DEB_B1} wine-installer
echo -e "Installing wine . . ."
mv wine-installer/opt/wine* ~/wine
# Download wine dependencies
# - these packages are needed for running box86/wine-i386 on a 64-bit RPiOS via multiarch
sudo dpkg --add-architecture armhf && sudo apt-get update # enable multi-arch
sudo apt-get install -y libasound2:armhf libc6:armhf libglib2.0-0:armhf libgphoto2-6:armhf libgphoto2-port12:armhf \
libgstreamer-plugins-base1.0-0:armhf libgstreamer1.0-0:armhf libldap-2.4-2:armhf libopenal1:armhf libpcap0.8:armhf \
libpulse0:armhf libsane1:armhf libudev1:armhf libusb-1.0-0:armhf libvkd3d1:armhf libx11-6:armhf libxext6:armhf \
libasound2-plugins:armhf ocl-icd-libopencl1:armhf libncurses6:armhf libncurses5:armhf libcap2-bin:armhf libcups2:armhf \
libdbus-1-3:armhf libfontconfig1:armhf libfreetype6:armhf libglu1-mesa:armhf libglu1:armhf libgnutls30:armhf \
libgssapi-krb5-2:armhf libkrb5-3:armhf libodbc1:armhf libosmesa6:armhf libsdl2-2.0-0:armhf libv4l-0:armhf \
libxcomposite1:armhf libxcursor1:armhf libxfixes3:armhf libxi6:armhf libxinerama1:armhf libxrandr2:armhf \
libxrender1:armhf libxxf86vm1 libc6:armhf libcap2-bin:armhf # to run wine-i386 through box86:armhf on aarch64
# This list found by downloading...
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/wine-devel-i386_7.1~bullseye-1_i386.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/winehq-devel_7.1~bullseye-1_i386.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/wine-devel_7.1~bullseye-1_i386.deb
# then `dpkg-deb -I package.deb`. Read output, add `:armhf` to packages in dep list, then try installing them on Pi aarch64.
# - these packages are needed for running box64/wine-amd64 on RPiOS (box64 only runs on 64-bit OS's)
sudo apt-get install -y libasound2:arm64 libc6:arm64 libglib2.0-0:arm64 libgphoto2-6:arm64 libgphoto2-port12:arm64 \
libgstreamer-plugins-base1.0-0:arm64 libgstreamer1.0-0:arm64 libldap-2.4-2:arm64 libopenal1:arm64 libpcap0.8:arm64 \
libpulse0:arm64 libsane1:arm64 libudev1:arm64 libunwind8:arm64 libusb-1.0-0:arm64 libvkd3d1:arm64 libx11-6:arm64 libxext6:arm64 \
ocl-icd-libopencl1:arm64 libasound2-plugins:arm64 libncurses6:arm64 libncurses5:arm64 libcups2:arm64 \
libdbus-1-3:arm64 libfontconfig1:arm64 libfreetype6:arm64 libglu1-mesa:arm64 libgnutls30:arm64 \
libgssapi-krb5-2:arm64 libjpeg62-turbo:arm64 libkrb5-3:arm64 libodbc1:arm64 libosmesa6:arm64 libsdl2-2.0-0:arm64 libv4l-0:arm64 \
libxcomposite1:arm64 libxcursor1:arm64 libxfixes3:arm64 libxi6:arm64 libxinerama1:arm64 libxrandr2:arm64 \
libxrender1:arm64 libxxf86vm1:arm64 libc6:arm64 libcap2-bin:arm64
# This list found by downloading...
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-amd64/wine-devel_7.1~bullseye-1_amd64.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-amd64/wine-devel-amd64_7.1~bullseye-1_amd64.deb
# then `dpkg-deb -I package.deb`. Read output, add `:arm64` to packages in dep list, then try installing them on Pi aarch64.
# These packages are needed for running wine-staging on RPiOS (Credits: chills340)
sudo apt install libstb0 -y
cd ~/Downloads
wget -r -l1 -np -nd -A "libfaudio0_*~bpo10+1_i386.deb" http://ftp.us.debian.org/debian/pool/main/f/faudio/ # Download libfaudio i386 no matter its version number
dpkg-deb -xv libfaudio0_*~bpo10+1_i386.deb libfaudio
sudo cp -TRv libfaudio/usr/ /usr/
rm libfaudio0_*~bpo10+1_i386.deb # clean up
rm -rf libfaudio # clean up
# Install symlinks
sudo ln -s ~/wine/bin/wine /usr/local/bin/wine
sudo ln -s ~/wine/bin/wine64 /usr/local/bin/wine64
sudo ln -s ~/wine/bin/wineboot /usr/local/bin/wineboot
sudo ln -s ~/wine/bin/winecfg /usr/local/bin/winecfg
sudo ln -s ~/wine/bin/wineserver /usr/local/bin/wineserver
sudo chmod +x /usr/local/bin/wine /usr/local/bin/wine64 /usr/local/bin/wineboot /usr/local/bin/winecfg /usr/local/bin/wineserver
```
## Installing winetricks
Winetricks is a bash script which makes it easier to install & configure any desired Windows core system software packages which may be dependencies for certain Windows programs. You can either install it with `apt`, or manually using the steps below.
```
sudo apt-get install cabextract -y # winetricks needs this installed
sudo mv /usr/local/bin/winetricks /usr/local/bin/winetricks-old # Backup old winetricks
cd ~/Downloads && wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks # Download
sudo chmod +x winetricks && sudo mv winetricks /usr/local/bin/ # Install
```
Whenever we run winetricks, we must tell Box86 to supress its info banner, otherwise winetricks will crash. Box86's info banner can be suppressed using the `BOX86_NOBANNER=1` environment variable before invoking winetricks (example: `BOX86_NOBANNER=1 winetricks`).
If `apt` installed a desktop menu shortcut for winetricks (or if you make your own desktop shortcut for winetricks) then you may need to edit that shortcut to include Box86's BOX86_NOBANNER=1 env var. With your favorite text editor, edit `/usr/share/applications/winetricks.desktop` and change `Exec=winetricks --gui` to `Exec=env BOX86_NOBANNER=1 winetricks --gui`.
## Example commands
Creating a 64-bit wineprefix:
`wine64 wineboot` or `wine wineboot` (wineprefix is created in `~/.wine/`)
`WINEPREFIX="$HOME/prefix64" wine wineboot` (wineprefix is created in `~/prefix64/`) _Note: You will need to invoke `WINEPREFIX="$HOME/prefix64"` before every command to use this wineprefix._
Creating a 32-bit wineprefix:
`WINEARCH=win32 wine wineboot` (wineprefix is created in `~/.wine/`)
Fore-quitting wine:
`wineserver -k`
Running Wine Configuration:
`winecfg`
Using winetricks:
`winetricks -q corefonts vcrun2010 dotnet20sp1`
_This command will silently install three packages in series: Windows core fonts, VC++ 2010 Runtimes, and .NET 2.0 SP1. `-q` is the "install silent/quiet" command._
Invoking Box86's logging features (with `BOX86_LOG=1` or similar) will cause winetricks to crash.
For a list of all the different Windows packages & libraries that winetricks can help you install, run `winetricks list-all`
## Other notes
### Wineprefixes (and Wine initialization)
When you first run or boot Wine (`wine wineboot`), Wine will create a new user environment within which to install Windows software. This user environment is called a "wineprefix" (or "wine bottle") and is located (by default) in `~/.wine` (note that Linux folders with a `.` in front of them are "hidden" folders). Think of a wineprefix as Wine's virtual 'harddrive' where it installs software and saves settings. Wineprefixes are portable and deletable. For more Wine documentation, see [WineHQ](https://www.winehq.org/documentation).
If you at any point corrupt something inside your default wineprefix, you can start "fresh" by deleting your `~/.wine` directory (with the `rm -rf ~/.wine` command) and boot wine again to create a new default wineprefix.
### Transplanting wineprefixes
If software isn't installing in Wine with Box86, but is installing for you in Wine on a regular x86 Linux computer, you can copy a wineprefix from your x86 Linux computer to the device you're running Box86 on. This is most easily done by tarring the `~/.wine` folder on your x86 Linux computer (`tar -cvf winebottle.tar ~/.wine`), transferring the tar file to your device, then un-tarring the tar file (`tar -xf winebottle.tar`) on your device running Box86 & Wine. Tarring the wineprefix preserves any symlinks that are inside it.
### Swapping out different versions of Wine
Some versions of Wine work better with certain software. It is best to install a version of Wine that is known to work with the software you would like to run. There are three main development branches of Wine you can pick from, referred to as wine-stable, wine-devel, and wine-staging. _Note that the wine-staging branch requires extra installation steps on Raspberry Pi._
Your entire Wine installation can reside within a single folder on your Linux computer. TwisterOS assumes that your Wine installation is located inside the `~/wine/` directory. The actual directory where you put your `wine` folder doesn't matter as long as you have symlinks within the `/usr/local/bin/` directory which point to the `wine` folder so that Linux can find Wine when you type `wine` into the terminal).
You can change which version of Wine you are running simply by renaming your old `wine` and `.wine` folders to something else, then putting a new `wine` folder (containing your new version of Wine) in its place. Running `wine wineboot` again will migrate a wineprefix from an older version of Wine to be usable by the newer version of Wine you just installed. You can check which version of Wine you're running with the `wine --version` command.
+790 -278
View File
File diff suppressed because it is too large. Load diff
+330
View File
@@ -0,0 +1,330 @@
# Usage: python gen.py
import json
import os
import re
from collections import defaultdict
script_dir = os.path.dirname(os.path.abspath(__file__))
usage_file = os.path.join(script_dir, 'usage.json')
with open(usage_file, 'r') as file:
data = json.load(file)
with open(os.path.join(script_dir, '../USAGE.md'), 'w') as md_file:
md_file.write("""<!--- This file is generated by gen.py, do not edit it directly. -->
Usage
----
There are many environment variables to control Box64's behaviour, which will be listed below by category.
There are 2 types of Box64 builds: the Wine WOW64 build (WowBox64) and the regular Linux build. Beware only some of the environment variables are available in WowBox64.
### Configuration files
In addition to environment variables, if you're using the regular Linux build, Box64 also looks for 2 places for rcfile by default: the system-wide `/etc/box64.box64rc` and user-specific `~/.box64rc`.
While in WowBox64, the configuration file is checked at `%USERPROFILE%/.box64rc` only.
Settings priority follows this order (from highest to lowest): `~/.box64rc` > `/etc/box64.box64rc` > environment variables.
Example configuration:
```
[factorio]
BOX64_DYNAREC_SAFEFLAGS=0
BOX64_DYNAREC_BIGBLOCK=2
BOX64_DYNAREC_FORWARD=1024
BOX64_DYNAREC_CALLRET=1
```
This configuration will apply the specified settings application-wide to any executable named `factorio`.
### Advanced usage for Linux build
1. **Wildcard Matching**
Asterisks (`*`) can be used for basic pattern matching in application names. For instance, `[*setup*]` will match any program containing "setup" in its name. Note this implements simple wildcard matching rather than full regex support.
2. **Custom Configuration File**
The `BOX64_RCFILE` environment variable can specify an alternative configuration file instead of the default `/etc/box64.box64rc`.
3. **Per-File Settings**
Sections starting with `/` apply to specific files. For example:
```
[/d3d9.dll]
BOX64_DYNAREC_SAFEFLAGS=0
```
These settings will only affect the `d3d9.dll` file. This syntax also works for **emulated** Linux libraries, e.g., `[/libstdc++.so.6]`.
----
""")
categories = defaultdict(list)
for entry in data:
categories[entry["category"]].append(entry)
# Put "Performance" at the top, then sort the rest alphabetically
sorted_categories = sorted(categories.items(), key=lambda x: (x[0] != "Performance", x[0]))
for category, entries in sorted_categories:
md_file.write(f"## {category}\n\n")
for entry in entries:
md_file.write(f"### {entry['name']}\n\n{entry['description']}{' Available in WowBox64.' if entry['wine'] else ''}\n\n")
for option in entry['options']:
md_file.write(f" * {option['key']}: {option['description']} {'[Default]' if option['default'] else ''}\n")
md_file.write("\n")
with open(os.path.join(script_dir, '../box64.pod'), 'w') as pod_file:
pod_file.write("""=head1 NAME
box64 - Linux Userspace x86_64 Emulator with a twist
=head1 SYNOPSIS
B<box64> [B<--help>] [B<--version>] I<executable>
=head1 DESCRIPTION
B<Box64> lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux
systems, like ARM (host system needs to be 64-bit little-endian). Since B<Box64>
uses the native versions of some "system" libraries, like libc, libm, SDL, and
OpenGL, it's easy to integrate and use with most applications, and performance
can be surprisingly high in many cases. B<Box64> integrates with DynaRec (dynamic
recompiler) for the ARM64 platform, providing a speed boost between 5 to 10
times faster than using only the interpreter.
=head1 OPTIONS
=over 8
=item B<-h,--help>
Print box64 help and quit.
=item B<-v,--version>
Print box64 version and quit.
=back
=head1 BRIEF USAGE
There are many environment variables to control B<Box64>'s behaviour. In
addition to environment variables, B<Box64> also looks for 2 places for rcfile:
F</etc/box64.box64rc> and F<~/.box64rc>, in the format of .ini files.
Settings priority: F<~/.box64rc> > F</etc/box64.box64rc> > environment variables.
Example:
[factorio]
BOX64_DYNAREC_SAFEFLAGS=0
BOX64_DYNAREC_BIGBLOCK=2
BOX64_DYNAREC_FORWARD=1024
BOX64_DYNAREC_CALLRET=1
=head1 ENVIRONMENT VARIABLES
=over 8
""")
for entry in data:
pod_file.write(f"\n=item B<{entry['name']}> =I<{ '|'.join(option['key'] for option in entry['options']) }>\n\n{entry['description']}{' Available in WowBox64.' if entry['wine'] else ''}\n\n")
for option in entry['options']:
pod_file.write(f" * {option['key']} : {option['description']} {'[Default]' if option['default'] else ''}\n")
pod_file.write("\n")
pod_file.write("""
=back
=cut
""")
####################
# Validation
####################
PADDING = 30
INCLUDE_BLANK = False
def get_usage_entry(usage, define):
entry = list(e for e in usage if e["name"] == define)
if len(entry) == 0:
print(f"{define:<{PADDING}}: missing usage.json entry")
elif len(entry) > 1:
print(f"{define:<{PADDING}}: multiple usage entries found", len(entry))
else:
return entry[0]
return None
# check `default` uniqueness
for entry in data:
i = list(d["default"] for d in entry["options"]).count(True)
if i > 1:
print(f"{entry['name']:<{PADDING}}: multiple default values usage.json")
# regex to match env.h C code
regex = {
"INTEGER": re.compile(
r"^\s*INTEGER\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<min>\w+), (?P<max>\w+), (?P<wine>\w+)\)"
),
"INTEGER64": re.compile(
r"^\s*INTEGER64\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<wine>\w+)\)"
),
"BOOLEAN": re.compile(
r"^\s*BOOLEAN\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<wine>\w+)\)"
),
"ADDRESS": re.compile(r"^\s*ADDRESS\((?P<define>\w+), (?P<name>\w+), (?P<wine>\w+)\)"),
"STRING": re.compile(r"^\s*STRING\((?P<define>\w+), (?P<name>\w+), (?P<wine>\w+)\)"),
}
env_file = os.path.join(script_dir, "../../src/include/env.h")
with open(env_file, "r") as file:
matches = {}
for line in file.readlines():
for t, r in regex.items():
m = r.search(line)
if m:
# filter out comments and other non useful code
if m.group("define") == "NAME":
continue
if t not in matches:
matches[t] = {}
if (m.group("define") in matches[t]):
# multiple definitions, no default
matches[t][m.group("define")]['no_default'] = True
break
matches[t][m.group("define")] = m.groupdict()
matches[t][m.group("define")]['no_default'] = False
for define, m in matches["INTEGER"].items():
name = m["name"]
default = None if m["no_default"] or not m["default"].isdigit() else int(m["default"])
min = int(m["min"])
max = int(m["max"])
# Check default in valid range
if default and (default < min or default > max):
print(f"{define:<{PADDING}}: default lays outside of min/max range")
# Check consistency with usage.json
if e := get_usage_entry(data, define):
# guess min/max values if possible
min2 = max2 = None
# blank means that the entry has an 'XXXX' entry which usually indicated that arbitrary values are valid
blank = False
default2 = None
if int(m["wine"]) != int(e["wine"]):
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
for o in e["options"]:
if o["key"] == "XXXX":
blank = True
continue
val = int(o["key"]) # not supposed to fail
min2 = min2 if min2 is not None and min2 < val else val
max2 = max2 if max2 is not None and max2 > val else val
if o["default"]:
default2 = val
if min2 and min2 != min:
if not blank or (blank and INCLUDE_BLANK):
print(
f"{define:<{PADDING}}: min value mismatch: env.h={min}, usage.json={min2}{(' (possible false positive)' if blank else '')}"
)
if max2 and max2 != max:
if not blank or (blank and INCLUDE_BLANK):
print(
f"{define:<{PADDING}}: max value mismatch: env.h={max}, usage.json={max2}{(' (possible false positive)' if blank else '')}"
)
if default2 != default:
print(
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
)
for define, m in matches['INTEGER64'].items():
# similar to INTEGER but without min/max
name = m["name"]
default = None if m["no_default"] or not m["default"].isdigit() else int(m["default"])
# Check consistency with usage.json
if e := get_usage_entry(data, define):
default2 = None
if int(m["wine"]) != int(e["wine"]):
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
for o in e["options"]:
if o["key"] == "XXXX":
continue
val = int(o["key"])
if o["default"]:
default2 = val
if default2 != default:
print(
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
)
for define, m in matches["BOOLEAN"].items():
name = m["name"]
default = None if m["no_default"] or m["default"] not in ["0", "1"] else bool(m["default"])
# Check consistency with usage.json
if e := get_usage_entry(data, define):
default2 = None
if int(m["wine"]) != int(e["wine"]):
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
for o in e["options"]:
try:
val = bool(o["key"])
except ValueError:
print(f"{define:<{PADDING}}: failed to parse boolean {o['key']}")
if o["default"]:
default2 = val
if default2 != default:
print(
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
)
# ADDRESS and STRING are not that interesting
for define, m in matches["ADDRESS"].items():
if e := get_usage_entry(data, define):
if int(m["wine"]) != int(e["wine"]):
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
for define, m in matches["STRING"].items():
# skip BOX64_ENV[1-5] entries, they mismatch but this is fine
if define.startswith("BOX64_ENV"):
continue
if e := get_usage_entry(data, define):
if int(m["wine"]) != int(e["wine"]):
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
# check that everything from usage.json is in env.h
for e in data:
define = e["name"]
# skip BOX64_ENV[1-5] entries, they mismatch but this is fine
if define.startswith("BOX64_ENV"):
continue
found = False
for t in matches:
for d in matches[t]:
if d == define:
found = True
if not found:
print(f"{define:<{PADDING}}: missing env.h entry")
+2260
View File
File diff suppressed because it is too large. Load diff
+71
View File
@@ -0,0 +1,71 @@
/* origin: FreeBSD /usr/src/lib/msun/src/k_cos.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __cos( x, y )
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
*
* Algorithm
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
* 3. cos(x) is approximated by a polynomial of degree 14 on
* [0,pi/4]
* 4 14
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
* where the remez error is
*
* | 2 4 6 8 10 12 14 | -58
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
* | |
*
* 4 6 8 10 12 14
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
* cos(x) ~ 1 - x*x/2 + r
* since cos(x+y) ~ cos(x) - sin(x)*y
* ~ cos(x) - x*y,
* a correction term is necessary in cos(x) and hence
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
* For better accuracy, rearrange to
* cos(x+y) ~ w + (tmp + (r-x*y))
* where w = 1 - x*x/2 and tmp is a tiny correction term
* (1 - x*x/2 == w + tmp exactly in infinite precision).
* The exactness of w + tmp in infinite precision depends on w
* and tmp having the same precision as x. If they have extra
* precision due to compiler bugs, then the extra precision is
* only good provided it is retained in all terms of the final
* expression for cos(). Retention happens in all cases tested
* under FreeBSD, so don't pessimize things by forcibly clipping
* any extra precision in w.
*/
#include "libm.h"
static const double
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
double __cos(double x, double y)
{
double_t hz,z,r,w;
z = x*x;
w = z*z;
r = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6));
hz = 0.5*z;
w = 1.0-hz;
return w + (((1.0-w)-hz) + (z*r-x*y));
}
+6
View File
@@ -0,0 +1,6 @@
#include "libm.h"
double __math_divzero(uint32_t sign)
{
return fp_barrier(sign ? -1.0 : 1.0) / 0.0;
}
+6
View File
@@ -0,0 +1,6 @@
#include "libm.h"
double __math_invalid(double x)
{
return (x - x) / (x - x);
}
+190
View File
@@ -0,0 +1,190 @@
/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
* Optimized by Bruce D. Evans.
*/
/* __rem_pio2(x,y)
*
* return the remainder of x rem pi/2 in y[0]+y[1]
* use __rem_pio2_large() for large x
*/
#include "libm.h"
#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
#define EPS DBL_EPSILON
#elif FLT_EVAL_METHOD==2
#define EPS LDBL_EPSILON
#endif
/*
* invpio2: 53 bits of 2/pi
* pio2_1: first 33 bit of pi/2
* pio2_1t: pi/2 - pio2_1
* pio2_2: second 33 bit of pi/2
* pio2_2t: pi/2 - (pio2_1+pio2_2)
* pio2_3: third 33 bit of pi/2
* pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
static const double
toint = 1.5/EPS,
pio4 = 0x1.921fb54442d18p-1,
invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
/* caller must handle the case when reduction is not needed: |x| ~<= pi/4 */
int __rem_pio2(double x, double *y)
{
union {double f; uint64_t i;} u = {x};
double_t z,w,t,r,fn;
double tx[3],ty[2];
uint32_t ix;
int sign, n, ex, ey, i;
sign = u.i>>63;
ix = u.i>>32 & 0x7fffffff;
if (ix <= 0x400f6a7a) { /* |x| ~<= 5pi/4 */
if ((ix & 0xfffff) == 0x921fb) /* |x| ~= pi/2 or 2pi/2 */
goto medium; /* cancellation -- use medium case */
if (ix <= 0x4002d97c) { /* |x| ~<= 3pi/4 */
if (!sign) {
z = x - pio2_1; /* one round good to 85 bits */
y[0] = z - pio2_1t;
y[1] = (z-y[0]) - pio2_1t;
return 1;
} else {
z = x + pio2_1;
y[0] = z + pio2_1t;
y[1] = (z-y[0]) + pio2_1t;
return -1;
}
} else {
if (!sign) {
z = x - 2*pio2_1;
y[0] = z - 2*pio2_1t;
y[1] = (z-y[0]) - 2*pio2_1t;
return 2;
} else {
z = x + 2*pio2_1;
y[0] = z + 2*pio2_1t;
y[1] = (z-y[0]) + 2*pio2_1t;
return -2;
}
}
}
if (ix <= 0x401c463b) { /* |x| ~<= 9pi/4 */
if (ix <= 0x4015fdbc) { /* |x| ~<= 7pi/4 */
if (ix == 0x4012d97c) /* |x| ~= 3pi/2 */
goto medium;
if (!sign) {
z = x - 3*pio2_1;
y[0] = z - 3*pio2_1t;
y[1] = (z-y[0]) - 3*pio2_1t;
return 3;
} else {
z = x + 3*pio2_1;
y[0] = z + 3*pio2_1t;
y[1] = (z-y[0]) + 3*pio2_1t;
return -3;
}
} else {
if (ix == 0x401921fb) /* |x| ~= 4pi/2 */
goto medium;
if (!sign) {
z = x - 4*pio2_1;
y[0] = z - 4*pio2_1t;
y[1] = (z-y[0]) - 4*pio2_1t;
return 4;
} else {
z = x + 4*pio2_1;
y[0] = z + 4*pio2_1t;
y[1] = (z-y[0]) + 4*pio2_1t;
return -4;
}
}
}
if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */
medium:
/* rint(x/(pi/2)) */
fn = rint(x * invpio2);
n = (int32_t)fn;
r = x - fn*pio2_1;
w = fn*pio2_1t; /* 1st round, good to 85 bits */
/* Matters with directed rounding. */
if (predict_false(r - w < -pio4)) {
n--;
fn--;
r = x - fn*pio2_1;
w = fn*pio2_1t;
} else if (predict_false(r - w > pio4)) {
n++;
fn++;
r = x - fn*pio2_1;
w = fn*pio2_1t;
}
y[0] = r - w;
u.f = y[0];
ey = u.i>>52 & 0x7ff;
ex = ix>>20;
if (ex - ey > 16) { /* 2nd round, good to 118 bits */
t = r;
w = fn*pio2_2;
r = t - w;
w = fn*pio2_2t - ((t-r)-w);
y[0] = r - w;
u.f = y[0];
ey = u.i>>52 & 0x7ff;
if (ex - ey > 49) { /* 3rd round, good to 151 bits, covers all cases */
t = r;
w = fn*pio2_3;
r = t - w;
w = fn*pio2_3t - ((t-r)-w);
y[0] = r - w;
}
}
y[1] = (r - y[0]) - w;
return n;
}
/*
* all other (large) arguments
*/
if (ix >= 0x7ff00000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
/* set z = scalbn(|x|,-ilogb(x)+23) */
u.f = x;
u.i &= (uint64_t)-1>>12;
u.i |= (uint64_t)(0x3ff + 23)<<52;
z = u.f;
for (i=0; i < 2; i++) {
tx[i] = (double)(int32_t)z;
z = (z-tx[i])*0x1p24;
}
tx[i] = z;
/* skip zero terms, first term is non-zero */
while (tx[i] == 0.0)
i--;
n = __rem_pio2_large(tx,ty,(int)(ix>>20)-(0x3ff+23),i+1,1);
if (sign) {
y[0] = -ty[0];
y[1] = -ty[1];
return -n;
}
y[0] = ty[0];
y[1] = ty[1];
return n;
}
+442
View File
@@ -0,0 +1,442 @@
/* origin: FreeBSD /usr/src/lib/msun/src/k_rem_pio2.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __rem_pio2_large(x,y,e0,nx,prec)
* double x[],y[]; int e0,nx,prec;
*
* __rem_pio2_large return the last three digits of N with
* y = x - N*pi/2
* so that |y| < pi/2.
*
* The method is to compute the integer (mod 8) and fraction parts of
* (2/pi)*x without doing the full multiplication. In general we
* skip the part of the product that are known to be a huge integer (
* more accurately, = 0 mod 8 ). Thus the number of operations are
* independent of the exponent of the input.
*
* (2/pi) is represented by an array of 24-bit integers in ipio2[].
*
* Input parameters:
* x[] The input value (must be positive) is broken into nx
* pieces of 24-bit integers in double precision format.
* x[i] will be the i-th 24 bit of x. The scaled exponent
* of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
* match x's up to 24 bits.
*
* Example of breaking a double positive z into x[0]+x[1]+x[2]:
* e0 = ilogb(z)-23
* z = scalbn(z,-e0)
* for i = 0,1,2
* x[i] = floor(z)
* z = (z-x[i])*2**24
*
*
* y[] ouput result in an array of double precision numbers.
* The dimension of y[] is:
* 24-bit precision 1
* 53-bit precision 2
* 64-bit precision 2
* 113-bit precision 3
* The actual value is the sum of them. Thus for 113-bit
* precison, one may have to do something like:
*
* long double t,w,r_head, r_tail;
* t = (long double)y[2] + (long double)y[1];
* w = (long double)y[0];
* r_head = t+w;
* r_tail = w - (r_head - t);
*
* e0 The exponent of x[0]. Must be <= 16360 or you need to
* expand the ipio2 table.
*
* nx dimension of x[]
*
* prec an integer indicating the precision:
* 0 24 bits (single)
* 1 53 bits (double)
* 2 64 bits (extended)
* 3 113 bits (quad)
*
* External function:
* double scalbn(), floor();
*
*
* Here is the description of some local variables:
*
* jk jk+1 is the initial number of terms of ipio2[] needed
* in the computation. The minimum and recommended value
* for jk is 3,4,4,6 for single, double, extended, and quad.
* jk+1 must be 2 larger than you might expect so that our
* recomputation test works. (Up to 24 bits in the integer
* part (the 24 bits of it that we compute) and 23 bits in
* the fraction part may be lost to cancelation before we
* recompute.)
*
* jz local integer variable indicating the number of
* terms of ipio2[] used.
*
* jx nx - 1
*
* jv index for pointing to the suitable ipio2[] for the
* computation. In general, we want
* ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
* is an integer. Thus
* e0-3-24*jv >= 0 or (e0-3)/24 >= jv
* Hence jv = max(0,(e0-3)/24).
*
* jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
*
* q[] double array with integral value, representing the
* 24-bits chunk of the product of x and 2/pi.
*
* q0 the corresponding exponent of q[0]. Note that the
* exponent for q[i] would be q0-24*i.
*
* PIo2[] double precision array, obtained by cutting pi/2
* into 24 bits chunks.
*
* f[] ipio2[] in floating point
*
* iq[] integer array by breaking up q[] in 24-bits chunk.
*
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
*
* ih integer. If >0 it indicates q[] is >= 0.5, hence
* it also indicates the *sign* of the result.
*
*/
/*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "libm.h"
static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
/*
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
*
* integer array, contains the (24*i)-th to (24*i+23)-th
* bit of 2/pi after binary point. The corresponding
* floating value is
*
* ipio2[i] * 2^(-24(i+1)).
*
* NB: This table must have at least (e0-3)/24 + jk terms.
* For quad precision (e0 <= 16360, jk = 6), this is 686.
*/
static const int32_t ipio2[] = {
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
#if LDBL_MAX_EXP > 1024
0x47C419, 0xC367CD, 0xDCE809, 0x2A8359, 0xC4768B, 0x961CA6,
0xDDAF44, 0xD15719, 0x053EA5, 0xFF0705, 0x3F7E33, 0xE832C2,
0xDE4F98, 0x327DBB, 0xC33D26, 0xEF6B1E, 0x5EF89F, 0x3A1F35,
0xCAF27F, 0x1D87F1, 0x21907C, 0x7C246A, 0xFA6ED5, 0x772D30,
0x433B15, 0xC614B5, 0x9D19C3, 0xC2C4AD, 0x414D2C, 0x5D000C,
0x467D86, 0x2D71E3, 0x9AC69B, 0x006233, 0x7CD2B4, 0x97A7B4,
0xD55537, 0xF63ED7, 0x1810A3, 0xFC764D, 0x2A9D64, 0xABD770,
0xF87C63, 0x57B07A, 0xE71517, 0x5649C0, 0xD9D63B, 0x3884A7,
0xCB2324, 0x778AD6, 0x23545A, 0xB91F00, 0x1B0AF1, 0xDFCE19,
0xFF319F, 0x6A1E66, 0x615799, 0x47FBAC, 0xD87F7E, 0xB76522,
0x89E832, 0x60BFE6, 0xCDC4EF, 0x09366C, 0xD43F5D, 0xD7DE16,
0xDE3B58, 0x929BDE, 0x2822D2, 0xE88628, 0x4D58E2, 0x32CAC6,
0x16E308, 0xCB7DE0, 0x50C017, 0xA71DF3, 0x5BE018, 0x34132E,
0x621283, 0x014883, 0x5B8EF5, 0x7FB0AD, 0xF2E91E, 0x434A48,
0xD36710, 0xD8DDAA, 0x425FAE, 0xCE616A, 0xA4280A, 0xB499D3,
0xF2A606, 0x7F775C, 0x83C2A3, 0x883C61, 0x78738A, 0x5A8CAF,
0xBDD76F, 0x63A62D, 0xCBBFF4, 0xEF818D, 0x67C126, 0x45CA55,
0x36D9CA, 0xD2A828, 0x8D61C2, 0x77C912, 0x142604, 0x9B4612,
0xC459C4, 0x44C5C8, 0x91B24D, 0xF31700, 0xAD43D4, 0xE54929,
0x10D5FD, 0xFCBE00, 0xCC941E, 0xEECE70, 0xF53E13, 0x80F1EC,
0xC3E7B3, 0x28F8C7, 0x940593, 0x3E71C1, 0xB3092E, 0xF3450B,
0x9C1288, 0x7B20AB, 0x9FB52E, 0xC29247, 0x2F327B, 0x6D550C,
0x90A772, 0x1FE76B, 0x96CB31, 0x4A1679, 0xE27941, 0x89DFF4,
0x9794E8, 0x84E6E2, 0x973199, 0x6BED88, 0x365F5F, 0x0EFDBB,
0xB49A48, 0x6CA467, 0x427271, 0x325D8D, 0xB8159F, 0x09E5BC,
0x25318D, 0x3974F7, 0x1C0530, 0x010C0D, 0x68084B, 0x58EE2C,
0x90AA47, 0x02E774, 0x24D6BD, 0xA67DF7, 0x72486E, 0xEF169F,
0xA6948E, 0xF691B4, 0x5153D1, 0xF20ACF, 0x339820, 0x7E4BF5,
0x6863B2, 0x5F3EDD, 0x035D40, 0x7F8985, 0x295255, 0xC06437,
0x10D86D, 0x324832, 0x754C5B, 0xD4714E, 0x6E5445, 0xC1090B,
0x69F52A, 0xD56614, 0x9D0727, 0x50045D, 0xDB3BB4, 0xC576EA,
0x17F987, 0x7D6B49, 0xBA271D, 0x296996, 0xACCCC6, 0x5414AD,
0x6AE290, 0x89D988, 0x50722C, 0xBEA404, 0x940777, 0x7030F3,
0x27FC00, 0xA871EA, 0x49C266, 0x3DE064, 0x83DD97, 0x973FA3,
0xFD9443, 0x8C860D, 0xDE4131, 0x9D3992, 0x8C70DD, 0xE7B717,
0x3BDF08, 0x2B3715, 0xA0805C, 0x93805A, 0x921110, 0xD8E80F,
0xAF806C, 0x4BFFDB, 0x0F9038, 0x761859, 0x15A562, 0xBBCB61,
0xB989C7, 0xBD4010, 0x04F2D2, 0x277549, 0xF6B6EB, 0xBB22DB,
0xAA140A, 0x2F2689, 0x768364, 0x333B09, 0x1A940E, 0xAA3A51,
0xC2A31D, 0xAEEDAF, 0x12265C, 0x4DC26D, 0x9C7A2D, 0x9756C0,
0x833F03, 0xF6F009, 0x8C402B, 0x99316D, 0x07B439, 0x15200C,
0x5BC3D8, 0xC492F5, 0x4BADC6, 0xA5CA4E, 0xCD37A7, 0x36A9E6,
0x9492AB, 0x6842DD, 0xDE6319, 0xEF8C76, 0x528B68, 0x37DBFC,
0xABA1AE, 0x3115DF, 0xA1AE00, 0xDAFB0C, 0x664D64, 0xB705ED,
0x306529, 0xBF5657, 0x3AFF47, 0xB9F96A, 0xF3BE75, 0xDF9328,
0x3080AB, 0xF68C66, 0x15CB04, 0x0622FA, 0x1DE4D9, 0xA4B33D,
0x8F1B57, 0x09CD36, 0xE9424E, 0xA4BE13, 0xB52333, 0x1AAAF0,
0xA8654F, 0xA5C1D2, 0x0F3F0B, 0xCD785B, 0x76F923, 0x048B7B,
0x721789, 0x53A6C6, 0xE26E6F, 0x00EBEF, 0x584A9B, 0xB7DAC4,
0xBA66AA, 0xCFCF76, 0x1D02D1, 0x2DF1B1, 0xC1998C, 0x77ADC3,
0xDA4886, 0xA05DF7, 0xF480C6, 0x2FF0AC, 0x9AECDD, 0xBC5C3F,
0x6DDED0, 0x1FC790, 0xB6DB2A, 0x3A25A3, 0x9AAF00, 0x9353AD,
0x0457B6, 0xB42D29, 0x7E804B, 0xA707DA, 0x0EAA76, 0xA1597B,
0x2A1216, 0x2DB7DC, 0xFDE5FA, 0xFEDB89, 0xFDBE89, 0x6C76E4,
0xFCA906, 0x70803E, 0x156E85, 0xFF87FD, 0x073E28, 0x336761,
0x86182A, 0xEABD4D, 0xAFE7B3, 0x6E6D8F, 0x396795, 0x5BBF31,
0x48D784, 0x16DF30, 0x432DC7, 0x356125, 0xCE70C9, 0xB8CB30,
0xFD6CBF, 0xA200A4, 0xE46C05, 0xA0DD5A, 0x476F21, 0xD21262,
0x845CB9, 0x496170, 0xE0566B, 0x015299, 0x375550, 0xB7D51E,
0xC4F133, 0x5F6E13, 0xE4305D, 0xA92E85, 0xC3B21D, 0x3632A1,
0xA4B708, 0xD4B1EA, 0x21F716, 0xE4698F, 0x77FF27, 0x80030C,
0x2D408D, 0xA0CD4F, 0x99A520, 0xD3A2B3, 0x0A5D2F, 0x42F9B4,
0xCBDA11, 0xD0BE7D, 0xC1DB9B, 0xBD17AB, 0x81A2CA, 0x5C6A08,
0x17552E, 0x550027, 0xF0147F, 0x8607E1, 0x640B14, 0x8D4196,
0xDEBE87, 0x2AFDDA, 0xB6256B, 0x34897B, 0xFEF305, 0x9EBFB9,
0x4F6A68, 0xA82A4A, 0x5AC44F, 0xBCF82D, 0x985AD7, 0x95C7F4,
0x8D4D0D, 0xA63A20, 0x5F57A4, 0xB13F14, 0x953880, 0x0120CC,
0x86DD71, 0xB6DEC9, 0xF560BF, 0x11654D, 0x6B0701, 0xACB08C,
0xD0C0B2, 0x485551, 0x0EFB1E, 0xC37295, 0x3B06A3, 0x3540C0,
0x7BDC06, 0xCC45E0, 0xFA294E, 0xC8CAD6, 0x41F3E8, 0xDE647C,
0xD8649B, 0x31BED9, 0xC397A4, 0xD45877, 0xC5E369, 0x13DAF0,
0x3C3ABA, 0x461846, 0x5F7555, 0xF5BDD2, 0xC6926E, 0x5D2EAC,
0xED440E, 0x423E1C, 0x87C461, 0xE9FD29, 0xF3D6E7, 0xCA7C22,
0x35916F, 0xC5E008, 0x8DD7FF, 0xE26A6E, 0xC6FDB0, 0xC10893,
0x745D7C, 0xB2AD6B, 0x9D6ECD, 0x7B723E, 0x6A11C6, 0xA9CFF7,
0xDF7329, 0xBAC9B5, 0x5100B7, 0x0DB2E2, 0x24BA74, 0x607DE5,
0x8AD874, 0x2C150D, 0x0C1881, 0x94667E, 0x162901, 0x767A9F,
0xBEFDFD, 0xEF4556, 0x367ED9, 0x13D9EC, 0xB9BA8B, 0xFC97C4,
0x27A831, 0xC36EF1, 0x36C594, 0x56A8D8, 0xB5A8B4, 0x0ECCCF,
0x2D8912, 0x34576F, 0x89562C, 0xE3CE99, 0xB920D6, 0xAA5E6B,
0x9C2A3E, 0xCC5F11, 0x4A0BFD, 0xFBF4E1, 0x6D3B8E, 0x2C86E2,
0x84D4E9, 0xA9B4FC, 0xD1EEEF, 0xC9352E, 0x61392F, 0x442138,
0xC8D91B, 0x0AFC81, 0x6A4AFB, 0xD81C2F, 0x84B453, 0x8C994E,
0xCC2254, 0xDC552A, 0xD6C6C0, 0x96190B, 0xB8701A, 0x649569,
0x605A26, 0xEE523F, 0x0F117F, 0x11B5F4, 0xF5CBFC, 0x2DBC34,
0xEEBC34, 0xCC5DE8, 0x605EDD, 0x9B8E67, 0xEF3392, 0xB817C9,
0x9B5861, 0xBC57E1, 0xC68351, 0x103ED8, 0x4871DD, 0xDD1C2D,
0xA118AF, 0x462C21, 0xD7F359, 0x987AD9, 0xC0549E, 0xFA864F,
0xFC0656, 0xAE79E5, 0x362289, 0x22AD38, 0xDC9367, 0xAAE855,
0x382682, 0x9BE7CA, 0xA40D51, 0xB13399, 0x0ED7A9, 0x480569,
0xF0B265, 0xA7887F, 0x974C88, 0x36D1F9, 0xB39221, 0x4A827B,
0x21CF98, 0xDC9F40, 0x5547DC, 0x3A74E1, 0x42EB67, 0xDF9DFE,
0x5FD45E, 0xA4677B, 0x7AACBA, 0xA2F655, 0x23882B, 0x55BA41,
0x086E59, 0x862A21, 0x834739, 0xE6E389, 0xD49EE5, 0x40FB49,
0xE956FF, 0xCA0F1C, 0x8A59C5, 0x2BFA94, 0xC5C1D3, 0xCFC50F,
0xAE5ADB, 0x86C547, 0x624385, 0x3B8621, 0x94792C, 0x876110,
0x7B4C2A, 0x1A2C80, 0x12BF43, 0x902688, 0x893C78, 0xE4C4A8,
0x7BDBE5, 0xC23AC4, 0xEAF426, 0x8A67F7, 0xBF920D, 0x2BA365,
0xB1933D, 0x0B7CBD, 0xDC51A4, 0x63DD27, 0xDDE169, 0x19949A,
0x9529A8, 0x28CE68, 0xB4ED09, 0x209F44, 0xCA984E, 0x638270,
0x237C7E, 0x32B90F, 0x8EF5A7, 0xE75614, 0x08F121, 0x2A9DB5,
0x4D7E6F, 0x5119A5, 0xABF9B5, 0xD6DF82, 0x61DD96, 0x023616,
0x9F3AC4, 0xA1A283, 0x6DED72, 0x7A8D39, 0xA9B882, 0x5C326B,
0x5B2746, 0xED3400, 0x7700D2, 0x55F4FC, 0x4D5901, 0x8071E0,
#endif
};
static const double PIo2[] = {
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
};
int __rem_pio2_large(double *x, double *y, int e0, int nx, int prec)
{
int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
double z,fw,f[20],fq[20],q[20];
/* initialize jk*/
jk = init_jk[prec];
jp = jk;
/* determine jx,jv,q0, note that 3>q0 */
jx = nx-1;
jv = (e0-3)/24; if(jv<0) jv=0;
q0 = e0-24*(jv+1);
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
j = jv-jx; m = jx+jk;
for (i=0; i<=m; i++,j++)
f[i] = j<0 ? 0.0 : (double)ipio2[j];
/* compute q[0],q[1],...q[jk] */
for (i=0; i<=jk; i++) {
for (j=0,fw=0.0; j<=jx; j++)
fw += x[j]*f[jx+i-j];
q[i] = fw;
}
jz = jk;
recompute:
/* distill q[] into iq[] reversingly */
for (i=0,j=jz,z=q[jz]; j>0; i++,j--) {
fw = (double)(int32_t)(0x1p-24*z);
iq[i] = (int32_t)(z - 0x1p24*fw);
z = q[j-1]+fw;
}
/* compute n */
z = scalbn(z,q0); /* actual value of z */
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
n = (int32_t)z;
z -= (double)n;
ih = 0;
if (q0 > 0) { /* need iq[jz-1] to determine n */
i = iq[jz-1]>>(24-q0); n += i;
iq[jz-1] -= i<<(24-q0);
ih = iq[jz-1]>>(23-q0);
}
else if (q0 == 0) ih = iq[jz-1]>>23;
else if (z >= 0.5) ih = 2;
if (ih > 0) { /* q > 0.5 */
n += 1; carry = 0;
for (i=0; i<jz; i++) { /* compute 1-q */
j = iq[i];
if (carry == 0) {
if (j != 0) {
carry = 1;
iq[i] = 0x1000000 - j;
}
} else
iq[i] = 0xffffff - j;
}
if (q0 > 0) { /* rare case: chance is 1 in 12 */
switch(q0) {
case 1:
iq[jz-1] &= 0x7fffff; break;
case 2:
iq[jz-1] &= 0x3fffff; break;
}
}
if (ih == 2) {
z = 1.0 - z;
if (carry != 0)
z -= scalbn(1.0,q0);
}
}
/* check if recomputation is needed */
if (z == 0.0) {
j = 0;
for (i=jz-1; i>=jk; i--) j |= iq[i];
if (j == 0) { /* need recomputation */
for (k=1; iq[jk-k]==0; k++); /* k = no. of terms needed */
for (i=jz+1; i<=jz+k; i++) { /* add q[jz+1] to q[jz+k] */
f[jx+i] = (double)ipio2[jv+i];
for (j=0,fw=0.0; j<=jx; j++)
fw += x[j]*f[jx+i-j];
q[i] = fw;
}
jz += k;
goto recompute;
}
}
/* chop off zero terms */
if (z == 0.0) {
jz -= 1;
q0 -= 24;
while (iq[jz] == 0) {
jz--;
q0 -= 24;
}
} else { /* break z into 24-bit if necessary */
z = scalbn(z,-q0);
if (z >= 0x1p24) {
fw = (double)(int32_t)(0x1p-24*z);
iq[jz] = (int32_t)(z - 0x1p24*fw);
jz += 1;
q0 += 24;
iq[jz] = (int32_t)fw;
} else
iq[jz] = (int32_t)z;
}
/* convert integer "bit" chunk to floating-point value */
fw = scalbn(1.0,q0);
for (i=jz; i>=0; i--) {
q[i] = fw*(double)iq[i];
fw *= 0x1p-24;
}
/* compute PIo2[0,...,jp]*q[jz,...,0] */
for(i=jz; i>=0; i--) {
for (fw=0.0,k=0; k<=jp && k<=jz-i; k++)
fw += PIo2[k]*q[i+k];
fq[jz-i] = fw;
}
/* compress fq[] into y[] */
switch(prec) {
case 0:
fw = 0.0;
for (i=jz; i>=0; i--)
fw += fq[i];
y[0] = ih==0 ? fw : -fw;
break;
case 1:
case 2:
fw = 0.0;
for (i=jz; i>=0; i--)
fw += fq[i];
// TODO: drop excess precision here once double_t is used
fw = (double)fw;
y[0] = ih==0 ? fw : -fw;
fw = fq[0]-fw;
for (i=1; i<=jz; i++)
fw += fq[i];
y[1] = ih==0 ? fw : -fw;
break;
case 3: /* painful */
for (i=jz; i>0; i--) {
fw = fq[i-1]+fq[i];
fq[i] += fq[i-1]-fw;
fq[i-1] = fw;
}
for (i=jz; i>1; i--) {
fw = fq[i-1]+fq[i];
fq[i] += fq[i-1]-fw;
fq[i-1] = fw;
}
for (fw=0.0,i=jz; i>=2; i--)
fw += fq[i];
if (ih==0) {
y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
} else {
y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
}
}
return n&7;
}
+64
View File
@@ -0,0 +1,64 @@
/* origin: FreeBSD /usr/src/lib/msun/src/k_sin.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __sin( x, y, iy)
* kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. Callers must return sin(-0) = -0 without calling here since our
* odd polynomial is not evaluated in a way that preserves -0.
* Callers may do the optimization sin(x) ~ x for tiny x.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
*/
#include "libm.h"
static const double
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
double __sin(double x, double y, int iy)
{
double_t z,r,v,w;
z = x*x;
w = z*z;
r = S2 + z*(S3 + z*S4) + z*w*(S5 + z*S6);
v = z*x;
if (iy == 0)
return x + v*(S1 + z*r);
else
return x - ((z*(0.5*y - v*r) - y) - v*S1);
}
+79
View File
@@ -0,0 +1,79 @@
/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* cos(x)
* Return cosine function of x.
*
* kernel function:
* __sin ... sine function on [-pi/4,pi/4]
* __cos ... cosine function on [-pi/4,pi/4]
* __rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "libm.h"
double __cdecl cos(double x)
{
double y[2];
uint32_t ix;
unsigned n;
GET_HIGH_WORD(ix, x);
ix &= 0x7fffffff;
/* |x| ~< pi/4 */
if (ix <= 0x3fe921fb) {
if (ix < 0x3e46a09e) { /* |x| < 2**-27 * sqrt(2) */
/* raise inexact if x!=0 */
FORCE_EVAL(x + 0x1p120f);
return 1.0;
}
return __cos(x, 0);
}
/* cos(Inf or NaN) is NaN */
if (isinf(x))
return math_error(_DOMAIN, "cos", x, 0, x - x);
if (ix >= 0x7ff00000)
return x-x;
/* argument reduction */
n = __rem_pio2(x, y);
switch (n&3) {
case 0: return __cos(y[0], y[1]);
case 1: return -__sin(y[0], y[1], 1);
case 2: return -__cos(y[0], y[1]);
default:
return __sin(y[0], y[1], 1);
}
}
+130
View File
@@ -0,0 +1,130 @@
/*
* Double-precision 2^x function.
*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#include <math.h>
#include <stdint.h>
#include "libm.h"
#include "exp_data.h"
#define N (1 << EXP_TABLE_BITS)
#define Shift __exp_data.exp2_shift
#define T __exp_data.tab
#define C1 __exp_data.exp2_poly[0]
#define C2 __exp_data.exp2_poly[1]
#define C3 __exp_data.exp2_poly[2]
#define C4 __exp_data.exp2_poly[3]
#define C5 __exp_data.exp2_poly[4]
/* Handle cases that may overflow or underflow when computing the result that
is scale*(1+TMP) without intermediate rounding. The bit representation of
scale is in SBITS, however it has a computed exponent that may have
overflown into the sign bit so that needs to be adjusted before using it as
a double. (int32_t)KI is the k used in the argument reduction and exponent
adjustment of scale, positive k here means the result may overflow and
negative k means the result may underflow. */
static inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki)
{
double_t scale, y;
if ((ki & 0x80000000) == 0) {
/* k > 0, the exponent of scale might have overflowed by 1. */
sbits -= 1ull << 52;
scale = asdouble(sbits);
y = 2 * (scale + scale * tmp);
return eval_as_double(y);
}
/* k < 0, need special care in the subnormal range. */
sbits += 1022ull << 52;
scale = asdouble(sbits);
y = scale + scale * tmp;
if (y < 1.0) {
/* Round y to the right precision before scaling it into the subnormal
range to avoid double rounding that can cause 0.5+E/2 ulp error where
E is the worst-case ulp error outside the subnormal range. So this
is only useful if the goal is better than 1 ulp worst-case error. */
double_t hi, lo;
lo = scale - y + scale * tmp;
hi = 1.0 + y;
lo = 1.0 - hi + y + lo;
y = eval_as_double(hi + lo) - 1.0;
/* Avoid -0.0 with downward rounding. */
if (WANT_ROUNDING && y == 0.0)
y = 0.0;
/* The underflow exception needs to be signaled explicitly. */
fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);
}
y = 0x1p-1022 * y;
return eval_as_double(y);
}
/* Top 12 bits of a double (sign and exponent bits). */
static inline uint32_t top12(double x)
{
return asuint64(x) >> 52;
}
double __cdecl exp2(double x)
{
uint32_t abstop;
uint64_t ki, idx, top, sbits;
double_t kd, r, r2, scale, tail, tmp;
abstop = top12(x) & 0x7ff;
if (predict_false(abstop - top12(0x1p-54) >= top12(512.0) - top12(0x1p-54))) {
if (abstop - top12(0x1p-54) >= 0x80000000)
/* Avoid spurious underflow for tiny x. */
/* Note: 0 is common input. */
return WANT_ROUNDING ? 1.0 + x : 1.0;
if (abstop >= top12(1024.0)) {
if (asuint64(x) == asuint64(-INFINITY))
return 0.0;
if (abstop >= top12(INFINITY))
return 1.0 + x;
if (!(asuint64(x) >> 63)) {
errno = ERANGE;
return fp_barrier(DBL_MAX) * DBL_MAX;
}
else if (x <= -2147483648.0) {
fp_barrier(x + 0x1p120f);
return 0;
}
else if (asuint64(x) >= asuint64(-1075.0)) {
errno = ERANGE;
fp_barrier(x + 0x1p120f);
return 0;
}
}
if (2 * asuint64(x) > 2 * asuint64(928.0))
/* Large x is special cased below. */
abstop = 0;
}
/* exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)]. */
/* x = k/N + r, with int k and r in [-1/2N, 1/2N]. */
kd = eval_as_double(x + Shift);
ki = asuint64(kd); /* k. */
kd -= Shift; /* k/N for int k. */
r = x - kd;
/* 2^(k/N) ~= scale * (1 + tail). */
idx = 2 * (ki % N);
top = ki << (52 - EXP_TABLE_BITS);
tail = asdouble(T[idx]);
/* This is only a valid scale when -1023*N < k < 1024*N. */
sbits = T[idx + 1] + top;
/* exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1). */
/* Evaluation is optimized assuming superscalar pipelined execution. */
r2 = r * r;
/* Without fma the worst case error is 0.5/N ulp larger. */
/* Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp. */
tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);
if (predict_false(abstop == 0))
return specialcase(tmp, sbits, ki);
scale = asdouble(sbits);
/* Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there
is no spurious underflow here even without fma. */
return eval_as_double(scale + scale * tmp);
}
+182
View File
@@ -0,0 +1,182 @@
/*
* Shared data between exp, exp2 and pow.
*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#include "exp_data.h"
#define N (1 << EXP_TABLE_BITS)
const struct exp_data __exp_data = {
// N/ln2
.invln2N = 0x1.71547652b82fep0 * N,
// -ln2/N
.negln2hiN = -0x1.62e42fefa0000p-8,
.negln2loN = -0x1.cf79abc9e3b3ap-47,
// Used for rounding when !TOINT_INTRINSICS
#if EXP_USE_TOINT_NARROW
.shift = 0x1800000000.8p0,
#else
.shift = 0x1.8p52,
#endif
// exp polynomial coefficients.
.poly = {
// abs error: 1.555*2^-66
// ulp error: 0.509 (0.511 without fma)
// if |x| < ln2/256+eps
// abs error if |x| < ln2/256+0x1p-15: 1.09*2^-65
// abs error if |x| < ln2/128: 1.7145*2^-56
0x1.ffffffffffdbdp-2,
0x1.555555555543cp-3,
0x1.55555cf172b91p-5,
0x1.1111167a4d017p-7,
},
.exp2_shift = 0x1.8p52 / N,
// exp2 polynomial coefficients.
.exp2_poly = {
// abs error: 1.2195*2^-65
// ulp error: 0.507 (0.511 without fma)
// if |x| < 1/256
// abs error if |x| < 1/128: 1.9941*2^-56
0x1.62e42fefa39efp-1,
0x1.ebfbdff82c424p-3,
0x1.c6b08d70cf4b5p-5,
0x1.3b2abd24650ccp-7,
0x1.5d7e09b4e3a84p-10,
},
// 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N)
// tab[2*k] = asuint64(T[k])
// tab[2*k+1] = asuint64(H[k]) - (k << 52)/N
.tab = {
0x0, 0x3ff0000000000000,
0x3c9b3b4f1a88bf6e, 0x3feff63da9fb3335,
0xbc7160139cd8dc5d, 0x3fefec9a3e778061,
0xbc905e7a108766d1, 0x3fefe315e86e7f85,
0x3c8cd2523567f613, 0x3fefd9b0d3158574,
0xbc8bce8023f98efa, 0x3fefd06b29ddf6de,
0x3c60f74e61e6c861, 0x3fefc74518759bc8,
0x3c90a3e45b33d399, 0x3fefbe3ecac6f383,
0x3c979aa65d837b6d, 0x3fefb5586cf9890f,
0x3c8eb51a92fdeffc, 0x3fefac922b7247f7,
0x3c3ebe3d702f9cd1, 0x3fefa3ec32d3d1a2,
0xbc6a033489906e0b, 0x3fef9b66affed31b,
0xbc9556522a2fbd0e, 0x3fef9301d0125b51,
0xbc5080ef8c4eea55, 0x3fef8abdc06c31cc,
0xbc91c923b9d5f416, 0x3fef829aaea92de0,
0x3c80d3e3e95c55af, 0x3fef7a98c8a58e51,
0xbc801b15eaa59348, 0x3fef72b83c7d517b,
0xbc8f1ff055de323d, 0x3fef6af9388c8dea,
0x3c8b898c3f1353bf, 0x3fef635beb6fcb75,
0xbc96d99c7611eb26, 0x3fef5be084045cd4,
0x3c9aecf73e3a2f60, 0x3fef54873168b9aa,
0xbc8fe782cb86389d, 0x3fef4d5022fcd91d,
0x3c8a6f4144a6c38d, 0x3fef463b88628cd6,
0x3c807a05b0e4047d, 0x3fef3f49917ddc96,
0x3c968efde3a8a894, 0x3fef387a6e756238,
0x3c875e18f274487d, 0x3fef31ce4fb2a63f,
0x3c80472b981fe7f2, 0x3fef2b4565e27cdd,
0xbc96b87b3f71085e, 0x3fef24dfe1f56381,
0x3c82f7e16d09ab31, 0x3fef1e9df51fdee1,
0xbc3d219b1a6fbffa, 0x3fef187fd0dad990,
0x3c8b3782720c0ab4, 0x3fef1285a6e4030b,
0x3c6e149289cecb8f, 0x3fef0cafa93e2f56,
0x3c834d754db0abb6, 0x3fef06fe0a31b715,
0x3c864201e2ac744c, 0x3fef0170fc4cd831,
0x3c8fdd395dd3f84a, 0x3feefc08b26416ff,
0xbc86a3803b8e5b04, 0x3feef6c55f929ff1,
0xbc924aedcc4b5068, 0x3feef1a7373aa9cb,
0xbc9907f81b512d8e, 0x3feeecae6d05d866,
0xbc71d1e83e9436d2, 0x3feee7db34e59ff7,
0xbc991919b3ce1b15, 0x3feee32dc313a8e5,
0x3c859f48a72a4c6d, 0x3feedea64c123422,
0xbc9312607a28698a, 0x3feeda4504ac801c,
0xbc58a78f4817895b, 0x3feed60a21f72e2a,
0xbc7c2c9b67499a1b, 0x3feed1f5d950a897,
0x3c4363ed60c2ac11, 0x3feece086061892d,
0x3c9666093b0664ef, 0x3feeca41ed1d0057,
0x3c6ecce1daa10379, 0x3feec6a2b5c13cd0,
0x3c93ff8e3f0f1230, 0x3feec32af0d7d3de,
0x3c7690cebb7aafb0, 0x3feebfdad5362a27,
0x3c931dbdeb54e077, 0x3feebcb299fddd0d,
0xbc8f94340071a38e, 0x3feeb9b2769d2ca7,
0xbc87deccdc93a349, 0x3feeb6daa2cf6642,
0xbc78dec6bd0f385f, 0x3feeb42b569d4f82,
0xbc861246ec7b5cf6, 0x3feeb1a4ca5d920f,
0x3c93350518fdd78e, 0x3feeaf4736b527da,
0x3c7b98b72f8a9b05, 0x3feead12d497c7fd,
0x3c9063e1e21c5409, 0x3feeab07dd485429,
0x3c34c7855019c6ea, 0x3feea9268a5946b7,
0x3c9432e62b64c035, 0x3feea76f15ad2148,
0xbc8ce44a6199769f, 0x3feea5e1b976dc09,
0xbc8c33c53bef4da8, 0x3feea47eb03a5585,
0xbc845378892be9ae, 0x3feea34634ccc320,
0xbc93cedd78565858, 0x3feea23882552225,
0x3c5710aa807e1964, 0x3feea155d44ca973,
0xbc93b3efbf5e2228, 0x3feea09e667f3bcd,
0xbc6a12ad8734b982, 0x3feea012750bdabf,
0xbc6367efb86da9ee, 0x3fee9fb23c651a2f,
0xbc80dc3d54e08851, 0x3fee9f7df9519484,
0xbc781f647e5a3ecf, 0x3fee9f75e8ec5f74,
0xbc86ee4ac08b7db0, 0x3fee9f9a48a58174,
0xbc8619321e55e68a, 0x3fee9feb564267c9,
0x3c909ccb5e09d4d3, 0x3feea0694fde5d3f,
0xbc7b32dcb94da51d, 0x3feea11473eb0187,
0x3c94ecfd5467c06b, 0x3feea1ed0130c132,
0x3c65ebe1abd66c55, 0x3feea2f336cf4e62,
0xbc88a1c52fb3cf42, 0x3feea427543e1a12,
0xbc9369b6f13b3734, 0x3feea589994cce13,
0xbc805e843a19ff1e, 0x3feea71a4623c7ad,
0xbc94d450d872576e, 0x3feea8d99b4492ed,
0x3c90ad675b0e8a00, 0x3feeaac7d98a6699,
0x3c8db72fc1f0eab4, 0x3feeace5422aa0db,
0xbc65b6609cc5e7ff, 0x3feeaf3216b5448c,
0x3c7bf68359f35f44, 0x3feeb1ae99157736,
0xbc93091fa71e3d83, 0x3feeb45b0b91ffc6,
0xbc5da9b88b6c1e29, 0x3feeb737b0cdc5e5,
0xbc6c23f97c90b959, 0x3feeba44cbc8520f,
0xbc92434322f4f9aa, 0x3feebd829fde4e50,
0xbc85ca6cd7668e4b, 0x3feec0f170ca07ba,
0x3c71affc2b91ce27, 0x3feec49182a3f090,
0x3c6dd235e10a73bb, 0x3feec86319e32323,
0xbc87c50422622263, 0x3feecc667b5de565,
0x3c8b1c86e3e231d5, 0x3feed09bec4a2d33,
0xbc91bbd1d3bcbb15, 0x3feed503b23e255d,
0x3c90cc319cee31d2, 0x3feed99e1330b358,
0x3c8469846e735ab3, 0x3feede6b5579fdbf,
0xbc82dfcd978e9db4, 0x3feee36bbfd3f37a,
0x3c8c1a7792cb3387, 0x3feee89f995ad3ad,
0xbc907b8f4ad1d9fa, 0x3feeee07298db666,
0xbc55c3d956dcaeba, 0x3feef3a2b84f15fb,
0xbc90a40e3da6f640, 0x3feef9728de5593a,
0xbc68d6f438ad9334, 0x3feeff76f2fb5e47,
0xbc91eee26b588a35, 0x3fef05b030a1064a,
0x3c74ffd70a5fddcd, 0x3fef0c1e904bc1d2,
0xbc91bdfbfa9298ac, 0x3fef12c25bd71e09,
0x3c736eae30af0cb3, 0x3fef199bdd85529c,
0x3c8ee3325c9ffd94, 0x3fef20ab5fffd07a,
0x3c84e08fd10959ac, 0x3fef27f12e57d14b,
0x3c63cdaf384e1a67, 0x3fef2f6d9406e7b5,
0x3c676b2c6c921968, 0x3fef3720dcef9069,
0xbc808a1883ccb5d2, 0x3fef3f0b555dc3fa,
0xbc8fad5d3ffffa6f, 0x3fef472d4a07897c,
0xbc900dae3875a949, 0x3fef4f87080d89f2,
0x3c74a385a63d07a7, 0x3fef5818dcfba487,
0xbc82919e2040220f, 0x3fef60e316c98398,
0x3c8e5a50d5c192ac, 0x3fef69e603db3285,
0x3c843a59ac016b4b, 0x3fef7321f301b460,
0xbc82d52107b43e1f, 0x3fef7c97337b9b5f,
0xbc892ab93b470dc9, 0x3fef864614f5a129,
0x3c74b604603a88d3, 0x3fef902ee78b3ff6,
0x3c83c5ec519d7271, 0x3fef9a51fbc74c83,
0xbc8ff7128fd391f0, 0x3fefa4afa2a490da,
0xbc8dae98e223747d, 0x3fefaf482d8e67f1,
0x3c8ec3bc41aa2008, 0x3fefba1bee615a27,
0x3c842b94c3a9eb32, 0x3fefc52b376bba97,
0x3c8a64a931d185ee, 0x3fefd0765b6e4540,
0xbc8e37bae43be3ed, 0x3fefdbfdad9cbe14,
0x3c77893b4d91cd9d, 0x3fefe7c1819e90d8,
0x3c5305c14160cc89, 0x3feff3c22b8f71f1,
},
};
+26
View File
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#ifndef _EXP_DATA_H
#define _EXP_DATA_H
#include <features.h>
#include <stdint.h>
#define EXP_TABLE_BITS 7
#define EXP_POLY_ORDER 5
#define EXP_USE_TOINT_NARROW 0
#define EXP2_POLY_ORDER 5
extern hidden const struct exp_data {
double invln2N;
double shift;
double negln2hiN;
double negln2loN;
double poly[4]; /* Last four coefficients. */
double exp2_shift;
double exp2_poly[EXP2_POLY_ORDER];
uint64_t tab[2*(1 << EXP_TABLE_BITS)];
} __exp_data;
#endif
+202
View File
@@ -0,0 +1,202 @@
/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* expm1(x)
* Returns exp(x)-1, the exponential of x minus 1.
*
* Method
* 1. Argument reduction:
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658
*
* Here a correction term c will be computed to compensate
* the error in r when rounded to a floating-point number.
*
* 2. Approximating expm1(r) by a special rational function on
* the interval [0,0.34658]:
* Since
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
* we define R1(r*r) by
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
* That is,
* R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
* = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
* = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
* We use a special Remez algorithm on [0,0.347] to generate
* a polynomial of degree 5 in r*r to approximate R1. The
* maximum error of this polynomial approximation is bounded
* by 2**-61. In other words,
* R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
* where Q1 = -1.6666666666666567384E-2,
* Q2 = 3.9682539681370365873E-4,
* Q3 = -9.9206344733435987357E-6,
* Q4 = 2.5051361420808517002E-7,
* Q5 = -6.2843505682382617102E-9;
* z = r*r,
* with error bounded by
* | 5 | -61
* | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2
* | |
*
* expm1(r) = exp(r)-1 is then computed by the following
* specific way which minimize the accumulation rounding error:
* 2 3
* r r [ 3 - (R1 + R1*r/2) ]
* expm1(r) = r + --- + --- * [--------------------]
* 2 2 [ 6 - r*(3 - R1*r/2) ]
*
* To compensate the error in the argument reduction, we use
* expm1(r+c) = expm1(r) + c + expm1(r)*c
* ~ expm1(r) + c + r*c
* Thus c+r*c will be added in as the correction terms for
* expm1(r+c). Now rearrange the term to avoid optimization
* screw up:
* ( 2 2 )
* ({ ( r [ R1 - (3 - R1*r/2) ] ) } r )
* expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
* ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 )
* ( )
*
* = r - E
* 3. Scale back to obtain expm1(x):
* From step 1, we have
* expm1(x) = either 2^k*[expm1(r)+1] - 1
* = or 2^k*[expm1(r) + (1-2^-k)]
* 4. Implementation notes:
* (A). To save one multiplication, we scale the coefficient Qi
* to Qi*2^i, and replace z by (x^2)/2.
* (B). To achieve maximum accuracy, we compute expm1(x) by
* (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
* (ii) if k=0, return r-E
* (iii) if k=-1, return 0.5*(r-E)-0.5
* (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
* else return 1.0+2.0*(r-E);
* (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
* (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else
* (vii) return 2^k(1-((E+2^-k)-r))
*
* Special cases:
* expm1(INF) is INF, expm1(NaN) is NaN;
* expm1(-INF) is -1, and
* for finite argument, only expm1(0)=0 is exact.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Misc. info.
* For IEEE double
* if x > 7.09782712893383973096e+02 then expm1(x) overflow
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "libm.h"
static const double
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */
Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */
Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
double __cdecl expm1(double x)
{
double_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
union {double f; uint64_t i;} u = {x};
uint32_t hx = u.i>>32 & 0x7fffffff;
int k, sign = u.i>>63;
/* filter out huge and non-finite argument */
if (hx >= 0x4043687A) { /* if |x|>=56*ln2 */
if (isnan(x))
return x;
if (isinf(x))
return sign ? -1 : x;
if (sign)
return math_error(_UNDERFLOW, "exp", x, 0, -1);
if (x > o_threshold) {
return math_error(_OVERFLOW, "exp", x, 0, x * 0x1p1023);
}
}
/* argument reduction */
if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
if (!sign) {
hi = x - ln2_hi;
lo = ln2_lo;
k = 1;
} else {
hi = x + ln2_hi;
lo = -ln2_lo;
k = -1;
}
} else {
k = invln2*x + (sign ? -0.5 : 0.5);
t = k;
hi = x - t*ln2_hi; /* t*ln2_hi is exact here */
lo = t*ln2_lo;
}
x = hi-lo;
c = (hi-x)-lo;
} else if (hx < 0x3c900000) { /* |x| < 2**-54, return x */
if (hx < 0x00100000)
FORCE_EVAL((float)x);
return x;
} else
k = 0;
/* x is now in primary range */
hfx = 0.5*x;
hxs = x*hfx;
r1 = 1.0+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
t = 3.0-r1*hfx;
e = hxs*((r1-t)/(6.0 - x*t));
if (k == 0) /* c is 0 */
return x - (x*e-hxs);
e = x*(e-c) - c;
e -= hxs;
/* exp(x) ~ 2^k (x_reduced - e + 1) */
if (k == -1)
return 0.5*(x-e) - 0.5;
if (k == 1) {
if (x < -0.25)
return -2.0*(e-(x+0.5));
return 1.0+2.0*(x-e);
}
u.i = (uint64_t)(0x3ff + k)<<52; /* 2^k */
twopk = u.f;
if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */
y = x - e + 1.0;
if (k == 1024)
y = y*2.0*0x1p1023;
else
y = y*twopk;
return y - 1.0;
}
u.i = (uint64_t)(0x3ff - k)<<52; /* 2^-k */
if (k < 20)
y = (x-e+(1-u.f))*twopk;
else
y = (x-(e+u.f)+1)*twopk;
return y;
}
+23
View File
@@ -0,0 +1,23 @@
#include <math.h>
#include <stdint.h>
double __cdecl frexp(double x, int *e)
{
union { double d; uint64_t i; } y = { x };
int ee = y.i>>52 & 0x7ff;
if (!ee) {
if (x) {
x = frexp(x*0x1p64, e);
*e -= 64;
} else *e = 0;
return x;
} else if (ee == 0x7ff) {
return x;
}
*e = ee - 0x3fe;
y.i &= 0x800fffffffffffffull;
y.i |= 0x3fe0000000000000ull;
return y.d;
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef FEATURES_H
#define FEATURES_H
#define weak
#define hidden
#define weak_alias(old, new)
#endif
+282
View File
@@ -0,0 +1,282 @@
#ifndef _LIBM_H
#define _LIBM_H
#include <stdint.h>
#include <float.h>
#include <math.h>
#include <errno.h>
#include <features.h>
typedef float float_t;
typedef double double_t;
hidden double math_error(int type, const char *name, double arg1, double arg2, double retval);
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
union ldshape {
long double f;
struct {
uint64_t m;
uint16_t se;
} i;
};
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
/* This is the m68k variant of 80-bit long double, and this definition only works
* on archs where the alignment requirement of uint64_t is <= 4. */
union ldshape {
long double f;
struct {
uint16_t se;
uint16_t pad;
uint64_t m;
} i;
};
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
union ldshape {
long double f;
struct {
uint64_t lo;
uint32_t mid;
uint16_t top;
uint16_t se;
} i;
struct {
uint64_t lo;
uint64_t hi;
} i2;
};
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
union ldshape {
long double f;
struct {
uint16_t se;
uint16_t top;
uint32_t mid;
uint64_t lo;
} i;
struct {
uint64_t hi;
uint64_t lo;
} i2;
};
#else
#error Unsupported long double representation
#endif
/* Support non-nearest rounding mode. */
#define WANT_ROUNDING 1
/* Support signaling NaNs. */
#define WANT_SNAN 0
#if WANT_SNAN
#error SNaN is unsupported
#else
#define issignalingf_inline(x) 0
#define issignaling_inline(x) 0
#endif
#ifndef TOINT_INTRINSICS
#define TOINT_INTRINSICS 0
#endif
#if TOINT_INTRINSICS
/* Round x to nearest int in all rounding modes, ties have to be rounded
consistently with converttoint so the results match. If the result
would be outside of [-2^31, 2^31-1] then the semantics is unspecified. */
static double_t roundtoint(double_t);
/* Convert x to nearest int in all rounding modes, ties have to be rounded
consistently with roundtoint. If the result is not representible in an
int32_t then the semantics is unspecified. */
static int32_t converttoint(double_t);
#endif
/* Helps static branch prediction so hot path can be better optimized. */
#ifdef __GNUC__
#define predict_true(x) __builtin_expect(!!(x), 1)
#define predict_false(x) __builtin_expect(x, 0)
#else
#define predict_true(x) (x)
#define predict_false(x) (x)
#endif
/* Evaluate an expression as the specified type. With standard excess
precision handling a type cast or assignment is enough (with
-ffloat-store an assignment is required, in old compilers argument
passing and return statement may not drop excess precision).
If compiled without -ffloat-store or -fexcess-precision=standard,
an extra volatile qualifier here will force limiting the precision. */
static inline float eval_as_float(float x)
{
volatile float y = x;
return y;
}
static inline double eval_as_double(double x)
{
volatile double y = x;
return y;
}
/* fp_barrier returns its input, but limits code transformations
as if it had a side-effect (e.g. observable io) and returned
an arbitrary value. */
#ifndef fp_barrierf
#define fp_barrierf fp_barrierf
static inline float fp_barrierf(float x)
{
volatile float y = x;
return y;
}
#endif
#ifndef fp_barrier
#define fp_barrier fp_barrier
static inline double fp_barrier(double x)
{
volatile double y = x;
return y;
}
#endif
#ifndef fp_barrierl
#define fp_barrierl fp_barrierl
static inline long double fp_barrierl(long double x)
{
volatile long double y = x;
return y;
}
#endif
/* fp_force_eval ensures that the input value is computed when that's
otherwise unused. To prevent the constant folding of the input
expression, an additional fp_barrier may be needed or a compilation
mode that does so (e.g. -frounding-math in gcc). Then it can be
used to evaluate an expression for its fenv side-effects only. */
#ifndef fp_force_evalf
#define fp_force_evalf fp_force_evalf
static inline void fp_force_evalf(float x)
{
volatile float y;
y = x;
}
#endif
#ifndef fp_force_eval
#define fp_force_eval fp_force_eval
static inline void fp_force_eval(double x)
{
volatile double y;
y = x;
}
#endif
#ifndef fp_force_evall
#define fp_force_evall fp_force_evall
static inline void fp_force_evall(long double x)
{
volatile long double y;
y = x;
}
#endif
#define FORCE_EVAL(x) do { \
if (sizeof(x) == sizeof(float)) { \
fp_force_evalf(x); \
} else if (sizeof(x) == sizeof(double)) { \
fp_force_eval(x); \
} else { \
fp_force_evall(x); \
} \
} while(0)
#define asuint(f) ((union{float _f; uint32_t _i;}){f})._i
#define asfloat(i) ((union{uint32_t _i; float _f;}){i})._f
#define asuint64(f) ((union{double _f; uint64_t _i;}){f})._i
#define asdouble(i) ((union{uint64_t _i; double _f;}){i})._f
#define EXTRACT_WORDS(hi,lo,d) \
do { \
uint64_t __u = asuint64(d); \
(hi) = __u >> 32; \
(lo) = (uint32_t)__u; \
} while (0)
#define GET_HIGH_WORD(hi,d) \
do { \
(hi) = asuint64(d) >> 32; \
} while (0)
#define GET_LOW_WORD(lo,d) \
do { \
(lo) = (uint32_t)asuint64(d); \
} while (0)
#define INSERT_WORDS(d,hi,lo) \
do { \
(d) = asdouble(((uint64_t)(hi)<<32) | (uint32_t)(lo)); \
} while (0)
#define SET_HIGH_WORD(d,hi) \
INSERT_WORDS(d, hi, (uint32_t)asuint64(d))
#define SET_LOW_WORD(d,lo) \
INSERT_WORDS(d, asuint64(d)>>32, lo)
#define GET_FLOAT_WORD(w,d) \
do { \
(w) = asuint(d); \
} while (0)
#define SET_FLOAT_WORD(d,w) \
do { \
(d) = asfloat(w); \
} while (0)
hidden int __rem_pio2_large(double*,double*,int,int,int);
hidden int __rem_pio2(double,double*);
hidden double __sin(double,double,int);
hidden double __cos(double,double);
hidden double __tan(double,double,int);
hidden double __expo2(double,double);
hidden int __rem_pio2f(float,double*);
hidden float __sindf(double);
hidden float __cosdf(double);
hidden float __tandf(double,int);
hidden float __expo2f(float,float);
hidden int __rem_pio2l(long double, long double *);
hidden long double __sinl(long double, long double, int);
hidden long double __cosl(long double, long double);
hidden long double __tanl(long double, long double, int);
hidden long double __polevll(long double, const long double *, int);
hidden long double __p1evll(long double, const long double *, int);
extern int __signgam;
hidden double __lgamma_r(double, int *);
hidden float __lgammaf_r(float, int *);
/* error handling functions */
hidden float __math_xflowf(uint32_t, float);
hidden float __math_uflowf(uint32_t);
hidden float __math_oflowf(uint32_t);
hidden float __math_divzerof(uint32_t);
hidden float __math_invalidf(float);
hidden double __math_xflow(uint32_t, double);
hidden double __math_uflow(uint32_t);
hidden double __math_oflow(uint32_t);
hidden double __math_divzero(uint32_t);
hidden double __math_invalid(double);
#if LDBL_MANT_DIG != DBL_MANT_DIG
hidden long double __math_invalidl(long double);
#endif
#endif
+6
View File
@@ -0,0 +1,6 @@
#include <math.h>
double __cdecl ldexp(double x, int n)
{
return scalbn(x, n);
}
+126
View File
@@ -0,0 +1,126 @@
/* origin: FreeBSD /usr/src/lib/msun/src/s_log1p.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* double log1p(double x)
* Return the natural logarithm of 1+x.
*
* Method :
* 1. Argument Reduction: find k and f such that
* 1+x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* Note. If k=0, then f=x is exact. However, if k!=0, then f
* may not be representable exactly. In that case, a correction
* term is need. Let u=1+x rounded. Let c = (1+x)-u, then
* log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
* and add back the correction term c/u.
* (Note: when x > 2**53, one can simply return log(x))
*
* 2. Approximation of log(1+f): See log.c
*
* 3. Finally, log1p(x) = k*ln2 + log(1+f) + c/u. See log.c
*
* Special cases:
* log1p(x) is NaN with signal if x < -1 (including -INF) ;
* log1p(+INF) is +INF; log1p(-1) is -INF with signal;
* log1p(NaN) is that NaN with no signal.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*
* Note: Assuming log() return accurate answer, the following
* algorithm can be used to compute log1p(x) to within a few ULP:
*
* u = 1+x;
* if(u==1.0) return x ; else
* return log(u)*(x/(u-1.0));
*
* See HP-15C Advanced Functions Handbook, p.193.
*/
#include "libm.h"
static const double
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
double __cdecl log1p(double x)
{
union {double f; uint64_t i;} u = {x};
double_t hfsq,f,c,s,z,R,w,t1,t2,dk;
uint32_t hx,hu;
int k;
hx = u.i>>32;
k = 1;
if (hx < 0x3fda827a || hx>>31) { /* 1+x < sqrt(2)+ */
if (hx >= 0xbff00000) { /* x <= -1.0 */
if (x == -1) {
errno = ERANGE;
return x/0.0; /* log1p(-1) = -inf */
}
errno = EDOM;
return (x-x)/0.0; /* log1p(x<-1) = NaN */
}
if (hx<<1 < 0x3ca00000<<1) { /* |x| < 2**-53 */
fp_barrier(x + 0x1p120f);
/* underflow if subnormal */
if ((hx&0x7ff00000) == 0)
FORCE_EVAL((float)x);
return x;
}
if (hx <= 0xbfd2bec4) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */
k = 0;
c = 0;
f = x;
}
} else if (hx >= 0x7ff00000)
return x;
if (k) {
u.f = 1 + x;
hu = u.i>>32;
hu += 0x3ff00000 - 0x3fe6a09e;
k = (int)(hu>>20) - 0x3ff;
/* correction term ~ log(1+x)-log(u), avoid underflow in c/u */
if (k < 54) {
c = k >= 2 ? 1-(u.f-x) : x-(u.f-1);
c /= u.f;
} else
c = 0;
/* reduce u into [sqrt(2)/2, sqrt(2)] */
hu = (hu&0x000fffff) + 0x3fe6a09e;
u.i = (uint64_t)hu<<32 | (u.i&0xffffffff);
f = u.f - 1;
}
hfsq = 0.5*f*f;
s = f/(2.0+f);
z = s*s;
w = z*z;
t1 = w*(Lg2+w*(Lg4+w*Lg6));
t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
R = t2 + t1;
dk = k;
return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi;
}
+128
View File
@@ -0,0 +1,128 @@
/*
* Double-precision log2(x) function.
*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#include <math.h>
#include <stdint.h>
#include "libm.h"
#include "log2_data.h"
#define T __log2_data.tab
#define T2 __log2_data.tab2
#define B __log2_data.poly1
#define A __log2_data.poly
#define InvLn2hi __log2_data.invln2hi
#define InvLn2lo __log2_data.invln2lo
#define N (1 << LOG2_TABLE_BITS)
#define OFF 0x3fe6000000000000
/* Top 16 bits of a double. */
static inline uint32_t top16(double x)
{
return asuint64(x) >> 48;
}
double __cdecl log2(double x)
{
double_t z, r, r2, r4, y, invc, logc, kd, hi, lo, t1, t2, t3, p;
uint64_t ix, iz, tmp;
uint32_t top;
int k, i;
ix = asuint64(x);
top = top16(x);
#define LO asuint64(1.0 - 0x1.5b51p-5)
#define HI asuint64(1.0 + 0x1.6ab2p-5)
if (predict_false(ix - LO < HI - LO)) {
/* Handle close to 1.0 inputs separately. */
/* Fix sign of zero with downward rounding when x==1. */
if (WANT_ROUNDING && predict_false(ix == asuint64(1.0)))
return 0;
r = x - 1.0;
#if __FP_FAST_FMA
hi = r * InvLn2hi;
lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi);
#else
double_t rhi, rlo;
rhi = asdouble(asuint64(r) & -1ULL << 32);
rlo = r - rhi;
hi = rhi * InvLn2hi;
lo = rlo * InvLn2hi + r * InvLn2lo;
#endif
r2 = r * r; /* rounding error: 0x1p-62. */
r4 = r2 * r2;
/* Worst-case error is less than 0.54 ULP (0.55 ULP without fma). */
p = r2 * (B[0] + r * B[1]);
y = hi + p;
lo += hi - y + p;
lo += r4 * (B[2] + r * B[3] + r2 * (B[4] + r * B[5]) +
r4 * (B[6] + r * B[7] + r2 * (B[8] + r * B[9])));
y += lo;
return eval_as_double(y);
}
if (predict_false(top - 0x0010 >= 0x7ff0 - 0x0010)) {
/* x < 0x1p-1022 or inf or nan. */
if (ix * 2 == 0) {
errno = ERANGE;
return __math_divzero(1);
}
if (ix == asuint64(INFINITY)) /* log(inf) == inf. */
return x;
if ((top & 0x7ff0) == 0x7ff0 && (ix & 0xfffffffffffffULL))
return x;
if (top & 0x8000) {
errno = EDOM;
return __math_invalid(x);
}
/* x is subnormal, normalize it. */
ix = asuint64(x * 0x1p52);
ix -= 52ULL << 52;
}
/* x = 2^k z; where z is in range [OFF,2*OFF) and exact.
The range is split into N subintervals.
The ith subinterval contains z and c is near its center. */
tmp = ix - OFF;
i = (tmp >> (52 - LOG2_TABLE_BITS)) % N;
k = (int64_t)tmp >> 52; /* arithmetic shift */
iz = ix - (tmp & 0xfffULL << 52);
invc = T[i].invc;
logc = T[i].logc;
z = asdouble(iz);
kd = (double_t)k;
/* log2(x) = log2(z/c) + log2(c) + k. */
/* r ~= z/c - 1, |r| < 1/(2*N). */
#if __FP_FAST_FMA
/* rounding error: 0x1p-55/N. */
r = __builtin_fma(z, invc, -1.0);
t1 = r * InvLn2hi;
t2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1);
#else
double_t rhi, rlo;
/* rounding error: 0x1p-55/N + 0x1p-65. */
r = (z - T2[i].chi - T2[i].clo) * invc;
rhi = asdouble(asuint64(r) & -1ULL << 32);
rlo = r - rhi;
t1 = rhi * InvLn2hi;
t2 = rlo * InvLn2hi + r * InvLn2lo;
#endif
/* hi + lo = r/ln2 + log2(c) + k. */
t3 = kd + logc;
hi = t3 + t1;
lo = t3 - hi + t1 + t2;
/* log2(r+1) = r/ln2 + r^2*poly(r). */
/* Evaluation is optimized assuming superscalar pipelined execution. */
r2 = r * r; /* rounding error: 0x1p-54/N^2. */
r4 = r2 * r2;
/* Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma).
~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma). */
p = A[0] + r * A[1] + r2 * (A[2] + r * A[3]) + r4 * (A[4] + r * A[5]);
y = lo + r2 * p + hi;
return eval_as_double(y);
}
+201
View File
@@ -0,0 +1,201 @@
/*
* Data for log2.
*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#include "log2_data.h"
#define N (1 << LOG2_TABLE_BITS)
const struct log2_data __log2_data = {
// First coefficient: 0x1.71547652b82fe1777d0ffda0d24p0
.invln2hi = 0x1.7154765200000p+0,
.invln2lo = 0x1.705fc2eefa200p-33,
.poly1 = {
// relative error: 0x1.2fad8188p-63
// in -0x1.5b51p-5 0x1.6ab2p-5
-0x1.71547652b82fep-1,
0x1.ec709dc3a03f7p-2,
-0x1.71547652b7c3fp-2,
0x1.2776c50f05be4p-2,
-0x1.ec709dd768fe5p-3,
0x1.a61761ec4e736p-3,
-0x1.7153fbc64a79bp-3,
0x1.484d154f01b4ap-3,
-0x1.289e4a72c383cp-3,
0x1.0b32f285aee66p-3,
},
.poly = {
// relative error: 0x1.a72c2bf8p-58
// abs error: 0x1.67a552c8p-66
// in -0x1.f45p-8 0x1.f45p-8
-0x1.71547652b8339p-1,
0x1.ec709dc3a04bep-2,
-0x1.7154764702ffbp-2,
0x1.2776c50034c48p-2,
-0x1.ec7b328ea92bcp-3,
0x1.a6225e117f92ep-3,
},
/* Algorithm:
x = 2^k z
log2(x) = k + log2(c) + log2(z/c)
log2(z/c) = poly(z/c - 1)
where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls
into the ith one, then table entries are computed as
tab[i].invc = 1/c
tab[i].logc = (double)log2(c)
tab2[i].chi = (double)c
tab2[i].clo = (double)(c - (double)c)
where c is near the center of the subinterval and is chosen by trying +-2^29
floating point invc candidates around 1/center and selecting one for which
1) the rounding error in 0x1.8p10 + logc is 0,
2) the rounding error in z - chi - clo is < 0x1p-64 and
3) the rounding error in (double)log2(c) is minimized (< 0x1p-68).
Note: 1) ensures that k + logc can be computed without rounding error, 2)
ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a
single rounding error when there is no fast fma for z*invc - 1, 3) ensures
that logc + poly(z/c - 1) has small error, however near x == 1 when
|log2(x)| < 0x1p-4, this is not enough so that is special cased. */
.tab = {
{0x1.724286bb1acf8p+0, -0x1.1095feecdb000p-1},
{0x1.6e1f766d2cca1p+0, -0x1.08494bd76d000p-1},
{0x1.6a13d0e30d48ap+0, -0x1.00143aee8f800p-1},
{0x1.661ec32d06c85p+0, -0x1.efec5360b4000p-2},
{0x1.623fa951198f8p+0, -0x1.dfdd91ab7e000p-2},
{0x1.5e75ba4cf026cp+0, -0x1.cffae0cc79000p-2},
{0x1.5ac055a214fb8p+0, -0x1.c043811fda000p-2},
{0x1.571ed0f166e1ep+0, -0x1.b0b67323ae000p-2},
{0x1.53909590bf835p+0, -0x1.a152f5a2db000p-2},
{0x1.5014fed61adddp+0, -0x1.9217f5af86000p-2},
{0x1.4cab88e487bd0p+0, -0x1.8304db0719000p-2},
{0x1.49539b4334feep+0, -0x1.74189f9a9e000p-2},
{0x1.460cbdfafd569p+0, -0x1.6552bb5199000p-2},
{0x1.42d664ee4b953p+0, -0x1.56b23a29b1000p-2},
{0x1.3fb01111dd8a6p+0, -0x1.483650f5fa000p-2},
{0x1.3c995b70c5836p+0, -0x1.39de937f6a000p-2},
{0x1.3991c4ab6fd4ap+0, -0x1.2baa1538d6000p-2},
{0x1.3698e0ce099b5p+0, -0x1.1d98340ca4000p-2},
{0x1.33ae48213e7b2p+0, -0x1.0fa853a40e000p-2},
{0x1.30d191985bdb1p+0, -0x1.01d9c32e73000p-2},
{0x1.2e025cab271d7p+0, -0x1.e857da2fa6000p-3},
{0x1.2b404cf13cd82p+0, -0x1.cd3c8633d8000p-3},
{0x1.288b02c7ccb50p+0, -0x1.b26034c14a000p-3},
{0x1.25e2263944de5p+0, -0x1.97c1c2f4fe000p-3},
{0x1.234563d8615b1p+0, -0x1.7d6023f800000p-3},
{0x1.20b46e33eaf38p+0, -0x1.633a71a05e000p-3},
{0x1.1e2eefdcda3ddp+0, -0x1.494f5e9570000p-3},
{0x1.1bb4a580b3930p+0, -0x1.2f9e424e0a000p-3},
{0x1.19453847f2200p+0, -0x1.162595afdc000p-3},
{0x1.16e06c0d5d73cp+0, -0x1.f9c9a75bd8000p-4},
{0x1.1485f47b7e4c2p+0, -0x1.c7b575bf9c000p-4},
{0x1.12358ad0085d1p+0, -0x1.960c60ff48000p-4},
{0x1.0fef00f532227p+0, -0x1.64ce247b60000p-4},
{0x1.0db2077d03a8fp+0, -0x1.33f78b2014000p-4},
{0x1.0b7e6d65980d9p+0, -0x1.0387d1a42c000p-4},
{0x1.0953efe7b408dp+0, -0x1.a6f9208b50000p-5},
{0x1.07325cac53b83p+0, -0x1.47a954f770000p-5},
{0x1.05197e40d1b5cp+0, -0x1.d23a8c50c0000p-6},
{0x1.03091c1208ea2p+0, -0x1.16a2629780000p-6},
{0x1.0101025b37e21p+0, -0x1.720f8d8e80000p-8},
{0x1.fc07ef9caa76bp-1, 0x1.6fe53b1500000p-7},
{0x1.f4465d3f6f184p-1, 0x1.11ccce10f8000p-5},
{0x1.ecc079f84107fp-1, 0x1.c4dfc8c8b8000p-5},
{0x1.e573a99975ae8p-1, 0x1.3aa321e574000p-4},
{0x1.de5d6f0bd3de6p-1, 0x1.918a0d08b8000p-4},
{0x1.d77b681ff38b3p-1, 0x1.e72e9da044000p-4},
{0x1.d0cb5724de943p-1, 0x1.1dcd2507f6000p-3},
{0x1.ca4b2dc0e7563p-1, 0x1.476ab03dea000p-3},
{0x1.c3f8ee8d6cb51p-1, 0x1.7074377e22000p-3},
{0x1.bdd2b4f020c4cp-1, 0x1.98ede8ba94000p-3},
{0x1.b7d6c006015cap-1, 0x1.c0db86ad2e000p-3},
{0x1.b20366e2e338fp-1, 0x1.e840aafcee000p-3},
{0x1.ac57026295039p-1, 0x1.0790ab4678000p-2},
{0x1.a6d01bc2731ddp-1, 0x1.1ac056801c000p-2},
{0x1.a16d3bc3ff18bp-1, 0x1.2db11d4fee000p-2},
{0x1.9c2d14967feadp-1, 0x1.406464ec58000p-2},
{0x1.970e4f47c9902p-1, 0x1.52dbe093af000p-2},
{0x1.920fb3982bcf2p-1, 0x1.651902050d000p-2},
{0x1.8d30187f759f1p-1, 0x1.771d2cdeaf000p-2},
{0x1.886e5ebb9f66dp-1, 0x1.88e9c857d9000p-2},
{0x1.83c97b658b994p-1, 0x1.9a80155e16000p-2},
{0x1.7f405ffc61022p-1, 0x1.abe186ed3d000p-2},
{0x1.7ad22181415cap-1, 0x1.bd0f2aea0e000p-2},
{0x1.767dcf99eff8cp-1, 0x1.ce0a43dbf4000p-2},
},
#if !__FP_FAST_FMA
.tab2 = {
{0x1.6200012b90a8ep-1, 0x1.904ab0644b605p-55},
{0x1.66000045734a6p-1, 0x1.1ff9bea62f7a9p-57},
{0x1.69fffc325f2c5p-1, 0x1.27ecfcb3c90bap-55},
{0x1.6e00038b95a04p-1, 0x1.8ff8856739326p-55},
{0x1.71fffe09994e3p-1, 0x1.afd40275f82b1p-55},
{0x1.7600015590e1p-1, -0x1.2fd75b4238341p-56},
{0x1.7a00012655bd5p-1, 0x1.808e67c242b76p-56},
{0x1.7e0003259e9a6p-1, -0x1.208e426f622b7p-57},
{0x1.81fffedb4b2d2p-1, -0x1.402461ea5c92fp-55},
{0x1.860002dfafcc3p-1, 0x1.df7f4a2f29a1fp-57},
{0x1.89ffff78c6b5p-1, -0x1.e0453094995fdp-55},
{0x1.8e00039671566p-1, -0x1.a04f3bec77b45p-55},
{0x1.91fffe2bf1745p-1, -0x1.7fa34400e203cp-56},
{0x1.95fffcc5c9fd1p-1, -0x1.6ff8005a0695dp-56},
{0x1.9a0003bba4767p-1, 0x1.0f8c4c4ec7e03p-56},
{0x1.9dfffe7b92da5p-1, 0x1.e7fd9478c4602p-55},
{0x1.a1fffd72efdafp-1, -0x1.a0c554dcdae7ep-57},
{0x1.a5fffde04ff95p-1, 0x1.67da98ce9b26bp-55},
{0x1.a9fffca5e8d2bp-1, -0x1.284c9b54c13dep-55},
{0x1.adfffddad03eap-1, 0x1.812c8ea602e3cp-58},
{0x1.b1ffff10d3d4dp-1, -0x1.efaddad27789cp-55},
{0x1.b5fffce21165ap-1, 0x1.3cb1719c61237p-58},
{0x1.b9fffd950e674p-1, 0x1.3f7d94194cep-56},
{0x1.be000139ca8afp-1, 0x1.50ac4215d9bcp-56},
{0x1.c20005b46df99p-1, 0x1.beea653e9c1c9p-57},
{0x1.c600040b9f7aep-1, -0x1.c079f274a70d6p-56},
{0x1.ca0006255fd8ap-1, -0x1.a0b4076e84c1fp-56},
{0x1.cdfffd94c095dp-1, 0x1.8f933f99ab5d7p-55},
{0x1.d1ffff975d6cfp-1, -0x1.82c08665fe1bep-58},
{0x1.d5fffa2561c93p-1, -0x1.b04289bd295f3p-56},
{0x1.d9fff9d228b0cp-1, 0x1.70251340fa236p-55},
{0x1.de00065bc7e16p-1, -0x1.5011e16a4d80cp-56},
{0x1.e200002f64791p-1, 0x1.9802f09ef62ep-55},
{0x1.e600057d7a6d8p-1, -0x1.e0b75580cf7fap-56},
{0x1.ea00027edc00cp-1, -0x1.c848309459811p-55},
{0x1.ee0006cf5cb7cp-1, -0x1.f8027951576f4p-55},
{0x1.f2000782b7dccp-1, -0x1.f81d97274538fp-55},
{0x1.f6000260c450ap-1, -0x1.071002727ffdcp-59},
{0x1.f9fffe88cd533p-1, -0x1.81bdce1fda8bp-58},
{0x1.fdfffd50f8689p-1, 0x1.7f91acb918e6ep-55},
{0x1.0200004292367p+0, 0x1.b7ff365324681p-54},
{0x1.05fffe3e3d668p+0, 0x1.6fa08ddae957bp-55},
{0x1.0a0000a85a757p+0, -0x1.7e2de80d3fb91p-58},
{0x1.0e0001a5f3fccp+0, -0x1.1823305c5f014p-54},
{0x1.11ffff8afbaf5p+0, -0x1.bfabb6680bac2p-55},
{0x1.15fffe54d91adp+0, -0x1.d7f121737e7efp-54},
{0x1.1a00011ac36e1p+0, 0x1.c000a0516f5ffp-54},
{0x1.1e00019c84248p+0, -0x1.082fbe4da5dap-54},
{0x1.220000ffe5e6ep+0, -0x1.8fdd04c9cfb43p-55},
{0x1.26000269fd891p+0, 0x1.cfe2a7994d182p-55},
{0x1.2a00029a6e6dap+0, -0x1.00273715e8bc5p-56},
{0x1.2dfffe0293e39p+0, 0x1.b7c39dab2a6f9p-54},
{0x1.31ffff7dcf082p+0, 0x1.df1336edc5254p-56},
{0x1.35ffff05a8b6p+0, -0x1.e03564ccd31ebp-54},
{0x1.3a0002e0eaeccp+0, 0x1.5f0e74bd3a477p-56},
{0x1.3e000043bb236p+0, 0x1.c7dcb149d8833p-54},
{0x1.4200002d187ffp+0, 0x1.e08afcf2d3d28p-56},
{0x1.460000d387cb1p+0, 0x1.20837856599a6p-55},
{0x1.4a00004569f89p+0, -0x1.9fa5c904fbcd2p-55},
{0x1.4e000043543f3p+0, -0x1.81125ed175329p-56},
{0x1.51fffcc027f0fp+0, 0x1.883d8847754dcp-54},
{0x1.55ffffd87b36fp+0, -0x1.709e731d02807p-55},
{0x1.59ffff21df7bap+0, 0x1.7f79f68727b02p-55},
{0x1.5dfffebfc3481p+0, -0x1.180902e30e93ep-54},
},
#endif
};
+28
View File
@@ -0,0 +1,28 @@
/*
* Copyright (c) 2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#ifndef _LOG2_DATA_H
#define _LOG2_DATA_H
#include <features.h>
#define LOG2_TABLE_BITS 6
#define LOG2_POLY_ORDER 7
#define LOG2_POLY1_ORDER 11
extern hidden const struct log2_data {
double invln2hi;
double invln2lo;
double poly[LOG2_POLY_ORDER - 1];
double poly1[LOG2_POLY1_ORDER - 1];
struct {
double invc, logc;
} tab[1 << LOG2_TABLE_BITS];
#if !__FP_FAST_FMA
struct {
double chi, clo;
} tab2[1 << LOG2_TABLE_BITS];
#endif
} __log2_data;
#endif
+34
View File
@@ -0,0 +1,34 @@
#include <math.h>
#include <stdint.h>
#include "libm.h"
double __cdecl scalbn(double x, int n)
{
union {double f; uint64_t i;} u;
double_t y = x;
if (n > 1023) {
y *= 0x1p1023;
n -= 1023;
if (n > 1023) {
y *= 0x1p1023;
n -= 1023;
if (n > 1023)
n = 1023;
}
} else if (n < -1022) {
/* make sure final n < -53 to avoid double
rounding in the subnormal range */
y *= 0x1p-1022 * 0x1p53;
n += 1022 - 53;
if (n < -1022) {
y *= 0x1p-1022 * 0x1p53;
n += 1022 - 53;
if (n < -1022)
n = -1022;
}
}
u.i = (uint64_t)(0x3ff+n)<<52;
x = y * u.f;
return x;
}
+80
View File
@@ -0,0 +1,80 @@
/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* sin(x)
* Return sine function of x.
*
* kernel function:
* __sin ... sine function on [-pi/4,pi/4]
* __cos ... cose function on [-pi/4,pi/4]
* __rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "libm.h"
double __cdecl sin(double x)
{
double y[2];
uint32_t ix;
unsigned n;
/* High word of x. */
GET_HIGH_WORD(ix, x);
ix &= 0x7fffffff;
/* |x| ~< pi/4 */
if (ix <= 0x3fe921fb) {
if (ix < 0x3e500000) { /* |x| < 2**-26 */
/* raise inexact if x != 0 and underflow if subnormal*/
FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
return x;
}
return __sin(x, 0.0, 0);
}
/* sin(Inf or NaN) is NaN */
if (isinf(x))
return math_error(_DOMAIN, "sin", x, 0, x - x);
if (ix >= 0x7ff00000)
return x - x;
/* argument reduction needed */
n = __rem_pio2(x, y);
switch (n&3) {
case 0: return __sin(y[0], y[1], 1);
case 1: return __cos(y[0], y[1]);
case 2: return -__sin(y[0], y[1], 1);
default:
return -__cos(y[0], y[1]);
}
}
+69
View File
@@ -0,0 +1,69 @@
/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#define _GNU_SOURCE
#include "libm.h"
void __cdecl sincos(double x, double *sin, double *cos)
{
double y[2], s, c;
uint32_t ix;
unsigned n;
GET_HIGH_WORD(ix, x);
ix &= 0x7fffffff;
/* |x| ~< pi/4 */
if (ix <= 0x3fe921fb) {
/* if |x| < 2**-27 * sqrt(2) */
if (ix < 0x3e46a09e) {
/* raise inexact if x!=0 and underflow if subnormal */
FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
*sin = x;
*cos = 1.0;
return;
}
*sin = __sin(x, 0.0, 0);
*cos = __cos(x, 0.0);
return;
}
/* sincos(Inf or NaN) is NaN */
if (ix >= 0x7ff00000) {
*sin = *cos = x - x;
return;
}
/* argument reduction needed */
n = __rem_pio2(x, y);
s = __sin(y[0], y[1], 1);
c = __cos(y[0], y[1]);
switch (n&3) {
case 0:
*sin = s;
*cos = c;
break;
case 1:
*sin = c;
*cos = -s;
break;
case 2:
*sin = -s;
*cos = -c;
break;
case 3:
default:
*sin = -c;
*cos = s;
break;
}
}
+158
View File
@@ -0,0 +1,158 @@
#include <stdint.h>
#include <math.h>
#include "libm.h"
#include "sqrt_data.h"
#define FENV_SUPPORT 1
/* returns a*b*2^-32 - e, with error 0 <= e < 1. */
static inline uint32_t mul32(uint32_t a, uint32_t b)
{
return (uint64_t)a*b >> 32;
}
/* returns a*b*2^-64 - e, with error 0 <= e < 3. */
static inline uint64_t mul64(uint64_t a, uint64_t b)
{
uint64_t ahi = a>>32;
uint64_t alo = a&0xffffffff;
uint64_t bhi = b>>32;
uint64_t blo = b&0xffffffff;
return ahi*bhi + (ahi*blo >> 32) + (alo*bhi >> 32);
}
double __cdecl sqrt(double x)
{
uint64_t ix, top, m;
/* special case handling. */
ix = asuint64(x);
top = ix >> 52;
if (predict_false(top - 0x001 >= 0x7ff - 0x001)) {
/* x < 0x1p-1022 or inf or nan. */
if (ix * 2 == 0)
return x;
if (ix == 0x7ff0000000000000)
return x;
if (ix > 0x7ff0000000000000)
return math_error(_DOMAIN, "sqrt", x, 0, (x - x) / (x - x));
/* x is subnormal, normalize it. */
ix = asuint64(x * 0x1p52);
top = ix >> 52;
top -= 52;
}
/* argument reduction:
x = 4^e m; with integer e, and m in [1, 4)
m: fixed point representation [2.62]
2^e is the exponent part of the result. */
int even = top & 1;
m = (ix << 11) | 0x8000000000000000;
if (even) m >>= 1;
top = (top + 0x3ff) >> 1;
/* approximate r ~ 1/sqrt(m) and s ~ sqrt(m) when m in [1,4)
initial estimate:
7bit table lookup (1bit exponent and 6bit significand).
iterative approximation:
using 2 goldschmidt iterations with 32bit int arithmetics
and a final iteration with 64bit int arithmetics.
details:
the relative error (e = r0 sqrt(m)-1) of a linear estimate
(r0 = a m + b) is |e| < 0.085955 ~ 0x1.6p-4 at best,
a table lookup is faster and needs one less iteration
6 bit lookup table (128b) gives |e| < 0x1.f9p-8
7 bit lookup table (256b) gives |e| < 0x1.fdp-9
for single and double prec 6bit is enough but for quad
prec 7bit is needed (or modified iterations). to avoid
one more iteration >=13bit table would be needed (16k).
a newton-raphson iteration for r is
w = r*r
u = 3 - m*w
r = r*u/2
can use a goldschmidt iteration for s at the end or
s = m*r
first goldschmidt iteration is
s = m*r
u = 3 - s*r
r = r*u/2
s = s*u/2
next goldschmidt iteration is
u = 3 - s*r
r = r*u/2
s = s*u/2
and at the end r is not computed only s.
they use the same amount of operations and converge at the
same quadratic rate, i.e. if
r1 sqrt(m) - 1 = e, then
r2 sqrt(m) - 1 = -3/2 e^2 - 1/2 e^3
the advantage of goldschmidt is that the mul for s and r
are independent (computed in parallel), however it is not
"self synchronizing": it only uses the input m in the
first iteration so rounding errors accumulate. at the end
or when switching to larger precision arithmetics rounding
errors dominate so the first iteration should be used.
the fixed point representations are
m: 2.30 r: 0.32, s: 2.30, d: 2.30, u: 2.30, three: 2.30
and after switching to 64 bit
m: 2.62 r: 0.64, s: 2.62, d: 2.62, u: 2.62, three: 2.62 */
static const uint64_t three = 0xc0000000;
uint64_t r, s, d, u, i;
i = (ix >> 46) % 128;
r = (uint32_t)__rsqrt_tab[i] << 16;
/* |r sqrt(m) - 1| < 0x1.fdp-9 */
s = mul32(m>>32, r);
/* |s/sqrt(m) - 1| < 0x1.fdp-9 */
d = mul32(s, r);
u = three - d;
r = mul32(r, u) << 1;
/* |r sqrt(m) - 1| < 0x1.7bp-16 */
s = mul32(s, u) << 1;
/* |s/sqrt(m) - 1| < 0x1.7bp-16 */
d = mul32(s, r);
u = three - d;
r = mul32(r, u) << 1;
/* |r sqrt(m) - 1| < 0x1.3704p-29 (measured worst-case) */
r = r << 32;
s = mul64(m, r);
d = mul64(s, r);
u = (three<<32) - d;
s = mul64(s, u); /* repr: 3.61 */
/* -0x1p-57 < s - sqrt(m) < 0x1.8001p-61 */
s = (s - 2) >> 9; /* repr: 12.52 */
/* -0x1.09p-52 < s - sqrt(m) < -0x1.fffcp-63 */
/* s < sqrt(m) < s + 0x1.09p-52,
compute nearest rounded result:
the nearest result to 52 bits is either s or s+0x1p-52,
we can decide by comparing (2^52 s + 0.5)^2 to 2^104 m. */
uint64_t d0, d1, d2;
double y, t;
d0 = (m << 42) - s*s;
d1 = s - d0;
d2 = d1 + s + 1;
s += d1 >> 63;
s &= 0x000fffffffffffff;
s |= top << 52;
y = asdouble(s);
if (FENV_SUPPORT) {
/* handle rounding modes and inexact exception:
only (s+1)^2 == 2^42 m case is exact otherwise
add a tiny value to cause the fenv effects. */
uint64_t tiny = predict_false(d2==0) ? 0 : 0x0010000000000000;
tiny |= (d1^d2) & 0x8000000000000000;
t = asdouble(tiny);
y = eval_as_double(y + t);
}
return y;
}
+19
View File
@@ -0,0 +1,19 @@
#include "sqrt_data.h"
const uint16_t __rsqrt_tab[128] = {
0xb451,0xb2f0,0xb196,0xb044,0xaef9,0xadb6,0xac79,0xab43,
0xaa14,0xa8eb,0xa7c8,0xa6aa,0xa592,0xa480,0xa373,0xa26b,
0xa168,0xa06a,0x9f70,0x9e7b,0x9d8a,0x9c9d,0x9bb5,0x9ad1,
0x99f0,0x9913,0x983a,0x9765,0x9693,0x95c4,0x94f8,0x9430,
0x936b,0x92a9,0x91ea,0x912e,0x9075,0x8fbe,0x8f0a,0x8e59,
0x8daa,0x8cfe,0x8c54,0x8bac,0x8b07,0x8a64,0x89c4,0x8925,
0x8889,0x87ee,0x8756,0x86c0,0x862b,0x8599,0x8508,0x8479,
0x83ec,0x8361,0x82d8,0x8250,0x81c9,0x8145,0x80c2,0x8040,
0xff02,0xfd0e,0xfb25,0xf947,0xf773,0xf5aa,0xf3ea,0xf234,
0xf087,0xeee3,0xed47,0xebb3,0xea27,0xe8a3,0xe727,0xe5b2,
0xe443,0xe2dc,0xe17a,0xe020,0xdecb,0xdd7d,0xdc34,0xdaf1,
0xd9b3,0xd87b,0xd748,0xd61a,0xd4f1,0xd3cd,0xd2ad,0xd192,
0xd07b,0xcf69,0xce5b,0xcd51,0xcc4a,0xcb48,0xca4a,0xc94f,
0xc858,0xc764,0xc674,0xc587,0xc49d,0xc3b7,0xc2d4,0xc1f4,
0xc116,0xc03c,0xbf65,0xbe90,0xbdbe,0xbcef,0xbc23,0xbb59,
0xba91,0xb9cc,0xb90a,0xb84a,0xb78c,0xb6d0,0xb617,0xb560,
};
+13
View File
@@ -0,0 +1,13 @@
#ifndef _SQRT_DATA_H
#define _SQRT_DATA_H
#include <features.h>
#include <stdint.h>
/* if x in [1,2): i = (int)(64*x);
if x in [2,4): i = (int)(32*x-64);
__rsqrt_tab[i]*2^-16 is estimating 1/sqrt(x) with small relative error:
|__rsqrt_tab[i]*0x1p-16*sqrt(x) - 1| < -0x1.fdp-9 < 2^-8 */
extern hidden const uint16_t __rsqrt_tab[128];
#endif
+83
View File
@@ -0,0 +1,83 @@
#include <stdint.h>
#include <math.h>
#include "libm.h"
#include "sqrt_data.h"
#define FENV_SUPPORT 1
static inline uint32_t mul32(uint32_t a, uint32_t b)
{
return (uint64_t)a*b >> 32;
}
/* see sqrt.c for more detailed comments. */
float __cdecl sqrtf(float x)
{
uint32_t ix, m, m1, m0, even, ey;
ix = asuint(x);
if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000)) {
/* x < 0x1p-126 or inf or nan. */
if (ix * 2 == 0)
return x;
if (ix == 0x7f800000)
return x;
if (ix > 0x7f800000)
return math_error(_DOMAIN, "sqrtf", x, 0, (x - x) / (x - x));
/* x is subnormal, normalize it. */
ix = asuint(x * 0x1p23f);
ix -= 23 << 23;
}
/* x = 4^e m; with int e and m in [1, 4). */
even = ix & 0x00800000;
m1 = (ix << 8) | 0x80000000;
m0 = (ix << 7) & 0x7fffffff;
m = even ? m0 : m1;
/* 2^e is the exponent part of the return value. */
ey = ix >> 1;
ey += 0x3f800000 >> 1;
ey &= 0x7f800000;
/* compute r ~ 1/sqrt(m), s ~ sqrt(m) with 2 goldschmidt iterations. */
static const uint32_t three = 0xc0000000;
uint32_t r, s, d, u, i;
i = (ix >> 17) % 128;
r = (uint32_t)__rsqrt_tab[i] << 16;
/* |r*sqrt(m) - 1| < 0x1p-8 */
s = mul32(m, r);
/* |s/sqrt(m) - 1| < 0x1p-8 */
d = mul32(s, r);
u = three - d;
r = mul32(r, u) << 1;
/* |r*sqrt(m) - 1| < 0x1.7bp-16 */
s = mul32(s, u) << 1;
/* |s/sqrt(m) - 1| < 0x1.7bp-16 */
d = mul32(s, r);
u = three - d;
s = mul32(s, u);
/* -0x1.03p-28 < s/sqrt(m) - 1 < 0x1.fp-31 */
s = (s - 1)>>6;
/* s < sqrt(m) < s + 0x1.08p-23 */
/* compute nearest rounded result. */
uint32_t d0, d1, d2;
float y, t;
d0 = (m << 16) - s*s;
d1 = s - d0;
d2 = d1 + s + 1;
s += d1 >> 31;
s &= 0x007fffff;
s |= ey;
y = asfloat(s);
if (FENV_SUPPORT) {
/* handle rounding and inexact exception. */
uint32_t tiny = predict_false(d2==0) ? 0 : 0x01000000;
tiny |= (d1^d2) & 0x80000000;
t = asfloat(tiny);
y = eval_as_float(y + t);
}
return y;
}
+45
View File
@@ -0,0 +1,45 @@
#include "gdbjit.h"
#include <stdio.h>
static char block_name_buffer[16];
static enum gdb_status read_debug_info(struct gdb_reader_funcs* self, struct gdb_symbol_callbacks* cbs, void* memory, long memory_sz)
{
gdbjit_block_t* block = (gdbjit_block_t*)memory;
struct gdb_object* object = cbs->object_open(cbs);
struct gdb_symtab* symtab = cbs->symtab_open(cbs, object, block->filename);
sprintf(block_name_buffer, "%x", block->x64start);
cbs->block_open(cbs, symtab, NULL, block->start, block->end, block_name_buffer);
cbs->line_mapping_add(cbs, symtab, block->nlines, block->lines);
cbs->symtab_close(cbs, symtab);
cbs->object_close(cbs, object);
return GDB_SUCCESS;
}
enum gdb_status unwind_frame(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs)
{
return GDB_SUCCESS;
}
struct gdb_frame_id get_frame_id(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs)
{
struct gdb_frame_id frame = {0xdeadbeef, 0};
return frame;
}
void destroy_reader(struct gdb_reader_funcs* self) {}
__attribute__((visibility("default"))) struct gdb_reader_funcs* gdb_init_reader(void)
{
static struct gdb_reader_funcs funcs = {GDB_READER_INTERFACE_VERSION, NULL, read_debug_info, unwind_frame, get_frame_id, destroy_reader};
return &funcs;
}
__attribute__((visibility("default"))) int plugin_is_GPL_compatible (void)
{
return 0;
}
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# create necessary directories
mkdir -p ~/steam/tmp # makes both ~/steam and ~/steam/tmp in one cmd
cd ~/steam/tmp
# download latest deb and unpack
curl -LO https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb
ar x steam.deb
tar xf data.tar.xz
# move deb contents to steam folder
mv ./usr/* ..
cd .. && rm -rf ./tmp
# create run script
echo '#!/bin/bash
export STEAMOS=1
export STEAM_RUNTIME=1
export PROTON_USE_WOW64=1
export DBUS_FATAL_WARNINGS=0
~/steam/bin/steam $@' > steam
# make script executable and move
chmod +x steam
sudo mv steam /usr/local/bin/
echo "Script complete."
+77 -12
View File
@@ -363,7 +363,7 @@ def readFiles(files: Iterable[Filename]) -> Tuple[JumbledGlobals, JumbledRedirec
gbl : JumbledGlobals = {}
redirects: JumbledRedirects = {}
filespec : JumbledFilesSpecific = {}
functions: Dict[str, Filename] = {}
halt_required = False # Is there a GO(*, .FE*) or similar in-batch error(s)?
# First read the files inside the headers
@@ -403,15 +403,23 @@ def readFiles(files: Iterable[Filename]) -> Tuple[JumbledGlobals, JumbledRedirec
or match("sdl1mixer", "sdl2mixer") \
or match("sdl1net", "sdl2net") \
or match("sdl1ttf", "sdl2ttf") \
or match("sdl1ttf", "sdl3ttf") \
or match("sdl2ttf", "sdl3ttf") \
or match("libgl", "libegl") \
or match("libgl", "glesv2") \
or match("libgl", "libglxnvidia") \
or match("libglx", "libglxnvidia") \
or match("libegl", "glesv2") \
or match("libegl", "libglxnvidia") \
or match("glesv2", "libglxnvidia") \
or match("softokn3", "p11kit") \
or match("libc", "tcmallocminimal") \
or match("libc", "tbbmallocproxy") \
or match("libc", "androidshmem") \
or match("crypto", "libssl3") \
or match("tcmallocminimal", "tbbmallocproxy"):
or match("tcmallocminimal", "tbbmallocproxy") \
or match("iconv", "libunistring2") \
or match("gomp", "libomp"):
continue
# Note: this test is very (too) simple. If it ever raises, comment
@@ -841,25 +849,26 @@ def main(root: str, files: Iterable[Filename], ver: str):
allowed_conv = conventions[allowed_conv_ident]
# H could be allowed maybe?
allowed_simply: Dict[str, str] = {"ARM64": "v", "RV64": "v"}
allowed_regs : Dict[str, str] = {"ARM64": "cCwWiuIUlLp", "RV64": "CWuIUlLp"}
allowed_fpr : Dict[str, str] = {"ARM64": "fd", "RV64": "fd"}
allowed_simply: Dict[str, str] = {"ARM64": "v", "RV64": "v", "LA64": "v"}
allowed_regs : Dict[str, str] = {"ARM64": "cCwWiuIUlLp", "RV64": "CWIUlLp", "LA64": "CWIUlLp"}
allowed_fpr : Dict[str, str] = {"ARM64": "fd", "RV64": "fd", "LA64": "fd"}
allowed_sextw : Dict[str, str] = {"ARM64": "", "RV64": "cwiu", "LA64": "cwiu"}
# Detect functions which return in an x87 register
retx87_wraps: Dict[ClausesStr, List[FunctionType]] = {}
return_x87: str = "D"
# Sanity checks
forbidden_simple: Dict[str, str] = {"ARM64": "EDVOSNHPAxXYb", "RV64": "EcwiDVOSNHPAxXYb"}
forbidden_simple: Dict[str, str] = {"ARM64": "EDVOSNHPAxXYb", "RV64": "EDVOSNHPAxXYb", "LA64": "EDVOSNHPAxXYb"}
assert(all(k in allowed_simply for k in forbidden_simple))
assert(all(k in allowed_regs for k in forbidden_simple))
assert(all(k in allowed_fpr for k in forbidden_simple))
for k1 in forbidden_simple:
assert(len(allowed_simply[k1]) + len(allowed_regs[k1]) + len(allowed_fpr[k1]) + len(forbidden_simple[k1]) == len(allowed_conv.values))
assert(len(allowed_simply[k1]) + len(allowed_regs[k1]) + len(allowed_fpr[k1]) + len(allowed_sextw[k1]) + len(forbidden_simple[k1]) == len(allowed_conv.values))
assert(all(c not in allowed_regs[k1] for c in allowed_simply[k1]))
assert(all(c not in allowed_simply[k1] + allowed_regs[k1] for c in allowed_fpr[k1]))
assert(all(c not in allowed_simply[k1] + allowed_regs[k1] + allowed_fpr[k1] for c in forbidden_simple[k1]))
assert(all(c in allowed_simply[k1] + allowed_regs[k1] + allowed_fpr[k1] + forbidden_simple[k1] for c in allowed_conv.values))
assert(all(c in allowed_simply[k1] + allowed_regs[k1] + allowed_fpr[k1] + allowed_sextw[k1] + forbidden_simple[k1] for c in allowed_conv.values))
assert(all(c in allowed_conv.values for c in return_x87))
assert(all(c in forbidden_simple[k] for c in depends_on_ld for k in forbidden_simple))
@@ -872,6 +881,7 @@ def main(root: str, files: Iterable[Filename], ver: str):
for k in forbidden_simple:
regs_count: int = 0
fpr_count : int = 0
sextw_mask: int = 0
if v.get_convention() is not allowed_conv:
continue
@@ -884,6 +894,9 @@ def main(root: str, files: Iterable[Filename], ver: str):
fpr_count = fpr_count + 1
elif c in allowed_simply[k]:
continue
elif c in allowed_sextw[k]:
sextw_mask |= 1 << regs_count
regs_count += 1
else:
break
else:
@@ -891,6 +904,7 @@ def main(root: str, files: Iterable[Filename], ver: str):
if (regs_count <= 6) and (fpr_count <= 8):
# All checks passed!
ret_val = 1 + fpr_count
ret_val |= sextw_mask << 4
if v[0] in allowed_fpr[k]:
ret_val = -ret_val
ret[k] = ret_val
@@ -1027,6 +1041,26 @@ def main(root: str, files: Iterable[Filename], ver: str):
#ifndef __{filename}UNDEFS_H_
#define __{filename}UNDEFS_H_
""",
"x64printer.c": """
#include <inttypes.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "x64emu.h"
#include "x64emu_private.h"
#include "wrapper.h"
#define PRIp "p"
#define PRIf "f"
#define PRILf "Lf"
#define PRIs "s"
void x64Print(x64emu_t* emu, char* buff, size_t buffsz, const char* func, int tid, wrapper_t w)
{lbr}
#ifdef HAVE_TRACE
if (0) {lbr}
"""
}
files_guard = {
@@ -1049,6 +1083,14 @@ def main(root: str, files: Iterable[Filename], ver: str):
"fnundefs.h": """
#endif // __{filename}UNDEFS_H_
""",
"x64printer.c": """
else
#endif // HAVE_TRACE
{lbr}
snprintf(buff, buffsz, "%04d|%p: Calling %s(0x%lX, 0x%lX, 0x%lX, ...)", tid, *(void**)(R_RSP), func, R_RDI, R_RSI, R_RDX);
{rbr}
{rbr}
"""
}
@@ -1142,7 +1184,7 @@ def main(root: str, files: Iterable[Filename], ver: str):
"fn({0});", # v
"R_RAX=(uint8_t)fn({0});", # c
"R_RAX=(uint16_t)fn({0});", # w
"R_RAX=(uint32_t)fn({0});", # i
"R_RAX=(int)fn({0});", # i
"S_RAX=(int64_t)fn({0});", # I
"R_RAX=(unsigned char)fn({0});", # C
"R_RAX=(unsigned short)fn({0});", # W
@@ -1171,8 +1213,8 @@ def main(root: str, files: Iterable[Filename], ver: str):
"fn({0});", # v
"R_RAX=fn({0});", # c
"R_RAX=fn({0});", # w
"R_RAX=(int32_t)fn({0});", # i
"R_RAX=(int64_t)fn({0});", # I
"R_RAX=(int)fn({0});", # i
"S_RAX=(int64_t)fn({0});", # I
"R_RAX=(unsigned char)fn({0});", # C
"R_RAX=(unsigned short)fn({0});", # W
"R_RAX=(uint32_t)fn({0});", # u
@@ -1724,7 +1766,30 @@ def main(root: str, files: Iterable[Filename], ver: str):
if k != str(Clauses()):
file.write("#endif\n")
file.write(files_guard["wrapper.h"].format(lbr="{", rbr="}", version=ver))
# E v c w i I C W u U f d D l L p V O S N H P A x X Y b
formats_map = ["(error)", "(error)", "i8", "i16", "i32", "i64", "u8", "u16", "u32", "u64", "f", "f", "Lf", "i64", "u64", "p", "p", "(error)", "(error)", "(error)", "u64", "p", "p", "(error)", "(error)", "(error)", "(error)"]
# Rewrite the x64printer.c file:
with open(os.path.join(root, "src", "emu", "x64printer.c"), 'w') as file:
file.write(files_header["x64printer.c"].format(lbr="{", rbr="}", version=ver))
for k in gbls:
if k != str(Clauses()):
file.write("#if {k}\n".format(k=k))
for signature in gbls[k]:
sig = signature if signature[2] != "E" else (signature[:2]+signature[3:])
if any(letter in sig[2:] for letter in "OSNHxXYb") or signature.endswith('FE') or signature[1] == 'W':
continue
formats = sig[2:].replace("G", "UU")
params = '' if formats == "v" else ", " + function_args_systemV(FunctionType(formats))[:-2]
formats = '' if formats == "v" else ', '.join("%\" PRI{x} \"".format(x=formats_map[FunctionType(sig).get_convention().values.index(t)]) for t in formats)
file.write(" {rbr} else if (w == {signature}) {lbr}\n".format(signature=signature, lbr="{", rbr="}"))
file.write(" snprintf(buff, buffsz, \"%04d|%p: Calling %s({formats})\", tid, *(void**)(R_RSP), func{params});\n".format(formats=formats, params=params))
if k != str(Clauses()):
file.write("#endif\n")
file.write(" }\n")
file.write(files_guard["x64printer.c"].format(lbr="{", rbr="}", version=ver))
# Rewrite the *types.h files:
for k in conventions:
td_types[k][conventions[k].values.index('A')] = "va_list"
+18 -7
View File
@@ -583,8 +583,8 @@ class FileSpec:
# CONSTANT- rvalues: valid replacement values (outside of structures)
# CONSTANT- validrepl: valid replacement values (for structures)
# structs: structure ids and additional data
values: Sequence[str] = ['E', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'h', 'H', 'a', 'A', 'V', 'O', 'S', '2', 'P', 'N', 'M', 's', 'r', 'b', 'B', '_', 't', 'X']
rvalues: Sequence[str] = ['E', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'h', 'H', 'a', 'A', 'V', 'O', 'S', '2', 'P', 'N', 'M', 's', 'r', 'b', 'B', '_', 't', 'X']
values: Sequence[str] = ['E', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'h', 'H', 'a', 'A', 'V', 'O', 'S', '2', 'P', 'N', 'M', 's', 'r', 'b', 'B', '_', 't', 'X', 'n']
rvalues: Sequence[str] = ['E', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'h', 'H', 'a', 'A', 'V', 'O', 'S', '2', 'P', 'N', 'M', 's', 'r', 'b', 'B', '_', 't', 'X', 'n']
validrepl: Sequence[str] = ['c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'h', 'H', 'a', 'A', 'V', 'O', 'S', '2', 'P', 'N', 'M', 's', 'r', 'b', 'B', '_']
def __init__(self) -> None:
@@ -874,6 +874,9 @@ def readFiles(files: Iterable[str]) -> Tuple[JumbledFunctions, JumbledFunctions,
or match("gstinterfaces010","gstaudio")\
or match("gstreamer010","gstreamer") \
or match("appindicator","appindicator3")\
or match("libgl", "libegl") \
or match("libgl", "libglx") \
or match("libgl", "libglxnvidia")\
\
or match("libc", "tcmallocminimal") \
or match("libc", "ldlinux") \
@@ -1150,7 +1153,8 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
"\n#error Invalid return type: wo structure declaration\n", # B
"\n#error Invalid return type: end of structure declaration\n", # _
"R_EAX = to_cstring(fn({0}));", # t
"R_EAX = to_ptrv(addDisplay(fn({0})));", # X
"R_EAX = to_ptrv(addDisplay(fn({0})));", # X
"\n#error Invalid return type: xcb_connection_t*\n", # n
]
asargs = [
"emu, ", # E
@@ -1188,6 +1192,7 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
"\n#error Invalid argument type: end of structure declaration\n", # _
"\n#error Invalid argument type: maybe-high string\n",# t
"getDisplay(from_ptriv(R_ESP + {p})), ", # X
"aligned_xcb, ", # n
]
if len(FileSpec.values) != len(asreturns):
raise NotImplementedError("len(values) = {lenval} != len(asreturns) = {lenvals}".format(lenval=len(FileSpec.values), lenvals=len(asreturns)))
@@ -1201,6 +1206,9 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
CType[(value, CType.ReadWrite.none)].aspre = ""
CType[(value, CType.ReadWrite.none)].asarg = asarg
CType[(value, CType.ReadWrite.none)].aspost = ""
if value == 'n':
CType[(value, CType.ReadWrite.none)].aspre = f"void *aligned_xcb = align_xcb_connection32(from_ptriv(R_ESP + {{p}})); "
CType[(value, CType.ReadWrite.none)].aspost = f" unalign_xcb_connection32(aligned_xcb, from_ptriv(R_ESP + {{p}}));"
for ctn in CType.getSingletons():
CType[ctn].generate_converters()
@@ -1300,6 +1308,9 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
void* getDisplay(void*);
void* addDisplay(void*);
void* align_xcb_connection32(void* src);
void unalign_xcb_connection32(void* src, void* dst);
""",
"wrapper32.h": """
#ifndef __WRAPPER32_H_
@@ -1405,8 +1416,8 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
files_guard[fhdr] = trim(files_guard[fhdr])
# Typedefs
# E v c w i I C W u U f d D K l L p h H a A V O S 2 P N M s r b B _ t X
tdtypes = ["x64emu_t*", "void", "int8_t", "int16_t", "int32_t", "int64_t", "uint8_t", "uint16_t", "uint32_t", "uint64_t", "float", "double", "long double", "double", "intptr_t", "uintptr_t", "void*", "uintptr_t", "uintptr_t", "void*", "void*", "void*", "int32_t", "void*", "_2uint_struct_t", "void*", "...", "...", "void*", "\n#error _\n", "\n#error _\n", "\n#error _\n", "\n#error _\n", "char*", "void*"]
# E v c w i I C W u U f d D K l L p h H a A V O S 2 P N M s r b B _ t X n
tdtypes = ["x64emu_t*", "void", "int8_t", "int16_t", "int32_t", "int64_t", "uint8_t", "uint16_t", "uint32_t", "uint64_t", "float", "double", "long double", "double", "intptr_t", "uintptr_t", "void*", "uintptr_t", "uintptr_t", "void*", "void*", "void*", "int32_t", "void*", "_2uint_struct_t", "void*", "...", "...", "void*", "\n#error _\n", "\n#error _\n", "\n#error _\n", "\n#error _\n", "char*", "void*", "void*"]
if len(FileSpec.values) != len(tdtypes):
raise NotImplementedError("len(values) = {lenval} != len(tdtypes) = {lentypes}".format(lenval=len(FileSpec.values), lentypes=len(tdtypes)))
def generate_typedefs(funs: Iterable[FunctionType], file):
@@ -1431,8 +1442,8 @@ def generate_files(root: str, files: Iterable[str], ver: str, gbls: SortedGlobal
for i in range(2, len(funtype.orig.replaced))) + ");\n")
# Wrappers
# E v c w i I C W u U f d D K l L p h H a A V O S 2 P N M s r b B _ t X
deltas = [0, 4, 4, 4, 4, 8, 4, 4, 4, 8, 4, 8, 12, 12, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 8, 4, 0, 0, 0, 1, 1, 4, 1, 4, 4]
# E v c w i I C W u U f d D K l L p h H a A V O S 2 P N M s r b B _ t X n
deltas = [0, 4, 4, 4, 4, 8, 4, 4, 4, 8, 4, 8, 12, 12, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 8, 4, 0, 0, 0, 1, 1, 4, 1, 4, 4, 4]
# Asserts
if len(FileSpec.values) != len(deltas):
raise NotImplementedError("len(values) = {lenval} != len(deltas) = {lendeltas}".format(lenval=len(FileSpec.values), lendeltas=len(deltas)))
-7
View File
@@ -17,13 +17,6 @@ endif()
set(ENV{BOX64_LOG} 0)
set(ENV{BOX64_NOBANNER} 1)
if( EXISTS ${CMAKE_SOURCE_DIR}/x64lib )
# we are inside box64 folder
set(ENV{BOX64_LD_LIBRARY_PATH} ${CMAKE_SOURCE_DIR}/x64lib)
else()
# we are inside build folder
set(ENV{BOX64_LD_LIBRARY_PATH} ${CMAKE_SOURCE_DIR}/../x64lib)
endif( EXISTS ${CMAKE_SOURCE_DIR}/x64lib )
# run the test program, capture the stdout/stderr and the result var
execute_process(
+8 -8
View File
@@ -18,7 +18,7 @@ KHASH_MAP_INIT_STR(strings, ptr_t);
static kh_from_t* hash_from = NULL;
static kh_to_t* hash_to = NULL;
#define HASH_MSK 0xf000000f
#define HASH_VAL 0x00ffffff
#define HASH_VAL 0x007fffff
#define HASH_SHIFT 4
static uint32_t hash_cnt = 1;
static pthread_rwlock_t hash_lock = {0};
@@ -147,11 +147,11 @@ ulong_t to_hash_d(uintptr_t p) {
}
typedef struct struct_locale_s {
void* p0[13];
void* p0[13]; // struct __locale_data *
void* p1; //const unsigned short int *__ctype_b;
void* p2; //const int *__ctype_tolower;
void* p3; //const int *__ctype_toupper;
void* p4[13];
void* p4[13]; //const char*
} struct_locale_t;
// not a real structure
#define LOCALE_SIGN 0x54abcd845412LL
@@ -180,7 +180,7 @@ void to_struct_locale(ptr_t d, const struct_locale_t *src) {
dest->p0[i] = to_hashv(src->p0[i]);
}
for(int i=0; i<13; ++i) {
dest->p4[i] = to_hashv(src->p4[i]);
dest->p4[i] = to_cstring(src->p4[i]);
}
// copy the 3 ctype int (1st is short int, but int will do)
memcpy(dest->type_b, src->p1-128*sizeof(short), 384*sizeof(short));
@@ -194,9 +194,9 @@ void free_struct_locale(const struct_locale_t *src) {
for(int i=0; i<13; ++i) {
to_hash_d((uintptr_t)src->p0[i]);
}
for(int i=0; i<13; ++i) {
/*for(int i=0; i<13; ++i) {
to_hash_d((uintptr_t)src->p4[i]);
}
}*/
}
// Convert from locale key to original 64bits value
@@ -314,7 +314,7 @@ ptr_t to_cstring(char* p) {
// create a new key, but need write lock!
pthread_rwlock_unlock(&hash_lock);
pthread_rwlock_wrlock(&hash_lock);
ret = to_ptrv(box_strdup(p));
ret = to_ptrv(box32_strdup(p));
int r;
k = kh_put(strings, const_strings, (char*)from_ptrv(ret), &r);
kh_value(const_strings, k) = ret;
@@ -335,7 +335,7 @@ ptr_t to_cstring_d(char* p) {
} else {
ret = kh_value(const_strings, k);
kh_del(strings, const_strings, k);
free(from_ptrv(ret));
box32_free(from_ptrv(ret));
}
pthread_rwlock_unlock(&hash_lock);
return ret;
+91 -95
View File
@@ -6,7 +6,9 @@
#include <signal.h>
#include <sys/mman.h>
#include <pthread.h>
#include <inttypes.h>
#include "os.h"
#include "box64context.h"
#include "debug.h"
#include "elfloader.h"
@@ -14,15 +16,15 @@
#include "threads.h"
#include "x64trace.h"
#include "bridge.h"
#include "alternate.h"
#include "librarian.h"
#include "library.h"
#include "wrapper.h"
#include "x64emu.h"
#include "signals.h"
#include "rcfile.h"
#include "gltools.h"
#include "rbtree.h"
#include "dynarec.h"
#include "box64cpu.h"
#ifdef BOX32
#include "box32.h"
#endif
@@ -49,7 +51,6 @@ void finiAllHelpers(box64context_t* context)
static int finied = 0;
if(finied)
return;
DeleteParams();
fini_pthread_helper(context);
fini_signal_helper();
fini_bridge_helper();
@@ -72,53 +73,9 @@ int getrand(int maxval)
}
void free_tlsdatasize(void* p)
{
if(!p)
return;
tlsdatasize_t *data = (tlsdatasize_t*)p;
box_free(data->ptr);
box_free(p);
if(my_context)
pthread_setspecific(my_context->tlskey, NULL);
}
void x64Syscall(x64emu_t *emu);
void x86Syscall(x64emu_t *emu);
int unlockMutex()
{
int ret = unlockCustommemMutex();
int i;
#ifdef USE_CUSTOM_MUTEX
uint32_t tid = (uint32_t)GetTID();
#define GO(A, B) \
i = (native_lock_storeifref2_d(&A, 0, tid)==tid); \
if(i) { \
ret|=(1<<B); \
}
#else
#define GO(A, B) \
i = checkUnlockMutex(&A); \
if(i) { \
ret|=(1<<B); \
}
#endif
GO(my_context->mutex_trace, 7)
#ifdef DYNAREC
GO(my_context->mutex_dyndump, 8)
#else
GO(my_context->mutex_lock, 8)
#endif
GO(my_context->mutex_tls, 9)
GO(my_context->mutex_thread, 10)
GO(my_context->mutex_bridge, 11)
#undef GO
return ret;
}
void relockMutex(int locks)
{
relockCustommemMutex(locks);
@@ -127,14 +84,14 @@ void relockMutex(int locks)
mutex_trylock(&A); \
GO(my_context->mutex_trace, 7)
#ifdef DYNAREC
GO(my_context->mutex_dyndump, 8)
#else
GO(my_context->mutex_lock, 8)
#endif
GO(my_context->mutex_tls, 9)
GO(my_context->mutex_thread, 10)
GO(my_context->mutex_bridge, 11)
#ifdef DYNAREC
#else
GO(my_context->mutex_lock, 12)
#endif
#undef GO
}
@@ -149,6 +106,7 @@ void init_mutexes(box64context_t* context)
pthread_mutex_init(&context->mutex_tls, &attr);
pthread_mutex_init(&context->mutex_thread, &attr);
pthread_mutex_init(&context->mutex_bridge, &attr);
pthread_mutex_init(&context->mutex_dyndump, &attr);
pthread_mutexattr_destroy(&attr);
#else
@@ -179,28 +137,25 @@ static void atfork_child_box64context(void)
init_mutexes(my_context);
}
int box64_cycle_log_initialized = 0;
void freeCycleLog(box64context_t* ctx)
{
if(cycle_log) {
for(int i=0; i<cycle_log; ++i) {
box_free(ctx->log_call[i]);
box_free(ctx->log_ret[i]);
}
if (BOX64ENV(rolling_log) && box64_cycle_log_initialized) {
box_free(ctx->log_call);
box_free(ctx->log_ret);
ctx->log_call = NULL;
ctx->log_ret = NULL;
box64_cycle_log_initialized = 0;
}
}
void initCycleLog(box64context_t* context)
{
if(cycle_log) {
context->log_call = (char**)box_calloc(cycle_log, sizeof(char*));
context->log_ret = (char**)box_calloc(cycle_log, sizeof(char*));
for(int i=0; i<cycle_log; ++i) {
context->log_call[i] = (char*)box_calloc(256, 1);
context->log_ret[i] = (char*)box_calloc(128, 1);
}
if(context && BOX64ENV(rolling_log)) {
context->log_call = (char*)box_calloc(BOX64ENV(rolling_log), 256*sizeof(char));
context->log_ret = (char*)box_calloc(BOX64ENV(rolling_log), 128*sizeof(char));
box64_cycle_log_initialized = 1;
}
}
@@ -219,7 +174,6 @@ box64context_t *NewBox64Context(int argc)
initCycleLog(context);
context->deferredInit = 1;
context->sel_serial = 1;
init_custommem_helper(context);
@@ -258,28 +212,25 @@ box64context_t *NewBox64Context(int argc)
init_mutexes(context);
pthread_atfork(NULL, NULL, atfork_child_box64context);
pthread_key_create(&context->tlskey, free_tlsdatasize);
for (int i=0; i<8; ++i) context->canary[i] = 1 + getrand(255);
context->canary[getrand(4)] = 0;
printf_log(LOG_DEBUG, "Setting up canary (for Stack protector) at FS:0x28, value:%08X\n", *(uint32_t*)context->canary);
// init segments
for(int i=0; i<16; i++) {
context->segtls[i].limit = (uintptr_t)-1LL;
context->seggdt[i].limit = (uintptr_t)-1LL;
}
context->segtls[10].key_init = 0; // 0x53 selector
context->segtls[10].present = 1;
context->segtls[8].key_init = 0; // 0x43 selector
context->segtls[8].present = 1;
context->segtls[6].key_init = 0; // 0x33 selector
context->segtls[6].present = 1;
context->segtls[5].key_init = 0; // 0x2b selector
context->segtls[5].present = 1;
context->segtls[4].key_init = 0; // 0x23 selector
context->segtls[4].present = 1;
context->segtls[4].is32bits = 1;
// 0x53 selector
context->seggdt[10].present = 1;
// 0x43 selector
context->seggdt[8].present = 1;
// 0x33 selector
context->seggdt[6].present = 1;
// 0x2b selector
context->seggdt[5].present = 1;
// 0x23 selector
context->seggdt[4].present = 1;
context->seggdt[4].is32bits = 1;
context->globdata = NewMapSymbols();
context->uniques = NewMapSymbols();
@@ -294,6 +245,42 @@ box64context_t *NewBox64Context(int argc)
}
void freeALProcWrapper(box64context_t* context);
void freeCUDAProcWrapper(box64context_t* context);
#ifdef DYNAREC
//#define DYNAREC_HIST // uncomment to print dynablock size histogram at exit
#ifdef DYNAREC_HIST
#define HIST_BUCKETS 12
static const uintptr_t bucket_limits[HIST_BUCKETS] = {
8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, (uintptr_t)-1
};
static const char* bucket_labels[HIST_BUCKETS] = {
"1-8", "9-16", "17-32", "33-64", "65-128", "129-256",
"257-512", "513-1024", "1025-2048", "2049-4096", "4097-8192", "8193+"
};
typedef struct {
uint64_t count[HIST_BUCKETS];
uint64_t total_blocks;
uint64_t total_bytes;
uintptr_t max_size;
} hist_data_t;
static void db_size_walk_cb(uintptr_t start, uintptr_t end, uint64_t data, void* userdata) {
(void)end;
hist_data_t* h = (hist_data_t*)userdata;
uintptr_t size = start; // key = x64_size
uint64_t n = data; // value = count of blocks
for (int i = 0; i < HIST_BUCKETS; i++) {
if (size <= bucket_limits[i]) {
h->count[i] += n;
break;
}
}
h->total_blocks += n;
h->total_bytes += size * n;
if (size > h->max_size) h->max_size = size;
}
#endif
#endif
EXPORTDYN
void FreeBox64Context(box64context_t** context)
{
@@ -303,7 +290,12 @@ void FreeBox64Context(box64context_t** context)
if(--(*context)->forked >= 0)
return;
box64context_t* ctx = *context; // local copy to do the cleanning
box64context_t* ctx = *context; // local copy to do the cleaning
if(ctx->video_mem) {
munmap(ctx->video_mem, 0x10000);
ctx->video_mem = NULL;
}
//clean_current_emuthread(); // cleaning main thread seems a bad idea
if(ctx->local_maplib)
@@ -357,12 +349,14 @@ void FreeBox64Context(box64context_t** context)
box_free(ctx->fullpath);
box_free(ctx->box64path);
box_free(ctx->bashpath);
box_free(ctx->pythonpath);
FreeBridge(&ctx->system);
#ifndef STATICBUILD
freeGLProcWrapper(ctx);
freeALProcWrapper(ctx);
freeCUDAProcWrapper(ctx);
#ifdef BOX32
#endif
#endif
@@ -371,12 +365,6 @@ void FreeBox64Context(box64context_t** context)
box_free(ctx->stack_clone);
void* ptr;
if ((ptr = pthread_getspecific(ctx->tlskey)) != NULL) {
free_tlsdatasize(ptr);
}
pthread_key_delete(ctx->tlskey);
if(ctx->tlsdata)
box_free(ctx->tlsdata);
@@ -390,7 +378,21 @@ void FreeBox64Context(box64context_t** context)
FreeMapSymbols(&ctx->uniques);
#ifdef DYNAREC
//dynarec_log(LOG_INFO, "BOX64 Dynarec at exit: Max DB=%d, righter=%d\n", ctx->max_db_size, rb_get_righter(ctx->db_sizes));
#ifdef DYNAREC_HIST
{
hist_data_t hist = {0};
rbtree_walk(ctx->db_sizes, db_size_walk_cb, &hist);
if(hist.total_blocks) {
printf_log(LOG_INFO, "BOX64 Dynarec block size histogram: %" PRIu64 " blocks, %" PRIu64 " total x86 bytes, max=%" PRIuPTR "\n",
hist.total_blocks, hist.total_bytes, hist.max_size);
for(int i = 0; i < HIST_BUCKETS; i++) {
if(hist.count[i])
printf_log(LOG_INFO, " %10s: %" PRIu64 " blocks (%.1f%%)\n",
bucket_labels[i], hist.count[i], hist.count[i] * 100.0 / hist.total_blocks);
}
}
}
#endif
rbtree_delete(ctx->db_sizes);
#endif
@@ -404,6 +406,7 @@ void FreeBox64Context(box64context_t** context)
pthread_mutex_destroy(&ctx->mutex_tls);
pthread_mutex_destroy(&ctx->mutex_thread);
pthread_mutex_destroy(&ctx->mutex_bridge);
pthread_mutex_destroy(&ctx->mutex_dyndump);
#endif
freeCycleLog(ctx);
@@ -436,8 +439,6 @@ void RemoveElfHeader(box64context_t* ctx, elfheader_t* head) {
/*if(tlsbase == -ctx->tlssize) {
// not really correct, but will do for now
ctx->tlssize -= GetTLSSize(head);
if(!(++ctx->sel_serial))
++ctx->sel_serial;
}*/
}
for(int i=0; i<ctx->elfsize; ++i)
@@ -454,12 +455,7 @@ int AddTLSPartition(box64context_t* context, int tlssize) {
context->tlsdata = box_realloc(context->tlsdata, context->tlssize);
memmove(context->tlsdata+tlssize, context->tlsdata, oldsize); // move to the top, using memmove as regions will probably overlap
memset(context->tlsdata, 0, tlssize); // fill new space with 0 (not mandatory)
// clean GS segment for current emu
if(my_context) {
//ResetSegmentsCache(thread_get_emu());
if(!(++context->sel_serial))
++context->sel_serial;
}
// clean GS segment for current emu?
return -context->tlssize; // negative offset
}
+2 -2
View File
@@ -2,7 +2,7 @@
#define __BOX64_VERSION_H_
#define BOX64_MAJOR 0
#define BOX64_MINOR 3
#define BOX64_REVISION 2
#define BOX64_MINOR 4
#define BOX64_REVISION 1
#endif //__BOX64_VERSION_H_
+15 -17
View File
@@ -1,27 +1,25 @@
#include <stdio.h>
#include "debug.h"
#include "box64version.h"
#ifdef NOGIT
#define GITREV "nogit"
#include "build_info.h"
#if defined(DYNAREC)
#define WITH_DYNAREC_STR " with Dynarec"
#else
#include "git_head.h"
#define WITH_DYNAREC_STR ""
#endif
void PrintBox64Version()
#ifdef HAVE_TRACE
#define WITH_TRACE_STR " with trace"
#else
#define WITH_TRACE_STR ""
#endif
void PrintBox64Version(int prefix)
{
printf_log(LOG_NONE, "Box64%s%s v%d.%d.%d %s built on %s %s\n",
#ifdef HAVE_TRACE
" with trace",
#else
"",
#endif
#ifdef DYNAREC
" with Dynarec",
#else
"",
#endif
BOX64_MAJOR, BOX64_MINOR, BOX64_REVISION,
GITREV,
PrintfFtrace(prefix, BOX64_BUILD_INFO_STRING WITH_DYNAREC_STR WITH_TRACE_STR " built on %s %s\n",
__DATE__, __TIME__);
}
#undef WITH_TRACE
#undef WITH_DYNAREC
+41 -2
View File
@@ -1,6 +1,45 @@
#include "box64version.h"
#ifdef NOGIT
#define GITREV "nogit"
#else
#include "git_head.h"
#endif
#ifndef __BUILD_INFO_H__
#define __BUILD_INFO_H__
void PrintBox64Version(void);
#endif //__BUILD_INFO_H__
#if defined(DYNAREC) && (defined(ARM64) || defined(RV64) || defined(LA64) || defined(PPC64LE))
#if defined(ARM64)
#define ARCH_STR " arm64"
#elif defined(RV64)
#define ARCH_STR " riscv64"
#elif defined(LA64)
#define ARCH_STR " loongarch64"
#elif defined(PPC64LE)
#define ARCH_STR " ppc64le"
#endif
#else
#define ARCH_STR ""
#endif
void PrintBox64Version(int prefix);
#define BOX64_BUILD_INFO_STR_HELPER(x) #x
#define BOX64_BUILD_INFO_STR(x) BOX64_BUILD_INFO_STR_HELPER(x)
#ifdef _WIN32
#define BOX64_STR "WowBox64"
#else
#define BOX64_STR "Box64"
#endif
#define BOX64_BUILD_INFO_STRING \
BOX64_STR ARCH_STR \
" v" BOX64_BUILD_INFO_STR(BOX64_MAJOR) "." BOX64_BUILD_INFO_STR(BOX64_MINOR) "." BOX64_BUILD_INFO_STR(BOX64_REVISION) " " GITREV
#define BOX64_BUILD_INFO_STRING_SHORT \
BOX64_STR \
" v" BOX64_BUILD_INFO_STR(BOX64_MAJOR) "." BOX64_BUILD_INFO_STR(BOX64_MINOR) "." BOX64_BUILD_INFO_STR(BOX64_REVISION)
#endif //__BUILD_INFO_H__
+535 -1587
View File
File diff suppressed because it is too large. Load diff
+1641 -455
View File
File diff suppressed because it is too large. Load diff
+10 -7
View File
@@ -2,6 +2,8 @@
#include <unistd.h>
#include <stdint.h>
#include "env.h"
#ifndef MAP_FAILED
#define MAP_FAILED ((void *) -1)
#endif
@@ -22,21 +24,22 @@ extern void* mapallmem;
extern int box64_is32bits;
void setProtection(uintptr_t addr, size_t size, uint32_t prot);
void freeProtection(uintptr_t addr, size_t size);
void* internal_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
int internal_munmap(void* addr, unsigned long length);
void* InternalMmap(void* addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
int InternalMunmap(void* addr, unsigned long length);
void* box_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
extern int running32bits;
extern int box64_mmap32;
extern box64env_t box64env;
EXPORT void* mmap64(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset)
{
void* ret;
if(!addr && ((running32bits && box64_mmap32) || (flags&MAP_32BIT) || box64_is32bits))
ret = my_mmap64(NULL, addr, length, prot, flags | MAP_32BIT, fd, offset);
if(!addr && ((running32bits && BOX64ENV(mmap32)) || (flags&MAP_32BIT) || box64_is32bits))
ret = box_mmap(addr, length, prot, flags | MAP_32BIT, fd, offset);
else
ret = internal_mmap(addr, length, prot, flags, fd, offset);
ret = InternalMmap(addr, length, prot, flags, fd, offset);
if(ret!=MAP_FAILED && mapallmem)
setProtection((uintptr_t)ret, length, prot);
return ret;
@@ -45,7 +48,7 @@ EXPORT void* mmap(void *addr, unsigned long length, int prot, int flags, int fd,
EXPORT int munmap(void* addr, unsigned long length)
{
int ret = internal_munmap(addr, length);
int ret = InternalMunmap(addr, length);
if(!ret && mapallmem) {
freeProtection((uintptr_t)addr, length);
}
+89 -151
View File
@@ -5,144 +5,7 @@
*/
/*
ARM64 Linux Call Convention
SP The Stack Pointer.
r30 LR The Link Register.
r29 FP The Frame Pointer
r19…r28 Callee-saved registers
r18 The Platform Register, if needed; otherwise a temporary register. See notes.
r17 IP1 The second intra-procedure-call temporary register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
r16 IP0 The first intra-procedure-call scratch register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
r9…r15 Temporary registers
r8 Indirect result location register
r0…r7 Parameter/result registers
For SIMD:
The first eight registers, v0-v7, are used to pass argument values into a subroutine and to return result values from a function.
They may also be used to hold intermediate values within a routine (but, in general, only between subroutine calls).
Registers v8-v15 must be preserved by a callee across subroutine calls;
the remaining registers (v0-v7, v16-v31) do not need to be preserved (or should be preserved by the caller).
Additionally, only the bottom 64 bits of each value stored in v8-v15 need to be preserved [8];
it is the responsibility of the caller to preserve larger values.
For SVE:
z0-z7 are used to pass scalable vector arguments to a subroutine, and to return scalable vector results from a function.
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
or returns results in such regisers, the subroutine must ensure that the entire contents of z8-z23 are preserved across the call.
In other cases it need only preserve the low 64 bits of z8-z15, as described in SIMD and Floating-Point registers.
p0-p3 are used to pass scalable predicate arguments to a subroutine and to return scalable predicate results from a function.
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
or returns results in such registers, the subroutine must ensure that p4-p15 are preserved across the call.
In other cases it need not preserve any scalable predicate register contents.
*/
// x86 Register mapping
#define xRAX 10
#define xRCX 11
#define xRDX 12
#define xRBX 13
#define xRSP 14
#define xRBP 15
#define xRSI 16
#define xRDI 17
#define xR8 18
#define xR9 19
#define xR10 20
#define xR11 21
#define xR12 22
#define xR13 23
#define xR14 24
#define xR15 25
#define xFlags 26
#define xRIP 27
#define xSavedSP 28
// convert a x86 register to native according to the register mapping
#define TO_NAT(A) (xRAX + (A))
// 32bits version
#define wEAX xRAX
#define wECX xRCX
#define wEDX xRDX
#define wEBX xRBX
#define wESP xRSP
#define wEBP xRBP
#define wESI xRSI
#define wEDI xRDI
#define wR8 xR8
#define wR9 xR9
#define wR10 xR10
#define wR11 xR11
#define wR12 xR12
#define wR13 xR13
#define wR14 xR14
#define wR15 xR15
#define wFlags xFlags
// scratch registers
#define x1 1
#define x2 2
#define x3 3
#define x4 4
#define x5 5
#define x6 6
#define x7 7
// 32bits version of scratch
#define w1 x1
#define w2 x2
#define w3 x3
#define w4 x4
#define w5 x5
#define w6 x6
#define w7 x7
// emu is r0
#define xEmu 0
// ARM64 LR
#define xLR 30
// ARM64 SP is r31 but is a special register
#define xSP 31
// xZR regs is 31
#define xZR 31
#define wZR xZR
// conditions
// Z == 1
#define cEQ 0b0000
// Z != 1
#define cNE 0b0001
// C == 1
#define cCS 0b0010
// C == 1
#define cHS cCS
// C != 1
#define cCC 0b0011
// C != 1
#define cLO cCC
// N == 1
#define cMI 0b0100
// N != 1
#define cPL 0b0101
// V == 1
#define cVS 0b0110
// V != 1
#define cVC 0b0111
// C == 1 && Z == 0
#define cHI 0b1000
// C !=1 || Z == 1
#define cLS 0b1001
// N == V
#define cGE 0b1010
// N != V
#define cLT 0b1011
// N == V && Z == 0
#define cGT 0b1100
// N != V || Z == 1
#define cLE 0b1101
// always
#define c__ 0b1110
#include "arm64_mapping.h"
int convert_bitmask(uint64_t bitmask);
#define convert_bitmask_w(A) convert_bitmask(((uint64_t)(A) << 32) + (uint32_t)(A))
@@ -177,6 +40,7 @@ int convert_bitmask(uint64_t bitmask);
#define MOV64xw(Rd, imm64) if(rex.w) {MOV64x(Rd, imm64);} else {MOV32w(Rd, imm64);}
#define MOV64z(Rd, imm64) if(rex.is32bits) {MOV32w(Rd, imm64);} else {MOV64x(Rd, imm64);}
#define MOV64y(Rd, imm64) if(rex.is32bits || rex.is67) {MOV32w(Rd, imm64);} else {MOV64x(Rd, imm64);}
// ADD / SUB
@@ -184,13 +48,17 @@ int convert_bitmask(uint64_t bitmask);
#define ADDx_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(1, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDSx_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(1, 0, 1, 0b00, Rm, 0, Rn, Rd))
#define ADDx_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen(1, 0, 0, 0b00, Rm, lsl, Rn, Rd))
#define ADDz_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen(rex.is32bits?0:1, 0, 0, 0b00, Rm, lsl, Rn, Rd))
#define ADDx_REG_LSR(Rd, Rn, Rm, lsr) EMIT(ADDSUB_REG_gen(1, 0, 0, 0b01, Rm, lsr, Rn, Rd))
#define ADDz_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen((rex.is32bits)?0:1, 0, 0, 0b00, Rm, lsl, Rn, Rd))
#define ADDy_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen((rex.is32bits || rex.is67)?0:1, 0, 0, 0b00, Rm, lsl, Rn, Rd))
#define ADDw_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(0, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDSw_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(0, 0, 1, 0b00, Rm, 0, Rn, Rd))
#define ADDw_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen(0, 0, 0, 0b00, Rm, lsl, Rn, Rd))
#define ADDw_REG_LSR(Rd, Rn, Rm, lsr) EMIT(ADDSUB_REG_gen(0, 0, 0, 0b01, Rm, lsr, Rn, Rd))
#define ADDSw_REG_LSL(Rd, Rn, Rm, lsl) FEMIT(ADDSUB_REG_gen(0, 0, 1, 0b00, Rm, lsl, Rn, Rd))
#define ADDxw_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(rex.w, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDz_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(rex.is32bits?0:1, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDz_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen((rex.is32bits)?0:1, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDy_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen((rex.is32bits || rex.is67)?0:1, 0, 0, 0b00, Rm, 0, Rn, Rd))
#define ADDSxw_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(rex.w, 0, 1, 0b00, Rm, 0, Rn, Rd))
#define ADDxw_REG_LSR(Rd, Rn, Rm, lsr) EMIT(ADDSUB_REG_gen(rex.w, 0, 0, 0b01, Rm, lsr, Rn, Rd))
@@ -201,21 +69,33 @@ int convert_bitmask(uint64_t bitmask);
#define ADDSw_U12(Rd, Rn, imm12) FEMIT(ADDSUB_IMM_gen(0, 0, 1, 0b00, (imm12)&0xfff, Rn, Rd))
#define ADDxw_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen(rex.w, 0, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define ADDSxw_U12(Rd, Rn, imm12) FEMIT(ADDSUB_IMM_gen(rex.w, 0, 1, 0b00, (imm12)&0xfff, Rn, Rd))
#define ADDz_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen(rex.is32bits?0:1, 0, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define ADDz_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen((rex.is32bits)?0:1, 0, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define ADDy_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen((rex.is32bits || rex.is67)?0:1, 0, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define SUBx_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(1, 1, 0, 0b00, Rm, 0, Rn, Rd))
#define SUBSx_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(1, 1, 1, 0b00, Rm, 0, Rn, Rd))
#define SUBSx_REG_ASR(Rd, Rn, Rm, asr) FEMIT(ADDSUB_REG_gen(1, 1, 1, 0b10, Rm, asr, Rn, Rd))
#define SUBx_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen(1, 1, 0, 0b00, Rm, lsl, Rn, Rd))
#define SUBw_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(0, 1, 0, 0b00, Rm, 0, Rn, Rd))
#define SUBw_REG_LSL(Rd, Rn, Rm, lsl) EMIT(ADDSUB_REG_gen(0, 1, 0, 0b00, Rm, lsl, Rn, Rd))
#define SUBw_REG_ASR(Rd, Rn, Rm, asr) EMIT(ADDSUB_REG_gen(0, 1, 0, 0b10, Rm, asr, Rn, Rd))
#define SUBx_REG_ASR(Rd, Rn, Rm, asr) EMIT(ADDSUB_REG_gen(1, 1, 0, 0b10, Rm, asr, Rn, Rd))
#define SUBSw_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(0, 1, 1, 0b00, Rm, 0, Rn, Rd))
#define SUBSw_REG_LSL(Rd, Rn, Rm, lsl) FEMIT(ADDSUB_REG_gen(0, 1, 1, 0b00, Rm, lsl, Rn, Rd))
#define SUBSw_REG_LSR(Rd, Rn, Rm, lsr) FEMIT(ADDSUB_REG_gen(0, 1, 1, 0b01, Rm, lsr, Rn, Rd))
#define SUBSw_REG_ASR(Rd, Rn, Rm, asr) FEMIT(ADDSUB_REG_gen(0, 1, 1, 0b10, Rm, asr, Rn, Rd))
#define SUBxw_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(rex.w, 1, 0, 0b00, Rm, 0, Rn, Rd))
#define SUBz_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen(rex.is32bits?0:1, 1, 0, 0b00, Rm, 0, Rn, Rd))
#define SUBy_REG(Rd, Rn, Rm) EMIT(ADDSUB_REG_gen((rex.is32bits || rex.is67)?0:1, 1, 0, 0b00, Rm, 0, Rn, Rd))
#define SUBSxw_REG(Rd, Rn, Rm) FEMIT(ADDSUB_REG_gen(rex.w, 1, 1, 0b00, Rm, 0, Rn, Rd))
#define SUBSxw_REG_ASR(Rd, Rn, Rm, asr) FEMIT(ADDSUB_REG_gen(rex.w, 1, 1, 0b10, Rm, asr, Rn, Rd))
#define CMPSx_REG(Rn, Rm) SUBSx_REG(xZR, Rn, Rm)
#define CMPSx_REG_ASR(Rn, Rm, asr) SUBSx_REG_ASR(xZR, Rn, Rm, asr)
#define CMPSw_REG(Rn, Rm) SUBSw_REG(wZR, Rn, Rm)
#define CMPSw_REG_LSR(Rn, Rm, lsr) SUBSw_REG_LSR(wZR, Rn, Rm, lsr)
#define CMPSw_REG_ASR(Rn, Rm, asr) SUBSw_REG_ASR(wZR, Rn, Rm, asr)
#define CMPSxw_REG(Rn, Rm) SUBSxw_REG(xZR, Rn, Rm)
#define CMPSxw_REG_ASR(Rn, Rm, asr) SUBSxw_REG_ASR(xZR, Rn, Rm, asr)
#define NEGx_REG(Rd, Rm) SUBx_REG(Rd, xZR, Rm);
#define NEGw_REG(Rd, Rm) SUBw_REG(Rd, wZR, Rm);
#define NEGxw_REG(Rd, Rm) SUBxw_REG(Rd, xZR, Rm);
@@ -229,6 +109,7 @@ int convert_bitmask(uint64_t bitmask);
#define SUBSw_U12(Rd, Rn, imm12) FEMIT(ADDSUB_IMM_gen(0, 1, 1, 0b00, (imm12)&0xfff, Rn, Rd))
#define SUBxw_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen(rex.w, 1, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define SUBz_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen(rex.is32bits?0:1, 1, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define SUBy_U12(Rd, Rn, imm12) EMIT(ADDSUB_IMM_gen((rex.is32bits || rex.is67)?0:1, 1, 0, 0b00, (imm12)&0xfff, Rn, Rd))
#define SUBSxw_U12(Rd, Rn, imm12) FEMIT(ADDSUB_IMM_gen(rex.w, 1, 1, 0b00, (imm12)&0xfff, Rn, Rd))
#define CMPSx_U12(Rn, imm12) SUBSx_U12(xZR, Rn, imm12)
#define CMPSw_U12(Rn, imm12) SUBSw_U12(wZR, Rn, imm12)
@@ -248,6 +129,20 @@ int convert_bitmask(uint64_t bitmask);
#define SBCSw_REG(Rd, Rn, Rm) FEMIT(ADDSUBC_gen(0, 1, 1, Rm, Rn, Rd))
#define SBCSxw_REG(Rd, Rn, Rm) FEMIT(ADDSUBC_gen(rex.w, 1, 1, Rm, Rn, Rd))
#define ADDSUB_ext(sf, op, S, Rm, option, imm3, Rn, Rd) ((sf)<<31 | (op)<<30 | (S)<<29 | 0b01011<<24 | 1<<21 | (Rm)<<16 | (option)<<13 | (imm3)<<10 | (Rn)<<5 | (Rd))
#define SUBxw_UXTB(Rd, Rn, Rm) EMIT(ADDSUB_ext(rex.w, 1, 0, Rm, 0b000, 0, Rn, Rd))
#define SUBw_UXTB(Rd, Rn, Rm) EMIT(ADDSUB_ext(0, 1, 0, Rm, 0b000, 0, Rn, Rd))
#define SUBw_SXTB(Rd, Rn, Rm) EMIT(ADDSUB_ext(0, 1, 0, Rm, 0b100, 0, Rn, Rd))
#define SUBw_UXTH(Rd, Rn, Rm) EMIT(ADDSUB_ext(0, 1, 0, Rm, 0b001, 0, Rn, Rd))
#define SUBx_UXTW(Rd, Rn, Rm) EMIT(ADDSUB_ext(1, 1, 0, Rm, 0b010, 0, Rn, Rd))
#define SUBw_SXTH(Rd, Rn, Rm) EMIT(ADDSUB_ext(0, 1, 0, Rm, 0b101, 0, Rn, Rd))
#define SUBx_SXTW(Rd, Rn, Rm) EMIT(ADDSUB_ext(1, 1, 0, Rm, 0b110, 0, Rn, Rd))
#define ADDz_UXTB(Rd, Rn, Rm) EMIT(ADDSUB_ext(rex.is32bits?0:1, 0, 0, Rm, 0b000, 0, Rn, Rd))
#define ADDw_UXTH(Rd, Rn, Rm) EMIT(ADDSUB_ext(0, 0, 0, Rm, 0b001, 0, Rn, Rd))
#define ADDx_UXTW(Rd, Rn, Rm) EMIT(ADDSUB_ext(1, 0, 0, Rm, 0b010, 0, Rn, Rd))
#define ADDx_SXTW(Rd, Rn, Rm) EMIT(ADDSUB_ext(1, 0, 0, Rm, 0b110, 0, Rn, Rd))
#define ADDx_REGy(Rd, Rn, Rm) do {if(rex.is32bits || rex.is67) ADDx_SXTW(Rd, Rn, Rm); else ADDx_REG(Rd, Rn, Rm); } while(0)
// CCMP compare if cond is true, set nzcv if false
#define CCMP_reg(sf, Rm, cond, Rn, nzcv) ((sf)<<31 | 1<<30 | 1<<29 | 0b11010010<<21 | (Rm)<<16 | (cond)<<12 | (Rn)<<5 | (nzcv))
#define CCMPw(Wn, Wm, nzcv, cond) FEMIT(CCMP_reg(0, Wm, cond, Wn, nzcv))
@@ -269,6 +164,7 @@ int convert_bitmask(uint64_t bitmask);
#define LDRH_S9_postindex(Rt, Rn, imm9) EMIT(LDR_gen(0b01, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
#define LDRH_S9_preindex(Rt, Rn, imm9) EMIT(LDR_gen(0b01, 0b00, (imm9)&0x1ff, 0b11, Rn, Rt))
#define LDRxw_S9_postindex(Rt, Rn, imm9) EMIT(LDR_gen(rex.w?0b11:0b10, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
#define LDRz_S9_preindex(Rt, Rn, imm9) EMIT(LDR_gen(rex.is32bits?0b10:0b11, 0b00, (imm9)&0x1ff, 0b11, Rn, Rt))
#define LDRS_gen(size, op1, imm9, op2, Rn, Rt) ((size)<<30 | 0b111<<27 | (op1)<<24 | 0b10<<22 | (imm9)<<12 | (op2)<<10 | (Rn)<<5 | (Rt))
#define LDRSW_S9_postindex(Rt, Rn, imm9) EMIT(LDRS_gen(0b10, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
@@ -284,6 +180,8 @@ int convert_bitmask(uint64_t bitmask);
#define LDS_gen(size, op1, imm12, Rn, Rt) ((size)<<30 | 0b111<<27 | (op1)<<24 | 0b10<<22 | (imm12)<<10 | (Rn)<<5 | (Rt))
#define LDRSW_U12(Rt, Rn, imm12) EMIT(LDS_gen(0b10, 0b01, ((uint32_t)((imm12)>>2))&0xfff, Rn, Rt))
#define LDRSH_U12(Rt, Rn, imm12) EMIT(LDS_gen(0b01, 0b01, ((uint32_t)((imm12)>>1))&0xfff, Rn, Rt))
#define LDRSB_U12(Rt, Rn, imm12) EMIT(LDS_gen(0b00, 0b01, ((uint32_t)(imm12))&0xfff, Rn, Rt))
#define LDR_REG_gen(size, Rm, option, S, Rn, Rt) ((size)<<30 | 0b111<<27 | 0b01<<22 | 1<<21 | (Rm)<<16 | (option)<<13 | (S)<<12 | (0b10)<<10 | (Rn)<<5 | (Rt))
#define LDRx_REG(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b11, Rm, 0b011, 0, Rn, Rt))
@@ -294,9 +192,7 @@ int convert_bitmask(uint64_t bitmask);
#define LDRw_REG_LSL2(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b10, Rm, 0b011, 1, Rn, Rt))
#define LDRw_REG_SXTW(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b10, Rm, 0b110, 0, Rn, Rt))
#define LDRxw_REG(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b10+rex.w, Rm, 0b011, 0, Rn, Rt))
#define LDRz_REG(Rt, Rn, Rm) EMIT(LDR_REG_gen(rex.is32bits?0b10:0b11, Rm, 0b011, 0, Rn, Rt))
#define LDRxw_REG_SXTW(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b10+rex.w, Rm, 0b110, 0, Rn, Rt))
#define LDRz_REG_SXTW(Rt, Rn, Rm) EMIT(LDR_REG_gen(rex.is32bits?0b10:0b11, Rm, 0b110, 0, Rn, Rt))
#define LDRB_REG(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b00, Rm, 0b011, 0, Rn, Rt))
#define LDRB_REG_UXTW(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b00, Rm, 0b010, 0, Rn, Rt))
#define LDRB_REG_SXTW(Rt, Rn, Rm) EMIT(LDR_REG_gen(0b00, Rm, 0b110, 0, Rn, Rt))
@@ -316,7 +212,7 @@ int convert_bitmask(uint64_t bitmask);
#define LDRSW_REG_SXTW(Rt, Rn, Rm) EMIT(LDRS_REG_gen(0b10, Rm, 0b110, 0, Rn, Rt))
#define LDR_PC_gen(opc, imm19, Rt) ((opc)<<30 | 0b011<<27 | (imm19)<<5 | (Rt))
#define LDRx_literal(Rt, imm19) EMIT(LDR_PC_gen(0b01, ((imm19)>>2)&0x7FFFF, Rt))
#define LDRx_literal(Rt, imm21) EMIT(LDR_PC_gen(0b01, (((int64_t)(imm21))>>2)&0x7FFFF, Rt))
#define LDU_gen(size, opc, imm9, Rn, Rt) ((size)<<30 | 0b111<<27 | (opc)<<22 | ((imm9)&0x1ff)<<12 | (Rn)<<5 | (Rt))
#define LDURx_I9(Rt, Rn, imm9) EMIT(LDU_gen(0b11, 0b01, imm9, Rn, Rt))
@@ -390,12 +286,15 @@ int convert_bitmask(uint64_t bitmask);
#define STRw_REG_SXTW(Rt, Rn, Rm) EMIT(STR_REG_gen(0b10, Rm, 0b110, 0, Rn, Rt))
#define STRB_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(0b00, Rm, 0b011, 0, Rn, Rt))
#define STRB_REG_SXTW(Rt, Rn, Rm) EMIT(STR_REG_gen(0b00, Rm, 0b110, 0, Rn, Rt))
#define STRB_REGz(Rt, Rn, Rm) EMIT(STR_REG_gen(0b00, Rm, rex.is32bits?0b110:0b011, 0, Rn, Rt))
#define STRH_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(0b01, Rm, 0b011, 0, Rn, Rt))
#define STRH_REG_SXTW(Rt, Rn, Rm) EMIT(STR_REG_gen(0b01, Rm, 0b110, 0, Rn, Rt))
#define STRxw_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.w?0b11:0b10, Rm, 0b011, 0, Rn, Rt))
#define STRxw_REG_SXTW(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.w?0b11:0b10, Rm, 0b110, 0, Rn, Rt))
#define STRxw_REGz(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.w?0b11:0b10, Rm, rex.is32bits?0b110:0b011, 0, Rn, Rt))
#define STRz_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.is32bits?0b10:0b11, Rm, 0b011, 0, Rn, Rt))
#define STRz_REG_SXTW(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.is32bits?0b10:0b11, Rm, 0b110, 0, Rn, Rt))
#define STRz_REGz(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.is32bits?0b10:0b11, Rm, rex.is32bits?0b110:0b011, 0, Rn, Rt))
// LOAD/STORE PAIR
#define MEMPAIR_gen(size, L, op2, imm7, Rt2, Rn, Rt) ((size)<<31 | 0b101<<27 | (op2)<<23 | (L)<<22 | (imm7)<<15 | (Rt2)<<10 | (Rn)<<5 | (Rt))
@@ -510,6 +409,9 @@ int convert_bitmask(uint64_t bitmask);
#define DSB_ST() EMIT(DSB_gen(0b1110))
#define DSB_SY() EMIT(DSB_gen(0b1111))
#define DC_gen(op1, CRm, op2, Xt) (0b1101010100001<<19 | (op1)<<16 | 0b0111<<12 | (CRm)<<8 | (op2)<<5 | Xt)
#define DC_CIVAC(Xt) EMIT(DC_gen(0b011, 0b1110, 0b001, Xt))
// Break
#define BRK_gen(imm16) (0b11010100<<24 | 0b001<<21 | (((imm16)&0xffff)<<5))
#define BRK(imm16) EMIT(BRK_gen(imm16))
@@ -524,11 +426,11 @@ int convert_bitmask(uint64_t bitmask);
#define CBNZx(Rt, imm19) EMIT(CB_gen(1, 1, ((imm19)>>2)&0x7FFFF, Rt))
#define CBNZw(Rt, imm19) EMIT(CB_gen(0, 1, ((imm19)>>2)&0x7FFFF, Rt))
#define CBNZxw(Rt, imm19) EMIT(CB_gen(rex.w, 1, ((imm19)>>2)&0x7FFFF, Rt))
#define CBNZz(Rt, imm19) EMIT(CB_gen(rex.is32bits?0:1, 1, ((imm19)>>2)&0x7FFFF, Rt))
#define CBNZy(Rt, imm19) EMIT(CB_gen((rex.is32bits || rex.is67)?0:1, 1, ((imm19)>>2)&0x7FFFF, Rt))
#define CBZx(Rt, imm19) EMIT(CB_gen(1, 0, ((imm19)>>2)&0x7FFFF, Rt))
#define CBZw(Rt, imm19) EMIT(CB_gen(0, 0, ((imm19)>>2)&0x7FFFF, Rt))
#define CBZxw(Rt, imm19) EMIT(CB_gen(rex.w, 0, ((imm19)>>2)&0x7FFFF, Rt))
#define CBZz(Rt, imm19) EMIT(CB_gen(rex.is32bits?0:1, 0, ((imm19)>>2)&0x7FFFF, Rt))
#define CBZy(Rt, imm19) EMIT(CB_gen((rex.is32bits || rex.is67)?0:1, 0, ((imm19)>>2)&0x7FFFF, Rt))
#define TB_gen(b5, op, b40, imm14, Rt) ((b5)<<31 | 0b011011<<25 | (op)<<24 | (b40)<<19 | (imm14)<<5 | (Rt))
#define TBZ(Rt, bit, imm16) EMIT(TB_gen(((bit)>>5)&1, 0, (bit)&0x1f, ((imm16)>>2)&0x3FFF, Rt))
@@ -560,7 +462,7 @@ int convert_bitmask(uint64_t bitmask);
#define CSINV_gen(sf, Rm, cond, Rn, Rd) ((sf)<<31 | 1<<30 | 0b11010100<<21 | (Rm)<<16 | (cond)<<12 | (Rn)<<5 | (Rd))
#define CSINVx(Rd, Rn, Rm, cond) EMIT(CSINV_gen(1, Rm, cond, Rn, Rd))
#define CSINVw(Rd, Rn, Rm, cond) EMIT(CSINV_gen(0, Rm, cond, Rn, Rd))
#define CSINVxw(Rd, Rn, Rm, cond) EMIT(CSINV_gen(rex.w?, Rm, cond, Rn, Rd))
#define CSINVxw(Rd, Rn, Rm, cond) EMIT(CSINV_gen(rex.w, Rm, cond, Rn, Rd))
#define CINVx(Rd, Rn, cond) CSINVx(Rd, Rn, Rn, invertCond(cond))
#define CINVw(Rd, Rn, cond) CSINVw(Rd, Rn, Rn, invertCond(cond))
#define CINVxw(Rd, Rn, cond) CSINVxw(Rd, Rn, Rn, invertCond(cond))
@@ -661,7 +563,7 @@ int convert_bitmask(uint64_t bitmask);
#define BICw_LSL(Rd, Rn, Rm, lsl) EMIT(LOGIC_REG_gen(0, 0b00, 0b00, 1, Rm, lsl, Rn, Rd))
#define BICSx(Rd, Rn, Rm) FEMIT(LOGIC_REG_gen(1, 0b11, 0b00, 1, Rm, 0, Rn, Rd))
#define BICSw(Rd, Rn, Rm) FEMIT(LOGIC_REG_gen(0, 0b11, 0b00, 1, Rm, 0, Rn, Rd))
#define BICxw(Rd, Rn, Rm) FEMIT(LOGIC_REG_gen(rex.w, 0b00, 0b00, 1, Rm, 0, Rn, Rd))
#define BICxw(Rd, Rn, Rm) EMIT(LOGIC_REG_gen(rex.w, 0b00, 0b00, 1, Rm, 0, Rn, Rd))
#define BICSxw(Rd, Rn, Rm) FEMIT(LOGIC_REG_gen(rex.w, 0b11, 0b00, 1, Rm, 0, Rn, Rd))
#define BICx_REG BICx
#define BICw_REG BICw
@@ -694,6 +596,7 @@ int convert_bitmask(uint64_t bitmask);
#define BFCx(Rd, lsb, width) BFMx(Rd, xZR, ((-(lsb))%64)&0x3f, (width)-1)
#define BFCw(Rd, lsb, width) BFMw(Rd, xZR, ((-(lsb))%32)&0x1f, (width)-1)
#define BFCxw(Rd, lsb, width) BFMxw(Rd, xZR, rex.w?(((-(lsb))%64)&0x3f):(((-(lsb))%32)&0x1f), (width)-1)
#define BFCz(Rd, lsb, width) if(rex.is32bits) {BFCw(Rd, lsb, width);} else {BFCx(Rd, lsb, width);}
// Insert lsb:width part of Rn into low part of Rd (leaving rest of Rd untouched)
#define BFXILx(Rd, Rn, lsb, width) EMIT(BFM_gen(1, 0b01, 1, (lsb), (lsb)+(width)-1, Rn, Rd))
// Insert lsb:width part of Rn into low part of Rd (leaving rest of Rd untouched)
@@ -720,6 +623,7 @@ int convert_bitmask(uint64_t bitmask);
#define LSLx(Rd, Rn, lsl) UBFMx(Rd, Rn, ((-(lsl))%64)&63, 63-(lsl))
#define LSLw(Rd, Rn, lsl) UBFMw(Rd, Rn, ((-(lsl))%32)&31, 31-(lsl))
#define LSLxw(Rd, Rn, lsl) UBFMxw(Rd, Rn, rex.w?(((-(lsl))%64)&63):(((-(lsl))%32)&31), (rex.w?63:31)-(lsl))
#define LSLy(Rd, Rn, lsl) do {if(rex.is32bits || rex.is67) LSLw(Rd, Rn, lsl); else LSLx(Rd, Rn, lsl);} while(0)
// Take width first bits from Rn, LSL lsb and create Rd
#define UBFIZx(Rd, Rn, lsb, width) UBFMx(Rd, Rn, ((-(lsb))%64)&63, width-1)
// Take width first bits from Rn, LSL lsb and create Rd
@@ -881,7 +785,7 @@ int convert_bitmask(uint64_t bitmask);
#define FCSELS(Sd, Sn, Sm, cond) EMIT(FCSEL_scalar(0b00, Sm, cond, Sn, Sd))
#define FCSELD(Dd, Dn, Dm, cond) EMIT(FCSEL_scalar(0b01, Dm, cond, Dn, Dd))
// VLDR
// VLDR/VSTR
#define VMEM_gen(size, opc, imm12, Rn, Rt) ((size)<<30 | 0b111<<27 | 1<<26 | 0b01<<24 | (opc)<<22 | (imm12)<<10 | (Rn)<<5 | (Rt))
// imm13 must be 1-aligned
#define VLDR16_U12(Ht, Rn, imm13) EMIT(VMEM_gen(0b01, 0b01, ((uint32_t)((imm13)>>1))&0xfff, Rn, Ht))
@@ -900,6 +804,15 @@ int convert_bitmask(uint64_t bitmask);
// (imm13) must be 1-aligned
#define VSTR16_U12(Ht, Rn, imm13) EMIT(VMEM_gen(0b01, 0b00, ((uint32_t)((imm13)>>1))&0xfff, Rn, Ht))
//VLDP/VSTP
#define VMEMP_vector(opc, L, imm7, Rt2, Rn, Rt) ((opc)<<30 | 0b101<<27 | 1<<26 | 0b010<<23 | (L)<<22 | (imm7)<<15 | (Rt2)<<10 | (Rn)<<5 | (Rt))
#define VLDP32_I7(Rt1, Rt2, Rn, imm9) EMIT(VMEMP_vector(0b00, 1, (((int64_t)(imm9))>>2)&0x7f, Rt2, Rn, Rt1))
#define VLDP64_I7(Rt1, Rt2, Rn, imm10) EMIT(VMEMP_vector(0b01, 1, (((int64_t)(imm10))>>3)&0x7f, Rt2, Rn, Rt1))
#define VLDP128_I7(Rt1, Rt2, Rn, imm11) EMIT(VMEMP_vector(0b10, 1, (((int64_t)(imm11))>>4)&0x7f, Rt2, Rn, Rt1))
#define VSTP32_I7(Rt1, Rt2, Rn, imm9) EMIT(VMEMP_vector(0b00, 0, (((int64_t)(imm9))>>2)&0x7f, Rt2, Rn, Rt1))
#define VSTP64_I7(Rt1, Rt2, Rn, imm10) EMIT(VMEMP_vector(0b01, 0, (((int64_t)(imm10))>>3)&0x7f, Rt2, Rn, Rt1))
#define VSTP128_I7(Rt1, Rt2, Rn, imm11) EMIT(VMEMP_vector(0b10, 0, (((int64_t)(imm11))>>4)&0x7f, Rt2, Rn, Rt1))
#define VMEMUR_vector(size, opc, imm9, Rn, Rt) ((size)<<30 | 0b111<<27 | 1<<26 | (opc)<<22 | (imm9)<<12 | (Rn)<<5 | (Rt))
// signed offset, no alignement!
#define VLDR8_I9(Vt, Rn, imm9) EMIT(VMEMUR_vector(0b00, 0b01, (imm9)&0b111111111, Rn, Vt))
@@ -918,10 +831,12 @@ int convert_bitmask(uint64_t bitmask);
#define VLD64(A, B, C) if(unscaled) {VLDR64_I9(A, B, C);} else {VLDR64_U12(A, B, C);}
#define VLD32(A, B, C) if(unscaled) {VLDR32_I9(A, B, C);} else {VLDR32_U12(A, B, C);}
#define VLD16(A, B, C) if(unscaled) {VLDR16_I9(A, B, C);} else {VLDR16_U12(A, B, C);}
#define VLD8(A, B, C) if(unscaled) {VLDR8_I9(A, B, C);} else {VLDR8_U12(A, B, C);}
#define VST128(A, B, C) if(unscaled) {VSTR128_I9(A, B, C);} else {VSTR128_U12(A, B, C);}
#define VST64(A, B, C) if(unscaled) {VSTR64_I9(A, B, C);} else {VSTR64_U12(A, B, C);}
#define VST32(A, B, C) if(unscaled) {VSTR32_I9(A, B, C);} else {VSTR32_U12(A, B, C);}
#define VST16(A, B, C) if(unscaled) {VSTR16_I9(A, B, C);} else {VSTR16_U12(A, B, C);}
#define VST8(A, B, C) if(unscaled) {VSTR8_I9(A, B, C);} else {VSTR8_U12(A, B, C);}
#define VMEMW_gen(size, opc, imm9, op2, Rn, Rt) ((size)<<30 | 0b111<<27 | 1<<26 | (opc)<<22 | (imm9)<<12 | (op2)<<10 | 0b01<<10 | (Rn)<<5 | (Rt))
#define VLDR64_S9_postindex(Rt, Rn, imm9) EMIT(VMEMW_gen(0b11, 0b01, (imm9)&0x1ff, 0b01, Rn, Rt))
@@ -1141,7 +1056,9 @@ int convert_bitmask(uint64_t bitmask);
#define VFMOVDQ_8(Vd, u8) EMIT(FMOV_vector_imm(1, 1, ((u8)>>5)&0b111, (u8)&0b11111, Vd))
#define FMOV_scalar_imm(type, imm8, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | (imm8)<<13 | 0b100<<10 | (Rd))
// FMOV to Sd, imm=7 :~6:6:6:6:6:6:5:4 :3:2:1:0....
#define FMOVS_8(Sd, u8) EMIT(FMOV_scalar_imm(0b00, u8, Sd))
// FMOV to Dd, imm=7 :~6:6:6:6:6:6:6:6:6:5:4 :3:2:1:0....
#define FMOVD_8(Dd, u8) EMIT(FMOV_scalar_imm(0b01, u8, Dd))
// VMOV
@@ -1297,7 +1214,7 @@ int convert_bitmask(uint64_t bitmask);
#define VFRSQRTSQS(Vd, Vn, Vm) EMIT(FRSQRTS_vector(1, 0, Vm, Vn, Vd))
#define VFRSQRTSQD(Vd, Vn, Vm) EMIT(FRSQRTS_vector(1, 0, Vm, Vn, Vd))
// CMP
// CMP . NZCV: unordere=0011, eq=0110, inf=1000, sup=0010
#define FCMP_scalar(type, Rn, Rm, opc) (0b11110<<24 | (type)<<22 | 1<<21 | (Rm)<<16 | 0b1000<<10 | (Rn)<<5 | (opc)<<3)
#define FCMPS(Sn, Sm) FEMIT(FCMP_scalar(0b00, Sn, Sm, 0b00))
#define FCMPD(Dn, Dm) FEMIT(FCMP_scalar(0b01, Dn, Dm, 0b00))
@@ -1538,6 +1455,12 @@ int convert_bitmask(uint64_t bitmask);
#define VFMAXQS(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 0, 0, 0, Vm, Vn, Vd))
#define VFMINQD(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 0, 1, 1, Vm, Vn, Vd))
#define VFMAXQD(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 0, 0, 1, Vm, Vn, Vd))
#define VFMINPS(Vd, Vn, Vm) EMIT(FMINMAX_vector(0, 1, 1, 0, Vm, Vn, Vd))
#define VFMAXPS(Vd, Vn, Vm) EMIT(FMINMAX_vector(0, 1, 0, 0, Vm, Vn, Vd))
#define VFMINPQS(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 1, 1, 0, Vm, Vn, Vd))
#define VFMAXPQS(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 1, 0, 0, Vm, Vn, Vd))
#define VFMINPQD(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 1, 1, 1, Vm, Vn, Vd))
#define VFMAXPQD(Vd, Vn, Vm) EMIT(FMINMAX_vector(1, 1, 0, 1, Vm, Vn, Vd))
#define FMINMAX_scalar(type, Rm, op, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | (Rm)<<16 | 0b01<<14 | (op)<<12 | 0b10<<10 | (Rn)<<5 | (Rd))
#define FMINS(Sd, Sn, Sm) EMIT(FMINMAX_scalar(0b00, Sm, 0b01, Sn, Sd))
@@ -1826,7 +1749,7 @@ int convert_bitmask(uint64_t bitmask);
#define FCMLTS_0(Rd, Rn) EMIT(FCMP_0_scalar(0, 0, 0b10, (Rn), (Rd)))
#define FCMLTD_0(Rd, Rn) EMIT(FCMP_0_scalar(0, 1, 0b10, (Rn), (Rd)))
// Scalar Float CMP
// Scalar Float CMEQ
#define FCMP_op_scalar(U, E, sz, Rm, ac, Rn, Rd) (0b01<<30 | (U)<<29 | 0b11110<<24 | (E)<<23 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b1110<<12 | (ac)<<11 | 1<<10 | (Rn)<<5 | (Rd))
#define FCMEQS(Rd, Rn, Rm) EMIT(FCMP_op_scalar(0, 0, 0, (Rm), 0, (Rn), (Rd)))
#define FCMEQD(Rd, Rn, Rm) EMIT(FCMP_op_scalar(0, 0, 1, (Rm), 0, (Rn), (Rd)))
@@ -2119,6 +2042,10 @@ int convert_bitmask(uint64_t bitmask);
#define URHADDQ_16(Vd, Vn, Vm) EMIT(RHADD_vector(1, 1, 0b01, Vm, Vn, Vd))
#define URHADDQ_32(Vd, Vn, Vm) EMIT(RHADD_vector(1, 1, 0b10, Vm, Vn, Vd))
//SRSHR/URSHR
#define RSHR(Q, U, immh, immb, Rn, Rd) ((Q)<<30 | (U)<<29 | 0b011110<<23 | (immh)<<19 | (immb)<<16 | 1<<13 | 0<<12 | 1<<10 | (Rn)<<5 | (Rd))
#define SRSHRQ_32(Vd, Vn, shift) EMIT(RSHR(1, 0, 0b0100 | (((32-(shift))>>3)&0b11), (32-(shift))&0b111, Vn, Vd))
// QRDMULH Signed saturating (Rounding) Doubling Multiply returning High half
#define QDMULH_vector(Q, U, size, Rm, Rn, Rd) ((Q)<<30 | (U)<<29 | 0b01110<<24 | (size)<<22 | 1<<21 | (Rm)<<16 | 0b10110<<11 | 1<<10 | (Rn)<<5 | (Rd))
#define SQRDMULH_8(Vd, Vn, Vm) EMIT(QDMULH_vector(0, 1, 0b00, Vm, Vn, Vd))
@@ -2157,6 +2084,7 @@ int convert_bitmask(uint64_t bitmask);
#define LDADDAxw(Rs, Rt, Rn) EMIT(ATOMIC_gen(0b10+rex.w, 1, 0, Rs, 0b000, Rn, Rt))
#define LDADDALxw(Rs, Rt, Rn) EMIT(ATOMIC_gen(0b10+rex.w, 1, 1, Rs, 0b000, Rn, Rt))
#define LDADDLxw(Rs, Rt, Rn) EMIT(ATOMIC_gen(0b10+rex.w, 0, 1, Rs, 0b000, Rn, Rt))
#define STADDLw(Rs, Rn) EMIT(ATOMIC_gen(0b10, 0, 1, Rs, 0b000, Rn, 0b11111))
#define STADDxw(Rs, Rn) EMIT(ATOMIC_gen(0b10+rex.w, 0, 0, Rs, 0b000, Rn, 0b11111))
#define STADDLxw(Rs, Rn) EMIT(ATOMIC_gen(0b10+rex.w, 0, 1, Rs, 0b000, Rn, 0b11111))
#define LDADDB(Rs, Rt, Rn) EMIT(ATOMIC_gen(0b00, 0, 0, Rs, 0b000, Rn, Rt))
@@ -2436,4 +2364,14 @@ int convert_bitmask(uint64_t bitmask);
//SHA256 hash update (part 2)
#define SHA256H2(Vd, Vn, Vm) EMIT(SHA256H2_gen(Vm, Vn, Vd))
// LRCPC extension
#define LDAPR_gen(sz, Rn, Rt) ((sz)<<30 | 0b111<<27 | 1<<23 | 1<<21 | 0b11111<<16 | 1<<15 | 0b100<<12 | (Rn)<<5 | (Rt))
#define LDAPRx(Rt, Rn) EMIT(LDAPR_gen(0b11, Rn, Rt))
#define LDAPRw(Rt, Rn) EMIT(LDAPR_gen(0b10, Rn, Rt))
#define LDAPRxw(Rt, Rn) EMIT(LDAPR_gen(0b10+rex.w, Rn, Rt))
#define LDAPRz(Rt, Rn) EMIT(LDAPR_gen(rex.is32bits?0b10:0b11, Rn, Rt))
#define LDAPRH(Rt, Rn) EMIT(LDAPR_gen(0b01, Rn, Rt))
#define LDAPRB(Rt, Rn) EMIT(LDAPR_gen(0b00, Rn, Rt))
#endif //__ARM64_EMITTER_H__
+3
View File
@@ -19,6 +19,9 @@ arm64_epilog:
stp x24, x25, [x0, (8 * 14)]
stp x26, x27, [x0, (8 * 16)] // put back reg value in emu, including EIP (so x27 must be EIP now)
//restore all used register
#ifdef _WIN32
ldr x18, [x0, 3104]
#endif
add sp, x28, 0
//vpop {d8-d15}
ldp x19, x20, [sp, (8 * 0)]
+169
View File
@@ -5,6 +5,7 @@
.text
.align 4
.extern cpuext
.global arm64_lock_read_b
.global arm64_lock_write_b
.global arm64_lock_read_h
@@ -22,6 +23,7 @@
.global arm64_lock_storeifnull
.global arm64_lock_storeifnull_d
.global arm64_lock_storeifref
.global arm64_lock_storeifref2
.global arm64_lock_storeifref_d
.global arm64_lock_storeifref2_d
.global arm64_lock_decifnot0b
@@ -33,6 +35,7 @@
.global arm64_lock_get_b
.global arm64_lock_get_d
.global arm64_lock_get_dd
.global arm64_crc
arm64_lock_read_b:
dmb ish
@@ -104,6 +107,10 @@ arm64_lock_write_dq:
arm64_lock_xchg_dd:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_xchg_dd
dmb ish
arm64_lock_xchg_dd_0:
// address is x0, value is x1, return old value in x0
@@ -113,7 +120,17 @@ arm64_lock_xchg_dd_0:
mov x0, x2
ret
arm64_atomic_xchg_dd:
dmb ish
// address is x0, value is x1, return old value in x0
swpal x1, x0, [x0]
ret
arm64_lock_xchg_d:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_xchg_d
dmb ish
arm64_lock_xchg_d_0:
// address is x0, value is x1, return old value in x0
@@ -123,7 +140,17 @@ arm64_lock_xchg_d_0:
mov w0, w2
ret
arm64_atomic_xchg_d:
dmb ish
// address is x0, value is x1, return old value in x0
swpal w1, w0, [x0]
ret
arm64_lock_xchg_h:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_xchg_h
dmb ish
arm64_lock_xchg_h_0:
// address is x0, value is x1, return old value in x0
@@ -133,7 +160,17 @@ arm64_lock_xchg_h_0:
mov w0, w2
ret
arm64_atomic_xchg_h:
dmb ish
// address is x0, value is x1, return old value in x0
swpalh w1, w0, [x0]
ret
arm64_lock_xchg_b:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_xchg_b
dmb ish
arm64_lock_xchg_b_0:
// address is x0, value is x1, return old value in x0
@@ -143,7 +180,17 @@ arm64_lock_xchg_b_0:
mov w0, w2
ret
arm64_atomic_xchg_b:
dmb ish
// address is x0, value is x1, return old value in x0
swpalb w1, w0, [x0]
ret
arm64_lock_storeifnull:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifnull
dmb ish
1:
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return old [x0] value
@@ -155,7 +202,20 @@ arm64_lock_storeifnull:
mov x0, x2
ret
arm64_atomic_storeifnull:
dmb ish
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return old [x0] value
mov x2, xzr
casal x2, x1, [x0]
mov x0, x2
ret
arm64_lock_storeifnull_d:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifnull_d
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is 0. return old [x0] value
@@ -168,7 +228,19 @@ arm64_lock_storeifnull_d:
mov w0, w2
ret
arm64_atomic_storeifnull_d:
dmb ish
// address is x0, value is w1, w1 store to x0 only if [x0] is 0. return old [x0] value
mov x2, xzr
casal w2, w1, [x0]
mov w0, w2
ret
arm64_lock_storeifref:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifref
dmb ish
1:
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return new [x0] value (so x1 or old value)
@@ -183,7 +255,24 @@ arm64_lock_storeifref:
mov x0, x3
ret
arm64_atomic_storeifref:
dmb ish
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return new [x0] value (so x1 or old value)
mov x3, x2
casal x2, x1, [x0]
cmp x2, x3
bne 2f
mov x0, x1
ret
2:
mov x0, x3
ret
arm64_lock_storeifref_d:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifref_d
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return new [x0] value (so x1 or old value)
@@ -198,7 +287,24 @@ arm64_lock_storeifref_d:
mov w0, w3
ret
arm64_atomic_storeifref_d:
dmb ish
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return new [x0] value (so w1 or old value)
mov w3, w2
casal w2, w1, [x0]
bne 2f
cmp w2, w3
mov w0, w1
ret
2:
mov w0, w3
ret
arm64_lock_storeifref2_d:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifref2_d
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return old [x0] value
@@ -211,6 +317,37 @@ arm64_lock_storeifref2_d:
mov w0, w3
ret
arm64_atomic_storeifref2_d:
dmb ish
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return old [x0] value
casal w2, w1, [x0]
mov w0, w2
ret
arm64_lock_storeifref2:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_storeifref2
dmb ish
1:
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return old [x0] value
ldaxr x3, [x0]
cmp x2, x3
bne 2f
stlxr w4, x1, [x0]
cbnz w4, 1b
2:
mov x0, x3
ret
arm64_atomic_storeifref2:
dmb ish
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return old [x0] value
casal x2, x1, [x0]
mov x0, x2
ret
arm64_lock_decifnot0b:
dmb ish
1:
@@ -242,6 +379,10 @@ arm64_lock_decifnot0:
ret
arm64_lock_incif0:
adrp x3, cpuext
add x3, x3, #:lo12:cpuext
ldr w3, [x3]
tbnz w3, #0, arm64_atomic_incif0
dmb ish
1:
ldaxr w1, [x0]
@@ -254,6 +395,13 @@ arm64_lock_incif0:
mov w0, w1
ret
arm64_atomic_incif0:
mov w1, #1
dmb ish
swpal w1, wzr, [x0]
mov w0, w1
ret
arm64_lock_store:
str w1, [x0]
dmb ish
@@ -275,3 +423,24 @@ arm64_lock_get_d:
arm64_lock_get_dd:
ldaxr x0, [x0]
ret
arm64_crc:
//x0 is address, w1 is len
mov x2, x0 // address is x2 now
mov w0, wzr // crc is w0
1:
cmp w1, #8
blo 2f
ldr x3, [x2], #8
crc32x w0, w0, x3
subs w1, w1, #8
bne 1b
2:
cbz w1, 4f
3:
ldrb w3, [x2], #1
crc32b w0, w0, w3
subs w1, w1, #1
bne 3b
4:
ret
+14 -1
View File
@@ -29,30 +29,43 @@ extern int arm64_lock_write_dq(uint64_t a, uint64_t b, void* addr);
// Atomically exchange value at [p] with val, return old p
extern uintptr_t arm64_lock_xchg_dd(void* p, uintptr_t val);
extern uintptr_t arm64_atomic_xchg_dd(void* p, uintptr_t val);
// Atomically exchange value at [p] with val, return old p
extern uint32_t arm64_lock_xchg_d(void* p, uint32_t val);
extern uint32_t arm64_atomic_xchg_d(void* p, uint32_t val);
// Atomically exchange value at [p] with val, return old p
extern uint32_t arm64_lock_xchg_h(void* p, uint32_t val);
extern uint32_t arm64_atomic_xchg_h(void* p, uint32_t val);
// Atomically exchange value at [p] with val, return old p
extern uint32_t arm64_lock_xchg_b(void* p, uint32_t val);
extern uint32_t arm64_atomic_xchg_b(void* p, uint32_t val);
// Atomically store value to [p] only if [p] is NULL. Return old [p] value
extern uint32_t arm64_lock_storeifnull_d(void*p, uint32_t val);
extern uint32_t arm64_atomic_storeifnull_d(void*p, uint32_t val);
// Atomically store value to [p] only if [p] is NULL. Return old [p] value
extern void* arm64_lock_storeifnull(void*p, void* val);
extern void* arm64_atomic_storeifnull(void*p, void* val);
// Atomically store value to [p] only if [p] is ref. Return new [p] value (so val or old)
extern void* arm64_lock_storeifref(void*p, void* val, void* ref);
extern void* arm64_atomic_storeifref(void*p, void* val, void* ref);
// Atomically store value to [p] only if [p] is ref. Return old [p] value (so val or old)
extern void* arm64_lock_storeifref2(void*p, void* val, void* ref);
extern void* arm64_atomic_storeifref2(void*p, void* val, void* ref);
// Atomically store value to [p] only if [p] is ref. Return new [p] value (so val or old)
extern uint32_t arm64_lock_storeifref_d(void*p, uint32_t val, uint32_t ref);
extern uint32_t arm64_atomic_storeifref_d(void*p, uint32_t val, uint32_t ref);
// Atomically store value to [p] only if [p] is ref. Return new [p] value (so val or old)
// Atomically store value to [p] only if [p] is ref. Return old [p] value (so ref or old)
extern uint32_t arm64_lock_storeifref2_d(void*p, uint32_t val, uint32_t ref);
extern uint32_t arm64_atomic_storeifref2_d(void*p, uint32_t val, uint32_t ref);
// decrement atomically the byte at [p] (but only if p not 0)
extern void arm64_lock_decifnot0b(void*p);
+149
View File
@@ -0,0 +1,149 @@
#ifndef __ARM64_MAPPING_H__
#define __ARM64_MAPPING_H__
/*
ARM64 Linux Call Convention
SP The Stack Pointer.
r30 LR The Link Register.
r29 FP The Frame Pointer
r19…r28 Callee-saved registers
r18 The Platform Register, if needed; otherwise a temporary register. See notes.
r17 IP1 The second intra-procedure-call temporary register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
r16 IP0 The first intra-procedure-call scratch register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
r9…r15 Temporary registers
r8 Indirect result location register
r0…r7 Parameter/result registers
For SIMD:
The first eight registers, v0-v7, are used to pass argument values into a subroutine and to return result values from a function.
They may also be used to hold intermediate values within a routine (but, in general, only between subroutine calls).
Registers v8-v15 must be preserved by a callee across subroutine calls;
the remaining registers (v0-v7, v16-v31) do not need to be preserved (or should be preserved by the caller).
Additionally, only the bottom 64 bits of each value stored in v8-v15 need to be preserved [8];
it is the responsibility of the caller to preserve larger values.
For SVE:
z0-z7 are used to pass scalable vector arguments to a subroutine, and to return scalable vector results from a function.
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
or returns results in such regisers, the subroutine must ensure that the entire contents of z8-z23 are preserved across the call.
In other cases it need only preserve the low 64 bits of z8-z15, as described in SIMD and Floating-Point registers.
p0-p3 are used to pass scalable predicate arguments to a subroutine and to return scalable predicate results from a function.
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
or returns results in such registers, the subroutine must ensure that p4-p15 are preserved across the call.
In other cases it need not preserve any scalable predicate register contents.
*/
// x86 Register mapping
#define xRAX 10
#define xRCX 11
#define xRDX 12
#define xRBX 13
#define xRSP 14
#define xRBP 15
#define xRSI 16
#define xRDI 17
#define xR8 18
#define xR9 19
#define xR10 20
#define xR11 21
#define xR12 22
#define xR13 23
#define xR14 24
#define xR15 25
#define xFlags 26
#define xRIP 27
#define xSavedSP 28
// convert a x86 register to native according to the register mapping
#define TO_NAT(A) (xRAX + (A))
#define IS_GPR(A) ((A)>=xRAX && (A)<=xRIP)
// 32bits version
#define wEAX xRAX
#define wECX xRCX
#define wEDX xRDX
#define wEBX xRBX
#define wESP xRSP
#define wEBP xRBP
#define wESI xRSI
#define wEDI xRDI
#define wR8 xR8
#define wR9 xR9
#define wR10 xR10
#define wR11 xR11
#define wR12 xR12
#define wR13 xR13
#define wR14 xR14
#define wR15 xR15
#define wFlags xFlags
// scratch registers
#define x1 1
#define x2 2
#define x3 3
#define x4 4
#define x5 5
#define x6 6
#define x87pc 7
// x87 can be a scratch, but check if it's used as x87 PC and restore if needed in that case
// 32bits version of scratch
#define w1 x1
#define w2 x2
#define w3 x3
#define w4 x4
#define w5 x5
#define w6 x6
#define w87pc x87pc
// emu is r0
#define xEmu 0
// ARM64 LR
#define xLR 30
// ARM64 SP is r31 but is a special register
#define xSP 31
// xZR regs is 31
#define xZR 31
#define wZR xZR
// conditions
// Z == 1
#define cEQ 0b0000
// Z != 1
#define cNE 0b0001
// C == 1
#define cCS 0b0010
// C == 1
#define cHS cCS
// C != 1
#define cCC 0b0011
// C != 1
#define cLO cCC
// N == 1
#define cMI 0b0100
// N != 1
#define cPL 0b0101
// V == 1
#define cVS 0b0110
// V != 1
#define cVC 0b0111
// C == 1 && Z == 0
#define cHI 0b1000
// C !=1 || Z == 1
#define cLS 0b1001
// N == V
#define cGE 0b1010
// N != V
#define cLT 0b1011
// N == V && Z == 0
#define cGT 0b1100
// N != V || Z == 1
#define cLE 0b1101
// always
#define c__ 0b1110
//FCMP type of opcode produce:
// if any NAN: CV / v1 == v2: ZC / v1 < v2: N / v1 > v2: C
#endif //__ARM64_MAPPING_H__
+4 -2
View File
@@ -1,7 +1,5 @@
//arm update linker table for dynarec
//called with pointer to emu as 1st parameter
//and address of table to as 2nd parameter
//ip is at r12
.text
.align 4
@@ -22,6 +20,10 @@ arm64_next:
stp x16, x17, [sp, (8 * 8)]
stp x18, x27, [sp, (8 * 10)] // also save x27(rip) to allow change in LinkNext
#ifdef _WIN32
ldr x18, [x0, 3104]
#endif
mov x1, x27 // xRIP, should not be needed most of the time
mov x2, x30 // "from" is in lr, so put in x2
add x3, sp, 8*11 // x3 is address to change rip
// call the function
+155 -40
View File
@@ -2,6 +2,7 @@
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>
#include "arm64_printer.h"
#include "debug.h"
@@ -407,9 +408,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
if(sf) {
uint64_t noti=~(((uint64_t)imm)<<(hw*16));
if(!hw)
snprintf(buff, sizeof(buff), "MOVN %s, 0x%x\t; 0x%lx", Xt[Rd], imm, noti);
snprintf(buff, sizeof(buff), "MOVN %s, 0x%x\t; 0x%"PRIx64, Xt[Rd], imm, noti);
else
snprintf(buff, sizeof(buff), "MOVN %s, 0x%x LSL %d\t; 0x%lx", Xt[Rd], imm, 16*hw, noti);
snprintf(buff, sizeof(buff), "MOVN %s, 0x%x LSL %d\t; 0x%"PRIx64, Xt[Rd], imm, 16*hw, noti);
} else {
uint32_t noti=~(((uint32_t)imm)<<(hw*16));
if(!hw)
@@ -554,16 +555,36 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "SUBS %s, %s, %s %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm);
return buff;
}
if(isMask(opcode, "f1001011001mmmmmoooiiinnnnnddddd", &a)) {
const char* shifts[2][8] = {{ "UXTB", "UXTH", "LSL", "UXTX", "SXTB", "SXTH", "SXTW", "SXTX"}, {"UXTB", "UXTH", "UXTW", "LSL", "SXTB", "SXTH", "SXTW", "SXTX" }};
if(((sf==0 && shift==2) || (sf==1 && shift==3)) && imm==0)
snprintf(buff, sizeof(buff), "SUB %s, %s, %s", sf?XtSp[Rd]:WtSp[Rd], sf?XtSp[Rn]:WtSp[Rn], sf?XtSp[Rm]:WtSp[Rm]);
else if(shift==0)
snprintf(buff, sizeof(buff), "SUB %s, %s, %s %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[sf][shift]);
else
snprintf(buff, sizeof(buff), "SUB %s, %s, %s %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[sf][shift], imm);
return buff;
}
if(isMask(opcode, "f0001011001mmmmmoooiiinnnnnddddd", &a)) {
const char* shifts[2][8] = {{ "UXTB", "UXTH", "LSL", "UXTX", "SXTB", "SXTH", "SXTW", "SXTX"}, {"UXTB", "UXTH", "UXTW", "LSL", "SXTB", "SXTH", "SXTW", "SXTX" }};
if(((sf==0 && shift==2) || (sf==1 && shift==3)) && imm==0)
snprintf(buff, sizeof(buff), "ADD %s, %s, %s", sf?XtSp[Rd]:WtSp[Rd], sf?XtSp[Rn]:WtSp[Rn], sf?XtSp[Rm]:WtSp[Rm]);
else if(shift==0)
snprintf(buff, sizeof(buff), "ADD %s, %s, %s %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[sf][shift]);
else
snprintf(buff, sizeof(buff), "ADD %s, %s, %s %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[sf][shift], imm);
return buff;
}
// ---- LOGIC
if(isMask(opcode, "f11100100Nrrrrrrssssssnnnnnddddd", &a)) {
uint64_t i = DecodeBitMasks(a.N, imms, immr);
if(!sf) i&=0xffffffff;
if(sf==0 && a.N==1)
snprintf(buff, sizeof(buff), "invalid ANDS %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);
snprintf(buff, sizeof(buff), "invalid ANDS %s, %s, 0x%"PRIx64, Wt[Rd], Wt[Rn], i);
else if(Rd==31)
snprintf(buff, sizeof(buff), "TST %s, 0x%lx", sf?Xt[Rn]:Wt[Rn], i);
snprintf(buff, sizeof(buff), "TST %s, 0x%"PRIx64, sf?Xt[Rn]:Wt[Rn], i);
else
snprintf(buff, sizeof(buff), "ANDS %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
snprintf(buff, sizeof(buff), "ANDS %s, %s, 0x%"PRIx64, sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
return buff;
}
if(isMask(opcode, "f1101010hh0mmmmmiiiiiinnnnnddddd", &a)) {
@@ -601,9 +622,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
uint64_t i = DecodeBitMasks(a.N, imms, immr);
if(!sf) i&=0xffffffff;
if(sf==0 && a.N==1)
snprintf(buff, sizeof(buff), "invalid ORR %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);
snprintf(buff, sizeof(buff), "invalid ORR %s, %s, 0x%"PRIx64, Wt[Rd], Wt[Rn], i);
else
snprintf(buff, sizeof(buff), "ORR %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
snprintf(buff, sizeof(buff), "ORR %s, %s, 0x%"PRIx64, sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
return buff;
}
if(isMask(opcode, "f0101010hh1mmmmmiiiiiinnnnnddddd", &a)) {
@@ -636,9 +657,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
uint64_t i = DecodeBitMasks(a.N, imms, immr);
if(!sf) i&=0xffffffff;
if(sf==0 && a.N==1)
snprintf(buff, sizeof(buff), "invalid EOR %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);
snprintf(buff, sizeof(buff), "invalid EOR %s, %s, 0x%"PRIx64, Wt[Rd], Wt[Rn], i);
else
snprintf(buff, sizeof(buff), "EOR %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
snprintf(buff, sizeof(buff), "EOR %s, %s, 0x%"PRIx64, sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
return buff;
}
if(isMask(opcode, "f1001010hh0mmmmmiiiiiinnnnnddddd", &a)) {
@@ -653,9 +674,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
uint64_t i = DecodeBitMasks(a.N, imms, immr);
if(!sf) i&=0xffffffff;
if(sf==0 && a.N==1)
snprintf(buff, sizeof(buff), "invalid AND %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);
snprintf(buff, sizeof(buff), "invalid AND %s, %s, 0x%"PRIx64, Wt[Rd], Wt[Rn], i);
else
snprintf(buff, sizeof(buff), "AND %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
snprintf(buff, sizeof(buff), "AND %s, %s, 0x%"PRIx64, sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);
return buff;
}
if(isMask(opcode, "f0001010hh0mmmmmiiiiiinnnnnddddd", &a)) {
@@ -743,8 +764,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "BFC %s, %d, %d", sf?Xt[Rd]:Wt[Rd], lsb, width);
else
snprintf(buff, sizeof(buff), "BFI %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], lsb, width);
} else
snprintf(buff, sizeof(buff), "BFXIL %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], immr, imms-immr+1);
} else {
if(Rn==31 && immr==0)
snprintf(buff, sizeof(buff), "BFC %s, %d, %d", sf?Xt[Rd]:Wt[Rd], immr, imms-immr+1);
else
snprintf(buff, sizeof(buff), "BFXIL %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], immr, imms-immr+1);
}
return buff;
}
// ---- BRANCH / TEST
@@ -756,6 +781,13 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "BLR %s", Xt[Rn]);
return buff;
}
if(isMask(opcode, "1101011001011111000000nnnnn00000", &a)) {
if(Rn==30)
snprintf(buff, sizeof(buff), "RET");
else
snprintf(buff, sizeof(buff), "RET %s", Xt[Rn]);
return buff;
}
if(isMask(opcode, "01010100iiiiiiiiiiiiiiiiiii0cccc", &a)) {
int offset = signExtend(imm, 19)<<2;
snprintf(buff, sizeof(buff), "B.%s #+%di\t; %p", conds[cond], offset>>2, (void*)(addr + offset));
@@ -768,27 +800,22 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
}
if(isMask(opcode, "f0110100iiiiiiiiiiiiiiiiiiittttt", &a)) {
int offset = signExtend(imm, 19)<<2;
snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset));
snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", sf?Xt[Rt]:Wt[Rt], offset>>2, (void*)(addr + offset));
return buff;
}
if(isMask(opcode, "f0110101iiiiiiiiiiiiiiiiiiittttt", &a)) {
int offset = signExtend(imm, 19)<<2;
snprintf(buff, sizeof(buff), "CBNZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset));
return buff;
}
if(isMask(opcode, "f0110100iiiiiiiiiiiiiiiiiiittttt", &a)) {
int offset = signExtend(imm, 19)<<2;
snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset));
snprintf(buff, sizeof(buff), "CBNZ %s, #%+di\t; %p", sf?Xt[Rt]:Wt[Rt], offset>>2, (void*)(addr + offset));
return buff;
}
if(isMask(opcode, "s0110110sssssiiiiiiiiiiiiiittttt", &a)) {
int offset = signExtend(imm, 14)<<2;
snprintf(buff, sizeof(buff), "TBZ %s, 0x%x, #%+di\t; %p", (imms<31)?Xt[Rt]:Wt[Rt], imms, offset>>2, (void*)(addr + offset));
snprintf(buff, sizeof(buff), "TBZ %s, %d, #%+di\t; %p", (imms<31)?Xt[Rt]:Wt[Rt], imms, offset>>2, (void*)(addr + offset));
return buff;
}
if(isMask(opcode, "s0110111sssssiiiiiiiiiiiiiittttt", &a)) {
int offset = signExtend(imm, 14)<<2;
snprintf(buff, sizeof(buff), "TBNZ %s, 0x%x, #%+di\t; %p", (imms<31)?Xt[Rt]:Wt[Rt], imms, offset>>2, (void*)(addr + offset));
snprintf(buff, sizeof(buff), "TBNZ %s, %d, #%+di\t; %p", (imms<31)?Xt[Rt]:Wt[Rt], imms, offset>>2, (void*)(addr + offset));
return buff;
}
@@ -1059,9 +1086,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
tmp64u |= 0xffLL<<(i*8);
if(a.Q)
snprintf(buff, sizeof(buff), "MOVI V%d.2D, #0x%016lx", Rd, tmp64u);
snprintf(buff, sizeof(buff), "MOVI V%d.2D, #0x%016"PRIx64, Rd, tmp64u);
else
snprintf(buff, sizeof(buff), "MOVI D%d, #0x%016lx", Rd, tmp64u);
snprintf(buff, sizeof(buff), "MOVI D%d, #0x%016"PRIx64, Rd, tmp64u);
return buff;
}
@@ -1102,7 +1129,7 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
// ADR
if(isMask(opcode, "0ss10000iiiiiiiiiiiiiiiiiiiddddd", &a)) {
snprintf(buff, sizeof(buff), "ADR, %s, %ld", Xt[Rd], signExtend((imm)<<2|(imms), 20));
snprintf(buff, sizeof(buff), "ADR, %s, %"PRId64, Xt[Rd], signExtend((imm)<<2|(imms), 20));
return buff;
}
@@ -1324,6 +1351,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "FCMP %c%d, %c%d", s, Rn, s, Rm);
return buff;
}
//FCMEQ
if(isMask(opcode, "010111100f1mmmmm111001nnnnnddddd", &a)) {
char s = (sf==0)?'S':'D';
snprintf(buff, sizeof(buff), "FCMEQ %c%d, %c%d, %c%d", s, Rd, s, Rn, s, Rm);
return buff;
}
//FCMP vector
if(isMask(opcode, "0QU01110cf1mmmmm111001nnnnnddddd", &a)) {
char s = (sf==0)?'S':((sf==1)?'D':'?');
@@ -1340,18 +1373,18 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "F%s %c%d, %c%d, %c%d", (option==3)?"MINNM":((option==2)?"MAXNM":((!option)?"MAX":"MIN")), s, Rd, s, Rn, s, Rm);
return buff;
}
if(isMask(opcode, "0Q001110of1mmmmm110001nnnnnddddd", &a)) {
if(isMask(opcode, "0QU01110of1mmmmm110001nnnnnddddd", &a)) {
char s = (sf==0)?'S':((sf==1)?'D':'?');
int n = (sf==0)?2:1;
n *= a.Q?2:1;
snprintf(buff, sizeof(buff), "F%sNM%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"MIN":"MAX", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);
snprintf(buff, sizeof(buff), "F%sNM%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"MIN":"MAX", a.U?"P":"", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);
return buff;
}
if(isMask(opcode, "0Q001110of1mmmmm111101nnnnnddddd", &a)) {
if(isMask(opcode, "0QU01110of1mmmmm111101nnnnnddddd", &a)) {
char s = (sf==0)?'S':((sf==1)?'D':'?');
int n = (sf==0)?2:1;
n *= a.Q?2:1;
snprintf(buff, sizeof(buff), "F%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"MIN":"MAX", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);
snprintf(buff, sizeof(buff), "F%s%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"MIN":"MAX", a.U?"P":"", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);
return buff;
}
// FMADD
@@ -1565,6 +1598,28 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "%cRHADD V%d.%s, V%d.%s, V%d.%s", a.U?'U':'S', Rd, Vd, Rn, Vd, Rm, Vd);
return buff;
}
//S/URSHR
if(isMask(opcode, "0QU011110iiiiiii001001nnnnnddddd", &a)) {
int shft = 0;
int sz = 0;
const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "2D"};
if(imm&0b1000000) {
sz = 3;
shft = imm&0b111111;
} else if(imm&0b100000) {
sz = 2;
shft = imm&0b1111;
} else if(imm&0b10000) {
sz = 1;
shft = imm&0b111;
} else if(imm&0b1000) {
sz = 0;
shft = imm&0b111;
}
const char* Vd = Y[(sz<<1) | a.Q];
snprintf(buff, sizeof(buff), "%cRSHR V%d.%s, V%d.%s, #%d", a.U?'U':'S', Rd, Vd, Rn, Vd, shft);
return buff;
}
//SQ(R)DMULH
if(isMask(opcode, "0QU01110ff1mmmmm101101nnnnnddddd", &a)) {
const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "???"};
@@ -1574,12 +1629,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
}
// LD1/ST1 single structure
if(isMask(opcode, "0Q0011010L000000cc0Sffnnnnnttttt", &a)) {
if(isMask(opcode, "0Q0011010Lo00000cc0Sffnnnnnttttt", &a)) {
int scale = a.c;
int idx = 0;
const char* Y[] = {"B", "H", "S", "D"};
switch(scale) {
case 3: scale = sf; /* rep = 1; */ break;
case 3: scale = sf; /* rep = 1; */ idx=(8*(a.Q+1))>>scale; break;
case 0: idx = (a.Q<<3) | (a.S<<2) | sf; break;
case 1: idx = (a.Q<<2) | (a.S<<1) | (sf>>1); break;
case 2: if(!(sf&1))
@@ -1590,7 +1645,10 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
}
break;
}
snprintf(buff, sizeof(buff), "%s1 {V%d.%s}[%d], [%s]", a.L?"LD":"ST", Rt, Y[scale], idx, XtSp[Rn]);
if(!option && a.L && scale==3)
snprintf(buff, sizeof(buff), "LD1R {V%d.%d%s}, [%s]", Rt, idx, Y[scale], XtSp[Rn]);
else
snprintf(buff, sizeof(buff), "%s1 {V%d.%s}[%d], [%s]", a.L?"LD":"ST", Rt, Y[scale], idx, XtSp[Rn]);
return buff;
}
// LDUR/STUR
@@ -1619,6 +1677,17 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "%sR %s%d, [%s, %+d]", a.L?"LD":"ST", Y[sz], Rt, XtSp[Rn], imm);
return buff;
}
// LDP/STP vector
if(isMask(opcode, "ff1011010Liiiiiii22222nnnnnttttt", &a)) {
const char* Y[] = {"S", "D", "Q", "?"};
int sz = sf;
int offset = signExtend(imm, 7)<<(2+sz);
if(!offset)
snprintf(buff, sizeof(buff), "%sP %s%d, %s%d, [%s]", a.L?"LD":"ST", Y[sz], Rt, Y[sz], Rt2, XtSp[Rn]);
else
snprintf(buff, sizeof(buff), "%sP %s%d, %s%d, [%s, %s0x%x]", a.L?"LD":"ST", Y[sz], Rt, Y[sz], Rt2, XtSp[Rn], (offset<0)?"-":"", abs(offset));
return buff;
}
// (S/U)QXT(U)N
if(isMask(opcode, "0Q101110ff100001001010nnnnnddddd", &a)) {
@@ -1637,6 +1706,11 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "%cQXTN%s V%d.%s, V%d.%s", a.U?'U':'S', a.Q?"2":"", Rd, Vd, Rn, Va);
return buff;
}
if(isMask(opcode, "01U11110ff100001010010nnnnnddddd", &a)) {
const char Z[] = {'B', 'H', 'S', 'D', '?'};
snprintf(buff, sizeof(buff), "SQXT%sN %c%d, %c%d", a.U?"U":"", Z[sf], Rd, Z[sf+1], Rn);
return buff;
}
// (S/U)SSHL(2) / (U/S)XTL(2)
if(isMask(opcode, "0QU011110hhhhiii101001nnnnnddddd", &a)) {
@@ -1667,6 +1741,15 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
return buff;
}
// CNT
if(isMask(opcode, "0Q00111000100000010110nnnnnddddd", &a)) {
const char* Y[] = {"8B", "16B"};
const char* Vd = Y[a.Q];
const char* Va = Y[a.Q];
snprintf(buff, sizeof(buff), "CNT V%d.%s, V%d.%s", Rd, Vd, Rn, Va);
return buff;
}
// DUP
if(isMask(opcode, "0Q001110000iiiii000001nnnnnddddd", &a)) {
const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "2D"};
@@ -1712,15 +1795,47 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "PMULL%s V%d.%s, V%d.%s, V%d.%s", a.Q?"2":"", Rd, Vd, Rn, Vn, Rm, Vn);
return buff;
}
// DMB ISH
if(isMask(opcode, "11010101000000110011nnnn10111111", &a)) {
snprintf(buff, sizeof(buff), "DMB %s", (Rn==0b1011)?"ISH":"???");
// [S/U]MULL
if(isMask(opcode, "0QU01110ff1mmmmm110000nnnnnddddd", &a)) {
const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "??"};
const char* Z[] = {"8H", "4S", "2D", "??"};
int sz = sf;
const char* Vn = Y[(sz<<1)|a.Q];
const char* Vd = Z[sz];
snprintf(buff, sizeof(buff), "%cMULL%s V%d.%s, V%d.%s, V%d.%s", a.U?'U':'S', a.Q?"2":"", Rd, Vd, Rn, Vn, Rm, Vn);
return buff;
}
// DSB ISH/ISHST
//XTN(2)
if(isMask(opcode, "0Q001110ff100001001010nnnnnddddd", &a)) {
const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "??"};
const char* Z[] = {"8H", "4S", "2D", "??"};
int sz = sf;
const char* Vd = Y[(sz<<1)|a.Q];
const char* Vn = Z[sz];
snprintf(buff, sizeof(buff), "XTN%s V%d.%s, V%d.%s", a.Q?"2":"", Rd, Vd, Rn, Vn);
return buff;
}
// DMB
if(isMask(opcode, "11010101000000110011nnnn10111111", &a)) {
const char* barrier[] = {
"???", "???", "???", "???", // 0-3
"???", "???", "???", "???", // 4-7
"???", "ISHLD", "ISHST", "ISH", // 8-11
"???", "LD", "ST", "SY" // 12-15
};
snprintf(buff, sizeof(buff), "DMB %s", barrier[Rn]);
return buff;
}
// DSB
if(isMask(opcode, "11010101000000110011nnnn10011111", &a)) {
snprintf(buff, sizeof(buff), "DSB %s", (Rn==0b1011)?"ISH":((Rn==0b1010)?"ISHST":"???"));
const char* barrier[] = {
"???", "???", "???", "???", // 0-3
"???", "???", "???", "???", // 4-7
"???", "ISHLD", "ISHST", "ISH", // 8-11
"???", "LD", "ST", "SY" // 12-15
};
snprintf(buff, sizeof(buff), "DSB %s", barrier[Rn]);
return buff;
}
@@ -1744,9 +1859,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
snprintf(buff, sizeof(buff), "SWP%s%s %s, %s, [%s]", a.A?"A":"", a.R?"L":"", sf?Xt[Rs]:Wt[Rs], sf?Xt[Rt]:Wt[Rt], XtSp[Rn]);
return buff;
}
// SWPxw
// SWP B/H
if(isMask(opcode, "0f111000AR1sssss100000nnnnnttttt", &a)) {
snprintf(buff, sizeof(buff), "CAS%s%s%s %s, %s, [%s]", a.A?"A":"", a.R?"L":"", sf?"H":"B", Xt[Rs], Xt[Rt], XtSp[Rn]);
snprintf(buff, sizeof(buff), "SWP%s%s%s %s, %s, [%s]", a.A?"A":"", a.R?"L":"", sf?"H":"B", Xt[Rs], Xt[Rt], XtSp[Rn]);
return buff;
}
// LDXXXxw
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-284
View File
@@ -1,284 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "../dynarec_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed, wb1, wback;
int64_t j64;
int16_t i16;
int v0, v1;
int64_t fixedaddress;
int unscaled;
MAYUSE(j64);
GETREX();
/*if(rex.w && opcode!=0x0f) { // rex.w cancels "66", but not for 66 0f type of prefix
MESSAGE(LOG_DUMP, "Here!\n");
return dynarec64_64(dyn, addr-2, ip, ninst, rex, rep, ok, need_epilog);
}*/
switch(opcode) {
case 0x0F:
opcode = F8;
switch(opcode) {
case 0x2E:
// no special check...
case 0x2F:
if(opcode==0x2F) {INST_NAME("COMISD Gx, Ex");} else {INST_NAME("UCOMISD Gx, Ex");}
SETFLAGS(X_ALL, SF_SET);
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
v1 = fpu_get_scratch(dyn, ninst);
if(rex.is32bits)
VLDR64_REG_SXTW(v1, x4, ed);
else
VLDR64_REG(v1, ed, x4);
}
FCMPD(v0, v1);
FCOMI(x1, x2, 0, v0, v1, 0); //disable precise cmp
break;
case 0x6F:
INST_NAME("MOVDQA Gx,Ex");
nextop = F8;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
GETGX_empty(v0);
VMOVQ(v0, v1);
} else {
GETGX_empty(v0);
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
SMREAD();
if(rex.is32bits)
VLDR128_REG_SXTW(v0, x4, ed);
else
VLDR128_REG(v0, ed, x4);
}
break;
case 0x7F:
INST_NAME("MOVDQA Ex,Gx");
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1);
VMOVQ(v1, v0);
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(rex.is32bits)
VSTR128_REG_SXTW(v0, x4, ed);
else
VSTR128_REG(v0, ed, x4);
SMWRITE2();
}
break;
case 0xD6:
INST_NAME("MOVQ Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3));
FMOVD(v1, v0);
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(rex.is32bits)
VSTR64_REG_SXTW(v0, x4, ed);
else
VSTR64_REG(v0, ed, x4);
SMWRITE();
}
break;
default:
DEFAULT;
}
break;
case 0x83:
nextop = F8;
switch((nextop>>3)&7) {
case 0: //ADD
if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_add16(dyn, ninst, ed, x5, x2, x4);
EWBACK;
break;
case 1: //OR
if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
emit_or16c(dyn, ninst, x1, i16, x2, x4);
EWBACK;
break;
case 2: //ADC
if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_adc16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 3: //SBB
if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_sbb16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 4: //AND
if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
emit_and16c(dyn, ninst, x1, i16, x2, x4);
EWBACK;
break;
case 5: //SUB
if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_sub16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 6: //XOR
if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
emit_xor16c(dyn, ninst, x1, i16, x2, x4);
EWBACK;
break;
case 7: //CMP
if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
grab_segdata(dyn, addr, ninst, x1, seg);
GETEWO(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
if(i16) {
MOVZw(x2, i16);
emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);
} else
emit_cmp16_0(dyn, ninst, x1, x3, x4);
break;
}
break;
case 0x89:
INST_NAME("MOV FS:Ew, Gw");
nextop = F8;
GETGD; // don't need GETGW here
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
if(rex.w) {
MOVx_REG(ed, gd);
} else {
if(ed!=gd) {
BFIx(ed, gd, 0, 16);
}
}
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(rex.w) {
STRx_REG(gd, ed, x4);
} else {
if(rex.is32bits)
STRH_REG_SXTW(gd, x4, ed);
else
STRH_REG(gd, ed, x4);
}
SMWRITE();
}
break;
case 0x8B:
INST_NAME("MOV Gw, FS:Ew");
nextop=F8;
GETGD;
if(MODREG) { // reg <= reg
ed = TO_NAT((nextop & 7) + (rex.b << 3));
if(rex.w) {
MOVx_REG(gd, ed);
} else {
if(ed!=gd) {
BFIx(gd, ed, 0, 16);
}
}
} else { // mem <= reg
grab_segdata(dyn, addr, ninst, x4, seg);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(rex.w) {
LDRx_REG(gd, ed, x4);
} else {
if(rex.is32bits)
LDRH_REG_SXTW(x1, x4, ed);
else
LDRH_REG(x1, ed, x4);
BFIx(gd, x1, 0, 16);
}
}
break;
default:
DEFAULT;
}
return addr;
}
+159 -193
View File
@@ -5,10 +5,9 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -22,9 +21,9 @@
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
@@ -40,28 +39,21 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
MAYUSE(wb2);
MAYUSE(j64);
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
GETREX();
switch(opcode) {
case 0x01:
INST_NAME("LOCK ADD Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x5);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_add16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK ADD Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETGW(x5);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
UFLAG_IF {
LDADDALH(x5, x1, wback);
emit_add16(dyn, ninst, x1, x5, x3, x4);
@@ -75,23 +67,22 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
case 0x09:
INST_NAME("LOCK OR Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x5);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_or16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK OR Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETGW(x5);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
UFLAG_IF {
LDSETALH(x5, x1, wback);
emit_or16(dyn, ninst, x1, x5, x3, x4);
@@ -105,7 +96,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
@@ -114,22 +104,20 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
switch(opcode) {
case 0xB1:
INST_NAME("LOCK CMPXCHG Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
UXTHw(x6, xRAX);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
wback = 0;
UXTHw(x1, ed);
CMPSxw_REG(x6, x1);
B_MARK(cNE);
BFIx(ed, gd, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK CMPXCHG Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETGD;
UXTHw(x6, xRAX);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(!ALIGNED_ATOMICH) {
if(arm64_uscat) {
if(cpuext.uscat) {
ANDx_mask(x1, wback, 1, 0, 3); // mask = F
CMPSw_U12(x1, 0xF);
B_MARK3(cGE);
@@ -139,7 +127,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
}
}
// Aligned version
if(arm64_atomics) {
if(cpuext.atomics) {
MOVw_REG(x1, x6);
CASALH(x1, gd, wback);
} else {
@@ -158,6 +146,8 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
MARK3;
LDRH_U12(x1, wback, 0);
LDAXRB(x3, wback); // dummy read, to arm the write...
SUBw_UXTB(x3, x3, x1);
CBNZw_MARK3(x3);
CMPSw_REG(x6, x1);
B_MARK(cNE);
// EAX == Ed
@@ -165,28 +155,27 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
CBNZx_MARK3(x4);
STRH_U12(gd, wback, 0);
}
MARK;
// Common part (and fallback for EAX != Ed)
UFLAG_IF {emit_cmp16(dyn, ninst, x6, x1, x3, x4, x5);}
BFIx(xRAX, x1, 0, 16);
}
SMDMB();
MARK;
// Common part (and fallback for EAX != Ed)
UFLAG_IF {emit_cmp16(dyn, ninst, x6, x1, x3, x4, x5);}
BFIx(xRAX, x1, 0, 16);
break;
case 0xC1:
INST_NAME("LOCK XADD Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
gd = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
UXTHx(x5, gd);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
BFIx(gd, ed, 0, 16);
emit_add16(dyn, ninst, x5, gd, x3, x4);
BFIx(ed, x5, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK XADD Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
gd = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
UXTHx(x5, gd);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
LDADDALH(x5, x1, wback);
} else {
MARKLOCK;
@@ -195,7 +184,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x4, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
IFX(X_ALL|X_PEND) {
MOVxw_REG(x2, x1);
emit_add16(dyn, ninst, x2, x5, x3, x4);
@@ -210,40 +198,39 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
break;
case 0x11:
INST_NAME("LOCK ADC Ew, Gw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x5);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_adc16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK ADC Ew, Gw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
GETGW(x5);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
MARKLOCK;
LDAXRH(x1, wback);
emit_adc16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
SMDMB();
}
break;
case 0x21:
INST_NAME("LOCK AND Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x5);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_and16(dyn, ninst, x6, gd, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK AND Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETGW(x5);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
MVNw_REG(x3, gd);
UFLAG_IF {
LDCLRALH(x3, x1, wback);
@@ -258,7 +245,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
@@ -267,25 +253,23 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
nextop = F8;
switch((nextop>>3)&7) {
case 0: //ADD
if(opcode==0x81) {
INST_NAME("LOCK ADD Ew, Iw");
} else {
INST_NAME("LOCK ADD Ew, Ib");
}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
MOV32w(x5, i16);
UXTHw(x6, ed);
emit_add16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {
INST_NAME("LOCK ADD Ew, Iw");
} else {
INST_NAME("LOCK ADD Ew, Ib");
}
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOV32w(x5, i16);
if(!ALIGNED_ATOMICH) {
if(arm64_uscat) {
if(cpuext.uscat) {
ANDx_mask(x1, wback, 1, 0, 3); // mask = F
CMPSw_U12(x1, 0xF);
B_MARK(cGE);
@@ -294,47 +278,50 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
B_MARK(cNE);
}
}
if(arm64_atomics) {
LDADDALH(x5, x1, wback);
if(cpuext.atomics) {
UFLAG_IF {
emit_add16(dyn, ninst, x1, x5, x3, x4);
LDADDALH(x5, x1, wback);
} else {
STADDLH(x5, wback);
}
} else {
MARKLOCK;
LDAXRH(x1, wback);
emit_add16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
ADDw_REG(x4, x1, x5);
STLXRH(x3, x4, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
if(!ALIGNED_ATOMICH) {
B_NEXT_nocond;
B_MARK2_nocond;
MARK; // unaligned! also, not enough
LDRH_U12(x1, wback, 0);
LDAXRB(x4, wback);
BFIw(x1, x4, 0, 8); // re-inject
emit_add16(dyn, ninst, x1, x5, x3, x4);
STLXRB(x3, x1, wback);
SUBw_UXTB(x4, x4, x1);
CBNZw_MARK(x4);
ADDw_REG(x4, x1, x5);
STLXRB(x3, x4, wback);
CBNZx_MARK(x3);
STRH_U12(x1, wback, 0); // put the whole value
SMDMB();
STRH_U12(x4, wback, 0); // put the whole value
}
MARK2;
UFLAG_IF {
emit_add16(dyn, ninst, x1, x5, x3, x4);
}
}
break;
case 1: //OR
if(opcode==0x81) {INST_NAME("LOCK OR Ew, Iw");} else {INST_NAME("LOCK OR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_or16c(dyn, ninst, x6, i16, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK OR Ew, Iw");} else {INST_NAME("LOCK OR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
if(!i64) {MOV32w(x5, i16);}
if(arm64_atomics) {
if(cpuext.atomics) {
UFLAG_IF {
LDSETALH(x5, x1, wback);
emit_or16c(dyn, ninst, x1, i16, x3, x4);
@@ -354,21 +341,18 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
case 2: //ADC
if(opcode==0x81) {INST_NAME("LOCK ADC Ew, Iw");} else {INST_NAME("LOCK ADC Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
MOV32w(x5, i16);
UXTHw(x6, ed);
emit_adc16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK ADC Ew, Iw");} else {INST_NAME("LOCK ADC Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOV32w(x5, i16);
@@ -377,21 +361,18 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
emit_adc16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
SMDMB();
}
break;
case 3: //SBB
if(opcode==0x81) {INST_NAME("LOCK SBB Ew, Iw");} else {INST_NAME("LOCK SBB Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
MOV32w(x5, i16);
UXTHw(x6, ed);
emit_sbb16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK SBB Ew, Iw");} else {INST_NAME("LOCK SBB Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOV32w(x5, i16);
@@ -400,23 +381,21 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
emit_sbb16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
SMDMB();
}
break;
case 4: //AND
if(opcode==0x81) {INST_NAME("LOCK AND Ew, Iw");} else {INST_NAME("LOCK AND Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_and16c(dyn, ninst, x6, i16, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK AND Ew, Iw");} else {INST_NAME("LOCK AND Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
i64 = convert_bitmask_w(i16);
if(arm64_atomics) {
if(cpuext.atomics) {
MOV32w(x5, ~i16);
UFLAG_IF {
LDCLRALH(x5, x1, wback);
@@ -440,26 +419,23 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
}
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
SMDMB();
}
}
break;
case 5: //SUB
if(opcode==0x81) {INST_NAME("LOCK SUB Ew, Iw");} else {INST_NAME("LOCK SUB Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
MOV32w(x5, i16);
UXTHw(x6, ed);
emit_sub16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK SUB Ew, Iw");} else {INST_NAME("LOCK SUB Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOV32w(x5, i16);
if(!ALIGNED_ATOMICH) {
if(arm64_uscat) {
if(cpuext.uscat) {
ANDx_mask(x1, wback, 1, 0, 3); // mask = F
CMPSw_U12(x1, 0xF);
B_MARK(cGE);
@@ -468,50 +444,51 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
B_MARK(cNE);
}
}
if(arm64_atomics) {
if(cpuext.atomics) {
NEGw_REG(x4, x5);
UFLAG_IF {
LDADDALH(x4, x1, wback);
emit_sub16(dyn, ninst, x1, x5, x3, x4);
} else {
STADDLH(x4, wback);
}
} else {
MARKLOCK;
LDAXRH(x1, wback);
emit_sub16(dyn, ninst, x1, x5, x3, x4);
SUBw_REG(x4, x1, x5);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
if(!ALIGNED_ATOMICH) {
B_NEXT_nocond;
B_MARK2_nocond;
MARK; // unaligned! also, not enough
LDRH_U12(x1, wback, 0);
LDAXRB(x4, wback);
BFIw(x1, x4, 0, 8); // re-inject
emit_sub16(dyn, ninst, x1, x5, x3, x4);
STLXRB(x3, x1, wback);
SUBw_UXTB(x4, x4, x1);
CBNZw_MARK(x4);
SUBw_REG(x4, x1, x5);
STLXRB(x3, x4, wback);
CBNZx_MARK(x3);
STRH_U12(x1, wback, 0); // put the whole value
SMDMB();
STRH_U12(x4, wback, 0); // put the whole value
}
MARK2;
UFLAG_IF {
emit_sub16(dyn, ninst, x1, x5, x3, x4);
}
}
break;
case 6: //XOR
if(opcode==0x81) {INST_NAME("LOCK XOR Ew, Iw");} else {INST_NAME("LOCK XOR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i16 = F16S; else i16 = F8S;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_xor16c(dyn, ninst, x6, i16, x3, x4);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
if(opcode==0x81) {INST_NAME("LOCK XOR Ew, Iw");} else {INST_NAME("LOCK XOR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
i64 = convert_bitmask_w(i16);
if(arm64_atomics) {
if(cpuext.atomics) {
UFLAG_IF {
LDEORALH(x5, x1, wback);
emit_xor16c(dyn, ninst, x1, i16, x3, x4);
@@ -528,23 +505,14 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
emit_xor16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
SMDMB();
}
}
break;
case 7: //CMP
if(opcode==0x81) {INST_NAME("(LOCK) CMP Ew, Iw");} else {INST_NAME("(LOCK) CMP Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x6, (opcode==0x81)?2:1);
(void)wb1;
// No need to LOCK, this is readonly
if(opcode==0x81) i16 = F16S; else i16 = F8S;
if(i16) {
MOV32w(x5, i16);
emit_cmp16(dyn, ninst, x6, x5, x3, x4, x6);
} else {
emit_cmp16_0(dyn, ninst, ed, x3, x4);
}
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
break;
}
break;
@@ -554,16 +522,16 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
switch((nextop>>3)&7)
{
case 0: // INC Ew
INST_NAME("LOCK INC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_inc16(dyn, ninst, x6, x5, x3);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK INC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
MOV32w(x3, 1);
UFLAG_IF {
LDADDALH(x3, x1, wback);
@@ -578,20 +546,19 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
case 1: //DEC Ew
INST_NAME("LOCK DEC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET);
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
UXTHw(x6, ed);
emit_dec16(dyn, ninst, x6, x5, x3);
BFIx(ed, x6, 0, 16);
INST_NAME("Invalid LOCK");
UDF(0);
*need_epilog = 1;
*ok = 0;
} else {
INST_NAME("LOCK DEC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
if(arm64_atomics) {
if(cpuext.atomics) {
MOV32w(x3, -1);
UFLAG_IF {
LDADDALH(x3, x1, wback);
@@ -606,7 +573,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
}
break;
default:
+3 -10
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -47,12 +45,6 @@ uintptr_t dynarec64_66F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
MAYUSE(eb1);
MAYUSE(eb2);
MAYUSE(j64);
#if STEP > 1
static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };
static const int8_t mask_string8[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
static const int8_t mask_string16[] = { 15, 14, 13, 12, 11, 10, 9, 8 };
static const int8_t round_round[] = { 0, 2, 1, 3};
#endif
switch(opcode) {
@@ -61,11 +53,12 @@ uintptr_t dynarec64_66F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
switch(opcode) {
case 0xF1:
if (rex.w) return dynarec64_F20F(dyn, addr - 2, ip, ninst, rex, ok, need_epilog);
INST_NAME("CRC32 Gd, Ew");
nextop = F8;
GETEW(x1, 0);
GETGD;
if(arm64_crc32) {
if(cpuext.crc32) {
CRC32CH(gd, gd, ed);
} else {
MOV32w(x2, 0x82f63b78);
+86 -13
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -47,19 +45,88 @@ uintptr_t dynarec64_66F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
MAYUSE(eb1);
MAYUSE(eb2);
MAYUSE(j64);
#if STEP > 1
static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };
static const int8_t mask_string8[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
static const int8_t mask_string16[] = { 15, 14, 13, 12, 11, 10, 9, 8 };
static const int8_t round_round[] = { 0, 2, 1, 3};
#endif
switch(opcode) {
case 0xB8:
INST_NAME("POPCNT Gw, Ew");
SETFLAGS(X_ALL, SF_SET);
SET_DFNONE();
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
v1 = fpu_get_scratch(dyn, ninst);
VEORQ(v1, v1, v1);
VMOVQDfrom(v1, 0, ed);
CNT_8(v1, v1);
UADDLV_8(v1, v1);
VMOVHto(gd, v1, 0);
IFX(X_ALL) {
IFX(X_AF|X_PF|X_SF|X_OF|X_CF) {
MOV32w(x1, (1<<F_OF) | (1<<F_SF) | (1<<F_ZF) | (1<<F_AF) | (1<<F_CF) | (1<<F_PF));
BICw(xFlags, xFlags, x1);
}
IFX(X_ZF) {
CMPSw_U12(gd, 0);
IFNATIVE(NF_EQ) {}
else {
CSETw(x1, cEQ);
BFIw(xFlags, x1, F_ZF, 1);
}
}
}
GWBACK;
break;
case 0xBC:
INST_NAME("TZCNT Gw, Ew");
if (!BOX64DRENV(dynarec_safeflags)) {
SETFLAGS(X_CF|X_ZF, SF_SUBSET);
} else {
if(BOX64ENV(cputype)) {
SETFLAGS(X_ALL&~X_OF, SF_SUBSET);
} else {
SETFLAGS(X_ALL, SF_SET);
}
}
SET_DFNONE();
nextop = F8;
GETEW(x1, 0);
GETGW(x2);
TSTxw_REG(ed, ed);
IFX(X_CF) {
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_CF, 1); // CF = is source 0?
}
RBITw(x3, ed); // reverse
CLZw(gd, x3); // x2 gets leading 0 == TZCNT
MOV32w(x3, 16);
CSELw(gd, x3, gd, cEQ); // if src is zero, use bit width as res
IFX(X_ZF) {
TSTxw_REG(gd, gd);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1); // ZF = is dest 0?
}
if (BOX64DRENV(dynarec_safeflags)) {
IFX(X_AF) BFCw(xFlags, F_AF, 1);
IFX(X_PF) BFCw(xFlags, F_PF, 1);
IFX(X_SF) BFCw(xFlags, F_SF, 1);
IFX2(X_OF, && !BOX64ENV(cputype)) BFCw(xFlags, F_OF, 1);
}
GWBACK;
break;
case 0xBD:
INST_NAME("LZCNT Gw, Ew");
SETFLAGS(X_CF|X_ZF, SF_SUBSET);
SET_DFNONE(x1);
if (!BOX64DRENV(dynarec_safeflags)) {
SETFLAGS(X_CF|X_ZF, SF_SUBSET);
} else {
if(BOX64ENV(cputype)) {
SETFLAGS(X_ALL&~X_OF, SF_SUBSET);
} else {
SETFLAGS(X_ALL, SF_SET);
}
}
SET_DFNONE();
nextop = F8;
GETEW(x1, 0);
GETGW(x2);
@@ -68,14 +135,20 @@ uintptr_t dynarec64_66F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_CF, 1); // CF = is source 0?
}
LSLw_IMM(ed, ed, 16);
CLZw(gd, ed);
SUBw_U12(gd, gd, 16); // sub zero cnt of high word
IFX(X_ZF) {
TSTxw_REG(gd, gd);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1); // ZF = is dest 0?
}
EWBACK;
if (BOX64DRENV(dynarec_safeflags)) {
IFX(X_AF) BFCw(xFlags, F_AF, 1);
IFX(X_PF) BFCw(xFlags, F_PF, 1);
IFX(X_SF) BFCw(xFlags, F_SF, 1);
IFX2(X_OF, && !BOX64ENV(cputype)) BFCw(xFlags, F_OF, 1);
}
GWBACK;
break;
default:
File diff suppressed because it is too large. Load diff
-157
View File
@@ -1,157 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "../dynarec_helper.h"
#include "dynarec_arm64_functions.h"
#define GETGm gd = ((nextop&0x38)>>3)
uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int seg, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2;
int64_t fixedaddress;
int unscaled;
int8_t i8;
uint8_t u8;
int32_t i32;
int64_t j64, i64;
int cacheupd = 0;
int lock;
int v0, v1, s0;
MAYUSE(i32);
MAYUSE(j64);
MAYUSE(v0);
MAYUSE(v1);
MAYUSE(s0);
MAYUSE(lock);
MAYUSE(cacheupd);
if(!rex.is32bits) {
// should do a different file
DEFAULT;
return addr;
}
rep = 0;
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
switch(opcode) {
case 0x89:
INST_NAME("MOV Seg:Ed, Gd");
nextop=F8;
GETGD;
if(MODREG) { // reg <= reg
MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd);
} else { // mem <= reg
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, 0);
STRw_REG(gd, ed, x4);
}
break;
case 0x8B:
INST_NAME("MOV Gd, Seg:Ed");
nextop=F8;
GETGD;
if(MODREG) { // reg => reg
MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
} else { // mem => reg
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, 0);
LDRw_REG(gd, ed, x4);
}
break;
case 0x8F:
INST_NAME("POP Seg:Ed");
nextop=F8;
if(MODREG) { // reg <= reg
POP1_32(x1);
MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), x1);
} else { // mem <= reg
grab_segdata(dyn, addr, ninst, x4, seg);
POP1_32(x1);
addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, 0);
STRw_REG(x1, ed, x4);
}
break;
case 0xA1:
INST_NAME("MOV EAX, Seg:[Od]");
i32 = F16;
grab_segdata(dyn, addr, ninst, x4, seg);
if(i32<4096 && !(i32&3)) {
LDRw_U12(xRAX, x4, i32);
} else if(i32<256) {
LDURw_I9(xRAX, x4, i32);
} else {
MOV32w(x1, i32);
LDRw_REG(xRAX, x4, x1);
}
break;
case 0xA3:
INST_NAME("MOV Seg:[Od], EAX");
i32 = F16;
grab_segdata(dyn, addr, ninst, x4, seg);
if(i32<4096 && !(i32&3)) {
STRw_U12(xRAX, x4, i32);
} else if(i32<256) {
STURw_I9(xRAX, x4, i32);
} else {
MOV32w(x1, i32);
STRw_REG(xRAX, x4, x1);
}
break;
case 0xFF:
nextop = F8;
grab_segdata(dyn, addr, ninst, x4, seg);
switch((nextop>>3)&7) {
case 6: // Push Ed
INST_NAME("PUSH FS:Ew");
if((nextop&0xC0)==0xC0) { // reg
DEFAULT;
} else { // mem <= i32
SMREAD();
addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0, 0, 0);
LDRw_REG(x3, ed, x4);
PUSH1_32(x3);
}
break;
default:
DEFAULT;
}
break;
default:
DEFAULT;
}
return addr;
}
-134
View File
@@ -1,134 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "../dynarec_helper.h"
#include "dynarec_arm64_functions.h"
#define GETGm gd = ((nextop&0x38)>>3)
uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2;
int64_t fixedaddress;
int unscaled;
int8_t i8;
uint8_t u8;
int32_t i32;
int64_t j64, i64;
int cacheupd = 0;
int lock;
int v0, v1, s0;
MAYUSE(i32);
MAYUSE(j64);
MAYUSE(v0);
MAYUSE(v1);
MAYUSE(s0);
MAYUSE(lock);
MAYUSE(cacheupd);
if(!rex.is32bits) {
// should do a different file
DEFAULT;
return addr;
}
rep = 0;
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
switch(opcode) {
case 64:
addr = dynarec64_6764_32(dyn, addr, ip, ninst, rex, rep, _FS, ok, need_epilog);
break;
#define GO(NO, YES) \
BARRIER(BARRIER_MAYBE); \
JUMP(addr+i8, 1); \
if(dyn->insts[ninst].x64.jmp_insts==-1 || \
CHECK_CACHE()) { \
/* out of the block */ \
i32 = dyn->insts[ninst].epilog-(dyn->native_size); \
Bcond(NO, i32); \
if(dyn->insts[ninst].x64.jmp_insts==-1) { \
if(!(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT)) \
fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \
jump_to_next(dyn, addr+i8, 0, ninst, rex.is32bits); \
} else { \
CacheTransform(dyn, ninst, cacheupd, x1, x2, x3); \
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);\
SKIP_SEVL(i32); \
B(i32); \
} \
} else { \
/* inside the block */ \
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \
SKIP_SEVL(i32); \
Bcond(YES, i32); \
}
case 0xE0:
INST_NAME("LOOPNZ (16bits)");
READFLAGS(X_ZF);
i8 = F8S;
UXTHw(x1, xRCX);
SUBw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 16);
CBZw_NEXT(x1); // ECX is 0, no LOOP
TSTw_mask(xFlags, 0b011010, 0); //mask=0x40
GO(cNE, cEQ);
break;
case 0xE1:
INST_NAME("LOOPZ (16bits)");
READFLAGS(X_ZF);
i8 = F8S;
UXTHw(x1, xRCX);
SUBw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 16);
CBZw_NEXT(x1); // ECX is 0, no LOOP
TSTw_mask(xFlags, 0b011010, 0); //mask=0x40
GO(cEQ, cNE);
break;
case 0xE2:
INST_NAME("LOOP (16bits)");
i8 = F8S;
UXTHw(x1, xRCX);
SUBSw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 16);
GO(cEQ, cNE);
break;
case 0xE3:
INST_NAME("JCXZ");
i8 = F8S;
TSTw_mask(xRCX, 0, 15); //mask=0xffff
GO(cNE, cEQ);
break;
#undef GO
default:
DEFAULT;
}
return addr;
}
-133
View File
@@ -1,133 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "../dynarec_helper.h"
static const char* avx_prefix_string(uint16_t p)
{
switch(p) {
case VEX_P_NONE: return "0";
case VEX_P_66: return "66";
case VEX_P_F2: return "F2";
case VEX_P_F3: return "F3";
default: return "??";
}
}
static const char* avx_map_string(uint16_t m)
{
switch(m) {
case VEX_M_NONE: return "0";
case VEX_M_0F: return "0F";
case VEX_M_0F38: return "0F38";
case VEX_M_0F3A: return "0F3A";
default: return "??";
}
}
uintptr_t dynarec64_67_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop, u8;
uint8_t gd, ed, vd;
uint8_t wback, wb1, wb2;
uint8_t eb1, eb2, gb1, gb2;
int32_t i32, i32_;
int cacheupd = 0;
int v0, v1, v2;
int q0, q1, q2;
int d0, d1, d2;
int s0;
uint64_t tmp64u;
int64_t j64;
int64_t fixedaddress;
int unscaled;
MAYUSE(wb1);
MAYUSE(wb2);
MAYUSE(eb1);
MAYUSE(eb2);
MAYUSE(gb1);
MAYUSE(gb2);
MAYUSE(q0);
MAYUSE(q1);
MAYUSE(d0);
MAYUSE(d1);
MAYUSE(s0);
MAYUSE(j64);
MAYUSE(cacheupd);
rex_t rex = vex.rex;
if( (vex.m==VEX_M_0F38) && (vex.p==VEX_P_F2)) {
switch(opcode) {
case 0xF6:
INST_NAME("MULX Gd, Vd, Ed (,RDX)");
nextop = F8;
GETGD;
GETED32(0);
GETVD;
if(rex.w) {
// 64bits mul
UMULH(x3, xRDX, ed);
MULx(vd, xRDX, ed);
MOVx_REG(gd, x3);
} else {
// 32bits mul
UMULL(x3, xRDX, ed);
MOVw_REG(vd, x3);
LSRx(gd, x3, 32);
}
break;
default:
DEFAULT;
}
}
else if((vex.m==VEX_M_0F) && (vex.p==VEX_P_66)) {
switch(opcode) {
case 0xD6:
INST_NAME("VMOVQ Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7)+(rex.b<<3));
VMOV(v1, v0);
YMM0((nextop&7)+(rex.b<<3));
} else {
addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v0, ed, fixedaddress);
}
break;
default:
DEFAULT;
}
}
else {DEFAULT;}
if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1)) {
dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
}
return addr;
}
+419
View File
@@ -0,0 +1,419 @@
#include <stddef.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include "debug.h"
#include "dynablock.h"
#include "x64emu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "dynarec/dynablock_private.h"
#include "dynarec_arm64_arch.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_native.h"
//order might be important, so define SUPER for the right one
#define SUPER() \
GO(flags) \
GO(x87) \
GO(mmx) \
GO(sse) \
GO(ymm) \
typedef struct arch_flags_s
{
uint8_t defered:1;
uint8_t nf:1;
uint8_t eq:1;
uint8_t vf:1;
uint8_t cf:1;
uint8_t inv_cf:1;
} arch_flags_t;
#define X87_ST_D 0
#define X87_ST_F 1
#define X87_ST_I64 2
typedef struct arch_x87_s
{
int8_t delta; //up to +/-7
uint8_t x87; // 1bit is STx present
uint16_t x87_type; // 2bits per STx type
uint32_t x87_pos; //4bits per STx position (well, 3 would be enough)
} arch_x87_t;
typedef struct arch_mmx_s
{
uint8_t mmx; //1bit for each mmx reg present
} arch_mmx_t;
typedef struct arch_sse_s
{
uint16_t sse; //1bit for each sse reg present
} arch_sse_t;
typedef struct arch_ymm_s
{
uint16_t ymm0; // 1bit for ymm0
uint16_t ymm; // 1bit for each ymm present
uint64_t ymm_pos; // 4bits for position of each ymm present
} arch_ymm_t;
typedef struct arch_arch_s
{
#define GO(A) uint16_t A:1;
SUPER()
#undef GO
uint16_t unaligned:1;
uint16_t seq:10; // how many instruction on the same values
} arch_arch_t;
typedef struct arch_build_s
{
#define GO(A) uint8_t A:1;
SUPER()
#undef GO
uint8_t unaligned;
#define GO(A) arch_##A##_t A##_;
SUPER()
#undef GO
} arch_build_t;
static arch_build_t static_build[MAX_INSTS+2] = {0};
static int arch_build(dynarec_arm_t* dyn, int ninst, arch_build_t* arch, int noarch)
{
memset(arch, 0, sizeof(arch_build_t));
// flags
if(((dyn->insts[ninst].f_entry!=status_none && dyn->insts[ninst].f_entry!=status_none_pending)) || dyn->insts[ninst].need_nat_flags || dyn->insts[ninst].before_nat_flags) {
arch->flags = 1;
arch->flags_.defered = (dyn->insts[ninst].f_entry!=status_none && dyn->insts[ninst].f_entry!=status_none_pending);
uint8_t flags = dyn->insts[ninst].need_nat_flags | dyn->insts[ninst].before_nat_flags;
arch->flags_.vf = flags&NF_VF;
arch->flags_.nf = flags&NF_SF;
arch->flags_.eq = flags&NF_EQ;
arch->flags_.cf = flags&NF_CF;
if(arch->flags_.cf)
arch->flags_.inv_cf = !dyn->insts[ninst].normal_carry;
}
// opcode can handle unaligned
arch->unaligned = dyn->insts[ninst].unaligned;
if(!noarch) {
// got through all naoncache to gather regs assignments
int idx;
for(int i=0; i<32; ++i)
if(dyn->insts[ninst].n.neoncache[i].v)
switch(dyn->insts[ninst].n.neoncache[i].t) {
case NEON_CACHE_XMMW:
arch->sse = 1;
arch->sse_.sse |= 1<<dyn->insts[ninst].n.neoncache[i].n;
break;
case NEON_CACHE_MM:
arch->mmx = 1;
arch->mmx_.mmx |= 1<<dyn->insts[ninst].n.neoncache[i].n;
break;
case NEON_CACHE_YMMW:
arch->ymm = 1;
arch->ymm_.ymm |= 1<<dyn->insts[ninst].n.neoncache[i].n;
idx = i;
if(idx>=EMM0 && idx<=EMM0+8)
idx-=EMM0;
else
idx-=SCRATCH0-8;
arch->ymm_.ymm_pos |= idx<<(dyn->insts[ninst].n.neoncache[i].n*4);
break;
case NEON_CACHE_ST_D:
arch->x87 = 1;
arch->x87_.x87 |= 1<<dyn->insts[ninst].n.neoncache[i].n;
arch->x87_.x87_pos = (i-EMM0)<<(dyn->insts[ninst].n.neoncache[i].n*4);
arch->x87_.x87_type = (X87_ST_D)<<(dyn->insts[ninst].n.neoncache[i].n*2);
break;
case NEON_CACHE_ST_F:
arch->x87 = 1;
arch->x87_.x87 |= 1<<dyn->insts[ninst].n.neoncache[i].n;
arch->x87_.x87_pos = (i-EMM0)<<(dyn->insts[ninst].n.neoncache[i].n*4);
arch->x87_.x87_type = (X87_ST_F)<<(dyn->insts[ninst].n.neoncache[i].n*2);
break;
case NEON_CACHE_ST_I64:
arch->x87 = 1;
arch->x87_.x87 |= 1<<dyn->insts[ninst].n.neoncache[i].n;
arch->x87_.x87_pos = (i-EMM0)<<(dyn->insts[ninst].n.neoncache[i].n*4);
arch->x87_.x87_type = (X87_ST_I64)<<(dyn->insts[ninst].n.neoncache[i].n*2);
break;
case NEON_CACHE_XMMR:
case NEON_CACHE_YMMR:
default:
// doing nothing, it's just a value read in memory
break;
}
// ymm0
if(dyn->insts[ninst].ymm0_out) {
arch->ymm = 1;
arch->ymm_.ymm0 = dyn->insts[ninst].ymm0_out;
}
// x87 top
if(dyn->insts[ninst].n.x87stack) {
arch->x87 = 1;
arch->x87_.delta = dyn->insts[ninst].n.x87stack;
}
}
return arch->flags + arch->x87 + arch->mmx + arch->sse + arch->ymm + arch->unaligned;
}
static int sizeof_arch(arch_arch_t* arch)
{
int sz = sizeof(arch_arch_t);
#define GO(A) if(arch->A) sz+=sizeof(arch_##A##_t);
SUPER()
#undef GO
return sz;
}
static int sizeof_arch_build(arch_build_t* build)
{
int sz = sizeof(arch_arch_t);
#define GO(A) if(build->A) sz+=sizeof(arch_##A##_t);
SUPER()
#undef GO
return sz;
}
size_t get_size_arch(dynarec_arm_t* dyn)
{
int noarch = BOX64ENV(dynarec_noarch);
if(noarch>1) return 0;
arch_build_t* previous = NULL;
size_t sz = 0;
int seq = 0;
int nseq = 0;
int last = 0;
if(!dyn->size) return 0;
for(int i=0; i<dyn->size; ++i) {
arch_build_t* build = static_build+i;
last = arch_build(dyn, i, build, noarch);
if(i && (!memcmp(build, previous, sizeof(arch_build_t))) && (seq<((1<<10)-1))) {
// same sequence, increment
++seq;
} else {
seq = 0;
++nseq;
previous = build;
sz += sizeof_arch_build(build);
}
}
if(nseq==1 && !last)
return 0; //empty, no flags, no nothing
return sz;
}
static void build_next(arch_arch_t* arch, arch_build_t* build)
{
#define GO(A) arch->A = build->A;
SUPER()
#undef GO
arch->unaligned = build->unaligned;
arch->seq = 0;
void* p = ((void*)arch)+sizeof(arch_arch_t);
#define GO(A) \
if(build->A) { \
memcpy(p, &(build->A##_), sizeof(arch_ ##A##_t)); \
p+=sizeof(arch_##A##_t); \
}
SUPER()
#undef GO
}
void* populate_arch(dynarec_arm_t* dyn, void* p, size_t tot_sz)
{
arch_build_t* previous = NULL;
arch_arch_t* arch = p;
arch_arch_t* next = p;
int seq = 0;
size_t total = 0;
if(!tot_sz) return NULL;
for(int i=0; i<dyn->size; ++i) {
arch_build_t* build = static_build+i;
if(i && (!memcmp(build, previous, sizeof(arch_build_t))) && (seq<((1<<10)-1))) {
// same sequence, increment
arch->seq = ++seq;
} else {
int sz = sizeof_arch_build(build);
if(total+sz>tot_sz) {
printf_log(LOG_INFO, "Warning: populate_arch on undersized buffer (%d+%d/%d, inst %d/%d)\n", total, sz, tot_sz, i, dyn->size);
return NULL;
}
arch = next;
build_next(arch, build);
seq = 0;
previous = build;
total += sz;
next = (arch_arch_t*)((uintptr_t)arch+sz);
}
}
return p;
}
// NZCV N
#define NZCV_N 31
// NZCV Z
#define NZCV_Z 30
// NZCV C
#define NZCV_C 29
// NZCV V
#define NZCV_V 28
#ifndef _WIN32 // TODO: Implemented this for Win32
void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc)
{
if(!db->arch_size || !db->arch)
return;
int ninst = getX64AddressInst(db, x64pc);
dynarec_log(LOG_INFO, "adjust_arch(...), db=%p, x64pc=%p, nints=%d", db, (void*)x64pc, ninst);
if(ninst<0) {
dynarec_log_prefix(0, LOG_INFO, "\n");
return;
}
if(ninst==0) {
dynarec_log_prefix(0, LOG_INFO, "\n");
CHECK_FLAGS(emu);
return;
}
// look for state at ninst-1
arch_arch_t* arch = db->arch;
arch_arch_t* next = arch;
#define GO(A) arch_##A##_t* A = NULL;
SUPER()
#undef GO
int i = 0;
while(i<(ninst)) { // this will look for ninst-1 state
arch = next;
dynarec_log_prefix(0, (i<(ninst-1))?LOG_DEBUG:LOG_INFO, "[ seq=%d%s%s%s%s%s ] ", arch->seq, arch->flags?" Flags":"", arch->x87?" x87":"", arch->mmx?" MMX":"", arch->sse?" SSE":"", arch->ymm?" YMM":"");
i += 1+arch->seq;
next = (arch_arch_t*)((uintptr_t)next + sizeof_arch(arch));
}
int sz = sizeof(arch_arch_t);
#define GO(A) \
if(arch->A) { \
A = (arch_##A##_t*)((uintptr_t)arch + sz); \
sz+=sizeof(arch_##A##_t); \
}
SUPER()
#undef GO
if(flags) {
dynarec_log_prefix(0, LOG_INFO, " flags[%s-%s%s%s%s] ", flags->defered?"defered":"", flags->nf?"S":"", flags->vf?"O":"", flags->eq?"Z":"", flags->cf?(flags->inv_cf?"C(inv)":"C"):"");
if(flags->defered) {
CHECK_FLAGS(emu);
//return;
}
if(flags->nf) {
CONDITIONAL_SET_FLAG(p->uc_mcontext.pstate&(1<<NZCV_N), F_SF);
}
if(flags->vf) {
CONDITIONAL_SET_FLAG(p->uc_mcontext.pstate&(1<<NZCV_V), F_OF);
}
if(flags->eq) {
CONDITIONAL_SET_FLAG(p->uc_mcontext.pstate&(1<<NZCV_Z), F_ZF);
}
if(flags->cf) {
if(flags->inv_cf) {
CONDITIONAL_SET_FLAG((p->uc_mcontext.pstate&(1<<NZCV_C))==0, F_CF);
} else {
CONDITIONAL_SET_FLAG(p->uc_mcontext.pstate&(1<<NZCV_C), F_CF);
}
}
}
struct fpsimd_context *fpsimd = NULL;
// find fpsimd struct
{
struct _aarch64_ctx * ff = (struct _aarch64_ctx*)p->uc_mcontext.__reserved;
while (ff->magic && !fpsimd) {
if(ff->magic==FPSIMD_MAGIC)
fpsimd = (struct fpsimd_context*)ff;
else
ff = (struct _aarch64_ctx*)((uintptr_t)ff + ff->size);
}
}
if(sse) {
dynarec_log_prefix(0, LOG_INFO, " sse[%x (fpsimd=%p)] ", sse->sse, fpsimd);
for(int i=0; i<16; ++i)
if(fpsimd && (sse->sse>>i)&1) {
int idx = 0;
if(i>7) {
idx = XMM8 + i - 8;
} else {
idx = XMM0 + i;
}
emu->xmm[i].u128 = fpsimd->vregs[idx];
}
}
if(ymm) {
dynarec_log_prefix(0, LOG_INFO, " ymm[%x, pos=%x, 0=%x (fpsimd=%p)] ", ymm->ymm, ymm->ymm_pos, ymm->ymm0, fpsimd);
for(int i=0; i<16; ++i) {
if(fpsimd && (ymm->ymm>>i)&1) {
int idx = (ymm->ymm_pos>>(i*4))&0xf;
if(i>7) {
idx = SCRATCH0 + i - 8;
} else {
idx = EMM0 + i;
}
emu->ymm[i].u128 = fpsimd->vregs[idx];
}
if(ymm->ymm0&(1<<i))
emu->ymm[i].u128 = 0;
}
}
if(mmx) {
dynarec_log_prefix(0, LOG_INFO, " mmx[%x (fpsimd=%p)] ", mmx->mmx, fpsimd);
for(int i=0; i<8; ++i)
if(fpsimd && (mmx->mmx>>i)&1) {
int idx = EMM0 + i;
emu->mmx[i].q = fpsimd->vregs[idx]&0xffffffffffffffffLL;
}
}
if(x87) {
dynarec_log_prefix(0, LOG_INFO, " x87[%x, pos=%x, type=%x (fpsimd=%p)] ", x87->x87, x87->x87_pos, x87->x87_type, fpsimd);
emu->top -= x87->delta;
for(int i=0; i<8; ++i) {
if(x87->x87&(1<<i)) {
int idx = EMM0 + (x87->x87_pos>>(i*4))&0x0f;
int t = (x87->x87_type>>(i*2))&0x3;
switch (t) {
case X87_ST_F:
emu->x87[(emu->top+i)&7].d = *(float*)&fpsimd->vregs[idx];
break;
case X87_ST_I64:
emu->x87[(emu->top+i)&7].d = *(int64_t*)&fpsimd->vregs[idx];
break;
case X87_ST_D:
emu->x87[(emu->top+i)&7].d = *(double*)&fpsimd->vregs[idx];
break;
}
}
}
}
dynarec_log_prefix(0, LOG_INFO, "\n");
}
#endif
int arch_unaligned(dynablock_t* db, uintptr_t x64pc)
{
if(!db)
return 0;
if(!db->arch_size || !db->arch)
return 0;
int ninst = getX64AddressInst(db, x64pc);
if(ninst<0) {
return 0;
}
// look for state at ninst
arch_arch_t* arch = db->arch;
arch_arch_t* next = arch;
int i = -1;
while(i<ninst) {
arch = next;
i += 1+arch->seq;
next = (arch_arch_t*)((uintptr_t)next + sizeof_arch(arch));
}
return arch->unaligned;
}
+24
View File
@@ -0,0 +1,24 @@
#ifndef __DYNAREC_ARM_ARCH_H__
#define __DYNAREC_ARM_ARCH_H__
#include <stddef.h>
#include "x64emu.h"
#include "box64context.h"
#include "box64cpu.h"
#include "dynarec_arm64_private.h"
// get size of arch specific info (can be 0)
size_t get_size_arch(dynarec_arm_t* dyn);
//populate the array
void* populate_arch(dynarec_arm_t* dyn, void* p, size_t sz);
#ifndef _WIN32
#include <ucontext.h>
//adjust flags and more
void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc);
#else
#define adjust_arch(db, emu, p, x64pc)
#endif
// get if instruction can be regenerated for unaligned access
int arch_unaligned(dynablock_t* db, uintptr_t x64pc);
#endif // __DYNAREC_ARM_ARCH_H__
+4 -5
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -71,8 +69,9 @@ uintptr_t dynarec64_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ni
addr = dynarec64_AVX_F3_0F38(dyn, addr, ip, ninst, vex, ok, need_epilog);
else {DEFAULT;}
if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1)) {
dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
if((*ok==-1) && (BOX64ENV(dynarec_log)>=LOG_INFO || dyn->need_dump || BOX64ENV(dynarec_missing)))
if(!dyn->size || BOX64ENV(dynarec_log)>LOG_INFO || dyn->need_dump) {
dynarec_log(LOG_NONE, " Dynarec unimplemented VEX opcode size %d prefix %s map %s opcode %02X\n", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
}
return addr;
}
+223 -110
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -56,9 +54,6 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
MAYUSE(s0);
MAYUSE(j64);
MAYUSE(cacheupd);
#if STEP > 1
static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };
#endif
rex_t rex = vex.rex;
@@ -81,11 +76,13 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
} else {
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress); // no alignment issue with ARMv8 NEON :)
if(vex.l) {
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, -1, -1, -1);
VLDR128_U12(v0, ed, fixedaddress+16);
v1 = ymm_get_reg_empty(dyn, ninst, x1, gd, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VLDP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VLD128(v0, ed, fixedaddress); // no alignment issue with ARMv8 NEON :)
}
}
if(!vex.l) YMM0(gd);
@@ -103,13 +100,15 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
v0 = ymm_get_reg(dyn, ninst, x1, gd, 0, ed, -1, -1);
v1 = ymm_get_reg_empty(dyn, ninst, x1, ed, gd, -1, -1);
VMOVQ(v1, v0);
}
} else YMM0(ed);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VSTR128_U12(v0, ed, fixedaddress);
if(vex.l) {
v0 = ymm_get_reg(dyn, ninst, x1, gd, 0, ed, -1, -1);
VSTR128_U12(v0, ed, fixedaddress+16);
v1 = ymm_get_reg(dyn, ninst, x1, gd, 0, ed, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VSTP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VST128(v0, ed, fixedaddress);
}
SMWRITE2();
}
@@ -139,17 +138,14 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
break;
case 0x13:
nextop = F8;
INST_NAME("VMOVLPS Ex, Vx, Gx");
GETGX(v0, 0);
GETVX(v2, 0);
if(v1!=v2)
VMOVQ(v0, v2);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1);
if(v0!=v1) VMOVeD(v1, 0, v0, 0);
INST_NAME("Illegal AVX.0F 13");
UDF(0);
} else {
INST_NAME("VMOVLPS Ex, Gx");
GETGX(v0, 0);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
VST1_64(v0, 0, ed); // better to use VST1 than VSTR_64, to avoid NEON->VFPU transfert I assume
VST1_64(v0, 0, ed);
SMWRITE2();
}
break;
@@ -197,15 +193,18 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
YMM0(gd);
break;
case 0x17:
INST_NAME("VMOVHPS Ex,Gx");
INST_NAME("VMOVHPS Ex, Gx");
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1);
ed = (nextop&7)+(rex.b<<3);
v1 = sse_get_reg(dyn, ninst, x1, ed, 1);
VMOVeD(v1, 0, v0, 1);
YMM0(ed);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
VST1_64(v0, 1, ed);
SMWRITE2();
}
break;
@@ -225,11 +224,13 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
} else {
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress);
if(vex.l) {
GETGY_empty(v0, -1, -1, -1);
VLDR128_U12(v0, ed, fixedaddress+16);
GETGY_empty(v1, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VLDP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VLD128(v0, ed, fixedaddress);
}
}
if(!vex.l) YMM0(gd);
@@ -246,37 +247,36 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
if(vex.l) {
GETGYEY_empty(v0, v1);
VMOVQ(v1, v0);
}
} else YMM0(ed);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VSTR128_U12(v0, ed, fixedaddress);
if(vex.l) {
GETGY(v0, 0, -1, -1, -1);
VSTR128_U12(v0, ed, fixedaddress+16);
GETGY(v1, 0, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VSTP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VST128(v0, ed, fixedaddress);
}
SMWRITE2();
}
break;
case 0x2B:
INST_NAME("VMOVNTPS Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
ed = (nextop&7)+(rex.b<<3);
v1 = sse_get_reg_empty(dyn, ninst, x1, ed);
VMOVQ(v1, v0);
if(vex.l) {
GETGYEY_empty(v0, v1);
VMOVQ(v1, v0);
}
INST_NAME("Illegal AVX.0F 2B");
UDF(0);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VSTR128_U12(v0, ed, fixedaddress);
INST_NAME("VMOVNTPS Ex, Gx");
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(vex.l) {
GETGY(v0, 0, -1, -1, -1);
VSTR128_U12(v0, ed, fixedaddress+16);
GETGY(v1, 0, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VSTP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VST128(v0, ed, fixedaddress);
}
}
break;
@@ -285,16 +285,18 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
// no special check...
case 0x2F:
if(opcode==0x2F) {INST_NAME("VCOMISS Gx, Ex");} else {INST_NAME("VUCOMISS Gx, Ex");}
SETFLAGS(X_ALL, SF_SET_NODF);
SETFLAGS(X_ALL, SF_SET);
nextop = F8;
GETGX(v0, 0);
GETEXSS(s0, 0, 0);
FCMPS(v0, s0);
FCOMI(x1, x2, 0, v0, s0, 1); //disable precise cmp
IFX(X_CF|X_PF|X_ZF) {
FCMPS(v0, s0);
}
FCOMI(x1, x2);
break;
case 0x50:
INST_NAME("VMOVMSPKPS Gd, Ex");
INST_NAME("VMOVMSKPS Gd, Ex");
nextop = F8;
GETGD;
MOV32w(gd, 0);
@@ -302,7 +304,7 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
// EX is an xmm reg
q0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETEX(v0, 0, 0); } else { GETEY(v0); }
if(!l) { GETEX_Y(v0, 0, 0); } else { GETEY(v0); }
SQXTN_16(q0, v0); // reduces the 4 32bits to 4 16bits
VMOVQDto(x1, q0, 0);
LSRx(x1, x1, 15);
@@ -317,15 +319,14 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
} else {
// EX is memory
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, (0xfff<<3)-24, 7, rex, NULL, 0, 0);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, (0x3f<<3)-16, 7, rex, NULL, 1, 0);
for(int l=0; l<1+vex.l; ++l) {
LDRx_U12(x1, ed, fixedaddress+16*l);
LDPx_S7_offset(x1, x2, ed, fixedaddress+16*l);
LSRx(x1, x1, 31);
BFIx(gd, x1, 0+(l*4), 1);
LSRx(x1, x1, 32);
BFIx(gd, x1, 1+(l*4), 1);
LDRx_U12(x1, ed, fixedaddress+8+16*l);
LSRx(x1, x1, 31);
LSRx(x1, x2, 31);
BFIx(gd, x1, 2+(l*4), 1);
LSRx(x1, x1, 32);
BFIx(gd, x1, 3+(l*4), 1);
@@ -336,9 +337,23 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
INST_NAME("VSQRTPS Gx, Ex");
nextop = F8;
SKIPTEST(x1);
if(!BOX64ENV(dynarec_fastnan)) {
d0 = fpu_get_scratch(dyn, ninst);
d1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_EX(q0, q1, 0); } else { GETGY_empty_EY(q0, q1); }
VFSQRTQS(q0, q1);
if(!l) { GETGX_empty_EX(v0, v1, 0); } else { GETGY_empty_EY(v0, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFCMEQQS(d0, v1, v1); // 0 if NAN, 1 if not NAN
VFSQRTQS(v0, v1);
VFCMEQQS(d1, v0, v0); // 0 => out is NAN
VBICQ(d1, d0, d1); // forget it in any input was a NAN already
VSHLQ_32(d1, d1, 31); // only keep the sign bit
VORRQ(v0, v0, d1); // NAN -> -NAN
} else {
VFSQRTQS(v0, v1);
}
}
if(!vex.l) YMM0(gd);
break;
@@ -440,27 +455,60 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
case 0x58:
INST_NAME("VADDPS Gx, Vx, Ex");
nextop = F8;
GETGX_empty_VXEX(v0, v2, v1, 0);
VFADDQS(v0, v2, v1);
if(vex.l) {
GETGY_empty_VYEY(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFMAXQS(q0, v2, v1); // propagate NAN
VFCMEQQS(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
VFADDQS(v0, v2, v1);
} else YMM0(gd)
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q1, v0, v0); // 0 => out is NAN
VBICQ(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd)
break;
case 0x59:
INST_NAME("VMULPS Gx, Vx, Ex");
nextop = F8;
GETGX_empty_VXEX(v0, v2, v1, 0);
VFMULQS(v0, v2, v1);
if(vex.l) {
GETGY_empty_VYEY(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFMAXQS(q0, v2, v1); // propagate NAN
VFCMEQQS(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
VFMULQS(v0, v2, v1);
} else YMM0(gd)
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q1, v0, v0); // 0 => out is NAN
VBICQ(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd)
break;
case 0x5A:
INST_NAME("VCVTPS2PD Gx, Ex");
nextop = F8;
GETGX_empty_EX(v0, v1, 0);
if (vex.l) {
GETGX_empty_EX(v0, v1, 0);
} else {
GETEXSD(v1, 0, 0);
GETGX_empty(v0);
}
if(vex.l) {
GETGY_empty(q0, -1, -1, -1);
FCVTL2(q0, v1);
@@ -480,56 +528,76 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
case 0x5C:
INST_NAME("VSUBPS Gx, Vx, Ex");
nextop = F8;
GETGX_empty_VXEX(v0, v2, v1, 0);
VFSUBQS(v0, v2, v1);
if(vex.l) {
GETGY_empty_VYEY(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFMAXQS(q0, v2, v1); // propagate NAN
VFCMEQQS(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
VFSUBQS(v0, v2, v1);
} else YMM0(gd)
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q1, v0, v0); // 0 => out is NAN
VBICQ(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd)
break;
case 0x5D:
INST_NAME("VMINPS Gx, Vx, Ex");
nextop = F8;
if(!box64_dynarec_fastnan) {
q0 = fpu_get_scratch(dyn, ninst);
}
q0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
// FMIN/FMAX wll not copy a NaN if either is NaN
// but x86 will copy src2 if either value is NaN, so lets force a copy of Src2 (Ex) if result is NaN
VFMINQS(v0, v2, v1);
if(!box64_dynarec_fastnan && (v2!=v1)) {
VFCMEQQS(q0, v0, v0); // 0 is NaN, 1 is not NaN, so MASK for NaN
VBIFQ(v0, v1, q0); // copy dest where source is NaN
}
VFCMGTQS(q0, v1, v2); // 0 if NaN or v1 GT v2, so invert mask for copy
if(v0!=v1) VBIFQ(v0, v1, q0);
if(v0!=v2) VBITQ(v0, v2, q0);
}
if(!vex.l) YMM0(gd);
break;
case 0x5E:
INST_NAME("VDIVPS Gx, Vx, Ex");
nextop = F8;
GETGX_empty_VXEX(v0, v2, v1, 0);
VFDIVQS(v0, v2, v1);
if(vex.l) {
GETGY_empty_VYEY(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFMAXQS(q0, v2, v1); // propagate NAN
VFCMEQQS(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
VFDIVQS(v0, v2, v1);
} else YMM0(gd)
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q1, v0, v0); // 0 => out is NAN
VBICQ(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd)
break;
case 0x5F:
INST_NAME("VMAXPS Gx, Vx, Ex");
nextop = F8;
if(!box64_dynarec_fastnan) {
q0 = fpu_get_scratch(dyn, ninst);
}
q0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
// FMIN/FMAX wll not copy a NaN if either is NaN
// but x86 will copy src2 if either value is NaN, so lets force a copy of Src2 (Ex) if result is NaN
VFMAXQS(v0, v2, v1);
if(!box64_dynarec_fastnan && (v2!=v1)) {
VFCMEQQS(q0, v0, v0); // 0 is NaN, 1 is not NaN, so MASK for NaN
VBIFQ(v0, v1, q0); // copy dest where source is NaN
}
VFCMGTQS(q0, v2, v1); // 0 if NaN or v2 GT v1, so invert mask for copy
if(v0!=v1) VBIFQ(v0, v1, q0);
if(v0!=v2) VBITQ(v0, v2, q0);
}
if(!vex.l) YMM0(gd);
break;
@@ -568,19 +636,52 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
INST_NAME("VLDMXCSR Md");
GETED(0);
STRw_U12(ed, xEmu, offsetof(x64emu_t, mxcsr));
if(box64_sse_flushto0) {
MRS_fpcr(x1); // get fpscr
if(BOX64ENV(sse_flushto0)) {
MRS_fpcr(x2); // get fpscr
LSRw_IMM(x3, ed, 15); // get FZ bit
BFIw(x1, x3, 24, 1); // inject FZ bit
BFIw(x2, x3, 24, 1); // inject FZ bit
EORw_REG_LSR(x3, x3, ed, 1); // FZ xor DAZ
BFIw(x1, x3, 1, 1); // inject AH bit
MSR_fpcr(x1); // put new fpscr
BFIw(x2, x3, 1, 1); // inject AH bit
MSR_fpcr(x2); // put new fpscr
}
if(BOX64ENV(sse_flushto0)) {
// try to sync mxcsr with fpsr on the flag side
/* mapping is
ARM <-> X86
0 <-> 0 // Invalid operation
1 <-> 2 // Divide by 0
2 <-> 3 // Overflow
3 <-> 4 // underflow
4 <-> 5 // Inexact
5 <-> 1 // denormal
*/
// doing X86 -> ARM here, 543210 => 432150
if(ed!=x1)
MOVw_REG(x1, ed); // x1 = 543210
UBFXw(x2, x1, 1, 5); // x2 = 54321
BFIw(x1, x2, 2, 4); // x1 = 432110
LSRw(x2, x2, 4); // x2 = 5
BFIw(x1, x2, 1, 1); // x1 = 432150
MRS_fpsr(x2);
BFIx(x2, x1, 0, 6);
MSR_fpsr(x2);
}
break;
case 3:
INST_NAME("VSTMXCSR Md");
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
LDRw_U12(x4, xEmu, offsetof(x64emu_t, mxcsr));
if(BOX64ENV(sse_flushto0)) {
// sync with fpsr, with mask from mxcsr
MRS_fpsr(x1);
// doing ARM -> X86 here, 0 1 2 3 4 5 -> 0 2 3 4 5 1
RORw(x3, x1, 2); // x3 = 10.....5432
BFIw(x1, x3, 1, 4); // x1 = 54320
RORw(x3, x3, 32-1); // x3 = 0.....54321
BFIw(x1, x3, 5, 1); // x1 = 154320
//BFXILw(x3, x4, 7, 6); // this would the mask, but let's ignore that for now
BFIw(x4, x1, 0, 6); // inject back the flags
}
STW(x4, ed, fixedaddress);
break;
default:
@@ -594,7 +695,7 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
q0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 1); u8 = F8; } else { GETGY_empty_VYEY(v0, v2, v1); }
if(((u8&15)==3) || ((u8&15)==7) || ((u8&15)==8) || ((u8&15)==9) || ((u8&15)==10) || ((u8&15)==12) || ((u8&15)==13) || ((u8&15)==14)) {
if(((u8&15)==3) || ((u8&15)==7) || ((u8&15)==8) || ((u8&15)==9) || ((u8&15)==10) || ((u8&15)==12)) {
VFMAXQS(q0, v2, v1); // propagate NAN
VFCMEQQS(((u8&15)==7)?v0:q0, q0, q0); // 0 if NAN, 1 if not NAN
}
@@ -634,15 +735,21 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
u8 = F8;
if(v2==v1 && (u8&0x3)==((u8>>2)&3) && (u8&0xf)==((u8>>4)&0xf)) {
VDUPQ_32(v0, v2, u8&3);
} else if(v2==v1 && (u8==0xe0)) { // easy special case
} else if(v2==v1 && (u8==0xe0)) { // elements 3 2 0 0
VMOVQ(v0, v2);
VMOVeS(v0, 1, v0, 0);
} else if(v2==v1 && (u8==0xe5)) { // easy special case
} else if(v2==v1 && (u8==0xe5)) { // elements 3 2 1 1
VMOVQ(v0, v2);
VMOVeS(v0, 0, v0, 1);
} else if(MODREG && u8==0x88) {
} else if(v2==v1 && (u8==0xa0)) { // elements 2 2 0 0
VTRNQ1_32(v0, v1, v2);
} else if(v2==v1 && (u8==0xf5)) { // elements 3 3 1 1
VTRNQ2_32(v0, v1, v2);
} else if(v2==v1 && (u8==0xb1)) { // elements 2 3 0 1
VREV64Q_32(v0, v1);
} else if(MODREG && u8==0x88) { // elements 2 0 2 0
VUZP1Q_32(v0, v2, v1);
} else if(MODREG && u8==0xdd) {
} else if(MODREG && u8==0xdd) { // elements 3 1 3 1
VUZP2Q_32(v0, v2, v1);
} else {
if((v0==v1) || (v0==v2)) {
@@ -674,15 +781,21 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
GETGY_empty_VY(v0, v2, 0, (MODREG)?((nextop&7)+(rex.b<<3)):-1, -1);
if(v2==v1 && (u8&0x3)==((u8>>2)&3) && (u8&0xf)==((u8>>4)&0xf)) {
VDUPQ_32(v0, v2, u8&3);
} else if(v2==v1 && (u8==0xe0)) {
} else if(v2==v1 && (u8==0xe0)) { // elements 3 2 0 0
VMOVQ(v0, v2);
VMOVeS(v0, 1, v0, 0);
} else if(v2==v1 && (u8==0xe5)) {
} else if(v2==v1 && (u8==0xe5)) { // elements 3 2 1 1
VMOVQ(v0, v2);
VMOVeS(v0, 0, v0, 1);
} else if(MODREG && u8==0x88) {
} else if(v2==v1 && (u8==0xa0)) { // elements 2 2 0 0
VTRNQ1_32(v0, v1, v2);
} else if(v2==v1 && (u8==0xf5)) { // elements 3 3 1 1
VTRNQ2_32(v0, v1, v2);
} else if(v2==v1 && (u8==0xb1)) { // elements 2 3 0 1
VREV64Q_32(v0, v1);
} else if(MODREG && u8==0x88) { // elements 2 0 2 0
VUZP1Q_32(v0, v2, v1);
} else if(MODREG && u8==0xdd) {
} else if(MODREG && u8==0xdd) { // elements 3 1 3 1
VUZP2Q_32(v0, v2, v1);
} else {
if(s0) d0 = v0;
+203 -28
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -39,6 +37,7 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
int q0, q1, q2;
int d0, d1, d2;
int s0;
int need_tst;
uint64_t tmp64u;
int64_t j64;
int64_t fixedaddress;
@@ -68,21 +67,32 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
GETGD;
GETED(0);
GETVD;
IFX(X_ZF)
need_tst = 0;
IFX(X_ZF) need_tst = 1;
IFXNATIVE(X_SF, NF_SF) need_tst = 1;
IFXNATIVE(X_OF, NF_VF) need_tst = 1;
IFXNATIVE(X_CF, NF_CF) need_tst = 1;
if(need_tst)
BICSxw(gd, ed, vd);
else
BICxw(gd, ed, vd);
IFX(X_ZF) {
CSETw(x1, cEQ);
BFIw(xFlags, x1, F_ZF, 1);
IFNATIVE(NF_EQ) {} else {
CSETw(x1, cEQ);
BFIw(xFlags, x1, F_ZF, 1);
}
}
IFX(X_OF) {
IFNATIVE(NF_VF) {} else {BFCw(xFlags, F_OF, 1);}
}
IFX(X_CF) {
IFNATIVE(NF_CF) {} else {BFCw(xFlags, F_CF, 1);}
}
IFX(X_OF)
BFCw(xFlags, F_OF, 1);
IFX(X_CF)
BFCw(xFlags, F_CF, 1);
IFX(X_SF) {
LSRxw_IMM(x1, gd, rex.w?63:31);
BFIw(xFlags, x1, F_SF, 1);
IFNATIVE(NF_SF) {} else {
LSRxw_IMM(x1, gd, rex.w?63:31);
BFIw(xFlags, x1, F_SF, 1);
}
}
break;
case 0xF3:
@@ -99,24 +109,129 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
BFIw(xFlags, x3, F_CF, 1);
}
SUBxw_U12(x3, ed, 1);
IFX(X_ZF)
need_tst = 0;
IFX(X_ZF) need_tst = 1;
IFXNATIVE(X_SF, NF_SF) need_tst = 1;
IFXNATIVE(X_OF, NF_VF) need_tst = 1;
if(need_tst)
ANDSxw_REG(vd, ed, x3);
else
ANDxw_REG(vd, ed, x3);
IFX(X_ZF) {
CSETMw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
IFNATIVE(NF_EQ) {} else {
CSETMw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
}
}
IFX(X_SF) {
LSRxw(x3, vd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
IFNATIVE(NF_SF) {} else {
LSRxw(x3, vd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
}
}
IFX(X_OF) BFCw(xFlags, F_OF, 1);
if(box64_dynarec_test) {
IFX(X_OF) {
IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
}
if (BOX64DRENV(dynarec_safeflags)) {
// those are UD flags
IFX(X_AF) BFCw(xFlags, F_AF, 1);
IFX(X_PF) BFCw(xFlags, F_PF, 1);
if(BOX64ENV(cputype)) {
IFX(X_PF) BFCw(xFlags, F_PF, 1);
} else {
IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
}
}
break;
case 2:
INST_NAME("BLSMSK Vd, Ed");
SETFLAGS(X_ALL, SF_SET);
GETED(0);
GETVD;
IFX(X_CF) {
TSTxw_REG(ed, ed);
CSETMw(x3, cEQ);
BFIw(xFlags, x3, F_CF, 1);
}
SUBxw_U12(x3, ed, 1);
need_tst = 0;
IFX(X_ZF) need_tst = 1;
IFXNATIVE(X_SF, NF_SF) need_tst = 1;
IFXNATIVE(X_OF, NF_VF) need_tst = 1;
EORxw_REG(vd, ed, x3);
if(need_tst)
TSTxw_REG(vd, vd);
IFX(X_ZF) {
IFNATIVE(NF_EQ) {} else {
CSETMw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
}
}
IFX(X_SF) {
IFNATIVE(NF_SF) {} else {
LSRxw(x3, vd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
}
}
IFX(X_OF) {
IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
}
if (BOX64DRENV(dynarec_safeflags)) {
// those are UD flags
IFX(X_AF) BFCw(xFlags, F_AF, 1);
if(BOX64ENV(cputype)) {
IFX(X_PF) BFCw(xFlags, F_PF, 1);
} else {
IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
}
}
break;
case 3:
INST_NAME("BLSI Vd, Ed");
SETFLAGS(X_ALL, SF_SET);
GETED(0);
GETVD;
IFX(X_CF) {
TSTxw_REG(ed, ed);
CSETMw(x3, cNE);
BFIw(xFlags, x3, F_CF, 1);
}
NEGxw_REG(x3, ed);
need_tst = 0;
IFX(X_ZF) need_tst = 1;
IFXNATIVE(X_SF, NF_SF) need_tst = 1;
IFXNATIVE(X_OF, NF_VF) need_tst = 1;
if(need_tst)
ANDSxw_REG(vd, ed, x3);
else
ANDxw_REG(vd, ed, x3);
IFX(X_ZF) {
IFNATIVE(NF_EQ) {} else {
CSETMw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
}
}
IFX(X_SF) {
IFNATIVE(NF_SF) {} else {
LSRxw(x3, vd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
}
}
IFX(X_OF) {
IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
}
if (BOX64DRENV(dynarec_safeflags)) {
// those are UD flags
IFX(X_AF) BFCw(xFlags, F_AF, 1);
if(BOX64ENV(cputype)) {
IFX(X_PF) BFCw(xFlags, F_PF, 1);
} else {
IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
}
}
break;
default:
DEFAULT;
}
@@ -131,27 +246,87 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
GETVD;
UXTBw(x1, vd);
CMPSw_U12(x1, rex.w?64:32);
CSETxw(x2, cPL);
IFX(F_CF) {
CSETMxw(x2, cPL);
IFX(X_CF) {
BFIw(xFlags, x2, F_CF, 1);
}
MVNxw_REG(x2, x2); //prepare mask
B_MARK(cPL);
LSLxw_REG(x2, x2, x1);
MARK;
IFX(X_ZF) {
need_tst = 0;
IFX(X_ZF) need_tst = 1;
IFXNATIVE(X_SF, NF_SF) need_tst = 1;
IFXNATIVE(X_OF, NF_VF) need_tst = 1;
if(need_tst) {
BICSxw(gd, ed, x2);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
} else
BICxw(gd, ed, x2);
IFX(X_ZF) {
IFNATIVE(NF_EQ) {} else {
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
}
}
IFX(X_SF) {
LSRxw(x3, gd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
IFNATIVE(NF_SF) {} else {
LSRxw(x3, gd, rex.w?63:31);
BFIw(xFlags, x3, F_SF, 1);
}
}
IFX(X_OF) {
IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
}
if (BOX64DRENV(dynarec_safeflags)) {
// those are UD flags
IFX(X_AF) BFCw(xFlags, F_AF, 1);
if(BOX64ENV(cputype)) {
IFX(X_PF) BFCw(xFlags, F_PF, 1);
} else {
IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
}
}
break;
case 0xF7:
INST_NAME("BEXTR Gd, Ed, Vd");
nextop = F8;
SETFLAGS(X_ALL, SF_SET);
GETGD;
GETED(0);
GETVD;
MOV64xw(x5, 0);
UXTBw(x4, vd); // start
UBFXw(x3, vd, 8, 8); // length
TSTw_REG(x3, x3);
B_MARK(cEQ);
CMPSw_U12(x4, rex.w?64:32);
B_MARK(cGE);
LSRxw_REG(x5, ed, x4);
CMPSw_U12(x3, rex.w?64:32);
B_MARK(cGT);
MOV32w(x4, rex.w?64:32);
SUBw_REG(x4, x4, x3);
LSLxw_REG(x5, x5, x4);
LSRxw_REG(x5, x5, x4);
MARK;
MOVxw_REG(gd, x5);
IFX(X_ZF) {
TSTxw_REG(x5, x5);
IFNATIVE(NF_EQ) {} else {
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1);
}
}
IFX(X_AF) BFCw(xFlags, F_AF, 1);
IFX(X_PF) BFCw(xFlags, F_PF, 1);
IFX(X_OF) BFCw(xFlags, F_OF, 1);
IFX(X_CF) BFCw(xFlags, F_CF, 1);
IFX(X_OF) {
IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
}
IFX(X_SF) {
IFNATIVE(NF_SF) {} else { BFCw(xFlags, F_SF, 1); }
}
break;
default:
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+160 -109
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -135,15 +133,21 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
if(!l) {
GETGX_empty_EX(v0, v1, 1);
u8 = F8;
if(v0==v1) {q1 = fpu_get_scratch(dyn, ninst); VMOVQ(q1, v1);}
} else {
GETGY_empty_EY(v0, v1);
if(v0==v1) {VMOVQ(q1, v1);}
}
if(((u8>>(l*2))&1)==((u8>>(1+l*2))&1))
VDUPQ_64(v0, (v0==v1)?q1:v1, ((u8>>(l*2))&1));
else for(int i=0; i<2; ++i)
VMOVeD(v0, i, (v0==v1)?q1:v1, (u8>>(i+l*2))&1);
switch(((u8>>(l*2))&3)) {
case 0b00:
case 0b11:
VDUPQ_64(v0, v1, ((u8>>(l*2))&1));
break;
case 0b10:
if(v0!=v1) VMOVQ(v0, v1);
break;
case 0b01:
VEXTQ_8(v0, v1, v1, 8); // invert 64bits values
break;
}
}
if(!vex.l) YMM0(gd);
break;
@@ -163,27 +167,27 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
u8 = F8;
GETVX(v2, 0);
GETGX_empty(v0);
if((v0==v2) && ((u8&0xf0)==0)) {
if((v0==v2) && ((u8&0b10110000)==0)) {
q0 = fpu_get_scratch(dyn, ninst);
VMOVQ(q0, v2);
v2 = q0;
}
if((v0==v1) && ((u8&0xf0)==0x20)) {
if((v0==v1) && ((u8&0b10110000)==0x20)) {
q1 = fpu_get_scratch(dyn, ninst);
VMOVQ(q1, v1);
v1 = q1;
}
switch(u8&0x0f) {
switch(u8&0b1011) {
case 0: if(v0!=v2) VMOVQ(v0, v2); break;
case 1: d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); VMOVQ(v0, d2); break;
case 2: if(MODREG) { if(v0!=v1) VMOVQ(v0, v1); } else { VLDR128_U12(v0, ed, fixedaddress); } break;
case 3: if(MODREG) { d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); VMOVQ(v0, d1); } else { VLDR128_U12(v0, ed, fixedaddress+16); } break;
default: VEORQ(v0, v0, v0);
}
if((u8&0xf0)==0x10) { if((u8&0x0f)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); }
if(MODREG && ((u8&0xf0)==0x30)) { if((u8&0x0f)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); }
if((u8&0b10110000)==0x10) { if((u8&0b1011)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); }
if(MODREG && ((u8&0b10110000)==0x30)) { if((u8&0b1011)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); }
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, s0, -1);
switch((u8>>4)&0x0f) {
switch((u8>>4)&0b1011) {
case 0: VMOVQ(v0, v2); break;
case 1: if(v0!=d2) VMOVQ(v0, d2); break;
case 2: if(MODREG) { if(v0!=v1) VMOVQ(v0, v1); } else { VLDR128_U12(v0, ed, fixedaddress); } break;
@@ -268,17 +272,21 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
} else if(q0==q1) {
for(int i=0; i<4; ++i)
if(u8&(1<<i)) {
VMOVeS(q0, i, q1, i);
//VMOVeS(q0, i, q1, i);
} else if(q0!=q2)
VMOVeS(q0, i, q2, i);
} else {
if(q0!=q2)
VMOVQ(q0, q2);
if((u8&15)==0b0011) {
if((u8&0b0011)==0b0011) {
VMOVeD(q0, 0, q1, 0);
} else if((u8&15)==0b1100) {
u8&=~0b0011;
}
if((u8&0b1100)==0b1100) {
VMOVeD(q0, 1, q1, 1);
} else for(int i=0; i<4; ++i)
u8&=~0b1100;
}
for(int i=0; i<4; ++i)
if(u8&(1<<i)) {
VMOVeS(q0, i, q1, i);
}
@@ -290,17 +298,21 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
} else if(q0==q1) {
for(int i=0; i<4; ++i)
if(u8&(1<<(i+4))) {
VMOVeS(q0, i, q1, i);
//VMOVeS(q0, i, q1, i);
} else if(q0!=q2)
VMOVeS(q0, i, q2, i);
} else {
if(q0!=q2)
VMOVQ(q0, q2);
if((u8>>4)==0b0011) {
if(((u8>>4)&0b0011)==0b0011) {
VMOVeD(q0, 0, q1, 0);
} else if((u8>>4)==0b1100) {
u8&=~0b00110000;
}
if(((u8>>4)&0b1100)==0b1100) {
VMOVeD(q0, 1, q1, 1);
} else for(int i=0; i<4; ++i)
u8&=~0b11000000;
}
for(int i=0; i<4; ++i)
if(u8&(1<<(i+4))) {
VMOVeS(q0, i, q1, i);
}
@@ -308,11 +320,11 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
} else YMM0(gd);
break;
case 0x0D:
INST_NAME("VPBLENDPD Gx, Vx, Ex, Ib");
INST_NAME("VBLENDPD Gx, Vx, Ex, Ib");
nextop = F8;
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(q0, q2, q1, 1); u8 = F8; } else { GETGY_empty_VYEY(q0, q2, q1); }
switch(u8>>(l*2)&3) {
switch((u8>>(l*2))&3) {
case 0b00: if(q0!=q2) VMOVQ(q0, q2); break; // VxVx
case 0b01: if(q0!=q1) VMOVeD(q0, 0, q1, 0); if(q0!=q2) VMOVeD(q0, 1, q2, 1); break; // Ex[0]Vx[1]
case 0b10: if(q0!=q2) VMOVeD(q0, 0, q2, 0); if(q0!=q1) VMOVeD(q0, 1, q1, 1); break; // Vx[0]Ex[1]
@@ -331,12 +343,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
MOVI_64(q0, u8);
SXTL_8(q0, q0); // expand 8bits to 16bits...
}
if(v0==v1) {
VBIFQ(v0, v2, q0);
} else {
if(v0!=v2) VMOVQ(v0, v2);
VBITQ(v0, v1, q0);
}
if(v0!=v2) VBIFQ(v0, v2, q0);
if(v0!=v1) VBITQ(v0, v1, q0);
}
if(!vex.l) YMM0(gd);
break;
@@ -370,7 +378,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff, 0, rex, NULL, 0, 1);
ed = x1;
}
@@ -378,6 +385,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
VMOVBto(ed, v0, u8&0x0f);
if(!MODREG) {
STB(ed, wback, fixedaddress);
SMWRITE2();
}
break;
case 0x15:
@@ -387,7 +395,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 1);
ed = x1;
}
@@ -395,6 +402,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
VMOVHto(ed, v0, u8&7);
if(!MODREG) {
STH(ed, wback, fixedaddress);
SMWRITE2();
}
break;
case 0x16:
@@ -404,7 +412,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 1);
ed = x1;
}
@@ -416,6 +423,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
}
if(!MODREG) {
STxw(ed, wback, fixedaddress);
SMWRITE2();
}
break;
case 0x17:
@@ -425,7 +433,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
if(MODREG) {
ed = TO_NAT((nextop & 7) + (rex.b << 3));
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1);
ed = x1;
}
@@ -433,6 +440,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
VMOVSto(ed, v0, u8&3);
if(!MODREG) {
STW(ed, wback, fixedaddress);
SMWRITE2();
}
break;
case 0x18:
@@ -479,12 +487,13 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 1);
VST128(v0, ed, fixedaddress);
SMWRITE2();
}
F8; // read u8, but it's been already handled
break;
case 0x1D:
INST_NAME("VCVTPS2PH Ex, Gx");
INST_NAME("VCVTPS2PH Ex, Gx, Ib");
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
@@ -531,13 +540,20 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
break;
case 0x20:
INST_NAME("VINSERTD Gx, Vx, Ex, Ib");
INST_NAME("VPINSRB Gx, Vx, ED, Ib");
nextop = F8;
GETGX_empty_VX(v0, v2);
GETED(1);
u8 = F8;
if(v0!=v2) VMOVQ(v0, v2);
VMOVQBfrom(v0, u8&0xf, ed);
if(MODREG) {
u8 = (F8)&15;
ed = TO_NAT((nextop & 7) + (rex.b << 3));
VMOVQBfrom(v0, u8, ed);
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
u8 = (F8)&15;
VLD1_8(v0, u8, wback);
}
YMM0(gd);
break;
case 0x21:
@@ -573,7 +589,11 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
YMM0(gd);
break;
case 0x22:
INST_NAME("VINSERTD Gx, Vx, Ex, Ib");
if (rex.w) {
INST_NAME("VPINSRQ Gx, Vx, ED, Ib");
} else {
INST_NAME("VPINSRD Gx, Vx, ED, Ib");
}
nextop = F8;
GETGX_empty_VX(v0, v2);
GETED(1);
@@ -592,36 +612,64 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
u8 = geted_ib(dyn, addr, ninst, nextop);
q0 = fpu_get_scratch(dyn, ninst);
// first mask
wb1 = 0; // mask
for(int i=0; i<4; ++i)
if(u8&(1<<i))
wb1 |= (3<<(i*2));
MOVI_64(q0, wb1); // load 8bits value as a 8bytes mask
SXTL_16(q0, q0); // expand 16bits to 32bits...
q1 = fpu_get_scratch(dyn, ninst);
// second mask
wb1 = 0; // mask
for(int i=0; i<4; ++i)
if((u8>>4)&(1<<i))
wb1 |= (3<<(i*2));
MOVI_64(q1, wb1); // load 8bits value as a 8bytes mask
SXTL_16(q1, q1); // expand 16bits to 32bits...
if((u8&0x0f)!=0x0f) {
wb1 = 0; // mask
for(int i=0; i<4; ++i)
if(u8&(1<<i))
wb1 |= (3<<(i*2));
MOVI_64(q0, wb1); // load 8bits value as a 8bytes mask
SXTL_16(q0, q0); // expand 16bits to 32bits...
}
if((u8&0xf0)!=0xf0) {
q1 = fpu_get_scratch(dyn, ninst);
// second mask
wb1 = 0; // mask
for(int i=0; i<4; ++i)
if((u8>>4)&(1<<i))
wb1 |= (3<<(i*2));
MOVI_64(q1, wb1); // load 8bits value as a 8bytes mask
SXTL_16(q1, q1); // expand 16bits to 32bits...
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 1); u8 = F8; } else { GETGY_empty_VYEY(v0, v2, v1); }
VFMULQS(v0, v2, v1);
VANDQ(v0, v0, q1); // second mask
if((u8&0xf0)!=0xf0) {
VANDQ(v0, v0, q1); // second mask
}
VFADDPQS(v0, v0, v0);
FADDPS(v0, v0);
VDUPQ_32(v0, v0, 0);
VANDQ(v0, v0, q0); // first mask
if((u8&0x0f)!=0x0f) {
VANDQ(v0, v0, q0); // first mask
}
}
if(!vex.l) YMM0(gd);
break;
case 0x44:
INST_NAME("PCLMULQDQ Gx, Vx, Ex, Ib");
case 0x41:
INST_NAME("VDPPD Gx, Vx, Ex, Ib");
nextop = F8;
if(arm64_pmull) {
GETGX_empty_VXEX(v0, v1, v2, 0);
u8 = F8;
VFMULQD(v0, v1, v2);
// mask some, duplicate all, mask some
for(int i=0; i<2; ++i)
if(!(u8&(1<<(4+i)))) {
VMOVQDfrom(v0, i, xZR);
}
FADDPD(v0, v0);
VDUPQ_64(v0, v0, 0);
for(int i=0; i<2; ++i)
if(!(u8&(1<<i))) {
VMOVQDfrom(v0, i, xZR);
}
YMM0(gd);
break;
case 0x44:
INST_NAME("VPCLMULQDQ Gx, Vx, Ex, Ib");
nextop = F8;
if(cpuext.pmull) {
d0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) {
@@ -648,34 +696,24 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
}
}
} else {
for(int l=0; l<1+vex.l; ++l) {
if(!l) {
GETG;
sse_forget_reg(dyn, ninst, gd);
sse_reflect_reg(dyn, ninst, vex.v);
GETG;
sse_forget_reg(dyn, ninst, gd);
sse_reflect_reg(dyn, ninst, vex.v);
MOV32w(x1, gd); // gx
MOV32w(x2, vex.v); // vx
if(MODREG) {
ed = (nextop&7)+(rex.b<<3);
sse_forget_reg(dyn, ninst, ed);
MOV32w(x3, ed);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
if(ed!=x3) {
MOVx_REG(x3, ed);
}
MOV32w(x1, gd); // gx
MOV32w(x2, vex.v); // vx
if(MODREG) {
if(!l) {
ed = (nextop&7)+(rex.b<<3);
sse_forget_reg(dyn, ninst, ed);
}
MOV32w(x3, ed);
} else {
if(!l) {
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
if(ed!=x3) {
MOVx_REG(x3, ed);
}
} else {
ADDx_U12(x3, ed, 16);
}
}
if(!l) u8 = F8;
MOV32w(x4, u8);
CALL_(l?native_pclmul_y:native_pclmul_x, -1, x3);
}
u8 = F8;
MOV32w(x4, u8);
CALL_(vex.l?const_native_pclmul_y:const_native_pclmul_x, -1, x3);
}
if(!vex.l) YMM0(gd);
break;
@@ -702,12 +740,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, u8, (MODREG)?((nextop&7)+(rex.b<<3)):-1);
}
VSSHRQ_32(q0, q1, 31); // create mask
if(v0==v1)
VBIFQ(v0, v2, q0);
else {
if(v0!=v2) VMOVQ(v0, v2);
VBITQ(v0, v1, q0);
}
if(v0!=v2) VBIFQ(v0, v2, q0);
if(v0!=v1) VBITQ(v0, v1, q0);
}
if(!vex.l) YMM0(gd);
break;
@@ -731,45 +765,62 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, u8, (MODREG)?((nextop&7)+(rex.b<<3)):-1);
}
VSSHRQ_64(q0, q1, 63); // create mask
if(v0==v1)
VBIFQ(v0, v2, q0);
else {
if(v0!=v2) VMOVQ(v0, v2);
VBITQ(v0, v1, q0);
}
if(v0!=v2) VBIFQ(v0, v2, q0);
if(v0!=v1) VBITQ(v0, v1, q0);
}
if(!vex.l) YMM0(gd);
break;
case 0x4C:
INST_NAME("VBLENDPVB Gx, Vx, Ex, XMMImm8");
INST_NAME("VPBLENDVB Gx, Vx, Ex, XMMImm8");
nextop = F8;
q0 = fpu_get_scratch(dyn, ninst);
u8 = geted_ib(dyn, addr, ninst, nextop)>>4;
ed = (nextop&7)+(rex.b<<3);
for(int l=0; l<1+vex.l; ++l) {
if(!l) {
q1 = sse_get_reg(dyn, ninst, x1, u8, 0);
GETGX_empty_VXEX(v0, v2, v1, 1);
F8;
} else {
v2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, u8, (MODREG)?((nextop&7)+(rex.b<<3)):-1);
v2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, u8, (MODREG)?ed:-1);
if(MODREG)
v1 = ymm_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0, gd, vex.v, u8);
v1 = ymm_get_reg(dyn, ninst, x1, ed, 0, gd, vex.v, u8);
else
VLDR128_U12(v1, ed, fixedaddress+16);
q1 = ymm_get_reg(dyn, ninst, x1, u8, 0, vex.v, gd, (MODREG)?((nextop&7)+(rex.b<<3)):-1);
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, u8, (MODREG)?((nextop&7)+(rex.b<<3)):-1);
q1 = ymm_get_reg(dyn, ninst, x1, u8, 0, vex.v, gd, (MODREG)?ed:-1);
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, u8, (MODREG)?ed:-1);
}
VSSHRQ_8(q0, q1, 7); // create mask
if(v0==v1)
VBIFQ(v0, v2, q0);
else {
if(v0!=v2) VMOVQ(v0, v2);
VBITQ(v0, v1, q0);
}
if(v0!=v2) VBIFQ(v0, v2, q0);
if(v0!=v1) VBITQ(v0, v1, q0);
}
if(!vex.l) YMM0(gd);
break;
case 0xDF:
INST_NAME("VAESKEYGENASSIST Gx, Ex, Ib");
nextop = F8;
GETG;
sse_forget_reg(dyn, ninst, gd);
MOV32w(x1, gd); // gx
if(MODREG) {
ed = (nextop&7)+(rex.b<<3);
sse_forget_reg(dyn, ninst, ed);
MOV32w(x2, ed);
MOV32w(x3, 0); //p = NULL
} else {
MOV32w(x2, 0);
addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
if(ed!=x3) {
MOVx_REG(x3, ed);
}
}
u8 = F8;
MOV32w(x4, u8);
CALL(const_native_aeskeygenassist, -1);
YMM0(gd);
break;
default:
DEFAULT;
}
+219 -85
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -113,7 +111,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
if(vex.l) {
GETGY_empty(v0, -1, -1, -1);
ADDx_U12(x3, ed, 16);
VLDQ1R_64(v0, ed);
VLDQ1R_64(v0, x3);
}
}
if(!vex.l) YMM0(gd);
@@ -125,11 +123,17 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
GETGX_empty_VX(v0, v1);
GETED(0);
d1 = fpu_get_scratch(dyn, ninst);
if(BOX64ENV(dynarec_fastround)<2) {
u8 = sse_setround(dyn, ninst, x3, x4, x5);
}
if(rex.w) {
SCVTFDx(d1, ed);
} else {
SCVTFDw(d1, ed);
}
if(BOX64ENV(dynarec_fastround)<2) {
x87_restoreround(dyn, ninst, u8);
}
if(v0!=v1) VMOVQ(v0, v1);
VMOVeD(v0, 0, d1, 0);
YMM0(gd);
@@ -140,13 +144,23 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETGD;
GETEXSD(q0, 0, 0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
FCVTZSxwD(gd, q0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && cpuext.frintts) {
v0 = fpu_get_scratch(dyn, ninst);
if(rex.w) {
FRINT64ZD(v0, q0);
} else {
FRINT32ZD(v0, q0);
}
FCVTZSxwD(gd, v0);
} else {
FCVTZSxwD(gd, q0);
}
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
@@ -161,17 +175,25 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETGD;
GETEXSD(q0, 0, 0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
u8 = sse_setround(dyn, ninst, x1, x2, x3);
d1 = fpu_get_scratch(dyn, ninst);
FRINTID(d1, q0);
if(!BOX64ENV(dynarec_fastround) && cpuext.frintts) {
if(rex.w) {
FRINT64XD(d1, q0);
} else {
FRINT32XD(d1, q0);
}
} else {
FRINTID(d1, q0);
}
x87_restoreround(dyn, ninst, u8);
FCVTZSxwD(gd, d1);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
@@ -188,17 +210,17 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
d1 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
if(!box64_dynarec_fastnan) {
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FCMEQD(q0, v1, v1); // 0 if NAN, 1 if not NAN
}
FSQRTD(d1, v1);
if(!box64_dynarec_fastnan) {
if(!BOX64ENV(dynarec_fastnan)) {
FCMEQD(q1, d1, d1); // 0 => out is NAN
VBIC(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_64(q1, q1, 63); // only keep the sign bit
SHL_64(q1, q1, 63); // only keep the sign bit
VORR(d1, d1, q1); // NAN -> -NAN
}
if(v0!=v2) {
@@ -211,28 +233,54 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x58:
INST_NAME("VADDSD Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FADDD(d1, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXD(q1, v0, v1); // propagate NAN
FCMEQD(q1, q1, q1); // 0 if NAN, 1 if not NAN
FADDD(q2, v1, v2); // the high part of the vector is erased...
FCMEQD(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FADDD(q2, v1, v2); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeD(v0, 0, d1, 0);
VMOVeD(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x59:
INST_NAME("VMULSD Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FMULD(d1, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXD(q1, v0, v1); // propagate NAN
FCMEQD(q1, q1, q1); // 0 if NAN, 1 if not NAN
FMULD(q2, v1, v2); // the high part of the vector is erased...
FCMEQD(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FMULD(q2, v1, v2); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeD(v0, 0, d1, 0);
YMM0(gd)
VMOVeD(v0, 0, q2, 0);
YMM0(gd);
break;
case 0x5A:
INST_NAME("VCVTSD2SS Gx, Vx, Ex");
@@ -240,7 +288,13 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
d1 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FCVT_S_D(d1, v1);
if(BOX64ENV(dynarec_fastround)==2) {
FCVT_S_D(d1, v1);
} else {
u8 = sse_setround(dyn, ninst, x1, x2, x3);
FCVT_S_D(d1, v1);
x87_restoreround(dyn, ninst, u8);
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
@@ -251,14 +305,27 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x5C:
INST_NAME("VSUBSD Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FSUBD(d1, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXD(q1, v0, v1); // propagate NAN
FCMEQD(q1, q1, q1); // 0 if NAN, 1 if not NAN
FSUBD(q2, v2, v1); // the high part of the vector is erased...
FCMEQD(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FSUBD(q2, v2, v1); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeD(v0, 0, d1, 0);
VMOVeD(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x5D:
@@ -269,7 +336,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
GETGX_empty_VX(v0, v2);
// VMINSD: if any input is NaN, or Ex[0]<Gx[0], copy Ex[0] -> Gx[0]
FCMPD(v2, v1);
FCSELD(d1, v1, v2, cCS);
FCSELD(d1, v1, v2, cCS); //CS: NAN or == or Vx > Ex
if(v0!=v2) {
VMOVQ(v0, v2);
}
@@ -279,27 +346,27 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x5E:
INST_NAME("VDIVSD Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
if(!box64_dynarec_fastnan) {
q0 = fpu_get_scratch(dyn, ninst);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXD(q0, v2, v1); // propagate NAN
FCMEQD(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
FDIVD(d1, v2, v1);
if(!box64_dynarec_fastnan) {
FCMEQD(q1, d1, d1); // 0 => out is NAN
VBIC(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_64(q1, q1, 63); // only keep the sign bit
VORR(d1, d1, q1); // NAN -> -NAN
FMAXD(q1, v0, v1); // propagate NAN
FCMEQD(q1, q1, q1); // 0 if NAN, 1 if not NAN
FDIVD(q2, v2, v1); // the high part of the vector is erased...
FCMEQD(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FDIVD(q2, v2, v1); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeD(v0, 0, d1, 0);
VMOVeD(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x5F:
@@ -309,7 +376,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
GETEXSD(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FCMPD(v1, v2);
FCSELD(d1, v1, v2, cCS);
FCSELD(d1, v1, v2, cCS); //CS: NAN or == or Ex > Vx
if(v0!=v2) {
VMOVQ(v0, v2);
}
@@ -322,7 +389,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
d0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETEX(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
if(!l) { GETEX_Y(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
if(u8==0b00000000 || u8==0b01010101 || u8==0b10101010 || u8==0b11111111) {
if(v0==v1) {
VMOVQ(d0, v1);
@@ -354,30 +421,85 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x7C:
INST_NAME("VHADDPS Gx, Vx, Ex");
nextop = F8;
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
VFMAXPQS(q0, v2, v1); // propagate NAN
VFCMEQQS(q0, q0, q0); // 0 if NAN, 1 if not NAN
}
VFADDPQS(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q1, v0, v0); // 0 => out is NAN
VBICQ(q1, q0, q1); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd);
break;
case 0x7D:
INST_NAME("VHSUBPS Gx, Vx, Ex");
nextop = F8;
q0 = fpu_get_scratch(dyn, ninst);
if(!BOX64ENV(dynarec_fastnan))
q1 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
VUZP1Q_32(q0, v2, v1);
VUZP2Q_32(v0, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
// check if any input value was NAN
// but need to mix low/high part
VFMAXQS(q1, v0, q0); // propagate NAN
VFCMEQQS(q1, q1, q1); // 0 if NAN, 1 if not NAN
}
VFSUBQS(v0, q0, v0);
if(!BOX64ENV(dynarec_fastnan)) {
VFCMEQQS(q0, v0, v0); // 0 => out is NAN
VBICQ(q1, q1, q0); // forget it in any input was a NAN already
VSHLQ_32(q1, q1, 31); // only keep the sign bit
VORRQ(v0, v0, q1); // NAN -> -NAN
}
}
if(!vex.l) YMM0(gd);
break;
case 0xC2:
INST_NAME("CMPSD Gx, Ex, Ib");
INST_NAME("VCMPSD Gx, Ex, Ib");
nextop = F8;
GETEXSD(v1, 0, 1);
GETGX_empty_VX(v0, v2);
u8 = F8;
FCMPD(v2, v1);
if(((u8&15)!=0x0b) && ((u8&15)!=0x0f)) {
if((u8&15)>7)
FCMPD(v1, v2);
else
FCMPD(v2, v1);
}
// TODO: create a test for this one, there might be an issue with cases 9, 10 and 13
if(v0!=v2) VMOVQ(v0, v2);
switch(u8&7) {
case 0: CSETMx(x2, cEQ); break; // Equal
case 1: CSETMx(x2, cCC); break; // Less than
case 2: CSETMx(x2, cLS); break; // Less or equal
case 3: CSETMx(x2, cVS); break; // NaN
case 4: CSETMx(x2, cNE); break; // Not Equal or unordered
case 5: CSETMx(x2, cCS); break; // Greater or equal or unordered
case 6: CSETMx(x2, cHI); break; // Greater or unordered, test inverted, N!=V so unordered or less than (inverted)
case 7: CSETMx(x2, cVC); break; // not NaN
switch(u8&15) {
case 0x00: CSETMx(x2, cEQ); break; // Equal
case 0x01: CSETMx(x2, cCC); break; // Less than
case 0x02: CSETMx(x2, cLS); break; // Less or equal
case 0x03: CSETMx(x2, cVS); break; // NaN
case 0x04: CSETMx(x2, cNE); break; // Not Equal or unordered
case 0x05: CSETMx(x2, cCS); break; // Greater or equal or unordered
case 0x06: CSETMx(x2, cHI); break; // Greater or unordered
case 0x07: CSETMx(x2, cVC); break; // not NaN
case 0x08: CSETMx(x2, cEQ); CSETMx(x3, cVS); ORRx_REG(x2, x2, x3); break; // Equal or unordered
case 0x09: CSETMx(x2, cHI); break; // Less than or unordered
case 0x0a: CSETMx(x2, cCS); break; // Less or equal or unordered
case 0x0b: MOV32w(x2, 0); break; // false
case 0x0c: CSETMx(x2, cNE); CSETMx(x3, cVS); BICx(x2, x2, x3); break; // Not Equal not unordered
case 0x0d: CSETMx(x2, cLS); break; // Greater or equal not unordered
case 0x0e: CSETMx(x2, cCC); break; // Greater not unordered
case 0x0f: MOV64x(x2, 0xffffffffffffffffLL); break; // true
}
VMOVQDfrom(v0, 0, x2);
YMM0(gd);
@@ -387,15 +509,16 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
INST_NAME("VADDSUBPS Gx, Vx, Ex");
nextop = F8;
q0 = fpu_get_scratch(dyn, ninst);
static float addsubps[4] = {-1.f, 1.f, -1.f, 1.f};
MAYUSE(addsubps);
TABLE64(x2, (uintptr_t)&addsubps);
TABLE64C(x2, const_4f_m1_1_m1_1);
VLDR128_U12(q0, x2, 0);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); if(v0==v1) q1 = fpu_get_scratch(dyn, ninst); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
if(v0==v1) {
VFMULQS(q1, v1, q0);
VFADDQS(v0, v2, q1);
//TODO: find a better way
if(!l) q1 = fpu_get_scratch(dyn, ninst);
VMOVQ(q1, v2);
VFMLAQS(q1, v1, q0);
VMOVQ(v0, q1);
} else {
if(v0!=v2) VMOVQ(v0, v2);
VFMLAQS(v0, v1, q0);
@@ -412,12 +535,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
if(!l) {
GETEX_Y(v1, 0, 0);
GETGX_empty(v0);
if(!box64_dynarec_fastround || vex.l)
if(!BOX64ENV(dynarec_fastround) || vex.l)
d0 = fpu_get_scratch(dyn, ninst);
} else {
GETEY(v1);
}
if(box64_dynarec_fastround) {
if(BOX64ENV(dynarec_fastround)) {
VFRINTIDQ(l?d0:v0, v1);
VFCVTNSQD(l?d0:v0, l?d0:v0); // convert double -> int64
if(!l)
@@ -425,28 +548,35 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
else
SQXTN2_32(v0, d0); // convert int64 -> int32 with saturation in higher part
} else {
if(!l) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
ORRw_mask(x4, xZR, 1, 0); //0x80000000
}
for(int i=0; i<2; ++i) {
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(i) {
VMOVeD(d0, 0, v1, i);
FRINTID(d0, d0);
} else {
FRINTID(d0, v1);
if(cpuext.frintts) {
VFRINT32XDQ(l?d0:v0, v1); // round, handling of overflow and Nan to 0x80000000
VFCVTNSQD(l?d0:v0, l?d0:v0); // convert double -> int64
if(!l)
SQXTN_32(v0, v0); // convert int64 -> int32 with saturation in lower part, RaZ high part
else
SQXTN2_32(v0, d0); // convert int64 -> int32 with saturation in higher part
} else {
if(!l) {
MRS_fpsr(x5);
ORRw_mask(x4, xZR, 1, 0); //0x80000000
}
FCVTZSwD(x1, d0);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TSTw_mask(x5, 0, 0); // mask = 1 = FPSR_IOC
CSELx(x1, x1, x4, cEQ);
VMOVQSfrom(v0, i+l*2, x1);
for(int i=0; i<2; ++i) {
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(i) {
VMOVeD(d0, 0, v1, i);
FRINTID(d0, d0);
} else {
FRINTID(d0, v1);
}
FCVTZSwD(x1, d0);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TSTw_mask(x5, 0, 0); // mask = 1 = FPSR_IOC
CSELx(x1, x1, x4, cEQ);
VMOVQSfrom(v0, i+l*2, x1);
}
if(!vex.l && !l) VMOVQDfrom(v0, 1, xZR);
}
if(!vex.l && !l) VMOVQDfrom(v0, 1, xZR);
}
}
x87_restoreround(dyn, ninst, u8);
@@ -454,7 +584,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
break;
case 0xF0:
INST_NAME("LDDQU Gx,Ex");
INST_NAME("VLDDQU Gx,Ex");
nextop = F8;
GETG;
if(MODREG) {
@@ -466,12 +596,16 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
VMOVQ(v0, v1);
}
} else {
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 7, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress);
v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, -1, -1, -1);
VLDR128_U12(v0, ed, fixedaddress+16);
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
if (vex.l) {
v1 = ymm_get_reg_empty(dyn, ninst, x1, gd, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0x3f << 4, 15, rex, NULL, 1, 0);
VLDP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff << 4, 15, rex, NULL, 0, 0);
VLD128(v0, ed, fixedaddress);
}
}
if(!vex.l) YMM0(gd);
break;
+41 -8
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -60,7 +58,36 @@ uintptr_t dynarec64_AVX_F2_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
rex_t rex = vex.rex;
switch(opcode) {
case 0xF5:
INST_NAME("PDEP Gd, Ed, Vd");
nextop = F8;
GETGD;
GETED(0);
GETVD;
if(gd==ed || gd==vd) {
gb1 = gd;
gd = x4;
} else {
gb1 = 0;
}
// x3 = mask of mask, loop while not 0
MOV32w(gd, 0);
MOV64x(x2, 1);
MOV64x(x3, 1);
MARK;
TSTxw_REG(ed, x3);
B_MARK2(cEQ);
TSTxw_REG(vd, x2);
B_MARK3(cEQ);
ORRxw_REG(gd, gd, x3);
MARK3;
LSLxw_IMM(x2, x2, 1);
MARK2;
LSLxw_IMM(x3, x3, 1);
CBNZxw_MARK(x3);
if(gb1)
MOVxw_REG(gb1, gd);
break;
case 0xF6:
INST_NAME("MULX Gd, Vd, Ed (,RDX)");
nextop = F8;
@@ -69,13 +96,19 @@ uintptr_t dynarec64_AVX_F2_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
GETVD;
if(rex.w) {
// 64bits mul
UMULH(x3, xRDX, ed);
MULx(vd, xRDX, ed);
MOVx_REG(gd, x3);
if((gd==xRDX) || (gd==ed) || (gd==vd))
gb1 = x3;
else
gb1 = gd;
UMULH(gb1, xRDX, ed);
if(gd!=vd) {MULx(vd, xRDX, ed);}
if(gb1==x3) {
MOVx_REG(gd, gb1);
}
} else {
// 32bits mul
UMULL(x3, xRDX, ed);
MOVw_REG(vd, x3);
if(gd!=vd) {MOVw_REG(vd, x3);}
LSRx(gd, x3, 32);
}
break;
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
+172 -73
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -83,7 +81,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETG;
if(MODREG) {
GETGXVXEX_empty(v0, v2, v1, 0);
GETGXVXEX_empty(v0, v1, v2, 0);
if((v2!=v1) && (v2!=v0)) VMOVQ(v2, v1);
if(v2!=v0) VMOVeS(v2, 0, v0, 0);
if((v2!=v1) && (v2==v0)) { VMOVeS(v2, 1, v0, 1); VMOVeD(v2, 1, v0, 1);}
@@ -108,7 +106,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
break;
case 0x16:
INST_NAME("MOVSHDUP Gx, Ex");
INST_NAME("VMOVSHDUP Gx, Ex");
nextop = F8;
GETEX_Y(q1, 0, 0);
GETGX_empty(q0);
@@ -125,11 +123,17 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
d1 = fpu_get_scratch(dyn, ninst);
GETGX_empty_VX(v0, v1);
GETED(0);
if(BOX64ENV(dynarec_fastround)<2) {
u8 = sse_setround(dyn, ninst, x3, x4, x5);
}
if(rex.w) {
SCVTFSx(d1, ed);
} else {
SCVTFSw(d1, ed);
}
if(BOX64ENV(dynarec_fastround)<2) {
x87_restoreround(dyn, ninst, u8);
}
if(v0!=v1) VMOVQ(v0, v1);
VMOVeS(v0, 0, d1, 0);
YMM0(gd);
@@ -140,13 +144,23 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETGD;
GETEXSS(d0, 0, 0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
FCVTZSxwS(gd, d0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && cpuext.frintts) {
v0 = fpu_get_scratch(dyn, ninst);
if(rex.w) {
FRINT64ZS(v0, d0);
} else {
FRINT32ZS(v0, d0);
}
FCVTZSxwS(gd, v0);
} else {
FCVTZSxwS(gd, d0);
}
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
@@ -161,17 +175,25 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETGD;
GETEXSS(q0, 0, 0);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
u8 = sse_setround(dyn, ninst, x1, x2, x3);
d1 = fpu_get_scratch(dyn, ninst);
FRINTIS(d1, q0);
if(!BOX64ENV(dynarec_fastround) && cpuext.frintts) {
if(rex.w) {
FRINT64XS(d1, q0);
} else {
FRINT32XS(d1, q0);
}
} else {
FRINTIS(d1, q0);
}
x87_restoreround(dyn, ninst, u8);
FCVTZSxwS(gd, d1);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround) && !cpuext.frintts) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
@@ -183,12 +205,24 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
break;
case 0x51:
INST_NAME("SQRTSS Gx, Ex");
INST_NAME("VSQRTSS Gx, Ex");
nextop = F8;
GETEXSS(d0, 0, 0);
GETGX_empty_VX(v0, v2);
d1 = fpu_get_scratch(dyn, ninst);
if(!BOX64ENV(dynarec_fastnan)) {
q0 = fpu_get_scratch(dyn, ninst);
q1 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FCMEQS(q0, v1, v1); // 0 if NAN, 1 if not NAN
}
FSQRTS(d1, d0);
if(!BOX64ENV(dynarec_fastnan)) {
FCMEQS(q1, d1, d1); // 0 => out is NAN
VBIC(q1, q0, q1); // forget it in any input was a NAN already
VSHL_32(q1, q1, 31); // only keep the sign bit
VORR(d1, d1, q1); // NAN -> -NAN
}
if(v0!=v2) VMOVQ(v0, v2);
VMOVeS(v0, 0, d1, 0);
YMM0(gd);
@@ -234,35 +268,53 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x58:
INST_NAME("VADDSS Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXS(q1, v0, v1); // propagate NAN
FCMEQS(q1, q1, q1); // 0 if NAN, 1 if not NAN
FADDS(q2, v1, v2); // the high part of the vector is erased...
FCMEQS(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
VSHL_32(q0, q0, 31); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FADDS(q2, v1, v2); // the high part of the vector is erased...
}
if(v0!=v2) {
if(v0==v1) {
VMOV(d1, v1);
v1 = d1;
}
VMOVQ(v0, v2);
}
FADDS(d1, v0, v1);
VMOVeS(v0, 0, d1, 0);
VMOVeS(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x59:
INST_NAME("VMULSS Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXS(q1, v0, v1); // propagate NAN
FCMEQS(q1, q1, q1); // 0 if NAN, 1 if not NAN
FMULS(q2, v1, v2); // the high part of the vector is erased...
FCMEQS(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
VSHL_32(q0, q0, 31); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FMULS(q2, v1, v2); // the high part of the vector is erased...
}
if(v0!=v2) {
if(v0==v1) {
VMOV(d1, v1);
v1 = d1;
}
VMOVQ(v0, v2);
}
FMULS(d1, v0, v1);
VMOVeS(v0, 0, d1, 0);
VMOVeS(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x5A:
@@ -271,41 +323,43 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
d1 = fpu_get_scratch(dyn, ninst);
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
if(v0!=v2) {
if(v0==v1) {
VMOV(d1, v1);
v1 = d1;
}
VMOVQ(v0, v2);
}
FCVT_D_S(d1, v1);
VMOVeD(v0, 0, d1, 0);
if(v0!=v2)
VMOVeD(v0, 1, v2, 1);
YMM0(gd);
break;
case 0x5B:
INST_NAME("VCVTTPS2DQ Gx, Ex");
nextop = F8;
d0 = fpu_get_scratch(dyn, ninst);
if(!box64_dynarec_fastround) {
if(!BOX64ENV(dynarec_fastround)) {
MRS_fpsr(x5);
ORRw_mask(x4, xZR, 1, 0); //0x80000000
}
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETGX_empty_EX(v0, v1, 0); } else { GETGY_empty_EY(v0, v1); }
if(box64_dynarec_fastround) {
if(BOX64ENV(dynarec_fastround)) {
VFCVTZSQS(v0, v1);
} else {
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
for(int i=0; i<4; ++i) {
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
VMOVeS(d0, 0, v1, i);
VFCVTZSs(d0, d0);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ(x5, FPSR_IOC, 4+4);
VMOVQSfrom(d0, 0, x4);
VMOVeS(v0, i, d0, 0);
if(cpuext.frintts) {
VFRINT32ZSQ(v0, v1);
VFCVTZSQS(v0, v0);
} else {
for(int i=0; i<4; ++i) {
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(i) {
VMOVeS(d0, 0, v1, i);
VFCVTZSs(d0, d0);
} else {
VFCVTZSs(d0, v1);
}
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ(x5, FPSR_IOC, 4+4);
VMOVQSfrom(d0, 0, x4);
VMOVeS(v0, i, d0, 0);
}
}
}
}
@@ -314,14 +368,27 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x5C:
INST_NAME("VSUBSS Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FSUBS(d1, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXS(q1, v0, v1); // propagate NAN
FCMEQS(q1, q1, q1); // 0 if NAN, 1 if not NAN
FSUBS(q2, v2, v1); // the high part of the vector is erased...
FCMEQS(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
VSHL_32(q0, q0, 31); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FSUBS(q2, v2, v1); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeS(v0, 0, d1, 0);
VMOVeS(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x5D:
@@ -331,7 +398,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FCMPS(v2, v1);
FCSELS(d1, v1, v2, cCS);
FCSELS(d1, v1, v2, cCS); //CS: NAN or == or Ex > Vx
if(v0!=v2) {
VMOVQ(v0, v2);
}
@@ -341,14 +408,27 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
case 0x5E:
INST_NAME("VDIVSS Gx, Vx, Ex");
nextop = F8;
d1 = fpu_get_scratch(dyn, ninst);
q2 = fpu_get_scratch(dyn, ninst);
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FDIVS(d1, v2, v1);
if(!BOX64ENV(dynarec_fastnan)) {
q1 = fpu_get_scratch(dyn, ninst);
q0 = fpu_get_scratch(dyn, ninst);
// check if any input value was NAN
FMAXS(q1, v0, v1); // propagate NAN
FCMEQS(q1, q1, q1); // 0 if NAN, 1 if not NAN
FDIVS(q2, v2, v1); // the high part of the vector is erased...
FCMEQS(q0, q2, q2); // 0 => out is NAN
VBIC(q0, q1, q0); // forget it in any input was a NAN already
VSHL_32(q0, q0, 31); // only keep the sign bit
VORR(q2, q2, q0); // NAN -> -NAN
} else {
FDIVS(q2, v2, v1); // the high part of the vector is erased...
}
if(v0!=v2) {
VMOVQ(v0, v2);
}
VMOVeS(v0, 0, d1, 0);
VMOVeS(v0, 0, q2, 0);
YMM0(gd)
break;
case 0x5F:
@@ -358,7 +438,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
GETEXSS(v1, 0, 0);
GETGX_empty_VX(v0, v2);
FCMPS(v1, v2);
FCSELS(d1, v1, v2, cCS);
FCSELS(d1, v1, v2, cCS); //CS: NAN or == or Ex > Vx
if(v0!=v2) {
VMOVQ(v0, v2);
}
@@ -370,22 +450,22 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
INST_NAME("VMOVDQU Gx, Ex");// no alignment constraint on NEON here, so same as MOVDQA
nextop = F8;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
GETGX_empty(v0);
GETGX_empty_EX(v0, v1, 0);
VMOVQ(v0, v1);
if(vex.l) {
v1 = ymm_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0, gd, -12, -1);
GETGY_empty(v0, (nextop&7)+(rex.b<<3), -1, -1);
GETGY_empty_EY(v0, v1);
VMOVQ(v0, v1);
}
} else {
GETGX_empty(v0);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress);
if(vex.l) {
GETGY_empty(v0, -1, -1, -1);
VLDR128_U12(v0, ed, fixedaddress+16);
GETGY_empty(v1, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VLDP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VLD128(v0, ed, fixedaddress);
}
}
if(!vex.l) YMM0(gd);
@@ -395,7 +475,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
d0 = fpu_get_scratch(dyn, ninst);
for(int l=0; l<1+vex.l; ++l) {
if(!l) { GETEX(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
if(!l) { GETEX_Y(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
if(u8==0b00000000 || u8==0b01010101 || u8==0b10101010 || u8==0b11111111) {
VDUP_16(d0, v1, 4+(u8&3));
} else {
@@ -420,7 +500,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
break;
case 0x7E:
INST_NAME("MOVQ Gx, Ex");
INST_NAME("VMOVQ Gx, Ex");
nextop = F8;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
@@ -439,19 +519,38 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3));
ed = (nextop&7) + (rex.b<<3);
v1 = sse_get_reg_empty(dyn, ninst, x1, ed);
VMOVQ(v1, v0);
if(vex.l) {
GETGY(v0, 0, (nextop&7) + (rex.b<<3), -1, -1);
v1 = ymm_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3), gd, -1, -1);
GETGY(v0, 0, ed, -1, -1);
v1 = ymm_get_reg_empty(dyn, ninst, x1, ed, gd, -1, -1);
VMOVQ(v1, v0);
} // no ymm raz here it seems
} else YMM0(ed);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
VSTR128_U12(v0, ed, fixedaddress);
if(vex.l) {
GETGY(v0, 0, -1, -1, -1);
VSTR128_U12(v0, ed, fixedaddress+16);
IF_UNALIGNED(ip) {
MESSAGE(LOG_DEBUG, "\tUnaligned path");
addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
for(int i=0; i<16; ++i) {
VST1_8(v0, i, i?x1:wback);
ADDx_U12(x1, i?x1:wback, 1);
}
if(vex.l) {
GETGY(v0, 0, -1, -1, -1);
for(int i=0; i<16; ++i) {
VST1_8(v0, i, x1);
ADDx_U12(x1, x1, 1);
}
}
} else {
if(vex.l) {
GETGY(v1, 0, -1, -1, -1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0x3f<<4, 15, rex, NULL, 1, 0);
VSTP128_I7(v0, v1, ed, fixedaddress);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
VST128(v0, ed, fixedaddress);
}
}
SMWRITE2();
}
+30 -3
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -61,6 +59,35 @@ uintptr_t dynarec64_AVX_F3_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
switch(opcode) {
case 0xF5:
INST_NAME("PEXT Gd, Ed, Vd");
nextop = F8;
GETGD;
GETED(0);
GETVD;
if(gd==ed || gd==vd) {
gb1 = gd;
gd = x4;
} else {
gb1 = 0;
}
// x3 = mask of mask, loop while not 0
MOV32w(gd, 0);
MOV64x(x3, 1LL<<(rex.w?63:31));
MARK;
TSTxw_REG(ed, x3);
B_MARK2(cEQ); // mask not set
TSTxw_REG(vd, x3);
CSINCxw(gd, gd, gd, cEQ); // return gd if TRUE, else gd+1
RORxw(gd, gd, 1);
MARK2;
LSRxw_IMM(x3, x3, 1);
CBNZxw_MARK(x3);
RBITxw(gd, gd);
if(gb1)
MOVxw_REG(gb1, gd);
break;
case 0xF7:
INST_NAME("SARX Gd, Ed, Vd");
nextop = F8;
+144
View File
@@ -0,0 +1,144 @@
#include <stdint.h>
#include <string.h>
#include "dynarec_arm64_consts.h"
#include "debug.h"
#include "box64context.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "emu/x87emu_private.h"
#include "emu/x64primop.h"
#include "my_cpuid.h"
#include "freq.h"
#include "debug.h"
#include "custommem.h"
#include "dynarec_arm64_functions.h"
#include "emu/x64shaext.h"
#include "emu/x87emu_private.h"
#include "emu/x64compstrings.h"
#include "x64test.h"
#include "dynarec/dynarec_next.h"
#include "random.h"
static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };
static const int8_t mask_string8[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
static const int8_t mask_string16[] = { 15, 14, 13, 12, 11, 10, 9, 8 };
static const float addsubps[4] = {-1.f, 1.f, -1.f, 1.f};
static const double addsubpd[2] = {-1., 1.};
static const float subaddps[4] = {1.f, -1.f, 1.f, -1.f};
static const double subaddpd[2] = {1., -1.};
#ifndef HAVE_TRACE
void PrintTrace() {}
#endif
uintptr_t getConst(arm64_consts_t which)
{
switch(which) {
case const_none: dynarec_log(LOG_NONE, "Warning, const none used\n");
return 0;
case const_daa8: return (uintptr_t)daa8;
case const_das8: return (uintptr_t)das8;
case const_aaa16: return (uintptr_t)aaa16;
case const_aas16: return (uintptr_t)aas16;
case const_aam16: return (uintptr_t)aam16;
case const_aad16: return (uintptr_t)aad16;
case const_native_br: return (uintptr_t)native_br;
case const_native_ud: return (uintptr_t)native_ud;
case const_native_priv: return (uintptr_t)native_priv;
case const_native_gpf: return (uintptr_t)native_gpf;
case const_native_int3: return (uintptr_t)native_int3;
case const_native_int: return (uintptr_t)native_int;
case const_native_div0: return (uintptr_t)native_div0;
case const_native_frstor16: return (uintptr_t)native_frstor16;
case const_native_fsave16: return (uintptr_t)native_fsave16;
case const_native_fsave: return (uintptr_t)native_fsave;
case const_native_aesimc: return (uintptr_t)native_aesimc;
case const_native_aesd: return (uintptr_t)native_aesd;
case const_native_aesd_y: return (uintptr_t)native_aesd_y;
case const_native_aesdlast: return (uintptr_t)native_aesdlast;
case const_native_aesdlast_y: return (uintptr_t)native_aesdlast_y;
case const_native_aese: return (uintptr_t)native_aese;
case const_native_aese_y: return (uintptr_t)native_aese_y;
case const_native_aeselast: return (uintptr_t)native_aeselast;
case const_native_aeselast_y: return (uintptr_t)native_aeselast_y;
case const_native_aeskeygenassist: return (uintptr_t)native_aeskeygenassist;
case const_native_pclmul: return (uintptr_t)native_pclmul;
case const_native_pclmul_x: return (uintptr_t)native_pclmul_x;
case const_native_pclmul_y: return (uintptr_t)native_pclmul_y;
case const_direct_f2xm1: return (uintptr_t)direct_f2xm1;
case const_direct_fyl2x: return (uintptr_t)direct_fyl2x;
case const_direct_fyl2xp1: return (uintptr_t)direct_fyl2xp1;
case const_native_fxtract: return (uintptr_t)native_fxtract;
case const_direct_ftan: return (uintptr_t)direct_ftan;
case const_direct_fpatan: return (uintptr_t)direct_fpatan;
case const_direct_fcos: return (uintptr_t)direct_fcos;
case const_direct_fsin: return (uintptr_t)direct_fsin;
case const_native_fsincos: return (uintptr_t)native_fsincos;
case const_direct_fscale: return (uintptr_t)direct_fscale;
case const_native_fld: return (uintptr_t)native_fld;
case const_native_fstp: return (uintptr_t)native_fstp;
case const_native_frstor: return (uintptr_t)native_frstor;
case const_native_next: return (uintptr_t)native_next;
case const_int3: return (uintptr_t)EmuInt3;
case const_x86syscall: return (uintptr_t)EmuX86Syscall;
case const_x64syscall: return (uintptr_t)EmuX64Syscall;
case const_x64syscall_linux: return (uintptr_t)EmuX64Syscall_linux;
case const_rcl16: return (uintptr_t)rcl16;
case const_rcl32: return (uintptr_t)rcl32;
case const_rcl64: return (uintptr_t)rcl64;
case const_rcr16: return (uintptr_t)rcr16;
case const_rcr32: return (uintptr_t)rcr32;
case const_rcr64: return (uintptr_t)rcr64;
case const_div64: return (uintptr_t)div64;
case const_idiv64: return (uintptr_t)idiv64;
case const_random32: return (uintptr_t)get_random32;
case const_random64: return (uintptr_t)get_random64;
case const_readtsc: return (uintptr_t)ReadTSC;
case const_helper_getcpu: return (uintptr_t)helper_getcpu;
case const_cpuid: return (uintptr_t)my_cpuid;
case const_getsegmentbase: return (uintptr_t)GetSegmentBaseEmu;
case const_updateflags_arm64: return (uintptr_t)create_updateflags();
case const_reset_fpu: return (uintptr_t)reset_fpu;
case const_sha1msg2: return (uintptr_t)sha1msg2;
case const_sha1rnds4: return (uintptr_t)sha1rnds4;
case const_sha256msg1: return (uintptr_t)sha256msg1;
case const_sha256msg2: return (uintptr_t)sha256msg2;
case const_sha256rnds2: return (uintptr_t)sha256rnds2;
case const_fpu_loadenv: return (uintptr_t)fpu_loadenv;
case const_fpu_savenv: return (uintptr_t)fpu_savenv;
case const_fpu_fxsave32: return (uintptr_t)fpu_fxsave32;
case const_fpu_fxsave64: return (uintptr_t)fpu_fxsave64;
case const_fpu_fxrstor32: return (uintptr_t)fpu_fxrstor32;
case const_fpu_fxrstor64: return (uintptr_t)fpu_fxrstor64;
case const_fpu_xsave: return (uintptr_t)fpu_xsave;
case const_fpu_xrstor: return (uintptr_t)fpu_xrstor;
case const_fpu_fbld: return (uintptr_t)fpu_fbld;
case const_fpu_fbst: return (uintptr_t)fpu_fbst;
case const_sse42_compare_string_explicit_len: return (uintptr_t)sse42_compare_string_explicit_len;
case const_sse42_compare_string_implicit_len: return (uintptr_t)sse42_compare_string_implicit_len;
case const_x64test_step: return (uintptr_t)x64test_step;
case const_printtrace: return (uintptr_t)PrintTrace;
case const_epilog: return (uintptr_t)native_epilog;
case const_jmptbl32: return getJumpTable32();
case const_jmptbl48: return getJumpTable48();
case const_jmptbl64: return getJumpTable64();
case const_context: return (uintptr_t)my_context;
case const_8b_m7_m6_m5_m4_m3_m2_m1_0: return (uintptr_t)&mask_shift8;
case const_8b_7_6_5_4_3_2_1_0: return (uintptr_t)&mask_string8;
case const_8b_15_14_13_12_11_10_9_8: return (uintptr_t)&mask_string16;
case const_4f_m1_1_m1_1: return (uintptr_t)&addsubps;
case const_4f_1_m1_1_m1: return (uintptr_t)&subaddps;
case const_2d_m1_1: return (uintptr_t)&addsubpd;
case const_2d_1_m1: return (uintptr_t)&subaddpd;
case const_last: dynarec_log(LOG_NONE, "Warning, const last used\n");
return 0;
}
dynarec_log(LOG_NONE, "Warning, Unknown const %d used\n", which);
return 0;
}
+110
View File
@@ -0,0 +1,110 @@
#ifndef __DYNAREC_ARM64_CONSTS__
#define __DYNAREC_ARM64_CONSTS__
#include <stdint.h>
typedef enum arm64_consts_s {
const_none,
const_daa8,
const_das8,
const_aaa16,
const_aas16,
const_aam16,
const_aad16,
const_native_br,
const_native_ud,
const_native_priv,
const_native_gpf,
const_native_int3,
const_native_int,
const_native_div0,
const_native_frstor16,
const_native_fsave16,
const_native_fsave,
const_native_aesimc,
const_native_aesd,
const_native_aesd_y,
const_native_aesdlast,
const_native_aesdlast_y,
const_native_aese,
const_native_aese_y,
const_native_aeselast,
const_native_aeselast_y,
const_native_aeskeygenassist,
const_native_pclmul,
const_native_pclmul_x,
const_native_pclmul_y,
const_direct_f2xm1,
const_direct_fyl2x,
const_direct_fyl2xp1,
const_native_fxtract,
const_direct_ftan,
const_direct_fpatan,
const_direct_fcos,
const_direct_fsin,
const_native_fsincos,
const_direct_fscale,
const_native_fld,
const_native_fstp,
const_native_frstor,
const_native_next,
const_int3,
const_x86syscall,
const_x64syscall,
const_x64syscall_linux,
const_rcl16,
const_rcl32,
const_rcl64,
const_rcr16,
const_rcr32,
const_rcr64,
const_div64,
const_idiv64,
const_random32,
const_random64,
const_readtsc,
const_helper_getcpu,
const_cpuid,
const_getsegmentbase,
const_updateflags_arm64,
const_reset_fpu,
const_sha1msg2,
const_sha1rnds4,
const_sha256msg1,
const_sha256msg2,
const_sha256rnds2,
const_fpu_loadenv,
const_fpu_savenv,
const_fpu_fxsave32,
const_fpu_fxsave64,
const_fpu_fxrstor32,
const_fpu_fxrstor64,
const_fpu_xsave,
const_fpu_xrstor,
const_fpu_fbld,
const_fpu_fbst,
const_sse42_compare_string_explicit_len,
const_sse42_compare_string_implicit_len,
const_x64test_step,
const_printtrace,
const_epilog,
const_jmptbl32,
const_jmptbl48,
const_jmptbl64,
const_context,
const_8b_m7_m6_m5_m4_m3_m2_m1_0,
const_8b_7_6_5_4_3_2_1_0,
const_8b_15_14_13_12_11_10_9_8,
const_4f_m1_1_m1_1,
const_2d_m1_1,
const_4f_1_m1_1_m1,
const_2d_1_m1,
const_last
} arm64_consts_t;
uintptr_t getConst(arm64_consts_t which);
// temporary define...
#define const_PrintTrace const_printtrace
#endif //__DYNAREC_ARM64_CONSTS__
+68 -9
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -23,12 +21,13 @@
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
(void)ip; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
uint8_t u8;
int64_t fixedaddress;
int unscaled;
int v1, v2;
@@ -51,11 +50,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FADD ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FADDS(v1, v1, v2);
} else {
FADDD(v1, v1, v2);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xC8:
case 0xC9:
@@ -68,11 +72,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FMUL ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FMULS(v1, v1, v2);
} else {
FMULD(v1, v1, v2);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xD0:
case 0xD1:
@@ -90,7 +99,7 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3, x4, v1, v2, ST_IS_F(0));
FCOM(x1, x2, x3);
break;
case 0xD8:
case 0xD9:
@@ -108,7 +117,7 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3, x4, v1, v2, ST_IS_F(0));
FCOM(x1, x2, x3);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 0xE0:
@@ -122,11 +131,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FSUB ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FSUBS(v1, v1, v2);
} else {
FSUBD(v1, v1, v2);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xE8:
case 0xE9:
@@ -139,11 +153,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FSUBR ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FSUBS(v1, v2, v1);
} else {
FSUBD(v1, v2, v1);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xF0:
case 0xF1:
@@ -156,11 +175,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FDIV ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FDIVS(v1, v1, v2);
} else {
FDIVD(v1, v1, v2);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xF8:
case 0xF9:
@@ -173,11 +197,16 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
INST_NAME("FDIVR ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FDIVS(v1, v2, v1);
} else {
FDIVD(v1, v2, v1);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
default:
DEFAULT;
@@ -190,12 +219,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FADDS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FADDD(v1, v1, s0);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 1:
INST_NAME("FMUL ST0, float[ED]");
@@ -203,12 +237,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FMULS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FMULD(v1, v1, s0);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 2:
INST_NAME("FCOM ST0, float[ED]");
@@ -222,7 +261,7 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
FCVT_D_S(s0, s0);
FCMPD(v1, s0);
}
FCOM(x1, x2, x3, x4, v1, v2, ST_IS_F(0));
FCOM(x1, x2, x3);
break;
case 3:
INST_NAME("FCOMP ST0, float[ED]");
@@ -236,7 +275,7 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
FCVT_D_S(s0, s0);
FCMPD(v1, s0);
}
FCOM(x1, x2, x3, x4, v1, s0, ST_IS_F(0));
FCOM(x1, x2, x3);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 4:
@@ -245,12 +284,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FSUBS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FSUBD(v1, v1, s0);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 5:
INST_NAME("FSUBR ST0, float[ED]");
@@ -258,12 +302,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FSUBS(v1, s0, v1);
} else {
FCVT_D_S(s0, s0);
FSUBD(v1, s0, v1);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 6:
INST_NAME("FDIV ST0, float[ED]");
@@ -271,12 +320,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FDIVS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FDIVD(v1, v1, s0);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 7:
INST_NAME("FDIVR ST0, float[ED]");
@@ -284,12 +338,17 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = fpu_get_scratch(dyn, ninst);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(s0, ed, fixedaddress);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
if(ST_IS_F(0)) {
FDIVS(v1, s0, v1);
} else {
FCVT_D_S(s0, s0);
FDIVD(v1, s0, v1);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
default:
DEFAULT;
+93 -91
View File
@@ -5,10 +5,8 @@
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "box64cpu.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
@@ -23,9 +21,9 @@
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
(void)ip; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
@@ -128,7 +126,7 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
} else {
FCMPD_0(v1);
}
FCOM(x1, x2, x3, x4, 0, 0, ST_IS_F(0)); // same flags...
FCOM(x1, x2, x3); // same flags...
break;
case 0xE5:
INST_NAME("FXAM");
@@ -270,71 +268,68 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
case 0xF0:
INST_NAME("F2XM1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
CALL(native_f2xm1, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (F2XM1)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
CALL_D(const_direct_f2xm1, v1, v1, -1, -1, -1);
break;
case 0xF1:
INST_NAME("FYL2X");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fyl2x, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FYL2X)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
CALL_D(const_direct_fyl2x, v2, v1, v2, -1, -1);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 0xF2:
INST_NAME("FPTAN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
CALL(native_ftan, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FPTAN)\n");
if(PK(0)==0xdd && PK(1)==0xd8) {
MESSAGE(LOG_DUMP, "Optimized next DD D8 fstp st0, st0, not emitting 1\n");
u8 = F8;
u8 = F8;
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
} else {
X87_PUSH_OR_FAIL(v1, dyn, ninst, x1, NEON_CACHE_ST_F);
X87_PUSH_OR_FAIL(v2, dyn, ninst, x1, NEON_CACHE_ST_F);
if(ST_IS_F(0)) {
FMOVS_8(v1, 0b01110000);
FMOVS_8(v2, 0b01110000);
} else {
FMOVD_8(v1, 0b01110000);
FMOVD_8(v2, 0b01110000);
}
v1 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
}
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
else
u8 = 0;
CALL_D(const_direct_ftan, v1, v1, -1, u8, -1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xF3:
INST_NAME("FPATAN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fpatan, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FPATAN)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
else
u8 = 0;
CALL_D(const_direct_fpatan, v2, v1, v2, u8, -1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 0xF4:
INST_NAME("FXTRACT");
MESSAGE(LOG_DUMP, "Need Optimization\n");
MESSAGE(LOG_DUMP, "Need Optimization (FXTRACT)\n");
X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, 0);
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fxtract, -1);
CALL(const_native_fxtract, -1);
x87_unstackcount(dyn, ninst, x1, i1);
break;
case 0xF5:
INST_NAME("FPREM1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
#if 0
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fprem1, -1);
x87_unstackcount(dyn, ninst, x1, i1);
#else
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
s0 = fpu_get_scratch(dyn, ninst);
@@ -355,11 +350,10 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
LSRx(x4, x4, 1);
BFIw(x1, x4, 8, 1);
STRw_U12(x1, xEmu, offsetof(x64emu_t, sw));
#endif
break;
case 0xF6:
INST_NAME("FDECSTP");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
BARRIER(BARRIER_FLOAT);
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
SUBw_U12(x2, x2, 1);
ANDw_mask(x2, x2, 0, 2); //mask=7
@@ -367,7 +361,7 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
break;
case 0xF7:
INST_NAME("FINCSTP");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
BARRIER(BARRIER_FLOAT);
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
ADDw_U12(x2, x2, 1);
ANDw_mask(x2, x2, 0, 2); //mask=7
@@ -375,14 +369,6 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
break;
case 0xF8:
INST_NAME("FPREM");
#if 0
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fprem, -1);
x87_unstackcount(dyn, ninst, x1, i1);
#else
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
s0 = fpu_get_scratch(dyn, ninst);
@@ -403,44 +389,44 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
LSRx(x4, x4, 1);
BFIw(x1, x4, 8, 1);
STRw_U12(x1, xEmu, offsetof(x64emu_t, sw));
#endif
break;
case 0xF9:
INST_NAME("FYL2XP1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fyl2xp1, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FYL2XP1)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
CALL_D(const_direct_fyl2xp1, v2, v1, v2, -1, -1);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 0xFA:
INST_NAME("FSQRT");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
if(ST_IS_F(0)) {
FSQRTS(v1, v1);
} else {
FSQRTD(v1, v1);
}
X87_CHECK_PRECISION(v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xFB:
INST_NAME("FSINCOS");
MESSAGE(LOG_DUMP, "Need Optimization\n");
MESSAGE(LOG_DUMP, "Need Optimization (FSINCOS)\n");
X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, 0);
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fsincos, -1);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
CALL_(const_native_fsincos, -1, BOX64ENV(dynarec_fastround) ? 0 : u8);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
x87_unstackcount(dyn, ninst, x1, i1);
break;
case 0xFC:
INST_NAME("FRNDINT");
#if 0
MESSAGE(LOG_DUMP, "Need Optimization\n");
// use C helper for now, nothing staightforward is available
x87_forget(dyn, ninst, x1, x2, 0);
CALL(native_frndint, -1);
#else
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
u8 = x87_setround(dyn, ninst, x1, x2, x3);
if(ST_IS_F(0)) {
@@ -449,32 +435,37 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
FRINTID(v1, v1);
}
x87_restoreround(dyn, ninst, u8);
#endif
break;
case 0xFD:
INST_NAME("FSCALE");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(native_fscale, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FSCALE)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = x87_get_st(dyn, ninst, x1, x2, 1, NEON_CACHE_ST_D);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
CALL_D(const_direct_fscale, v1, v1, v2, -1, -1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xFE:
INST_NAME("FSIN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
CALL(native_fsin, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FCOS)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
CALL_D(const_direct_fsin, v1, v1, -1, -1, -1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
case 0xFF:
INST_NAME("FCOS");
MESSAGE(LOG_DUMP, "Need Optimization\n");
i1 = x87_stackcount(dyn, ninst, x1);
x87_forget(dyn, ninst, x1, x2, 0);
CALL(native_fcos, -1);
x87_unstackcount(dyn, ninst, x1, i1);
MESSAGE(LOG_DUMP, "Need Optimization (FCOS)\n");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
CALL_D(const_direct_fcos, v1, v1, -1, -1, -1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
break;
default:
DEFAULT;
@@ -483,7 +474,7 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
switch((nextop>>3)&7) {
case 0:
INST_NAME("FLD ST0, float[ED]");
X87_PUSH_OR_FAIL(v1, dyn, ninst, x1, box64_dynarec_x87double?NEON_CACHE_ST_D:NEON_CACHE_ST_F);
X87_PUSH_OR_FAIL(v1, dyn, ninst, x1, (BOX64ENV(dynarec_x87double)==1)?NEON_CACHE_ST_D:NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VLD32(v1, ed, fixedaddress);
if(!ST_IS_F(0)) {
@@ -497,7 +488,11 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
s0 = v1;
else {
s0 = fpu_get_scratch(dyn, ninst);
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x2, x4);
FCVT_S_D(s0, v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
}
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
VST32(s0, ed, fixedaddress);
@@ -507,37 +502,44 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
if(!ST_IS_F(0)) {
if(!BOX64ENV(dynarec_fastround))
u8 = x87_setround(dyn, ninst, x1, x5, x4);
FCVT_S_D(v1, v1);
if(!BOX64ENV(dynarec_fastround))
x87_restoreround(dyn, ninst, u8);
}
VST32(v1, ed, fixedaddress);
X87_POP_OR_FAIL(dyn, ninst, x3);
break;
case 4:
INST_NAME("FLDENV Ed");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE?
MESSAGE(LOG_DUMP, "Need Optimization (FLDENV)\n");
BARRIER(BARRIER_FLOAT); // maybe only x87, not SSE?
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {
MOVx_REG(x1, ed);
}
MOV32w(x2, 0);
CALL(fpu_loadenv, -1);
CALL(const_fpu_loadenv, -1);
NATIVE_RESTORE_X87PC();
break;
case 5:
INST_NAME("FLDCW Ew");
GETEW(x1, 0);
STRH_U12(x1, xEmu, offsetof(x64emu_t, cw)); // hopefully cw is not too far for an imm8
if(dyn->need_x87check)
UBFXw(x87pc, x1, 8, 2);
break;
case 6:
INST_NAME("FNSTENV Ed");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE?
MESSAGE(LOG_DUMP, "Need Optimization (FNSTENV)\n");
BARRIER(BARRIER_FLOAT); // maybe only x87, not SSE?
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {
MOVx_REG(x1, ed);
}
MOV32w(x2, 0);
CALL(fpu_savenv, -1);
CALL(const_fpu_savenv, -1);
break;
case 7:
INST_NAME("FNSTCW Ew");
Loaded 100 of 1037 files, more files were not shown because too many files have changed in this diff. Show more