From 2ecbfae03b5242d8c73101cfd5803acc5a8dca71 Mon Sep 17 00:00:00 2001 From: Brandon Ros Date: Thu, 9 Apr 2026 08:20:30 -0400 Subject: [PATCH 1/3] cross compile --- ISSUE-165-TODO.md | 221 ---------------------------------------------- PARITY_DEBT.md | 65 -------------- flake.nix | 71 +++++++++++---- 3 files changed, 53 insertions(+), 304 deletions(-) delete mode 100644 ISSUE-165-TODO.md delete mode 100644 PARITY_DEBT.md diff --git a/ISSUE-165-TODO.md b/ISSUE-165-TODO.md deleted file mode 100644 index 6c6b054e..00000000 --- a/ISSUE-165-TODO.md +++ /dev/null @@ -1,221 +0,0 @@ -# Issue #165 Restructure Todo - -Tracking work for `restructure large files` on branch -`issue-165-restructure-large-files`. - -## 1. `emu/execution.rs` - -- [x] Extract shared run-loop startup, limit, loop-tracking, and trace helpers into `execution_control.rs` -- [x] Extract decode/cache-fill helpers out of `execution.rs` -- [x] Further separate single-threaded and multi-threaded runner concerns -- [x] Revisit REP-handling boundaries after the control-flow split - -## 2. Linux syscall gateways - -- [x] Convert `syscall32.rs` to descriptor-driven dispatch -- [x] Extract implemented `syscall32` handlers from the gateway -- [x] Convert `syscall64.rs` fallback name table to static metadata -- [x] Extract implemented `syscall64` handlers from the gateway - -## 3. `arch/x86/regs.rs` - -- [x] Macro-generate repetitive getter/setter helpers -- [x] Macro-generate repetitive show helpers -- [x] Preserve debugger/script register-name lookups while reducing duplication - -## 4. `maps/mod.rs` + `maps/mem64.rs` - -- [x] Extract shared scalar little-endian read/write helpers -- [x] Preserve `banzai` semantics -- [x] Preserve cross-map `write_bytes` behavior - -## 5. `windows/structures/kernel64.rs` - -- [x] Split the file into domain-oriented modules -- [x] Reassess macro/derive generation after the structural split - -## 6. Loader/API paired cleanup - -- [x] Share common readers between `loaders/pe/pe32.rs` and `loaders/pe/pe64.rs` -- [x] Extract common helper paths between `winapi32/ntdll.rs` and `winapi64/ntdll.rs` - -## 7. Deferred unless they block feature work - -- [x] Revisit `api/windows/winapi32/kernel32/mod.rs` and carry any remaining root-file cleanup into the later `kernel32` closeout sections below -- [x] Revisit `windows/constants.rs` and explicitly leave it alone for now unless feature work or code generation strategy changes - -## 8. Follow-up consistency cleanup - -- [x] Move the `emu/execution*` split into an `emu/execution/` module directory -- [x] Normalize `syscall32.rs` and `syscall64.rs` around one metadata/logging shape -- [x] Replace scalar helper string tags in `maps/mod.rs` and `maps/mem64.rs` with a typed enum -- [x] Run a focused review pass over the refactor diff before calling this polished - -## 9. Linux syscall architectural follow-up - -Section 2 and Section 8 got the syscall gateways into a more consistent state. -This section tracks the larger structural cleanup that is still open. - -- [x] Split `syscall32.rs` into family-oriented modules behind a thin gateway (`fs`, `proc`, `net`, `memory`, `signal`, `misc`) -- [x] Split `syscall64.rs` into the same family-oriented module layout so 32-bit and 64-bit syscall code are organized the same way -- [x] Move fallback syscall-name/descriptor metadata out of the top-level gateway bodies so both 32-bit and 64-bit gateways now follow the same thin-dispatch shape -- [x] Normalize the remaining legacy per-branch syscall logging/tracing so implemented handlers and fallback paths share one format -- [x] Reassess which syscall helpers can actually be shared across 32-bit and 64-bit without hiding ABI differences (kept ABI-specific handlers separate in this pass) - -## 10. WinAPI `kernel32` pair (`#128`) - -Issue `#128` is about reducing duplication without hiding ABI adaptation. -This section tracks the `kernel32` pair specifically. - -- [x] Extract shared API resolution, name lookup, and library-loading helpers from `winapi32/kernel32/mod.rs` and `winapi64/kernel32/mod.rs` -- [x] Keep 32-bit and 64-bit gateway / ABI adaptation thin and explicit -- [x] Reduce the size of both `kernel32` gateway files without growing a generic `common` dumping ground - -## 11. WinAPI `ntdll` pair (`#128`) - -This section should prefer domain-oriented helpers over growing `api/windows/common/ntdll.rs`. - -- [x] Split `winapi32/ntdll.rs` into domain-oriented helpers (`heap`, `file`, `memory`, `loader`, `string`, `sync`, `misc`) behind a thin gateway -- [x] Split `winapi64/ntdll.rs` into the same domain-oriented layout -- [x] Keep `api/windows/common/ntdll.rs` small and limited to obviously shared semantics -- [x] Reassess which `ntdll` helpers can actually be shared across 32-bit and 64-bit without hiding ABI differences - -## 12. `maps/mod.rs` - -- [x] Separate map registry / indexing / allocation concerns from string, memcpy, and memset utility helpers -- [x] Preserve `banzai`, cross-map writes, and the typed scalar helper boundary -- [x] Reassess which helpers belong in `Maps` versus `Mem64` -- Boundary decision: keep cross-map orchestration in `Maps` (map lookup, cross-boundary writes/reads, search/inspection helpers) and keep single-region primitives in `Mem64` (contiguous scalar/string read-write implementation). - -## 13. `emu/loaders.rs` - -- [x] Separate PE32, PE64, ELF64, and Mach-O loader flows from generic `load_code` orchestration -- [x] Extract per-format base-selection and mapping helpers into format-oriented modules -- [x] Preserve current loader behavior, entry-point setup, and library mapping semantics -- Integrated validation: `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passes on the combined Sections 9-13 tree. - -## Remaining-wave subagent instructions - -Use these rules for every remaining numbered section below. - -- Give one subagent one numbered section end-to-end. Do not split one section across multiple workers unless we intentionally break that section apart first. -- The section owner updates only its own checkbox list and notes in this file. -- Stay inside the declared file set for the section unless a tiny integration touch is required elsewhere. -- Prefer structural splits, thinner root files, and clearer module boundaries over clever abstraction. -- Keep ABI adaptation explicit. Share semantic logic only where behavior is truly the same. -- Use `nix develop`. -- On Apple Silicon, validate with `--target x86_64-apple-darwin`. -- Preferred worker validation: `cargo check -p libmwemu --target x86_64-apple-darwin`. -- Preferred integrator validation before calling a wave done: `cargo test --target x86_64-apple-darwin`. -- Do not run `cargo fmt --all`. -- Progress visibility rule: boxes flip only after a worker returns and I review/integrate the result; active work is tracked with `In-progress note` lines under each section. - -## 14. Linux syscall logging and tracing normalization - -This is the one explicitly open item from the current syscall wave. - -- [x] Introduce one per-ABI trace/log helper shape for the remaining legacy fallback paths so `syscall32` and `syscall64` each have a consistent internal format without pretending their calling conventions are identical -- [x] Replace the large remaining ad-hoc `log::trace!` arms in `syscall32/misc.rs` with helper-driven formatting so legacy fallback entries use the same prefix, syscall-name style, spacing, and argument-label style as implemented handlers -- [x] Do the same cleanup in `syscall64/misc.rs`, keeping argument extraction ABI-correct while making the visible trace format match the 32-bit side at the presentation level -- [x] Normalize name/style drift such as `fork` vs `fork()`, empty trailing placeholders, and inconsistent `fd/buf/sz` label wording without changing syscall behavior -- [x] Keep behavior-changing handlers behavior-only: if a branch currently stops the emulator, sets a return value, or touches memory, the cleanup here should only reroute logging/trace formatting around that logic -- [x] Keep 32-bit and 64-bit parameter formatting ABI-correct rather than forcing a misleading shared register-format helper -- [x] Preserve the current family-oriented module layout and thin gateway shape; this section is about consistency, not another structural rewrite -- [x] Avoid changing syscall semantics while normalizing traces -- Worker ownership: `crates/libmwemu/src/syscall/linux/syscall32.rs`, `crates/libmwemu/src/syscall/linux/syscall32/`, `crates/libmwemu/src/syscall/linux/syscall64.rs`, `crates/libmwemu/src/syscall/linux/syscall64/` -- Worker result: completed; Section 14 now uses per-ABI helper-driven syscall trace formatting in `syscall32/misc.rs` and `syscall64/misc.rs`, normalizes leftover naming/style drift in the legacy fallback paths, and leaves only auxiliary status/error logs as direct `log::trace!` calls. `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 15. Linux syscall root files: final thin-gateway pass - -- [x] Move any remaining obvious concrete handler bodies out of top-level `syscall32.rs` and `syscall64.rs` into family modules where the concern boundary is clear -- [x] Leave the root files as gateway entrypoints, shared macros/helpers, and minimal legacy dispatch glue only -- [x] Keep 32-bit and 64-bit organization mirrored even when the actual handler bodies differ -- [x] Do not force cross-ABI sharing just to reduce line count -- Worker ownership: `crates/libmwemu/src/syscall/linux/syscall32.rs`, `crates/libmwemu/src/syscall/linux/syscall32/`, `crates/libmwemu/src/syscall/linux/syscall64.rs`, `crates/libmwemu/src/syscall/linux/syscall64/` -- Worker result: completed; root syscall files are now thin gateways and `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 16. WinAPI `kernel32` pair: final root-file thin-down (`#128`) - -- [x] Reduce `winapi32/kernel32/mod.rs` and `winapi64/kernel32/mod.rs` toward module registry plus gateway responsibilities only -- [x] Move any remaining resolver, loader, IAT, or name-lookup helpers out of the root files into focused modules -- [x] Keep 32-bit and 64-bit ABI adaptation explicit -- [x] If more shared logic is clearly safe, prefer small helpers under `api/windows/common/kernel32.rs` or pair-local helpers, not a new generic dumping ground -- [x] Replace the still-massive flat `mod.rs` layout with a folder-backed structure so the root `kernel32` files stop being giant registries of hundreds of sibling modules -- [x] Group the extracted modules by concern in a way that makes navigation obvious, for example loader/resolver, process/thread, file/path, memory, registry, locale/string, and synchronization buckets -- [x] Leave the root `winapi32/kernel32/mod.rs` and `winapi64/kernel32/mod.rs` files as short hubs: module declarations, gateway dispatch, and only tiny glue/helpers that genuinely belong at the root -- [x] Mirror the concern layout across 32-bit and 64-bit sides so issue `#128` stays visible as “thin ABI wrappers around parallel semantic buckets,” not two unrelated trees -- [x] Do not satisfy this by stuffing more into `common/kernel32.rs`; the remaining work here is primarily structural organization of the pair-local trees -- Worker ownership: `crates/libmwemu/src/api/windows/common/kernel32.rs`, `crates/libmwemu/src/api/windows/winapi32/kernel32/`, `crates/libmwemu/src/api/windows/winapi64/kernel32/` -- Worker result: completed; mirrored folder-backed concern buckets landed under both `winapi32/kernel32/` and `winapi64/kernel32/`, the root `mod.rs` files are now hub-plus-gateway only, and `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 17. WinAPI `ntdll` pair: final root-file thin-down (`#128`) - -- [x] Move any remaining obvious concrete handlers out of the root `winapi32/ntdll.rs` and `winapi64/ntdll.rs` files into the existing domain modules -- [x] Keep `api/windows/common/ntdll.rs` intentionally small; only obviously shared semantics belong there -- [x] Preserve the current domain split (`heap`, `file`, `memory`, `loader`, `string`, `sync`, `misc`) and keep ABI wrappers explicit -- [x] If the root files remain large after handler moves, prefer a cleaner `ntdll/mod.rs` hub shape over adding more logic to the root files -- Worker ownership: `crates/libmwemu/src/api/windows/common/ntdll.rs`, `crates/libmwemu/src/api/windows/winapi32/ntdll.rs`, `crates/libmwemu/src/api/windows/winapi32/ntdll/`, `crates/libmwemu/src/api/windows/winapi64/ntdll.rs`, `crates/libmwemu/src/api/windows/winapi64/ntdll/` -- Worker result: completed; `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 18. PE loader structural split / folderization pass - -- [x] Move `pe32.rs` and `pe64.rs` toward a clearer folder-backed layout if that gives us better concern boundaries -- [x] Move the large PE32 structure/type definitions out of `pe32.rs` into dedicated submodules so the root file no longer mixes type declarations with parser/load orchestration -- [x] Do the same for PE64 where the root file still mixes width-specific structures with loader/parser logic -- [x] Split parser/load orchestration from data-model definitions so `pe32.rs` and `pe64.rs` become small hub files plus high-level entry types, not giant mixed “everything PE” roots -- [x] Keep `binding`, `resource`, and `relocation` helpers in their own modules and continue the split with parser-oriented modules rather than letting new parsing helpers accumulate back into the roots -- [x] Reassess which PE helpers or structures can truly be shared between 32-bit and 64-bit after the structural split; do not merge layouts that differ by field width or representation -- [x] Keep parser behavior stable; do not mix a structural split with a broad semantic rewrite in the same pass -- [x] Share 32-bit and 64-bit code only where the representation and behavior are genuinely the same -- Worker ownership: `crates/libmwemu/src/loaders/pe/pe32.rs`, `crates/libmwemu/src/loaders/pe/pe64.rs`, plus any new `crates/libmwemu/src/loaders/pe/*` structural files needed for the split -- Worker result: completed; common identical-layout PE model types moved to `loaders/pe/shared.rs`, width-specific PE32/PE64 headers moved into `pe32/types.rs` and `pe64/types.rs`, and parser/load orchestration moved into `pe32/parser.rs` and `pe64/parser.rs` so the root files are now small hubs plus exported entry types. `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 19. `windows/peb/peb64.rs` structural split - -- [x] Separate bootstrap and init helpers from dynamic loader-list maintenance and rebuild helpers -- [x] Keep PEB/TEB creation behavior stable -- [x] Keep dynamic module link/unlink, hash-table rebuild, and loader-global maintenance behavior stable -- [x] Prefer folder-backed organization if that gives clearer boundaries than another very long flat file -- Worker ownership: `crates/libmwemu/src/windows/peb/peb64.rs` and any new `crates/libmwemu/src/windows/peb/*` structural files created by the split -- Worker result: completed; folder-backed `peb64/` layout landed and `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 20. `debug/gdb/target.rs` arch separation pass - -- [x] Split the x86_64, x86, and aarch64 GDB target implementations into separate files under a folder-backed layout -- [x] Keep shared XML generation and library-list helpers in a small shared helper module -- [x] Avoid behavior changes to register access, resume, step, or memory read/write semantics in the same pass -- [x] Prefer structural clarity over aggressive trait abstraction unless the shared surface becomes truly obvious -- Worker ownership: `crates/libmwemu/src/debug/gdb/target.rs` and any new `crates/libmwemu/src/debug/gdb/target/*` files created by the split -- Worker result: completed; folder-backed `debug/gdb/target/` layout landed and `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 21. `winapi32/wininet.rs` folderization pass - -- [x] Move the file toward a folder-backed layout with concern-oriented modules -- [x] Group helpers by concern such as session open/connect, request creation, send/query, URL parsing, and handle teardown -- [x] Preserve current handle semantics and tracing behavior -- [x] Keep this pass structural first; avoid mixing in new wininet behavior unless a bug is directly uncovered -- Worker ownership: `crates/libmwemu/src/api/windows/winapi32/wininet.rs` and any new `crates/libmwemu/src/api/windows/winapi32/wininet/*` files created by the split -- Worker result: completed; folder-backed `wininet/` layout landed and `nix develop` + `cargo check -p libmwemu --target x86_64-apple-darwin` passed. - -## 22. Explicitly leave alone for now - -Do not assign subagents here unless feature work or new evidence changes the decision. - -- [x] `crates/libmwemu/src/arch/x86/regs.rs` is large but coherent enough after the recent cleanup -- [x] `crates/libmwemu/src/arch/x86/flags.rs` is high-risk and low-payoff for more structure work right now -- [x] `crates/libmwemu/src/windows/constants.rs` is mostly declarative data and does not need a restructure pass for this issue -- [x] `crates/libmwemu/src/maps/mem64.rs` should remain the single-region primitive owner for now -- [x] `crates/libmwemu/src/emu/operands.rs` is dense but focused and does not need a restructure pass right now -- [x] `crates/libmwemu/src/emu/execution/mod.rs` is already the intended execution hub after the earlier split -- [x] `crates/libmwemu/src/debug/console.rs` stays as-is unless command families start expanding again -- [x] `crates/libmwemu/src/debug/script.rs` stays as-is unless the script language surface grows enough to justify command modules -- [x] `crates/libmwemu/src/emu/object_handle/hive_parser.rs` stays as a cohesive parser/cache/test unit -- [x] `crates/pymwemu/src/lib.rs` stays as-is unless we later change how bindings are generated or organized - -## 23. Issue #165 close-out checklist - -- [x] Finish the formerly open concrete work in Sections 14, 16, and 18; no narrower follow-up issue was needed for this pass -- [x] Rerun the largest non-test `.rs` file report and confirm the remaining top files are either consciously deferred (`regs.rs`, `flags.rs`, `constants.rs`, `console.rs`, `script.rs`, `mem64.rs`) or now acceptable family/root files after this restructure wave (`syscall32/misc.rs`, `syscall64/misc.rs`, `winapi32/kernel32/mod.rs`) -- [x] Rerun `nix develop` + `cargo test --target x86_64-apple-darwin` on the combined tree -- [x] Post a final issue comment summarizing what was completed here versus what was intentionally deferred (`issuecomment-4201878954`) -- [ ] Close Issue #165 if the remaining work has either landed or been split into narrower follow-up issues diff --git a/PARITY_DEBT.md b/PARITY_DEBT.md deleted file mode 100644 index 3b93a901..00000000 --- a/PARITY_DEBT.md +++ /dev/null @@ -1,65 +0,0 @@ -# x86/AArch64 Parity Debt - -Remaining x86-only code that is either deferred or architecturally -x86-specific by design. - ---- - -## Deferred - -### 1. Serialization (`serialization/emu.rs`) — Low Priority - -The entire `SerializableEmu` struct and its `From<&Emu>` impl are x86-only. -Calling `dump_to_file()` or deserializing on aarch64 will panic. - -- `emu.x86_instruction()` — panics -- `emu.regs().clone()` — panics -- `emu.pre_op_regs()` / `emu.post_op_regs()` — panics -- `emu.flags()` — panics -- `emu.fpu().clone()` — panics - -**Fix:** Add `ArchSerializableState` enum with x86 and aarch64 variants. -Serialize aarch64 registers (x0-x30, sp, pc, NZCV) and current instruction. - -### 2. GDB server (`debug/gdb/`) — Deferrable - -Entirely x86: `target.rs`, `registers.rs`, `mod.rs` all use `regs()`, -`flags()`, `fpu()` without guards. ~12 unguarded call sites. - -**Fix:** Add aarch64 register set support in GDB protocol (x0-x30, sp, pc, -CPSR/NZCV). This is Step 13 in the plan. - ---- - -## Architecturally x86-specific (not bugs) - -These are x86-only by design and not reachable during aarch64 emulation. - -| File | Reason | -|------|--------| -| `emu/operands.rs` | x86 instruction operand decoding; aarch64 handlers don't use it | -| `emu/display.rs` `featured_regs32/64` | x86 display methods; `featured_regs_aarch64()` exists, callers dispatch | -| `emu/execution.rs` `step_single_threaded` | Deprecated, x86-only by design | -| `emu/stack.rs` `push32/pop32` | 32-bit x86 stack ops; aarch64 uses `push64/pop64` (already fixed) | -| `emu/winapi.rs`, `emu/tls.rs`, `emu/fls.rs` | Windows API emulation, x86/x64-only | -| `emu/call_stack.rs` | Architecture-neutral, no `regs()` calls | -| `emu/memory.rs` `memory_operand_to_address` | x86 operand syntax parser; guarded with early panic on aarch64 | - ---- - -## Previously fixed (this refactor) - -| Item | Fix | -|------|-----| -| `emu/stack.rs` push64/pop64 | Now uses `sp()`/`set_sp()`/`pc()` — works on both arches | -| `emu/exception_handlers.rs` | Uses `pc()`, returns early on aarch64 | -| `emu/memory.rs` trace logging | All `regs().rip` replaced with `pc()` | -| `emu/memory.rs` operand parsing | Guarded with arch check | -| `emu/trace.rs` capture_pre_op/post_op | aarch64 register snapshots implemented | -| `emu/trace.rs` write_to_trace_file | aarch64 reg diff via `RegsAarch64::diff()` | -| `debug/console.rs` | Full aarch64 support: registers, flags, stack, radare2 | -| `debug/script.rs` | All commands arch-dispatched | -| `debug/definitions.rs` | Uses `pc()`, aarch64 register lookup | -| `debug/tracing.rs` | `TraceRecord::capture()` dispatches to aarch64 | -| `threading/scheduler.rs` | Threading enabled for aarch64 | -| `pymwemu` | `get_reg`/`set_reg` arch-dispatched, added `get_pc`/`set_pc`/`get_sp`/`set_sp` | diff --git a/flake.nix b/flake.nix index 9604a061..901f51ef 100644 --- a/flake.nix +++ b/flake.nix @@ -7,24 +7,59 @@ outputs = { nixpkgs, rust-overlay, ... }: let - targets = { - "x86_64-linux" = [ "x86_64-unknown-linux-gnu" ]; - "aarch64-darwin" = [ "aarch64-apple-darwin" "x86_64-apple-darwin" ]; + system = "aarch64-darwin"; + pkgs = import nixpkgs { + inherit system; + overlays = [ rust-overlay.overlays.default ]; }; - mkShell = system: - let - pkgs = import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; - toolchain = pkgs.rust-bin.stable.latest.default.override { - extensions = [ "rust-src" "rust-analyzer" "clippy" ]; - targets = targets.${system}; - }; - in - pkgs.mkShell { - nativeBuildInputs = [ toolchain pkgs.pkg-config ]; - buildInputs = [ pkgs.openssl ]; + + # Rust toolchain with all cross-compilation targets + toolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = [ "rust-src" "rust-analyzer" "clippy" ]; + targets = [ + "aarch64-apple-darwin" + "x86_64-unknown-linux-gnu" + "aarch64-unknown-linux-gnu" + "aarch64-pc-windows-gnullvm" + ]; + }; + + # Pre-built LLVM/Clang toolchain for Windows cross-compilation. + # Provides {x86_64,aarch64}-w64-mingw32-clang. + # https://github.com/mstorsjo/llvm-mingw + llvm-mingw = pkgs.stdenv.mkDerivation { + pname = "llvm-mingw"; + version = "20260407"; + src = pkgs.fetchurl { + url = "https://github.com/mstorsjo/llvm-mingw/releases/download/20260407/llvm-mingw-20260407-ucrt-macos-universal.tar.xz"; + hash = "sha256:801b49549ae39043d7195062eede67916b5ab46318a89e3b8209dc8f49441abb"; }; - in { - devShells.x86_64-linux.default = mkShell "x86_64-linux"; - devShells.aarch64-darwin.default = mkShell "aarch64-darwin"; + sourceRoot = "."; + phases = [ "unpackPhase" "installPhase" ]; + installPhase = '' + mkdir -p $out + cp -r llvm-mingw-*/* $out/ + ''; + }; + + in + { + devShells.${system}.default = pkgs.mkShell { + nativeBuildInputs = [ + toolchain + pkgs.pkg-config + llvm-mingw + # GCC cross-compilers for Linux targets + pkgs.pkgsCross.gnu64.stdenv.cc + pkgs.pkgsCross.aarch64-multiplatform.stdenv.cc + ]; + + buildInputs = [ pkgs.openssl ]; + + # Cargo linkers for cross targets + CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_LINKER = "aarch64-w64-mingw32-clang"; + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER = "x86_64-unknown-linux-gnu-gcc"; + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = "aarch64-unknown-linux-gnu-gcc"; + }; }; -} +} \ No newline at end of file From 4145c9e289eee1575c3873d48a61e2928fd80ad2 Mon Sep 17 00:00:00 2001 From: Brandon Ros Date: Thu, 9 Apr 2026 08:22:25 -0400 Subject: [PATCH 2/3] hello world --- examples/hello-world/Makefile | 29 +++++++++++++++++++++++ examples/hello-world/hello-linux-arm64 | Bin 0 -> 70280 bytes examples/hello-world/hello-linux-x64 | Bin 0 -> 15856 bytes examples/hello-world/hello-mac-arm64 | Bin 0 -> 33440 bytes examples/hello-world/hello-win-arm64.exe | Bin 0 -> 88064 bytes examples/hello-world/hello-win-x64.exe | Bin 0 -> 89088 bytes examples/hello-world/main.c | 6 +++++ 7 files changed, 35 insertions(+) create mode 100644 examples/hello-world/Makefile create mode 100755 examples/hello-world/hello-linux-arm64 create mode 100755 examples/hello-world/hello-linux-x64 create mode 100755 examples/hello-world/hello-mac-arm64 create mode 100755 examples/hello-world/hello-win-arm64.exe create mode 100755 examples/hello-world/hello-win-x64.exe create mode 100644 examples/hello-world/main.c diff --git a/examples/hello-world/Makefile b/examples/hello-world/Makefile new file mode 100644 index 00000000..d2d02281 --- /dev/null +++ b/examples/hello-world/Makefile @@ -0,0 +1,29 @@ +CC_NATIVE = cc +CC_LINUX64 = x86_64-unknown-linux-gnu-gcc +CC_LINARM64 = aarch64-unknown-linux-gnu-gcc +CC_WINX64 = x86_64-w64-mingw32-clang +CC_WINARM64 = aarch64-w64-mingw32-clang + +SRC = main.c + +all: hello-mac-arm64 hello-linux-x64 hello-linux-arm64 hello-win-x64.exe hello-win-arm64.exe + +hello-mac-arm64: $(SRC) + $(CC_NATIVE) $(SRC) -o $@ + +hello-linux-x64: $(SRC) + $(CC_LINUX64) $(SRC) -o $@ + +hello-linux-arm64: $(SRC) + $(CC_LINARM64) $(SRC) -o $@ + +hello-win-x64.exe: $(SRC) + $(CC_WINX64) $(SRC) -o $@ + +hello-win-arm64.exe: $(SRC) + $(CC_WINARM64) $(SRC) -o $@ + +clean: + rm -f hello-mac-arm64 hello-linux-x64 hello-linux-arm64 hello-win-x64.exe hello-win-arm64.exe + +.PHONY: all clean \ No newline at end of file diff --git a/examples/hello-world/hello-linux-arm64 b/examples/hello-world/hello-linux-arm64 new file mode 100755 index 0000000000000000000000000000000000000000..cf82a0a2b66f6dcebef2ab392b8187639f0999fb GIT binary patch literal 70280 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 bdpJUGEVz!Vwi{OPe|&9d`DZmWGVcFhulscz literal 0 HcmV?d00001 diff --git a/examples/hello-world/hello-linux-x64 b/examples/hello-world/hello-linux-x64 new file mode 100755 index 0000000000000000000000000000000000000000..5c98f7c3e07ae6d8f0140a901ea7cc4bcdf4cf71 GIT binary patch literal 15856 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 V&YK;rBi-Mn>wX$s|HC$hdjeDHHlF|h literal 0 HcmV?d00001 diff --git a/examples/hello-world/hello-win-arm64.exe b/examples/hello-world/hello-win-arm64.exe new file mode 100755 index 0000000000000000000000000000000000000000..331e95dbc7532283b7e499be6a2e5ce665e6369a GIT binary patch literal 88064 zcmeEv33yaR)^^>k``*5tq&w*(osgvi1d^~N5H>|=HiZDPJD`psh5(U}gd}VV5>OEZ zl*}-SdsG|=;tb=U0_up%DDJr7u0b8e9RY>7kpDe(Z*|{5bj0ufzUTX&fATzCb>35_ zs!p9cwcRaa&soGI#+Ztq^DpcKKSM79KQ?n`EZb&0pS4{Y^L*Ci+2ysN>YA!qH6?RH zr6rY>Rdt~Y%0e~sD?{a#q2c2uh2~bxDC^movGF4qo3S~Du|K~M&rX-vUX*o!b!4U- z%UBvf25H6E$N&N#C&QdWw9J@`v!XHEg;cu{3Y)%MWU}){3W?%~1TSfNU&eOZWm*iz zb~$l9W77$TE%k_W{%y)e__Uk_Ok2P7(~K4{8I5d1wY4Mn9IT7_&ahIg01+C$8R!zj=wO;_2m{}2dIw_&qJLqME3lMaNBU2P9QE0EQ5mAbB-h6>YH%1B z)sP#G_D;})8wy@RR z4@R`kue^M|&Cq``ZemCVgUkoN<`3>e)fvXtne@J0@sV=s@SxLw{ z27Q019S$1~gDr=`rbC(zO?q+@*|-nt3FB9*pbsFw4|T2p{t$6bU^vD)w#(lTLuDnf zzKdkk1${ZcxnqNVIcy6Zd7HArpjnHR=5O#KkBlF+kJ3&2aud;RE!?tY)ar?S(C?I% zn-XsENa4kE(!(vql6MaAYw=r-{xeRi-{IN3YN9R~s|_iBxr+b6Xwv`?e zNiQhj>GkpVqa4_24@T!6Rv2!{8W3)In0N-`{y}<%$oA8v27OexC3gs9fV1kQhK`7b zHiC~jJK^_Ht<EOJ8AGtlJ6OTKf)ZZA~^ZG49LDw`WRh z-hTJ3sW*bhr22`cLjMp8z1pnQPaI&=%TXTjme_F^as_spm`7+1L0LNvA8Wnt_&KCl zV*wgZHHgXITQ6lV9Wz-A`NDpa?P!f-JE$FOy4=te$au^LoxpK%``vIcsl}{pk=D;J=UXLqE0NA>qh#A(tOrWq*L3-uH9gJ9r}#+%L93z{0g0@ z?Ne->j<>;nB{A>5pV6s`bi$f-%*|R1HN0a~jE-?1#{9wh8_f^KUpRXe{J`*hrf;mF z`Kbi9p}s*J$c@L`LVm)w*JMh@oG;)fSHiyq?ylH=#J2MEF#5d7A>XKDE`!gfpsaF~ zCGzz^zAL}Hb>gS3ch#V7lYH_H@Sb+a?9$j|_(h=nD~DVnn>P$|K$AmnfS;Xm~Pki2TEtrbmCKe zYrtiI_c{D$@D$+~G zI$$n^4*FQ^6&-uLW~@21&)Ww-YQ936`$01MDTFebJFx~T>sSY@J&MHF9?H+gvX-|o zrwiYsd58Q>*Vu$ijOE=JXM9idjk_Ud+NSM=lD=AjzI;t_xf{aJ{~D}orGE%xdS-jF z2Dux`ZWz+^ffCq!2KFb^cBk%#COsJ4bE6GE{h&1c^dW0#9ftWD`WVu%fri2Q=b~Ig zQU*RudmIhpa!JmO`f02o?x*3eU=3RTX>G4(2TQC0e!GX(0{GUty-yBlx$m(dErp=V zXR?+}a?-Q6zRY%Hrn7J6!gn(Z*f-tK$Ghe54%n>kZdZ6m4#l4Ej;DJwtfOpRKk3>V zcskZPN?(P2_WN?;=eHwYGU_>kwe0DRkLKKVh`mJnSWo%F?MzBuohy0FreSH@Yp^#V z`44Grec9Txt%m=Qp5-&cE#Jbo_Wogb3(f$WaV7~I!T#sI+tL2Vay~CY9UaT(Z@-|m zwJ=9YTz$td^x5U%rd>E!P+ltUFy@IzK4dTb^uw^G7W8Fwzx_|X?mvpQ490$8ImXuO zXj3b6dF+Q)UVo6){{i#-o`ILfH0(t?(652qae1qml(hOb)YWnM`A2bRTYtpPCu5%8 z*D*XWS7j4&m{COQOD^oVANI>*yUsC@ugJgaoc*v@~*-?NiVY$&pf5Ge6_| z(Ois;-LcpwAbp?08e|u(1^Q|(69e0z?fRdr^Ha#hw(aj4-eF)|dnBW%7=8IPbke0= z=jiA|jFEXGfoa@bl~O-3H*0q)_8J#T@Lf8GVy`io{GImavX1eHF-i3{V}Gx7-E`x= zIP3vY-}K8^lipy}*{HC>{jd?{690aTLu%JPC2=#&4O^i5u~Wk>EpyI*eMi8~!?AZA z)&#rrxrz5tn%S@qc@peC5p|M}>!_2<++;S$IRC(Zc;E6iFShE3O|Zqo6_n}T2I$Sx zTQ8MfI)r{d7RPW#VVn2g!T21uZ?)X?;UATzf8D4yebNj2ckIQcK}XDKTeE)jHYA`w zXs*KnW&H$v-uPi_j=NZHI;5zZ4=YOExA2+o;4?>1C+36o zx5{i@4$5QNs?@81*WgEU?|zx>u<4fFGHVg^bd0%8z?7HjI&!f%XFtxzJ=(ohe|iY^ zJK+|tgT0?b8}mr-F388*GCj881Dx64hdr8cPFe~+=}*@}__+o4AiJDk57;XXvH|Q( zLMSgD^hfA(*ckpAK%XXTrZas7_||-Ho&Tfj3Ok^`iGG7m9D*Hi9?YY1B(*ARdt2|jdU(s;i-xz*+P~g|bj&C9@X1E3P2?}T5QlNz>Vvc7 zDy%J^I?jNi?+#+^LdP6f1>G?xaQnAce3oJZDI60>#TnP#&IgzKz1Xafj*p$=wbH@=}7b5KG>e@J$+@kr4fCah`xP< z=4Q-e_u)*sY^CLcx5D1~JlGJjHpEp`YflM%EBQ*@hQm z0qbfheB7hsoJ!|H;195N*=25a&VR=etU0znbj}R1Z?L!DoP+%U*?u#0rt5UjaWOyB zVjn=);u7gP9InT0Lf=xG=o;Oo-j?okM%xq{Uc4XI0XF4@7vnlno{oJ|0J_o~M02u? zJ##7b53Y%l>|Pi1ugCuCeOaGFdot32WRE3aFUGG^TJtByHPwDuI*$+*GRNq zx7&n0%{_UB>o5KUIYVFmp9%F;4?4=fraa{X?jdkt|?X~5$pJ~fJho3H|wm^5L zTI(77m6z9EKVc1Ox1X}W7yZQh4DDHE_tR+fkq3QM{!P@+bI~Tu>65!HKYu&U*}R{+ z4>^B3_M9eR>L)sf?^km2*wV~N|IW_1wixL%6MkJz*Y@C7k75jzi#{W|0ed*CM;AiB z&#*pLz}|Bt@9H@XmTpC`HwJM7LwhQC8QwWG2IoFnynT!0g%5e>kZ!r?quc`4khi>e zy9ehQ+CQUDCge`AcvzGA<{|$x7#o=kdv%nN3(TOKbNn9oa>*;-U_V*l3cuuYg})h$ zYlK@MYmIH|dfg%HXAWcT`WAC9`eeN|Pg#3A+6R1uu_&&o(RFh4Ki! z?BLII&?_A@-4_x%4|UMDIB1*&BQn=IXsmS+eisLwQ5<30H{w)v~ zUT4Rf?6}d64-{JE9JOO#UkeBAc&jb9&5pO*@k4ezvaF(_s(WZ*RZYc=EDsc{w({$C zTxZMW*yY(xU|X>1ruGc5)5CW9keXTZ=ayC0g=SREEy1%0Wi>TbHKCm0Q2~lSLs3?ZM6{r6Mkr^>S;Ix`Q!3|FRxPv}#ER#Z)XhfQa&k`zW!KU} z7umHr*|WNbvS;OnLOC^Mbqh)=P6Hs5esQd|)og8T?TX(u_*LL{CVphgP)HP9U0XJP zMin%}efyHS@~TRDz@x6Jw5lQm!_*QZdqz*sFXp(Qybfl$sLYbgo)IF(i3OL`g|e$d zRrBk}jNIDYLv*eRfH0sIn?l zKDT66S&!PXQc@Ypon2m2H@~D}!u+zD#i5xcAp!X69z71A>(x*xZM1jvQx;w__N0r!`X)a;W`KZ z!&=Y(_S@q_#9`ZSMRAs&X3wyTYx8W0UBrKDB=q{(N<;&HR^Wd}!jh0RFZ@<*#Jn;- zv28gRF8oiFdpyqRCsOdN(jYtlgNtHe2QLS_H^5uu;Ee>&hYMUs9lQ&{qlX%F$cn$! z;5CAm@8E3)Z#Q@&9lU43YX+~;!FvO|0k{~q)xkRg-bnD;`tB*^+$i{2z_$E81 z3w`wWgdM+N#}*fDw(-YyeAteU*>Mmzsp+qa9rv{3Q|$OWJDzRF3+#BM9dEMZt#-WK zj;&G|d+a#;hK={z@j*NO{x~`HRI7woI~L^yZJck%Bkg#q9oO0M8av)>$M@RtE<1kN zjzzg29EZO<4*#cLEKB`w>lem~i-#50R+p91R-kxxN#%@+GTiWBY;M`y((1)T6&IJ3 z*3=c3S6xs%bADwh=TsLLmsZWCrz9;2;F(cWTQ{S;$`Yt7UNEz|ro6IlCIn~Bte9Ur zn{w1*g}-1v@rsL)w-~D@6&ytiI4Uh$R9JmIZT84a1yOmr}RYQde&1sueQo(B}8r1Nz3aBs)J3(yaDkj+*3C2cX3s!R? zo1Ix!H>RYvZUk*CsiaX66u{DKL7( z#Ir_>>C?MCeW~S6+2b1Qa9gJo45c%l{#waLA2#M%dpREt;c5774_dJvM<-O+qj)OkN%f=6EF7Ew-Use8Ut0O`$9W{X0K91=_X1Sf?b3;d zdVDWGzDITe;9kB@l$*r$>Hbk33q^PdoR{|ziuljp{|^?RXYlbyXOtBD(!%)VGd6M3 z@JaJ)KX|RW_@z%{N-7Y2ENCp4r?|-ueB)^m$o1iJN zzT^(EekmUBRmz1-i5-n5?L1Cl|OtODpXT??yytPRR_D_^ZvjJT=8fce` z=2%jvMC-N~rzS#>atyM4!>aGJE^yV;9X&>d9*n*S5)rlx_NSpKWa1$XF{>Y`yrH() zOwx+|n?c5hlH&AgH9F$j9b#59alwF!w+5EgWHVwp%jYqsXe?8wkmX|94&PX-Bjeg> z0(F&-yw7SA)#GpL-0|d31qrqp5(wEI6^NR7RDxyb#CEE%hD;KfHCjnqTeY2xEIUO_ z(^l4=yxOUV+M={=x$02&1PjAZZp$)yv@*j{FnNJT3_!Du9lR&{W{lNMu~DlGPNCrv zXAc+dBfho+zircggBh&m@;SU6_p+vKO-!sVOG9_W1u-W&n;vy4w7acGnKY|=tw}gW zOv16zNjQ$@jZVTo=OpisPV({5$vMGM0~853C+9@V^OGE%AqJi0PRVV3HrUo@Q_xrT zT$k#Y8ar5BNW+;=*|s02leA4|M0-#8bmsBXR)~s$ygek^_F6rUG8_8icTacBs5+nNS*fpg%++RBp=;v5b4Iqc+bJ6351fHlPo5Veps=G(Tv zJs-A~6X#?X@j#3ZSKEz*TWlnBa=CwBxaE^LUs@XjtxeI^0Kh1>rhliiM}600O#wkw$5 zGH$%nxCv3?!enhNn-~$qoSH;KC^;f+?G=KN41BN9&c0Vn*L+jf!E&}VF~HKJ9)?Y= zwdbHSLZ%J4hla#H3tQS~SJP_P(Yev=WG{`}?wx5TnH`;7NV@ zJ5F_NGqyKVN8PZkY-AFOoEWW%i2O@!r|O?k@`T-r<=m>+plFtT_#|c>M5B8Zcmvi& z>$u4s^Y~S}N_o=@sC3dt*uECkbnJ<*}@7wqu~dDct{$-%3O$vRKDNhI2)9b7t)c+MeBybMg4d z1jM&93FJiLEWwYY_F004SCTbUlG|GlY^Q8TecSWf_AgEIjuVJR(|Pnj;-cEzG$~jv zphw$kINItt(KE1bAftMt9UF6^L1HaipVS&jc1bvKItW;{XgkqIOl-~Z$q^ItIX;+x z+(awht4kGxlAR+-B&NoG3=Cv< z$+lzuWHxy1$=V(sZ8erm=gQEwwl-VD$c2w+=JvLUmh0FT=3tBe{QY-XU?A@ATkj<3 zSdOq;!CianZ!twa>*&? zDAIZv%2Yc|Jp$%h%1~e^(`}~q2g-0A0#_KpkNC;0imE^}F525rW{do!F0Zh!PpP(< z>!pH>{EoM}4w|`~i_$b$t&-_JUMXCI5D$ z#y^7~j`u-^@L1Bx?9_eC~ygyu})Dx)qUm&-~pIB)vt7BP8HyQu6k8! z>o>X{a}=RBp3otkB_2g+{vLwEDA%{hHCur1blsdIz!4OVPg+=FNA;jNPkjgNbk2Eh8pj97lULgQ8rkeP!g_TD#rkmFY zARDvIKMJ52)#h~qsKz4mMgcUV-oytrtO8udD)SBj+{QZdE&+67gL$_AhS6yLRRE8% z$^5$jrm@w0Kmf0?-F#4h7-N_Dhybz1Zj(BUTQtttV?HH-&v?UpRsg@zY`!Q!ys_VW zS%3uN05e|$I*a-w(ZI^~x=0He_$bd?0;L$bl=LppIV9P^@JUHC(6ih}(+r=IR4!1u z5m1sUfzF{ZmuUo*q#B@^ghIvuC20Xr4WTS!k&<)~&?SUA8ug0hsq}>xEy!JQI!M=J zerh21&`jo^Dd-S$;gg4K5(-fF>B&P7`_$KU?`5Rn8}K+ELi2r;@FsEIg2#Oc@Gk;y z>p&WE93}KFKrDbsdb|ga1du`CeE@vFjtwHvjJL~NWbY60Q+=}Q8)W{G=r~z9h*;D8 zDg?Qvm=N8_sOtV?!BUyxBbMsV6D&Lj-4`@I%gD4fN)VA-_Ky^)KIWSQdJv_qR(c}R zB|n***PyegT|h_pvV$+fkQn8z8&S*$GzI6TYmK0TdjP^}V!CV&07d$!N$JcC3y_SI zGX)5ytL7L1Qqo=KBmq*>F{TCRknS;O3y_xXHERV(PmeVh36PQQGnWdGnI3OmCO{}X zU|uOeR(g_owE!K{gXVPtbV^S(ZvnU+UoBHRr>B`4MM`#hXLE}HUDCUl_XGTe#JZ;E zm=6Q&B#@Inh(-HAbdJ+=PLQ)+dDNiESRM(qe4MXRv!!um}0^N(~z8TtQpaUHM zbV)79P|d>-=Odzb21_{xkV%4lGE_C?R=5g%EmJMbP=n0X4dhyKy*25RSiS(OVEqvSTnU5Y(~nl3t6<{`1z4RP&s;a7Muike z%?Og-2h<->)L(?mkEn4Q0QsK!6KcelVJ&bhT`}JR;0#VkYbGEw zPmwcxW>*1}jDXo2fR92oBWTiK;$m7x$Q&zxE2Fb{E&%sMcLrv60rZSK^N#`;8Qsl0 z1@L6_G#?Pa%*Z#N7r>j*+x!rK*AtUbXnrd|Y{mdnf&q9+T*e?XP5@s<*bD-24g49y z&5i=ZXPja71>j9c$QWsk6d;f>-aJQu#EhwCg#bwz)6Jy-yq@HY+2)l31T!kkn*s2G zEmKo6s+pf&Yvp6w$6RNCehsPW6Y0T65bNrrF#6ph^JC~Ja$;WW3|8uJ4qn0djCA;`>5dM64TCk(;d?PYBOU&Fx}(G2NOyGjo9T`Ye=FV5;curq zI{cko6{W~zAxSCaNdLu(yb2X;KTGWyu&&8D1AKda1Q>J zJ~`UqAE!@^cK9dh=S4ewfBJNcf4nTR&Kivxjm%VWB*;N$N>!yebxP;bW)aW%GWICJ z-xExmiHt#?{jzL29xvvPiH9)PNLBMm?0OQ*P#WH0|0HuLB(g z-XwSvhs}WaSR<2eF2J#+gNg-%*LW)xl^H{)X8cKw!4PdRy8wr>u?Y31gsdurTl|(9 z(2YsETp`-AEuqxR8xZ30MJ7EP*Ks|#cL8^#oz35gpyl`xB53`476i+D17SU7_)70M z2Hc-0c?AdqPf~Zh6GS2i)(IaTWryw7^J>43=`77yVso;k@rn=MPwOI03)#ALm8Ry~ zWVSR>zJ_H>6Qte{1c_HOQ0O2#Ic*BSWC5xHDr}Im5a6arDdVNyEJwzsU$j44n#2p9 zC>5e~UT_a2Zx>~q4zSAxU8Je63jPT2zYyRyfCB z&+NQz>`(!C-dKw!A(k5ekVZ@7uu@(J3tWjZm~TD85Ey!ac0I`MJ-Se8f+gB>0D(m5 z8q8KbhY_75J&(z?=UAeXrE1KiJ*N>JlrqW9dXy39Z&!p*EeVjf#G>=zAw8E7eX2x< z>z?=uCX)tQ^yNgK!ZY{kc?E$XQeR}iCWB=8j`vEijZXRN5Gk`pBT*Yq!5nB(a0@Z# zQ6uAcKq+w)u-Jclexn3;)8UXKYk0O^w+T`B= zETs_6zl-E5h$-?X^F;M9Ph+})4=hCiH@VTv4Y{m=*=Z?-IT?pP+)a9G5cizYn>3BcFJgo z>V4z-kpu-yqu%d51#Brl6|cy{4rUq1UrV)22)_(v7DYvAB4>TiLzgOGf}{tvm=3FD}ne2H3^P!@y+NRmeRI1^?`ax6Gr_k(D0h zq5oQ>G-SEbL4QF-UXo?LhB!xAn5BBhg2KlX;i_58TQ9)kEZw_afQzzx-a7=iI4kJA zAAodKmSlyz{}fMST6q!<#=8DV&&TDB?Ry@+iT)%TV$~8RNlB#~w-EY$)PO zQR;^OUt-Z?E$ImloWEX*NJ_7;z+v~ zYxsUiMa`jHzKfwqJ}EMX`VXt5Er<;+TG~Q_E0d)0yqznl-Xv)PZ{NpLi~Y*m`J#?GipQ`ZSKwQ9(@ zE=KSHGD)UZ57MoC4sbIlskcwL%r3#cyssZYnx^VMAi@RW`yrKpYUQcAfk@L0yranV ztE2o?bXmzmR}4Z#w1Vgc0^0l-)dsKO^BkrNNqDu91LjRfc}jnY^oSu1S!`!&Ur37U zM{&oEV8vlK&ZJI6Vsf*yt_P5+##2f^A1Sbv7^k{D{V_L&NDurk7p?~>vd+#0v#fV2 zf_Ez|MeMHJ0Nr)zcPQ0MyK^?(1NTBKcfo?jyHYn4@xeBwKbYvsL)ay%>FK9Q- z&R-DYd((Ie@doLT>7k8!66L{-2G8#Wz>Nl8bPlE9MuVpUDLn|_MuX>4A%+_b9vl$Z zDU?Dt8k8(hzXL~JtJ6a|ZdIjP-2=g13M{2cruPhhn5hWjm@)y;Lr72x^d^$mW1mE% zyWMk;P>ohfT@1Avw3}|Z;H&NM2_x=o#Oo9Zw;?>~X!Cm*q&P1!Prd-S4dL623=(cb z_>Us=Z6}1=5b;M5dip}}Q_6+g5T39AxDDYMCID_jc+L<2w;?>E1i){`XglDq=bQ{8R4-h`PjpG;&4her1 zX>=PR;a-90HblaGKp1>XqT3J&gWwF@gXuOz!VrPzHblZ1Kn!D4qT3J&ML>AOj!ASI zBH=6`JVn7Ix($&q5vVgEej9@OaUQC{6Kv$713)T|dC6tC=Vmgm7YcAX#N4!Ec0&Qu zK0T0v*eAWN`|?Ob9B|`(2t5y=gk{9RZ3xdl0ag>B+Yp|2f#`C!gxe6Fj{*Kh0JkAL zUjaNp0JkALc%+eE!k6eagqyT_5Xq8HcGHFNSBZ|3^=A-kx_2{JTsxWR?}Mf4URriI zOJ(|gVyRxb3BXx8Q{D#M3bwpPKY++Bd%qH?KBlyQ4nP5UweCWsOI|X$oi}P1okjUF zi}Gr8}9e-bQBO%fBPinUv+`h=L1NFez|n$R&NXp?9zN-n^( zi)V+JHkqcBWV#q12W_<}&7hL6hh=gp^=wKF(jop-f>Wue;BZXNLkXV4;lqGq2u>r_ zQZ}KYcap7@A(daeNtMP+1FVF@(FCc$;&=E5GW=-s)1;}spp`dWnwn;ljsm(zSaey4 z5(=%7$DELGs+BM!njjT0RItispn~<0G%5#ao1$sk9BHTGO5p2c^FegWfLq)}6w7>% zEId95pBLauAwC@qvrA-+hiJ`79&9o;l|wRda2p`Ey(u8$3NhXVu zPejQ*Hpx_4Z&bQb;-(dM7HlB}yzDySvh%>!rHjDxGWrD2N^B>OB5t;GPeu;;%w+p$ z<}s8FVk20Dl+{R(4RstyjTU@Y2?FMx0yft7nV|K0&^gjgx-ks|$zZc&oDX^n(YNTv zY|sxAeXGx?6Le$HSS;wGZlH79 zxcEx<#LOI3Z&S@}{Il|rN{FL&#Ru^=Fn-1Ho+%;d3%Xfr0o;)pBCpdFdc9zv+{|2Uyb zr4aKn3>?-3o!_IpJyI>5Wdl0*wOX&xR#H8e%3~U}d;o-`-Y#+{H#weO2!^H_rz6tc z@ARpC^6Mg zI-QUhVsaxTW*Ew_6B4tT{4gbU#KT!9Bz9u*Ta<{)Ijc`d?8oFIl!(hLkDibi%j5vY zlGM{sUOXYO8*@8NAXS~70Z|kGbcN|xV0fR&;V3}k6~J)>V+I3ymZ8i#dwiN$-Fh<* z9mCf|Shz<3oxCr@U~<_yNXH~0oyGnMWLzVH&L~Xos^ucV zt;Y95B!7-=6x8cW!6^t5Sb+2mP&;FXBS@s2v1ftu%|nJ9BP-*AsoK&tE3!#-RT~LEjc)+W7#gZjXrjJ>=F)!1A(xA^gOT|H6z|J|ir7m0oN6lm!1Jk&HGPTZm=`{Eeizijj!_g2`O(ftU`${T*Cm5fLlE zp@(tY0SwJ`M0^S2CL-vDz$PN5fuO4h`uH?UNt#S|QOdcHeUwtB+bK|yJx?k9k@5lv zxFNOc9pW{hoOg-X2I5nm=sALDm7RGiq^0j9#Z6aQ=xT-gJ`f)4;qbH%!acT)yjcMC zcBU8!ck*Je8EhDiC2Z!a5%we*#c5I=?QRzM9q2-$x9EWjK@TDN9$(-F z(B~8Vmtf#w(Dg+BHN@h3fS3S=yf$taBDb0t24@CHT&GQn9|Q150QHaYzXN$Ckp*!J zNK%h42j>Bh@;ZMd$oRzw?j^iBZX+UGrN;k=V)sK$LDr zS0q6lSY zKOblzgyc1Gvk|#v-)o5YAo)8k>Drx@u?Aw&MYz%(>}~aWhYjHHvU;<)eaPaHGX6$F zTj_H62|{@+<3&pSCsON9NS(wozu>8c^3(~5A(m-iNK4Nf$|olz7O>1Nl=vPr>vOzj zU0LQZO8k?d3_c+-jd2(F7^-WX;>#d+gvhCJUs9y|seS$hV8<^lDr z_s_HN4~+ypP7TBfdORLe`zvMKiQqKKI5?zBg95#Tz-cVdPtd31xhyKpzmIZ!fnWyZ z7>%mV44fmRMmlngQUm7;ei5oV2YLMDtA6TB`aiz7R|o;O>L(wMrvY#^uzWrD@IMjR zkaZIxskbC`++q~Zq7`QF#6Z3G%I^K=1|tT1b?4l7hiIh1k1Eq2S#DyqDBD_;&%`Ps(BOR8$K%uHW}* zMI`;1G%Tccu&!xjue)eH>eC&hyLXt<9)`Y!k5NEQ#rhJnFZr9Fo(<{Orw>H+GF$*- zg*0fG|3i@RxWLPnQ%bM?7a_{mv-H3)5EUwT*(@*;G}%e-q6fwbepg>$lHlhA1JeYZ zn-(Y*bY3VhThQG)2dY8yGOOf^QrGyUsA3wd4->z^%zJ~;()73 z_TX`{h2$(O{%(X#NH@HvP}$dkWM|^1vgff|!b=y~v}r3xI1WeGixAg^EJsB}Om+gP z>S-iPF~g9cybLmOB68s}gf8s`%gY9LK`kiicZlUbBj^KhiIypQ;Zhz46Imy6Eqe2; zPl4rS`CYLcLe@!$m)KfBXC~hc#$YO@J5EJ~mU@cn6p^YPgp8EN_MszGR>Mnu4JUb6 za0w+niX@k$Tm{75ON(?>TA&(Ff~GvuLhS#Z1aWFE>QYk7{Yb!zBqVBPfG0E8 z+W>CW>(p1O+Cgb?R76Z-fU&1IBsF770H5QK6po=Q+Al?63*c+fyd!W4u9-t>PHa6a zw$Zjr>}r5*0^AF*U4VxHo)BO+z#ai!0cf@Xiz`CON=H)CS59Q+O-R=6LV&A52e4>2y{xDkp5MbIhf>6<{Vm;mNLr_ORJy_5<|t=^%TMv~OuHA-sOJGhxaIUL zq6?8KCEymkt)osYH#`dvGVL7*XsYQfU#iOJjvTSxhD0ovoFv(prx65gJ!1Ld5Q9O^ zaw4pW{JKC~Gm4bU=q&G%sBiT55%@ksprSCjm;Wcy4d>zb10WbgY9NV( zc1cvFCxk>#HiAT!L$B~zQ3iCI=sR#0T*|i7{!)W&)#)o3VkY{9n z*$JeonLSal*#oJ{TWDo9hX$1k_1)d+Nb-ss?(|iC#}t;cjnq?El0PAnOOneQQp z`xL==O6lbrg-BO$4Pg+7R`3$gL(^Ktf)Lbd059V|hvVXO}E?1O@*>z`Peh z3VluY5dx*-)07xFzFTjP_Ue{#+TPbBuw$HUefQsy(>(2l*-N|#aL#PHt zjQ~eJJKMbrw4Mu)FOSJ~{hrh#xv{8dfdFS^%dRy5)M4^C)Or&D^_V;!73~3_Nmiba z9ddmwz{Kp%u2umiW#_mw)WM6MoZa1(DZrF$yt7<{-18tStuZb@mCp*skXIPQ~oZ%)iUnVle}^*f=|Jg)*5dk!d-KE#;BTFI{^QH6ftfL zz^hmTv35!xg&g5=0Hwg#ipZ_YMge0Vfva`Jvmq0#f#&`c4D%}lN(+KQh-m5FY(zmV z6qAgYY@lVam=2)v|CyQAQI83M<|TFVF?TmGW8$;)xY0_HK($B z?2L^MS8@m`8GjC-+8e3E$RhC@0b>XbCzvcv4cp}eXJMdhumSiuJMyWHrCdn5?3OGO zrdCl+rBa7g6qivUX&u%QJ@;A^fPNyK{|JV3z3(Br43d(nnn~&+x<&2(5?UmZ78lXL z@!y7BRfyol+^+P+t*!)@P?72QFUD*S#I)<(8Sf%#DR3r(QC5M-NWk=eB?wzEAAD`4 zJ7W~sTyVM&Tow@wjqhx=4YMAXeQ8)~fqDbdr7BA!a^|zp3(X?0Dy2;lFO!dF+?7$17ndTgQpT141Ns~kAE_gT9iWONg?yFuTA7<1&QQ2XCd9o9zeJ! z3r7dUU)X&y8AmL+AH??~kaN?OQ%Tdk0AU%gX=+KJPD61rUenZi3xL-&wSfZQHBIew z0q~lpHbMZrrm2k+0Iz9k=Lmq;G_^7T@S3J}p#XSIQ>zjHuW4!v1i)*W+QkCkHBGHv z0KBHDT`2%w)6~`hj3ce_nx?i{q~JA8?Op-!nx^&;0Ih^FUenYb2dE@KuW7nQg6aW| zw8ou*$Svz+1>;-^qqWfkj zw}3Xw0CY*l`NF96UpRWjb_)D8=PH##-<0K0m;(W%7? zfHyj|90Bk~rxq3fZ**#t1;87fS}}l&d=_tXYAZzw-sse>698{?YIg!~1K^EL?NI^n zMyK|!0C=NQ`&t0J(WyxT?L2s+Q%e>AZ**!s0JzccMyEDd0KCzujTQiJbZXNCz#E;~ z1pr(FywRyu2!J;_wPgUj33#JZ`-1>@qf^@`0N&`-?iT=WbZSola1HQAr}l~fc%xJM z1R#YBLT_}sT4D9CVQ^`+dmkb=SUl2}pqVnB*eXZt*7a<#xF`FVTmU+gdh>~N)gYIY z@!F^Mt*8O7eQGM$yl#5!(^Y~Dw}KdcR)A{Tc6D06UN_)BTwkRmS}p?S1fgwYWc{eJudppNXo6 z`!m`PA_@0rGy~=HOt?Rzr3!%iGg>bJaDPS{4!}DH_h&Tvr;Z%p{tWkZUI5*n(W!;p zQaW>yAvZu&DNu@`xBGU`IK__xeHXDGasLgGrpC&bgOxA{t=W{NTt!X17Qqill<&$? zKR_IiZ_ZNVHdE3qSt>(=5k;%MHH&HYL5%Csn1wl?G{NJvvh7oE_Y{^S9@Kg z{5cEn@QW!vj2T_3qPJZApLSsEQV{W@ap1a|h~*%zCt@RrjUbq>d$zS1n9TFhwRZp0 zNPG)Kf;531%!-%O(I6tSLAZ1fqd@RW?t$)u(9dyOQIwQ;Ca2Ga<&q{6>CZ!%NxvsD zemQ2Yq*+8J%!B}Q&4WD#153-2>unXbaTRuw&?%QfC|H4NW}Zf{3Du`;2jq1OqB>H_ z;T*j1)2Q&2HGmr_@8Ec-nDRK_jRa4pqEg8q+wFSNP>*_s;eQ+Dar+zt!R?cUOx!-W zlVRDX!&=n5USzZ%3hMB8Fx4)W;nHybc0d|#5nPIgx|JsE;aSpj8YfmKLSJCo+NSvymc6R+cJ`Zz@rZ(CQAuq@n#TbLUl zhYY~n_dwXKCKuXzt^rS~dXY+)#;tn{ZLA>cPWuF#hm`)Awsp_t*4+=tt2>XXj{D!D!vW` z_qFRlkgs7ow9C$J?N`5`7R(~6r9223?hxf%Nvj0Abhgj$OkBUPD)^;SL(&!3M}I=8#u- z2#{BJCx;t5LOO`V*A@tcfxBP^5*TO5VaiNBzMK5EgZgy(v<0dA8<%}Po)X)GY;>gy8eJ1b#}2@ z6To^KxcCtdv&~{uEce5xhycdd0kqh>mr!{{-DE=Jpj7n( zm{LqJWHrk0pFd%Nzq`oVI~ABml77HA6{{QYm2gx8`URhc(e?}SZZ`I&GN0;?1rGm;UYwPf@mK~zKN=j-< zXZI`Yu@FCAPM_W)Z?C%2*(EhSXVaxW{Cn%N8vK`MAZU1!<>0>=SJsJgPD%r4gv>L_ zX8xw!7nI=NE!WQYO?j(pXUxGr$}WX5=>Hq{D4$zRjpwE~sV07`>tSG=e1JoV#kRj3;n4L-7=8A=geV*0oa0 zcIktZmoF*O{4V9FR0P#{hJ$7iiZPUix}91UMBT2@2Q~i@sI)>$7^B6xMrtWzv`kl# zW)^84*QJ`_Dsqk05?n>f(WONYSFV&%{}IrN%T!hq_;#tjMKhHhs3pavEJRktDAMF2 zwE24Jpq8q9b;(Xm9;>CFrFGB;Y4U>)YH7;LtO%u!(>l1$)Y3*0sWhX|G?#KCa&{OE z&Pqxgd&cOo+VHVjKPVWF*VEIWS`bMJ^je_>FW0(5wbz!ea4B~qUvM19dzP+%jh}-; zF|OsB3)z^m?UI8iQ+WwY1r1Le4a+R22qht*NYlq@o-rC4+X=}kn(lfC3fSajS|_NU zgw*b?vosyzNtZ;)uOei?b%v&&MFpipw!cex9_{P^O}P>-l7{)8L@QCimSsgKQhANRft0(K6+P%u)}pgv z|8J$8nz7QQTw(dv7D@j|b1QGLov_G*%U0mQn2zM08~9Jju$<9a>H>r&oj2Q>vF^>Pd(%W>SoWtG;8fcSQV62+3sJ;@vEJO%_=ROTT)*6o3=Pn^PT+4j@2=;#?jO- zKER*^B+c|(j!6<`DpF?i$uYHPCnkr{n&(VJV>RVWm>$<3|DpBuT&l%9tR-KDDYQs~ zQQb5Rjn&-x>F9`&kGM<>O4nnW4mmeUlw8QyS1H@6B`Cq2piq9y*k8;qd(koc9LuPy zP8_JBllTU(cy?JuHTIcySAB;4p309-C+7RreIzRQjT^_49~Q?=4JTRee`P?H)zr)` zsf1@#&MK)cx5g#y|2VU(<~L1GwdJ#{y*D4@8hlN>{jBW87!P8McZKt$U;*ljMXzxg zR)uDE5Ss~%dc~!D!t_Bd<@#k<3qN59et|+JXDSB2oufS}T3$3Y%A-|F*?=V@`N1Mh zy-d>|)Lf%o%7<7zRF`sx1SQ|S0OR;y+>8;^J7y0n4L^DeL$wWGdURbx@Vb zsPZVXuj1K{T7`Z`t-EU3LFGHla|{&fco-T4J*zOcVV&+@q>U)jrn)Y}l80pwws}TE zLHA#Re9uS-eu08%oT^|j3sNlSPPqY0a=NWFdfo_ zi5{GwnXaX<$vDJkjMietXv%1`$-GqadvDRxG}na@*BU%)^T+ORMJ2t(sxa@xLa^ z!t#n4r6n~dlVwreqB>M!Uwpv2LyA56ON#w!`?0x}Z=lGNoZEltco;Wn&prDM>3J|(RU54?<2iUJMb#Z0cLWkW7aFtkP15odY zE3n<6zus=uwPo{XRQ0GSi)_YD(tggB6)K%%Zn4om`JB-;`Q-EdS9W;|>lRm+)l%*M zpPmCMgz)Amsl?RSFD=>9E-6+#JQBMK;BVp7)5y8Z4Xl2v=GIw z&@!+E$)(NiXf2*1o-bx6iY?N*;776BHQuFMhvRLo@|BDu=NK(^xz^b=O3V2_?R^h$ zoX2(FLdSz>k+PtOvKU!TAe(hqm!d$BR$!0f5Co0_zyol+J5i8L<>TS*190Zy?s|6s zL76k6Y06?8C1o4gRT9-;5@tr3I8!!}T2@k9+0`^^qPA+Ibd*M!svg-^U1f%rG!wPe zRQdtiZ{NOs`|s`B_jdQ&2l-92-#*YgigkD5gw|cg5?{wW zy&>^en67T_UjNzTwU_`gZ(`Yvb$(iB^9j&J8DJ|I(UaLPgYq?rV*#VSWD7s)iJ&Wd8^og!kXQJ&LwDkzl75uq*6JU1VzT{3|gRk}JO3lTV= z6Jmo)e8S?)>;h&}Nz1Pu3>fuVqa`fizV{DZaZFhHXqQ%Io&@=IY7YNnSrRPqqn>C%c-f*iVE(>z|A7SqPudJsT!bm_vg>8emrebQA1$=)j46`$z-mL6c4Dj`1!%%Jb@;2mb>U zyQ=M=8>u(EDQrLqPIf<`d&Fa!YnRv!bi)_so3oz3ROYUD`BN87KI?e9ed5Dp z8F>;y=nbt5X@{&nZxP#*^#pkFUN6&Q>+sgJX3PM(M6R87T`JeSVy!w;p1sUT9|SHd zrR(aKKGYTqaFns5M{B53>(EfqVSkXk84IHn`s6{Zo9GE!JWTa(>ZbTQ`uRFVq9xiC z7cD_#d2xyL9#kp8z$K;@mGaV4I+gO$(;A*xEktq{pIdW!b#&m%%o*U}W8#wum~=aLEdaqiHbg#>2P zYvFiFjCUu7wXrerxhKd>dF54KB}zK!)$5NW6DO0`r(tm#OPnLK((?*x$T=ueH+IAG zg?^Q2!gOH~C?1nHA#65A=$po&gQTHX>`iW%pjA9R3I_>EipR&GmR|M732lS^DP;K} zvKsv_QVu|zOwjOxBog;R(YcZgM20JPsHh-d+R_*;*8UDuOej4+0CPV+m2Z%B<%iIR6J&kD#IPZ8EqEra_=fKLN$a^GoxB=F zc>_2bV5UMzelnwL;ioV|(1fAj5Th}fcmzf%Oc$Fl7%#@Sj?Ooa*_yS66X*&!rH%j5 zp^OoFSyFZ81F=fV4~bPda6=1!7OTlGkkTF&sK2(3TH#Bvt?>VaK*g%rFH)bp9D#^Q zoTgsX-X+ckZ31x}Y%^#x*-xFgz6&CUX1|kg!8*V3br_(KWmrAl-<>F69RKuKGIv!1 z^5|AbxC44jZbKU*CQn}U#4T{6K?;q)>pY4?%C|4s1Aa!j6OTiBVRiSX5H?`+I{4>?UPtMWLwo5o?SDxk`ZtY3K*}92sD>#j=t0fcPlto}WaKKTILgYZ35qBl&U-(E4%_lUoDj8Xop zkc~HwB|rQI*YeL#BvGa-(%p&IAs|uczlYT<*f@#ebYMdzN*eQkjml?!>>N-2Rct?RzWc zb{0rqcmNYxcj5^n`6W+k6RgDJvICd@0L8!If#j!<*3x*{=7^79wf^U5$IRG< z*R`fi`z+Tf9R7@-p7lnEpq2I(ZOGI6_Y@A6BCWpHA+p;-*88e`-FQeRB7?{Z`T#HY zJ-ro*tcX|vnK|F9)m!CSRs6x2^H4z9)CpINF4V*QMy7K`p1|E^Gd%cnVfhM!$(>QN4!b07&m#UM(_ zLHi)j8U5Zg4=_-qEzSM!p_oc+CqymQPKjXcq~cokF|NGxwh|*<3)_kGk9<$`LpL%3 z_g|ux9LhSbiuJaZBB_QMTT&&|(&pv%bQW#edNBeaH@F;~W^5`$bBrz9w4>{5axfmO=6Ld5~j;k1ln$1S=esP)EC#g{@Nz1RjU%BL+p-deoBoii%X- z1&(}+pCBzk3|IZrEUf33o9t+hun>bH*nO7N{awrQGT?wwzL*`{d}n^B(*X|db|49g zEHc&n3=_(aHUzWFr9HImt3sH>Y zx$~fLwUQN{x7r-C5)>|pm8|7?$stNmxHO3J_OL^gV36nRavaam!5OXRT$E@1tqsBq z@|=s|ITy!s&epRq+NE+54Dy_dYe z9k9!`mhi9h5WZK;SbFRLlf!6FbFkzUa!?d zG7@~z&gVr5zQiCSS>$c&IztSKmjp%QGl=b(N)Cb*+bDuW->ajaMv|9}4%oFk#V_X^ z5WRt4HZyavd2D8+t^7p&-_F6j1C=<~a-fGec-Da=!?zs>Yfk+W9zfmzqW`701?2th zj1^ypLPD^*)P4cAKLzCqb$WMuoV*8c1_jps4B+f(kCXQv4xk(ol&KxvLxOXR6<;)| z3&D<2Shg~O*Z6sb`sJQO+{@qMC&47_M!-P{O3&|7_egLv4+2Ul;hXHhI4D8snS>_c zEe=hBeHL_&1nHV!`cX;=4_LH=65MS;_Y89|V?ke#;G+y8Vuq~yzl(#<@Dt4;)pObj zgNK>IBbIoie;#52XDy)_4%x>c4h2viWsu8$MzTLil|&pE2vNmpMuZqY{T1WFL=l=vjV(zgIXY$zoW(z$n9kZpa|}5S$*y(ZWey zBw?4DwFx*NZTE<+#QoA6j@vej$N@=p)~3q6#6g!T*PfSP%M_DP4{ThPmvfd>gvW!- zh$BtstwTRSDKYBRs;~EN-`DdFe%IW%WqFRlbz7u}&Ml4qfEsa%#)xHB=Xr9@}*GS z;^lcJdx4+2clGkLw1uCs^Wip*lt~a`LxOHvn-PX&`X(%{6<6rUP=1bSzsAoleIa&; zcS(KP)^SFH&sk7Wg3nt}q{j=@UJigm3C>y2tOR8Z89y5_zPiaK+%Lh31NUQTY zX0uJ0m7oxSgp**9R_FD_CQBS3v95amsjHXusybO=%29%3jEC3rrBXiLoj;aM0&j}Y$MEV^HU!jI_@^44cF z-7mq@flT)=%bT!-Oe7fOE-I0t+-0NOW#hQZF844C!V)C91ce_eMmC1KY#et{8F#*| z%`gT^f;!H#Jq|^J0~S=2 zpd%C!(GnGqYn(pv5VpXy1SJDAq~+~)P6|W`N;U>DLYe_W771f$wWqp?0o(W)v)B-+ zEhw=bn%$iKprwt-u>$1F-aq$PU_e#2s09VZpG@)bL>O>jB%|9%E=!KMa;jBN<=+a z;tT{Oq3(@Vzc4DrieXq#p6$%=8IE!&kxqV!QG{AdMuPIN%_vePL6HpOM%>GsT#QsP zLtu4KB!eD1C5Wuxo`>Br93?2RB1$4Rcc#p9(Up(!`-A*E%g;yo`4~UX^RxYNfhXl9 z7BaHCO4_F#zr<}SJw@931%|idi@y6RN4&<*4CmX9FZ#(8M@TtK{9fT_ou4g!3f)6Y zS8UE4Z6A3qrCKIhZ$wbDYx_sUHV$LwKDDm2u5p<0;rONDwJr+QinXUdE8Z&7*q zp^?F?!cphCnkzKDVzE_gsD&!sd*zpU3EA@&s&pK>T&R@q^-H|TUB7{?;H!@GafMHL z(U)WA^lbSmwN&)=X7)7h#!wUfQcKkv{-PS83%mS=iyy+RH7@^34LJ~T=tvG&}ZPbpN;_-(tqiM%(F znw;1H9wLCf^5Z~n%Zh$*R zbNTFGur+e6Lh7d z=NbX$3riA255*YK37QM@2$xM5p~_6b(5Nj|Yj{U@#{Zf>UoPS4bj?KfVowu1~4TBMlZsFP#5?G5zK zpnTJC79x`~DcnJQR2NuLcbc5h#75EZzUf}3iUupF&v_rxlB(0aX*MTurz7M{b=LI0 z5Wk(`sCYV;5Ox?sIOx+&-KRr%5$Ijz>dt;fIZ&u9U|i_-(F8ec+Ni09=KSK}9QvfC zqJ}G#_NFuG_2|mtxM^ciNNUg!?l_|nr!xWJdKiZwjFQIDB)?(Aru3ogVqvgaqQp%_ z%`sfYMc$Z~j;aG?+~i%Th>Rx`=|sbW`9W`Z6yi8PnY~+aj}HU6zfEe%J(%V`2hnV> zqi{}u0dGc94!As+R)%qJ(VZziSE19E>CXNR5y;sarMuuEN)G!aR39Xak9id$an=`k zHSA+#(F}}PEwzM3LmcL&dFp~y%-sPB?Md@c2>g~Z-2;OiH;|~Ag=$fGnFD(dK#xGT zfCSTugh!f09TJ8Ic0H4l&_v#ZP>{NW!Fy?;UMUwr)~nae&D~8^fD*E(s`yt?WmQp4 zG^a-jN8kn)s4nHI@`{=r&nrOf@yfMn&u~_6VFD?Vk}^%g-kX7Lfd3eS07KYJFF<Bq!d7=ahm^{E5m8CPXhf|vvIaFSviW>Fk!ZTC+8M=ke1dIB9)VqGwKiv$JM^r158=!x z8as6Rkm5`6z=63*zfAMbyqU?+mKDE>O9AJL^`njwDCmZpnW-!^=M?16INEV2n}>Ly z%lHwmZ#N1+2tV-JEX??5Pf9I{E!U;h=0tf!DV1hTGe+aXn`!vInxQ!!lV%lz0=ns* z$;q_xm#EfB)7PC_4;0;BaBZxwL{62|S}zLh722!4C;(x!Z^>VBnwwK_F(?qN>&`3` z^t(@z!dt3%1=gaC2F`*npU!zhgX#31!J&Nyjm8$ppfi?8-)gk%^qDOj(IU_;D4gc$ zRMJ$n6iHwKqndU5I)q-g2fCdo7@zkWHB7k`%v!Ok1u<(U1uN(;0!k$-p#qHX(=RBd zS2|kNWu+10VenL@!HlT|2ui9msyed{Bb*Apg3+k8JghZ}zFvE^$AX}VY>Q|v)HuQ| zMFMh#^FT=~7k7jC;CKBA>1a7H3GlL0CrbMq)F+0a8Oa`P%ehL5wv^4CgL&%cDCH%my^W)letSv|kJsAlEtZ13ZQCNYpIhDyzX1sLjKq?)Gg{F>3 z%xEh_(r~1e11y)`3?^x;Cg|#ZtOl%_Z6ri4HR9n4>smublJaJ&3r3;e%1tt+>1*mOv~4*A zg%>L#RlrIJ>!4-@i`g|7*MZyYS6x=KnH?s6S~y{is`WLiXq(}{NQ=c{r2&PNkvxy# zTJc}Nn9(-+RWbBOXw!0R%_}}|G5@Mp{8Aaq0$shlRE}{EctE1%!csA~geU^G)CkVMw_0oomX@Lv=IX2WGvCnDEwm+yp*wvC54hl;4*@6TG!;^);I#aE#N+*(f!0 z@Z0%tUXiMYeE==ECfe4~##~0d%qxVv(J;Kg@CX$ZZVTI)+^X9ddW^3b#_1v(=Pb7F z^V;j0(f{GJpHmassvYB}9;Zw4Gjm6qFuhx^2|H1=^CZThGC3nwJL~9+0*pmmI|nTm z+;M(Y``eq=9heOu+A;+E$>Q<}rtM(L%fYil4)?H6vklsW&yqa*Fi$U8_oc2gb}qQu zb~X;}#@&G=@aFcbMfL}a_22X@;{@;)`xTm$45Va>hut|A3wOuQdy6|%^XNRh>9k#8 z1+;$G6-YX<*)DCG7q*pP{>IFW?HVPeg%~^&dTp`T?~$`vJ1RWp4Bl+GSkV7Gd_h+= zRE_NTMb4x$cG~3-YFKE3EbuBp$N0R&nSv4`yqYXany-;l@WN?zjux zJeP;_#T!oTx$_PW{e2{r&942NYrdhvWsZJAWwjgD)1PdCOP74mG?!IiZ6V)pOhjp6 ze*Wm1c52=HaUX42^=g15$Hz%9@6ehbgNQv9WL=4M(u$bx)q1aXabx6p)tZOI3$$Sc z=6VZWsKPr6>oP=tT=a^O#$WCH3otRj#&*QR&cbq|X7=Ov|D8lQyT^kyp%WT{)kQU2y9;|Ghv-8;m^vCQtrV=KwyirwXe+~e zAQNb6M~4XRm*7QF2t*$%TcZuGZY%`9W3$Qwfy)?Yc+nMNv(|z!vTGz$DHQ!Va&tg} z1onc2MvKhHo+C#44A!y>>ARqB)q=%-1Y(tI(p%x$X{VPurTOyeQhyvzf7l0~zJxv_ zb*txT5?;^=_1+D`4fY5X^==m1AZEoNvGdbjaiM{!c1a1SQiO0R`E~5eQ^CD0L={_9 z7O+OETe!|@e%fSdp!^m_6%^7~D?X*dYE09TY)NRfYiW?r)rDe2X)`UT3fTGr{SwA& z+MKhd-3fC3R_xP2f$3ACtKO0H!T`iQ=$OO)^up{Yt;4jY-qwzKC-D%B(O7QKW{x~I zh5BZr#}JkdG{5uWLP6m#V!KWnM&zd6I=&bCbPlUM`oEXP#$PWrk;i_&Kv3`5G|Lj3 zG4){HNUnW1*w|I88XU9tFqR#?Svp7i>@>?>HlOx}vZMJ??0@lO<*79>m02NG3w3P2#_q~Gwnyo;R;W;B8@IC@#PX=( zm{aW~QHTAb9=Y)K2Q2AL>3t#43aFpk_N9pMtDd}Vd@*1xAyo}qpLy}EcVz{VVpZ%( zrcKJQjx`SLPL;hY5EQ&c&co>k#{w3XHX(QkM>eqd!2tvzEWCPgdu2$Mpz%3#0uQ<+TPdM?v@ZQsWk z&3^1?m4^m7nCWzfZI6J}axG4L#Q8PeyHg;xl!1wojxzAB?*F?_hS3i7}1?q^yN6ER*zflRnsRjX=a>klxOK+-QIGe*~-r? zU{Qcc=m_jR*qt>8>ljXA*%;1sbUZT&eP=k8gX)XDWLZA<6NPhaM@4R0#=4-i(V+j zo}=ss)S5VXE;v!ppTS$GT%=i3g!4`<`LMwOC+Pa{Mw=70s`z$Bt3wNo1`LSi2$^in zA_pKDrO4?}DNoaJO4$15ageL7nZwysvn}19sHu7$<~s7BEfzRbRwivz+w8Ij2KgPw znu=?>Rt_krVy*Z-rb z`IBy?ueWwM-#~D42r9YkI=xhLlt}AkoU&kFcyF-xQNA4pb z$eqZG?)Gu1u16{8mLCVX2XBW$kZ$12g&-4nqq~1xs(&B=L%07wUwlEA=$~dhkbA?U?I)(!klOA-#ZXufStiI-;*icQ`iy=gdzA>0ArQ z(QaGOf14{6%5YBUeylBgg zJrDW-^PwAsGUamv;;H*OIvWA0bMB_*UqfE6hA4j@kiJkVx|RQt4MECFfUFPI>NeCN zL8)AZ@?YR>bBLcm17yxpmNOY|hH`I!+1(b0O7XA3^QMmmbAJYqLm`|e@%BuJ&f|c* z3OrZ#zYoay5YFEPCrth-hq`hY&j^o8gofwN@k6sGAS8Kt&_a0b!q>J|sl zY7#w)ZVohgK_=jULZd~u0s<9%%t#6J1PkF~imGB$@yT;_dnm7WP=dEYW&awL6jYH= z*Q`?KAR#x0Ab$#+=Q*BgU#V}JM2Z>Wu@enL_a<&` z*fH~<$pm5!z^h))UDs-bI2^DLO8*Vi54Dc1)rwbyl(0A`1sw`keGbA-mjR@5{Pd%K zUbb`)&>vwbA(boF*YQRiQYsW0zwc5VhH$GyYa47fR0pyVoon=45m8<4|~cEH(Q5yTN#c+ zWqN=2v!PViA~8t-SF3bu;_!zJ9Yguc$g4M0t^+{72?Zmb4bC3|XP3<#B-C$UEI)XI z@I#O<;csh*jt@E)Y|YE!_MqjNQZ1tFPA4HqCIa~lK#zs^`6JZEbD`GxHXtK5FQT&n zkQYNZNkF!Sa9#z!uY_>E3rJ50XDd=&2;qDjkj){S|BQBjJB0J+fQ*D{<1dh6eMl?# zGeFLS=zI*--3#8Sy{I=R_2>9I4Jf@C$d3@(ia&?*U+}g&1o>mMj?+MJNEC)+xqO6Xa(|G=^&a`$)CP%3kfw2g<=v?hDB0 zTqv(ALFcUyWC*3)9HP7jI4_5ATEKZNG~Ry!INPodjug^@k6Vb?Q6CKP^Cgu1`4Htd zkn_gSh?_$EOCiY5qol3P!My$$CEaZ6N7mFMfVvtx1Ip(@eXI$Hj7mh{cRli=-#hO} zD<22dFk}az0_t!QkyO=4DjJbtI=>ph`76{|7-uSk^KT$CwwGx4j#rqTrW+dh4cAA_ z!ivjpsA>sn&o_gyE5{c&EG=q#!>4V!+c5`{t`T@8^#t2Cu-hlFS)J@Pd?022g0J_l z6Ugqlk8T1sdwuyv7P{j`bVa%k52M4HmjZc*twO+vY@uYBxhbiAw`wqf-fb%TOw6ts z6Kxb-&6iePQC7peKS!HjadnK|$s^Emp&c?)F5xoH5E5B!z6f3g+HU1%L%u1`yKKZY zNP6S1x#&xZ%-3vDodkk`J&=sZk-_V5P{zm>ppGXMw%apROwjH0p}e^l$Z-$XaboUj z5!ZurX@vY8(c4KJ#N1@Eq7f{3j)++e?Z1{LG{<~|m(FgGP$k)J5wo$~G;iCXcHtlb zHrU~V@!OB_sE>z zy0dETH!0bxMqt6m-DH6QY|2X8cSE<7NZrTW?_jz+Dh-BTY%q(xyRE||5K`kqxUADJ z;#^eG-tQn8cDj}x|0%(&=R&}x~sahB0*8K-#v`XgNQALCP!WtNVT-xndvH&&)S5#hIaj1Hc4+Q xIIj6V3vU>ECyZy&3q;bzt5IlYuVgT7XROo&`7SL-Y&)^wCLzLw7@ijRH0bipB+8alwFMY!g)6%?ik(Ob`e(YBr-mlQ4vd z$z-xjHnJFgvP6rB%Vk=DJ`_U9f1*{NRfE%Bm5WjFn7htn#9G#%_NuffY#XHRw9b z1~5|wuP?v=vWl_&i3q%$gp^Ioj5#5>>!hD#g7%TXGo71}}RIV|g+8^70tl7=wFdVJdOC91=1W$+anK_L1mAUR7N z3zBUm_>vsyjrkNX);XfV66C%pLn6tI!Z+qqK>EV9O~j%qum*fd4!(%}6p+5gs@nPr z+m~yRN^;}yjrkNXHg%+(cL(`pBfjJp_%ilWKytYjlbe1oQc2&uSSc7sa$_yIsq>N6 ziSGjYi%5J5NNzmW#NHSTE;)x9b&HU&;sTP(vz+i_7I-C)8-#ejl`g^pk{dmm!+Xik zYY~ur-*Q$YC?L5p<2jx=0}*wY5aJ`86$uI;7Xkkt5uuh(vO{fJQjoDdjBM<3A=tQa zW2j|!_O9xUg^LRp6)r4XuxRnZ`H;=43bm-{=C*l~05w zJn6Zzv%u(T9vN!O?>~gGYW^AF>AxPC7~9^ZFxLH-m@HupnVLT;ZX4U#pRvL=N6Qh( zvpx=Dg)LK)9F#toz=CV$b>;VKr!k%}Lw4U~0?iu&2?L z`)$i)gB5sw_aq8QfU1@}sda4r6uX8kud}Y7s6K7l=}2tL>6(%Rx8wllTR5HLuB~of z(Mx8d03>cnb?s8}kh)Ab!H9pQI3yS8`Z)8#{EIN?1=qiNnp)HMPu@>rIo=yUMe zSZh({803Btps39VwG#v{2<=zpBX4`s)rgAQwQCS{on+gx6SXX^$Pa^eV!QkA@ILG6 zPbEVC`b|Kg)+eWL=w36UxGifjgr?_y>giv=PHJ<1(lwamTK9yy_k>!%?>gv*idOYA z>S^^SwfR3mlh15D()BL*GrOOdHR1E-eTS6kx!ou3QU3wO$U0VoM%3+FEETBRcZj;C zLcA*<&4EsYkfAesHjMmxclSXGw$oT|*+zrJ<7uh*2iVIIZ0B}=XQD;=BdP0CP^~+< z#*wZJ1lwt}cKrq1XR1B@i%^<1o~NV4JxD_0#GksmqvQGDomfz-t0Utvci+M9i6h46 zu4j6F7D8c8sJ%8br)wP=WzY1VNGV)@D%I&XC>Z0hWp~c$cE&}EZ41stdP|-hcI@F( zUdslafWc+suM z0azR?Tz7cdv>Cyc_oO1{&Srymjo=x()_sr8(79${`{m*8?&Dj2aCt6nL-tU+R@E0# zg?nR2+R^=P?ze|B)_sq$u{Qj~y6-h)@vOfca_hdwDCi8|cj&%?2PHlta$oGa--n#7 zJJBZGl<@CD=wi*8yqj2~=5k2nb{4Gv*0Z4*#&xZO=7Tk$cyg$9e|J(frm=&Iz*_fx z8Wp#pn38EOM+tMS61e&hb*GU?OzijG%IAGy$V&<{hYm^a_=IU(`+BQMnYT$|Lr zx8;boDxtL#<9~YqRj8P}E+jpFNXJxJ2W;&+u8X5B%xuHsJ;4j(W(Q$Lab^zL62wwC zpE6qO(-&w*J_7SlZBfOA(G4AStN=~z-nIFE9*3s#Y*>L-ds5pBAW^UDT7%_<+!(qh z)UK|@_X$)3oCAlunlQJ9hU^Zt9tgE+Ymj4)b{;9A^tSwV>S~zKj?>zRYB{2Ne&dC5 z>=@6nlZLzow)?zcU@ZfyWfG%3W7?@ipR2NFYSq~!+rGrzvf5xF&-B+w$VI81^)FFD zlhUY9H-)fyoJ4DOd-G3xyBYO=o6>fYI#p3~i={7Gr~gE?vNmg>)-Sud$s(#=%PuTB zKQ_MDrady2b|7n(J&w){Ym;sR&V4h~`WcES!)$RVjTaDEZ$jO>LKS zqG!6u3iJ!AwKH04H)`!^aUi4T!TCn})b7?7a(7JF;koD@==-Y3^T^J^_R!y3zE?aK zUk^^(G__bdJhQ@mS+Vqe_q(14jpFvpsoeGZ4yCpkv)lbcHtai;P~7G{xN^My8Z=8&gm4f%3*n>%-w^i*-{Le}!b@t%uMLH?P0b|FORGhcdt=65g6n()R2 zeOh1m$3B}6E?Ay+YXbfxrx-&KojtA}yfCx1v+FNZqdn8f320ALv_0_o)d_txW&Q^GGL#->RhT&mhrr>yE}L)&Rhi8+H_KD*zXL zHIuFax8j<1PP_l{+3oKAC}lq`@D^kioY=ZxzqdPSDGEWyp4Y8i12NPk)cOW(gWqsk zGv5-cAJb(L{QnaADRs8VP+!=#2%5B$k?o{*_v7%?Uf3VEpEj|WHc^3BX&cZU_c=JN zJG*Gl`;6^h+Hd5bMQHX76=U09QjE!X30(z*=qe!FniV%74`#ntc&R(OzQwhjl~9WW z6o~3so&OWM9{C7NdqTwiQA~|I?unjxhWdxS1{bwHUyKH8eQ72-NZWat4P6(Y>Mh+8 zFNrRe2zUJ&K^rSMY_D1A0@>s+M_^F&K(PnR4`F^YQ zIjb@^!Fbd%WYw~;^>7zmCU5VCzq%@*6Ivqc2{{ZMx+t@Z9JZVswuBs((=~y#wB>Eb zU|?Ov9AE(nS!>+)*i+4HJxrIf8PG^eTI})x{d_-yE64n6sPlyvgj)a7`ZQPe5N0FR z^#e5pI?A}#K&W*!uGjKcLy*?v)?M96AJB}|rnPg{G;gRi?LsTHJLz2{9n$y~Cc0en z`nTi{<7J(Ne$XB_1ax=ObzD(g5#`>nFFdnNnsB&T&Fwst8ESnhI{$~-PV`dxkfJsT zTRx-}LhfLwZ7$fIVMnO7#ETWSHR;EZu)U6VqqsewyOZXk1hIpSTpx+vkWCjF7oP+kK!V|9mLG8fDP@(;l~)tNXYQ)ja>V0HF=tp7no)2-Z6VrC?rv z8L5Xn)f+=?7r-ziKaS)!Pd8?xC$V(kvf#tehHt|MLTxi}N%BQ^5?#j~dZFvC?{KB~ zF=Siv4Xe<%NpE|c!V7J-3Qe~P4WEGmuK)`LR#1U1QC_&HM_C7{tPdh(9ZzMw(vp8W z-AHVXgZ53Jx|0S&#~!U6H1(xJ)kwIMCnS^d#enB?r~|fXHK1vqcRVhPDGxP^FVuFH z*SbG|31!2#&7X(%XthYB&mL`*O+nLWkljf)V8*vLtDT8g`{28 z>&}He%~Pve&ULWxB+u4q{!shm0CpyU+)tz9p>P|zxHTHT?0OuVepu=4eu6eI$l{pr zMC04EP#wXz&!$^n)^;|UA7l3gT)2Kr^8V_;h&>)(j zUu-kP+l|ny!QnoKb^oAE%Z=D~Vyu1nQTs;O_6_Y}nA^Jl!0qvVTQE2n{*t<=9_rqA zsEfBw5p^By1#F6~`X|TUb92HP1GNv!WVpDWf-U6DkSF^mq8qI&u9!M`>bl7?ciHk{ zX=nAibI4_<_0GVb=i< z?rZ$CNGbNhh5MS`$Cf1XyZt-5`g33M`$LOhke640%vlqHIl`K=q7JGqYFoPz{e5Hkh z@v~`4xbIJ(nm#~nVJ-$w%Q;6_^Pofhb32dfU)}p4;^zWd%S0Cb>xO+79BPw8igpT? zqce8REeYk*Ap>1@1sVgPbq6`x;0z7t1W#Pm6&kW5w86RLHB3XFb}+Qojm4EP4gDO=-tJIzKC9H|cbZ7n03-?a{ zxL0}t?ia-7|5Yz6_rk7TxOaMQ{IBf!)xWT(Z?E*Jy>RdP4d`Vb-4BVa-#NYV_m=-x z_TJGe|CgSg`k(5BZ|Q}9-wXe#m%bl*rQgvDpVJEu=!JLo!oBV5t-rTDz2$rB>n-2Y zo~Wn)Jt|N_r?33O zJH}V=pF|pckNaD9_e&pjcYlbu_gC;eNT+W(zJ-m;npafSg@cv#E6Q=kUDeoF-x$m; znlr0#=IkLXlH62Nx2(Cgys;*Hb})PX%o#|Vv$CqOy0(5*u(7;uS(V5+XVLU|Clt?F zJcN~$H->AR?mNvbvh;8XT)vR0Xq3is#IqKZGr)5C2n<1-8g?oWNH# zHP?oNIGqpI*9V(cl-JgR;%D!T4T=Z!Nwv@TE3-<{!E@^DRk9X&`8uCJ)C4Z=}P#K@`~;bQ+)j-@qWxapiK zOERl6NQ|QumxqH{4Z-^6Fu9d`e^@YF-ngtPj8;O@u;AG>RX9ZlK&^wQS~FBOpzy-V zN_eY@vM(=h3f9#JYgUvms~X-^RY4}hxJ5OM;pXz%xy@CLX9ugxYii-wYIF%Q=In4) zQxJuhN3=vUl%TRuBC@Qi2`>*;;9-ei&g!hyY!+-;HGI{$G4w1&xMoEamuqgUnn(`E z#~#D{tc5V$Ri+Q^_UKb)j{^}G*yBT}v-)jTC8;a;w7a{{XWiX*B7Oj0%AY3+An-r% z5q2)`F}`C8{vWm{rsSVRdiz`RQE;#o|E$b0!eU;-O%pL+^HdBg{t=?R@fQ1@ET#Vn zH)H5|l+GC5rQnr-cO-^)7kHO|*DzjaW$Zcd*aRFG#PB``&kNp`7+!on$^fr3hBp$t z67T}hDL#|I+X7y84DVF%wt;u7&t98ryW0I$8Xs2$9C+d{UttrJ5IG@i;KrZdf~}7F1F)Ec6>%Jx#c!) z?8QIN##h?$U3UD49lvJBhwV6?+7X{*JI=J@advE_GIl~Qd`d6;pZ2gk^}nS(7%MHE zR@&51RY6;X(&goKm9B{Pc#+tftH3X}xYnz*vQ;sIA{7ajOS6Yg^rC3EtaTKlOsG@3h zP1vI9>#A#(VdW~VE5}}G73HvHU|TsJhvR~!BCe^cpkleI4z(xJHr) zS2eDnQUzT~)hUH>rR5C`rQx$1BDkgw%Xv*@X+t@lQLI9~SYMSdt#2fy!dlvLmDlo8 zD!AR@<&9P4m9#^tjcBZ^T2*Sh3~c^%8$8rl#XU+pt$OZ}rf_3zRUPR9Radd10aQ^{ zElik(T_Lu0we#&w1P%+Z9cw(A&1O`Ei_4qB(`l1Qnr23vbF^@ARr$(esAlu4!VBxH z{!ux7bwyPJZCp;MsYQv$1HI*ILnMq$A0yIeE8^mFXJ|C7rvB_V#%e9bt&3BsRXn` zVUDSCgH#6EF0ThKHeHjMHcBd!bd~9&lpM;%^IT}_S!(M^awR1x-T|&oc6@&VeJ|oc$+-701+Nq!{vFmMKWJK)G)yq5puLFa;hPP5E#fYG zb3h+P{ADU*lR>jI#;#4rUIcUp;veu`4jO%uU5sx7@ex0V?^@9N5f2XH+7)yT;tqVT zBpJkmGY}IW@y-Fb_9S`4fq}T@1icY)20HO>(1){7he3?J4Eg|KKi1{9K>z3S9}oQh z&I36Z(^RPrqr=+~=m>UXcjR>Bbrf`jI!Zd0bd+^0?`Y^)-Lbagl8%iXTRQIT*w)e6 zvA^TBjsqQCw;sOr$gS7h)^S_ersbQqY`S+7^gtP=1!mZq3OWG(^Z8%v0m&z2#V2Y? zythxkc%PKuz&3CUQ{rbP9-lJNoTSMC#*|DjrkEzq)m1AEDJG?89ySw;gd-V|5>N7s z>8eD)G)V{@Asd-faVF-(m$?!pI|-6z950BnS;n0fGKByt3zIR>UlB%k0|VxDX+hRK;R42>9B8cX%$Lir#{S=dJi4%SdK z@$u54MGP^ynZz4PhWvJFfGjx^ zOvusT2x3tkbEy*vfJc0K3y&Vl+j&e9qgEdqtBrJxqxYD`+u67uC#R4n^K8Kw)`X~( zB{MP7KqhaXNs-1hskJA^mSyG0AJ2`Mk|dEa#}DGDAZoNFRTwSXVoXhfAmx~b-o=Lk zFRuvO2{t{ZVae4epdA84%&`3VyQwMU^-zo$cM&RvTRyfYP4XoB7sHniQYCi0sL`=} z%)x6_6BpE^-Wsx2mCcCftkHzgO0xttBY7^a=fn_iwVme}RiLKwQqQyMMCJH;j)8=j zzLeO*CH|PsmlSpR%tXuS$;T+p8fAUR#nA!-R6=f|?dYCf>^T8i9*jDzr>s3;9-~;Q zrP9+UYD~3`@;zLrTRtXGh=*)+ED(GG{2_v~#ZttD=2>W>pse|&W6 z_wc;Ysoxtr_4}eze?o*0-y}xY0e`eOdmX^yA-X$pXa$LK2x1k%!ecKffvD|#*r!;- zs&7ntiV;rM!Db+_LBiQ4aox4;x2<@WXfitD-d@GU&{?Y2Ak4or(|1o;LLGqJV*(@Bh08Y8+9B-ioXi7RHg z;Mwd|h`i{IIy5fEq48jgO{6E)Ht`s|eZ}PkpPu_!oh?-i#c z$zrVqVxt~2GA3A~VWQQt$aAcX?TDl25^J!>T%h*M_zT9QEdTIH%(|wIZh+7mux`d&F7#eCdoDSqSaL9L9W~2Zo}ra9W}_Vs*lXpqFE+hL zcRb(GjoZ_^k!d?}yTF>dt>LVS)k}*Ge8(~TXc_uXG)IS<^6xDOz1@%1m|w|Q8!(sU zeDfIoI^G%%y>}kbc`ZI>Uc+@w?=4o(yAr*6JocIP?vYPmiPWe3wvL!lkVK;`*%~>0 zjt23squA_Sfwj89u9c|dS zqaA|2MnXSp$t1rd9_<&u<%^#4e#FJrl;0=fVtzdu5O-cu#FWz4^6Nk8Xrg)e{jSLR zf&r;U0OmWbSD}uch3b}HqI+LtaYmiwqUxE}uF@URgfikHYIyg+4KKRV7q`3qX>0p> zwsu0#=C!Y!X?5;#*-Wi$FABI`7VDOnzWY#ru#@epWYUllm9(}pxRenifEKZSv5QzL zt#WCREe5}|#5!v2Ec#nJ3;UAAzQL3c?PLG$<~-`wW47o&b(+%CY5(&>Bxbz-;vr&< z2Y+nWOp0_UYdpkWo}z*Ji182*<00k07!R?E6?;1GrC*EmSw7yPw}4TY9&H@Mnzo%{ zYvrOO>;9~DM=5%d9&<;@zUYqJ1m?T6cp5$)am8+ncw-uxHm)=#_->U(11Azi&-0JL zM2FkJ)B%VPy`S&)t=l8GO%$CU1F?M?1K^)5v3+}XD2#;INj5cR)656LKf9KXjwdk` zgVqF^VKw%Ep5tjC)iY}Ae{T##*8nZL1~_8Y06jWBg>_BHT2j*MQ*i3GaqZ?X)X2k9YmP) z-}($gZke4r7dua`M?9x4p6~c?DgRIA|MebNj^{J1cSY!Bb?oU_jcxPU6nm|wdwdX) z_W&2*D=n0qN=b>8qPz``LsH*EbQ&d&aViT$+NWS>s``aU8|hS**lFswV760+T&GfI zGqo!y!_^2J1qgn`SMF9+8J2O;QBGyK$ghLR3mofJ8f@m3Qf_+AfSdHMkntp>tI9ef zovLNfb8C{3k5Fa`4P;$)I!MI}7~!fnL34w41Q0w$3{QeU?c7bCUqyn5y|_08*fSYZ~Tm0PeT%Ot1N-5IbT9%ufLBBC+qy zAoE@e>LzfscI9$Jy6X4=hP(n&?JN1VAvNJC1Rmzyg~*SuBUh0S=|*BYB16|+rG);d z#(q_uqI=CE;4qH0)#G($&KICSH_TH6D1=zK08{mVxmzyW^ z^|k7AhQ8Ny2~eu&f@_9M6N;O(PABh|+)0tbQp1xdXeL5sWff-1XXzzY|D#75{2vk`y~sF4`?YeY(p z?lvzKAXkq!uM%RTFeltBQby~3^Bw`l=*iKMKNhpaHj!tXo*LK%zNy%JaFC44 zL(l1(0Q3!^33`XbycdC73~{YZnTg1deALPK1ZObECeYnrtM6;6M-Y3}1De--5!6$p z;$4lI2LN6r@ScVYG$X!B8N9ONJ#arK+9N9;BG!zkZZGqZzj!%iEXtQ-=)O#&#ZViF zo{;uBTF)^C)cZ7K@+9T2h&9zQ1FTDEYz;}%ib1EY1Sn9G(qyv>61=&R)0lZ!fIdk1 zPJlp~YW^fZN}9t|kelb}n`W4C0`yCBnE?S()7<7j0n*aq&1?bE)4b+z0s5yUm}3M8 zruoeY0%W8mn^OcBkQOj!2rw|MuQ?lFHhyM8%}h%*7l@Rsv`q6f0S2WFGOGdT*C^D% zY1!rqfNWG=%}$%ld}Kd&tQteRn4=Nm2PsQYx?>IESBM^)uC*Zc??7NkYHqq}{vP>x zFCCT60=EHdBf-(>sv4M%HXDl9bJa2FYJfR*BVjbP{iSKCLBxJ_JskQ+WZ^#C0Kab) z;3D{auh4uk#9kHP61e)10Il%uk0Q^n;ZQI1a&2vC3CuALh5v!f>6@NPKW%kb{Sm4b z2$`Qy;wb=pEdCuOt`OiKX^OcPfLE*=dFVIIIAH09d9wggy4&0?fSm3%pA|q!_nWT) z@Q$yh2TbbTT!EGzG`|wSk&g2fGzB+VPtP{f1TfNvniB+YrVleu62O%{!aQ97Gd;&_ z62P54%4`MT<;10rF|QLKK0VLeEPy9{viX1j-t+?VF#v9XFC8nl014?Qm~R5`DkP?d z%+Cbyr`GIaR)AU7k%XTYN~8XDFiq&c_$wHhkp_PigE7+Je@TmJ@Ym8}8vOONm;t&BN#$KgphYOcQN8pY}2S}h%oDJ>p{Wa(7e#p9uP{Mnfki@E9HLy;lGp(G@-bHux{-eVy8i^QZX|de?Z^8!AlO3idJeY(-b?U? zGF(pfr%OU!;7z1y;1FDGh+=SC8=3lND!q8>ecAo9a=dh1!Um1w5d=E|g9l5NhzCHNN)iLFLAbzY*^ds(q)x}+6Cl5dQU~oqh=-e*^t30t2HgF?*_VQNi-?^d zx`=oJ6{ia)Hc-L^*#`-hx>c0%Gb5Wew1dFU9tE*cL@Wd`1;h|{q9r;Sq9;D z1XMLb;h$~Kg3F{I;<8v9l`>RXxXMmAPAYrVCWlE&q?}>WTxrxWX`YnBf;G_do}Cz6 z1Mm+4t_A34S9*8{!0|SqoTJ$A<8WtFIAxf0GO1l6jUnAoy9kM8wtR3IzzQ3Tkjl;x z{5tSA3PA6J{7!%u0Wxh51>XUHM|kfEehx5IfFA&63ZS9;pf+4=_!@ufV1U&p^9WN8rCth#? zc&HiY13_oR2KF3g<@peJeqaY__(I=yi<(@?JB&i)4a%T}e!J_99J&|V~mph+8p>zf^V1G!me5bz< zZ0Er7ry)|7g^{S8O@Rta@_t3kv#63D9#D#h0yd!@Nv>&mD-oGh_Ywaqu$lHCNbe2= zyD9IYiH{=6QHqU87l9z9$}Bdi4KyiKW*d_>3jQ4Lq^ktKBrxfELC;N{bc>+p1t;Ap z==qtG?g!0vF34t+_W_t|Wo~FO`nYE<1sw7^=aZHByk7JhdB!xJ#2anG+h9m}dEX&& zw_iZ{C}7@SBg}@;?n|}HKu+=8L21$8D+qZW2ajogM0ot45%7zqWMpzK8rAzpQ}sKH%AD3G;r9;3tw^Jxx_ss*}D3O)?7R`pJ0Eg1PreG(J7NE%WfmDDxH& z?V&2NJRC4H?I4(A!IpB;@oF8P zg{+186k?u3hV=g!O9fvy&m+he>W{=EHT|$n;fe_hH7$K7Nb_i=n?aNMH+Cv!K;?Hyw`fEDqDfI7Ir)8r?STp8qx<~x!J6EOp3VT zI300`UFsFcAm0hb@k9ijiukE7vMHOoys;_os4JNkccvdI~Dvl6mJTb1_nPy+K*J_@(f2B7!MJ>Cd0fH zakjE5Lv{B9MK^Vo)fvn^TY$4O4EIt2&dKn)&l2F=jDUMR0NJXXml1UTR)F&}GMNJh z`uGJ-Bza{u7qM={eSnDWFU$E(Wvy+p@&_;uAwkX6?g1Ge_l1y};#4jX6*~eZ-D8%k zoQn9dI2W(J*K7Ns8dVnJ*lAkM+3ZyA6-;{JGz|-^e1}sJKP;!_fvKtTWRZ5KQ#r51 za-6(SFzYEREgy5`7zyzsmv)x-0>7FTGh~*9J$1W=uC(IX; zWD?!-G^i-66Ome`P_?f@vUCCOPd9>89+DL5Tbqb|ZE~lrjKrnI50k1hDOVq99yWmh z)NstR-xi}0D=pqbDHnO^5Q10nB3?y0!{AlCh*$APKwia*$d&+E{<^J&1N@;4uLjlz zD8+RlTXtxa3uB==OdP%MlhPn)iLZua~uE@x4W8Pol1`k(jW&5gB&K7BP-37 zhwUQ9Q4bQ}1YQLfrWVPs+y$vJVkBe4+PYP#EIG-xO{+qpqXEG^ki?r?%^-DUE5H?$ zZIoA8Z)dZQgN$8B(^O**A{;2(38{BL%1aFFG;wFliFcQIy=f+q7Sm~yi|!t|h`0zu z5>-hmYqQ17!;rgO*yBD3CCYf|3NYiyEEazl94RPyWUA4CYr*muL=Gg9$#^}Q7q=2X zTAWHLckQHXKm780Ex2$`#SUhqV(m<$mvr7>k!Orhi z#PSyiMw40tLs_(#jCBnymIEP`P2^b}V7Xa6!W$U*BJm4DTR)rlnhWA;K=PpA|hQ?sZ@Oe*fW5o zzLM!a0U&M(0uNK>BDx3(O0LmF@<#kdM24=PiG-(7OKH8XHjwO2fc>h3!ztHC5W!PG zOv2%m>stW|bi?&`0dP3w!b5157!Idg=m8eM;gkyxOd%na?KL}hf}U40^o4Ub%p>qoN`qHaMd`Ra-9jltAN8P zSG@o@oN_e@fWs-*Dgkgf|U5O5-d`w2{dIE{ZQLEr^%5|WR4RAP> za6L)la4NAwLgc64j=v5ARHDNv{}(`m3DMz{{|FH6p(Hw-^8Z~RI-K&;(~LZg4yXLO zKy*0ecMC*^Q+}U7bU2liED%4OO6n&dKb%Sm3dj$qlClKkhf_&I1>}cQN%RCcH-R5c zC5;o1A5JAr7LXrKB~2BOA5JBO1hfyQl4gUknd-_9r;<+xvRY@vvIOS>q zXdpm`Q##F#XHy2Rte*!i{R;tBNaGU3ni19QWp45pFQ<$}`Em^1mnn}yCJSqhBS+l@ zGR5%}LS|%urKx?znpK5DrNvW;IiCdjHDV#9bw-;{%R#?80h=gw0nO_DJ^-YJM_Wi! zc0anAyq;1QQEKW7fL9S*LaI`OST%1TcnXKt0&XUFGMSe46I5Xy;EQuQ-Fr*N)mEOx ze<#8RixP8L{{$%i+~xDkNZd7@+%=B@a@RZ-aZPUE*shrq;rDdSX*M6OskKR7)pZehyQ;Qp@aG`5>wCK9 z4-tM(*X)Y$Bd!@J&Hd2k;-C+;)M>l26P1?y*j%AU;K#+#YKHU*cy2bOFMci`7q#;d z3;+po1<#b#v7osrRxpn z{UAt2x`8>jfxe6A8x7}9(2o**lh^s2pgRK2mjr!tkg4}U!1W*k{ZX(TlD-F#YN*6A zg{@Noq{T`<*yMH($Gwr!oIC|=H{CR%Qe`)l>%IwaJWr*f-LC;ojKDbM^202jU>v2! z%a;dp2zjVN9;s}W?He!d)m|Qi0cAD=T3|p5$)?6h^QLlw{N$qxz1nCt>jp={moP}$ z>>vr8KH#geA9;HeA*Y+&jj%s1&>tr~ajB>eL?qLxctsoJQJyTM;6}nIA>ei@ep^63 z5zHFO6^Hu-B3B(4+Sv$xgH*Z2L0X7Z<#l>FV(fGgO8Qz#X7cTbX!|O~}#I&I&=yH>3Z~Y(Un}5zF~OJF5dXV?@>>Fp+gKFSVFw z4T0rm_aUVFF1rvn*gXt8FDAzVX|XQ@&Tz78a0#Tc)jWS+u-vQ#A^nNr<%sbsR(#Me zr~H!;NC{4*AlGiV8DOZh5%g!;JCJrrjt>x_jc8oZ#ct_QqN(U#l-Sp)oO@JakjWjC znC?`rJ1Q}Y$&XUv0H@M{?}0&;Zz16 zm3SP}V_hIEt{ebS(*vg&cr})-;BY3O^K`&wf^o+Kx-Nju2W;<|{1nSYH$2{nu=oiM zb02}jorWk!&MfWz|mA~4kBGmI1Q0}2zwfsHm6uyUi}y8!f+MBn7~wF$Z- z;M*wZn}bYS51<~5ZQ zHCS%;F2X@R#=b***lq=Sgi97cR?v8hUdcxIuB1%Q!~&06O7BZvrPJ1K-+WQu!h9At z1c@I?B%>8VPZ@k5eIY51aTq&`z|hyCN7NBf3(h%2>;-WV5$jNgD~Q+%;zlA8VcH!a z3@m4S$jybm2f=Vk^S2WJ1)Dzx{9TkI0m^oRK-xvAR-S19FH+h`(Do7$bs*m1Lat8{ z#rLxW&w`-zt)%Eal>ZG0&IG||pJcib4zLSz_W_XXOmWg&In3hd=#|AwXVltkF7sUv z89dFVGq%sRii3A!!521Qp4o7-rh4Zg+C|>}lT+DiJKMJxjD(jE9L_?@y@?cMOMmd6 z3gLhZ)}73MF6f~|-(~oJ1A08scYFPhfnGrLJpuo_pjQ(8#~@3fv-f5&5*0P1fOW`Vq$$Xw6wNzzCt1?NqW@_ucqNf(0i z2Fz6MN%vh0y3cO1S?R#jO@D&~J>#d`oX%3Z0q#P&vMF6P`l`w;5KtjX)lzQ7V^V$r zZo^6v2nuw2x;rpZfX(UNK)wK5(*1$i0{kI85U3E~j`Y;PY5;m1Pq{Na80Zk-uJi$c zKMS$D(=%B=s#fY$2pTNy5LHP}SO9b#gyc&-mm<<-@AruK(6}FW%k9QWzYt>5IXFaE zYfqy6egh8IH41P24WiW{eKQH&3!y(9B{Yusf-+Lb>XP~ zAnQ-h6iUxJl{rTx;yQ#LxRm}1%Z^GMjE6ud@pn#T^HGVZjCTS2ss|n!OgI&C{fJ!R z@lj;>sD8d$uoG4xm;|OYH|UmT`LjUs{yCfZhY5O)>K`rW5`+0RQO0`_lvBpzgN8KO zKVJysGyf@qo`R?DNSp63l;b@Fmr#zAP}B_n8X<+Fu}F@Ys{ca4KM_ThAdipws*l>z zM~{(vHbFpFebmPjXaM{PSiY9`@a;rip3#X&8YM{s_FDu=4R|$%ej`c`e23^U5|uRY zBcjJz^w&g>la>+x#~2xPF!*^AnKIBx^myq-$Yc&Q2`ra7IEW*#LZaGJ8vSIYw9`_Y zLG&(87&fh>_9Xb#C!nP5(BEW>o%y#fL**rWzvoDgoME2&;tb2Jj8zz-uC(3Pi zUjz9WHo$Z&H)B$sD>otJ`rI`6Rz}ik(zYh#^)?T>er=O{Zob9_Y&d?Alovr)NYdhe zWFuTKVkfK*QtcNsIB{SCYx)to;wqpV_bwRow4DtG;Bg(39yfi%X7Th7dZfG0LHgGb z7PpUOEguY>4@$Yb9Ui1Rh=W>)wT&Kyw3_oFYQjMtvTFNEv{U9FAJH$L1rx9f>4xC9 z$f6ub9`zRD9Oaedzy=VsKq#*!v%uv7{3Y24bO2CSQC>^-2L1%VC&)LF{ei~-XdzMF zN)80}39+}6gMsG-_-k@z;4cEalbp>GNL3olahyJSAX#-gSvZF3!3Gx)V>7Ksqf0>Q zqo|jSx!*uQe_c3+Iu#pB%(2wpd^-`08@)Ii6L8hbBtQd&`CbQ^@BxBNlrnPsjfirL z48y++#8T)mvY5XXH2KLGWcbe#{J~!TD#6bV_|F&gkW_z*poa$imkRp0O#hXjxlU{i z^X>pJ4)M*-7<%$%%$d~oY%Cc!mU@M+8Nmda67&8Qq_=XW{Oh9ZHKLit5mvJlp&a)l_%gyE;hdVyV+Kkw17Yx5L zc^4SRgOG+fl`?S=E59YUc=v0$%~fObNsEs_1P|oB3oRrq+ zUxU_vhrl%)R;@NvX{G9vK~o-S75GnrSOtcvq?nnAnK_9>%~KG{c(V$TuDWCGl@@

-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

y22^UEd9+WFWs}PJEd?uu%ae2H7}d3m#b>J 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 literal 0 HcmV?d00001 diff --git a/examples/hello-world/main.c b/examples/hello-world/main.c new file mode 100644 index 00000000..3f67e00f --- /dev/null +++ b/examples/hello-world/main.c @@ -0,0 +1,6 @@ +#include + +int main(void) { + printf("Hello, world!\n"); + return 0; +} From 121c4b81683750c1db76198b7a5b11244a6ad7c6 Mon Sep 17 00:00:00 2001 From: Brandon Ros Date: Thu, 9 Apr 2026 08:35:19 -0400 Subject: [PATCH 3/3] reorg tests, add hello world example + cross compile --- .../src/tests/fixtures/hello_linux_arm64 | Bin .../src/tests/fixtures/hello_linux_x64 | Bin .../src/tests/fixtures/hello_linux_x86 | Bin 0 -> 14928 bytes .../src/tests/fixtures/hello_mac_arm64 | Bin 33440 -> 33440 bytes .../libmwemu/src/tests/fixtures/hello_mac_x64 | Bin 0 -> 8440 bytes .../src/tests/fixtures/hello_win_arm64.exe | Bin .../src/tests/fixtures/hello_win_x64.exe | Bin .../src/tests/fixtures/hello_win_x86.exe | Bin 0 -> 78336 bytes .../tests/{ => isa/aarch64}/aarch64_basic.rs | 0 crates/libmwemu/src/tests/isa/aarch64/mod.rs | 1 + crates/libmwemu/src/tests/isa/mod.rs | 3 + .../tests/{ => isa/x64}/allocator64_test.rs | 0 .../src/tests/{ => isa/x64}/call64.rs | 0 .../{ => isa/x64}/exception_handler64.rs | 0 .../src/tests/{ => isa/x64}/linux_call64.rs | 0 .../src/tests/{ => isa/x64}/mem64_test.rs | 0 .../src/tests/{ => isa/x64}/memmove_test.rs | 0 crates/libmwemu/src/tests/isa/x64/mod.rs | 7 + .../src/tests/{ => isa/x64}/stack64_test.rs | 0 .../tests/{ => isa/x86}/allocator32_test.rs | 0 .../x86}/basic_test_code_bytes_shld_shrd.rs | 0 .../{ => isa/x86}/bit_manipulation_tests.rs | 0 .../src/tests/{ => isa/x86}/call32.rs | 0 .../src/tests/{ => isa/x86}/cmpxchg_tests.rs | 0 .../{ => isa/x86}/exception_handler32.rs | 0 .../tests/{ => isa/x86}/flag_calculations.rs | 0 .../tests/{ => isa/x86}/fpu_conversions.rs | 0 .../tests/{ => isa/x86}/fpu_f80_emulation.rs | 0 .../{ => isa/x86}/fpu_stack_operations.rs | 0 .../src/tests/{ => isa/x86}/logic_test.rs | 0 crates/libmwemu/src/tests/isa/x86/mod.rs | 22 ++ .../x86}/rax_x86_tests/arithmetic/aaa_aas.rs | 0 .../x86}/rax_x86_tests/arithmetic/aam_aad.rs | 0 .../rax_x86_tests/arithmetic/adc_extended.rs | 0 .../rax_x86_tests/arithmetic/adcx_adox.rs | 0 .../rax_x86_tests/arithmetic/add_extended.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/aaa.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/aad.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/aam.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/aas.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/daa.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/das.rs | 0 .../x86}/rax_x86_tests/arithmetic/bcd/mod.rs | 0 .../rax_x86_tests/arithmetic/cmp_extended.rs | 0 .../arithmetic/comparison/cmp.rs | 0 .../arithmetic/comprehensive_arithmetic.rs | 0 .../x86}/rax_x86_tests/arithmetic/daa_das.rs | 0 .../x86}/rax_x86_tests/arithmetic/div.rs | 0 .../x86}/rax_x86_tests/arithmetic/idiv.rs | 0 .../x86}/rax_x86_tests/arithmetic/imul.rs | 0 .../x86}/rax_x86_tests/arithmetic/inc_dec.rs | 0 .../arithmetic/integer_addition_carry/adc.rs | 0 .../arithmetic/integer_addition_carry/add.rs | 0 .../arithmetic/integer_division/div.rs | 0 .../arithmetic/integer_division/idiv.rs | 0 .../arithmetic/integer_multiplication/imul.rs | 0 .../arithmetic/integer_multiplication/mul.rs | 0 .../arithmetic/integer_subtraction/dec.rs | 0 .../arithmetic/integer_subtraction/inc.rs | 0 .../arithmetic/integer_subtraction/neg.rs | 0 .../arithmetic/integer_subtraction/sbb.rs | 0 .../integer_subtraction_base/sub.rs | 0 .../x86}/rax_x86_tests/arithmetic/mod.rs | 0 .../x86}/rax_x86_tests/arithmetic/mul.rs | 0 .../x86}/rax_x86_tests/arithmetic/neg.rs | 0 .../rax_x86_tests/arithmetic/sbb_extended.rs | 0 .../rax_x86_tests/arithmetic/sub_extended.rs | 0 .../{ => isa/x86}/rax_x86_tests/check.py | 0 .../{ => isa/x86}/rax_x86_tests/clean.py | 0 .../{ => isa/x86}/rax_x86_tests/clean2.py | 0 .../{ => isa/x86}/rax_x86_tests/common/mod.rs | 0 .../{ => isa/x86}/rax_x86_tests/fixer.py | 0 .../rax_x86_tests/fpu/arithmetic_variants.rs | 0 .../rax_x86_tests/fpu/comparison_control.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/f2xm1.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fabs.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fadd.rs | 0 .../fpu/faddp_fsubp_fmulp_fdivp.rs | 0 .../x86}/rax_x86_tests/fpu/fbld_fbstp.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fchs.rs | 0 .../x86}/rax_x86_tests/fpu/fclex_fnclex.rs | 0 .../x86}/rax_x86_tests/fpu/fcmovcc.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fcom.rs | 0 .../x86}/rax_x86_tests/fpu/fcomi_fcomip.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fcompp.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fcos.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fdiv.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/ffree.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fiadd.rs | 0 .../x86}/rax_x86_tests/fpu/ficom_ficomp.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fidiv.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fidivr.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fild.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fimul.rs | 0 .../x86}/rax_x86_tests/fpu/fincstp_fdecstp.rs | 0 .../x86}/rax_x86_tests/fpu/finit_fninit.rs | 0 .../x86}/rax_x86_tests/fpu/fist_fistp.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fisttp.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fisub.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fisubr.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fld.rs | 0 .../x86}/rax_x86_tests/fpu/fld_constants.rs | 0 .../x86}/rax_x86_tests/fpu/fldcw_fstcw.rs | 0 .../x86}/rax_x86_tests/fpu/fldenv_fstenv.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fmul.rs | 0 .../x86}/rax_x86_tests/fpu/fninit_extended.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fnop.rs | 0 .../x86}/rax_x86_tests/fpu/fnsave_fnop.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fpatan.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fprem.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fprem1.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fptan.rs | 0 .../x86}/rax_x86_tests/fpu/frndint.rs | 0 .../rax_x86_tests/fpu/frndint_extended.rs | 0 .../x86}/rax_x86_tests/fpu/fsave_frstor.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fscale.rs | 0 .../x86}/rax_x86_tests/fpu/fsin_fcos.rs | 0 .../x86}/rax_x86_tests/fpu/fsincos.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fsqrt.rs | 0 .../x86}/rax_x86_tests/fpu/fst_fstp.rs | 0 .../x86}/rax_x86_tests/fpu/fstenv_fnstenv.rs | 0 .../x86}/rax_x86_tests/fpu/fstsw_fnstsw.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fsub.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/ftst.rs | 0 .../rax_x86_tests/fpu/fucom_fucomp_fucompp.rs | 0 .../x86}/rax_x86_tests/fpu/fucomi_fucomip.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fxam.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fxch.rs | 0 .../rax_x86_tests/fpu/fxsave64_fxrstor64.rs | 0 .../x86}/rax_x86_tests/fpu/fxsave_fxrstor.rs | 0 .../x86}/rax_x86_tests/fpu/fxtract.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/fyl2x.rs | 0 .../x86}/rax_x86_tests/fpu/fyl2xp1.rs | 0 .../{ => isa/x86}/rax_x86_tests/fpu/mod.rs | 0 .../x86}/rax_x86_tests/lapic_integration.rs | 0 .../basic_logic/and.rs | 0 .../basic_logic/mod.rs | 0 .../basic_logic/not.rs | 0 .../basic_logic/or.rs | 0 .../basic_logic/test.rs | 0 .../basic_logic_xor/mod.rs | 0 .../basic_logic_xor/xor.rs | 0 .../bit_counting_swap/bswap.rs | 0 .../bit_counting_swap/lzcnt.rs | 0 .../bit_counting_swap/mod.rs | 0 .../bit_counting_swap/tzcnt.rs | 0 .../bit_scanning/bsf.rs | 0 .../bit_scanning/bsr.rs | 0 .../bit_scanning/mod.rs | 0 .../bit_testing/bt.rs | 0 .../bit_testing/btc.rs | 0 .../bit_testing/btr.rs | 0 .../bit_testing/bts.rs | 0 .../bit_testing/mod.rs | 0 .../logic_and_bit_manipulation/bmi1/bextr.rs | 0 .../logic_and_bit_manipulation/bmi1/blsi.rs | 0 .../logic_and_bit_manipulation/bmi1/blsmsk.rs | 0 .../logic_and_bit_manipulation/bmi1/blsr.rs | 0 .../logic_and_bit_manipulation/bmi1/mod.rs | 0 .../logic_and_bit_manipulation/bmi2/bzhi.rs | 0 .../logic_and_bit_manipulation/bmi2/mod.rs | 0 .../logic_and_bit_manipulation/bmi2/pdep.rs | 0 .../logic_and_bit_manipulation/bmi2/pext.rs | 0 .../logic_and_bit_manipulation/mod.rs | 0 .../rotates_advanced/mod.rs | 0 .../rotates_advanced/rorx.rs | 0 .../rotates_basic/mod.rs | 0 .../rotates_basic/rcl.rs | 0 .../rotates_basic/rcr.rs | 0 .../rotates_basic/rol.rs | 0 .../rotates_basic/ror.rs | 0 .../shifts_arithmetic/mod.rs | 0 .../shifts_arithmetic/sar.rs | 0 .../shifts_double_precision/mod.rs | 0 .../shifts_double_precision/shld.rs | 0 .../shifts_double_precision/shrd.rs | 0 .../shifts_logical/mod.rs | 0 .../shifts_logical/shl.rs | 0 .../shifts_logical/shr.rs | 0 .../shifts_variable/mod.rs | 0 .../shifts_variable/sarx.rs | 0 .../shifts_variable/shlx.rs | 0 .../shifts_variable/shrx.rs | 0 .../x86}/rax_x86_tests/logical/and.rs | 0 .../x86}/rax_x86_tests/logical/mod.rs | 0 .../x86}/rax_x86_tests/logical/not.rs | 0 .../{ => isa/x86}/rax_x86_tests/logical/or.rs | 0 .../x86}/rax_x86_tests/logical/sar.rs | 0 .../x86}/rax_x86_tests/logical/shl_sal.rs | 0 .../x86}/rax_x86_tests/logical/shr.rs | 0 .../x86}/rax_x86_tests/logical/test.rs | 0 .../x86}/rax_x86_tests/logical/xor.rs | 0 .../tests/{ => isa/x86}/rax_x86_tests/mod.rs | 0 .../{ => isa/x86}/rax_x86_tests/rotate/mod.rs | 0 .../{ => isa/x86}/rax_x86_tests/rotate/rcl.rs | 0 .../{ => isa/x86}/rax_x86_tests/rotate/rcr.rs | 0 .../{ => isa/x86}/rax_x86_tests/rotate/rol.rs | 0 .../rax_x86_tests/rotate/rol_ror_extended.rs | 0 .../{ => isa/x86}/rax_x86_tests/rotate/ror.rs | 0 .../x86}/rax_x86_tests/rotate/shld.rs | 0 .../rotate/shld_shrd_extended.rs | 0 .../x86}/rax_x86_tests/rotate/shrd.rs | 0 .../x86}/rax_x86_tests/simd/avx/mod.rs | 0 .../rax_x86_tests/simd/avx/vaddps_vaddpd.rs | 0 .../rax_x86_tests/simd/avx/vaddss_vaddsd.rs | 0 .../simd/avx/vaddsubps_vaddsubpd.rs | 0 .../rax_x86_tests/simd/avx/vandnps_vandnpd.rs | 0 .../rax_x86_tests/simd/avx/vandps_vandpd.rs | 0 .../simd/avx/vblendps_vblendpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vblendvpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vblendvps.rs | 0 .../simd/avx/vbroadcastss_vbroadcastsd.rs | 0 .../rax_x86_tests/simd/avx/vcmpps_vcmppd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vcomisd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vcomiss.rs | 0 .../simd/avx/vcvtdq2pd_vcvtpd2dq.rs | 0 .../simd/avx/vcvtdq2ps_vcvtps2dq.rs | 0 .../simd/avx/vcvtps2pd_vcvtpd2ps.rs | 0 .../simd/avx/vcvtsi2ss_vcvtsi2sd.rs | 0 .../simd/avx/vcvtss2sd_vcvtsd2ss.rs | 0 .../simd/avx/vcvtss2si_vcvtsd2si.rs | 0 .../simd/avx/vcvttps2dq_vcvttpd2dq.rs | 0 .../simd/avx/vcvttss2si_vcvttsd2si.rs | 0 .../rax_x86_tests/simd/avx/vdivps_vdivpd.rs | 0 .../rax_x86_tests/simd/avx/vdivss_vdivsd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vdppd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vdpps.rs | 0 .../rax_x86_tests/simd/avx/vextractf128.rs | 0 .../simd/avx/vextractf128_vinsertf128.rs | 0 .../rax_x86_tests/simd/avx/vfmadd132pd.rs | 0 .../rax_x86_tests/simd/avx/vfmadd132ps.rs | 0 .../rax_x86_tests/simd/avx/vfmadd213pd.rs | 0 .../rax_x86_tests/simd/avx/vfmadd213ps.rs | 0 .../rax_x86_tests/simd/avx/vfmadd231pd.rs | 0 .../rax_x86_tests/simd/avx/vfmadd231ps.rs | 0 .../rax_x86_tests/simd/avx/vfmsub132pd.rs | 0 .../rax_x86_tests/simd/avx/vfmsub132ps.rs | 0 .../rax_x86_tests/simd/avx/vfmsub213pd.rs | 0 .../rax_x86_tests/simd/avx/vfmsub213ps.rs | 0 .../rax_x86_tests/simd/avx/vfmsub231pd.rs | 0 .../rax_x86_tests/simd/avx/vfmsub231ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd132pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd132ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd213pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd213ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd231pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmadd231ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub132pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub132ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub213pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub213ps.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub231pd.rs | 0 .../rax_x86_tests/simd/avx/vfnmsub231ps.rs | 0 .../rax_x86_tests/simd/avx/vhaddps_vhaddpd.rs | 0 .../rax_x86_tests/simd/avx/vhsubps_vhsubpd.rs | 0 .../rax_x86_tests/simd/avx/vinsertf128.rs | 0 .../simd/avx/vldmxcsr_vstmxcsr.rs | 0 .../simd/avx/vmaskmovps_vmaskmovpd.rs | 0 .../rax_x86_tests/simd/avx/vmaxps_vmaxpd.rs | 0 .../rax_x86_tests/simd/avx/vminps_vminpd.rs | 0 .../rax_x86_tests/simd/avx/vmovaps_vmovapd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovddup.rs | 0 .../rax_x86_tests/simd/avx/vmovdqa_vmovdqu.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovhlps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovhpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovhps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovlhps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovlpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovlps.rs | 0 .../simd/avx/vmovmskps_vmovmskpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovntdq.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovntdqa.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovntpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovntps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovsd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovshdup.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovsldup.rs | 0 .../x86}/rax_x86_tests/simd/avx/vmovss.rs | 0 .../rax_x86_tests/simd/avx/vmovups_vmovupd.rs | 0 .../rax_x86_tests/simd/avx/vmulps_vmulpd.rs | 0 .../rax_x86_tests/simd/avx/vmulss_vmulsd.rs | 0 .../rax_x86_tests/simd/avx/vorps_vorpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vperm2f128.rs | 0 .../x86}/rax_x86_tests/simd/avx/vpermilpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vpermilps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vrcpps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vroundpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vroundps.rs | 0 .../x86}/rax_x86_tests/simd/avx/vroundsd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vroundss.rs | 0 .../x86}/rax_x86_tests/simd/avx/vrsqrtps.rs | 0 .../rax_x86_tests/simd/avx/vshufps_vshufpd.rs | 0 .../rax_x86_tests/simd/avx/vsqrtps_vsqrtpd.rs | 0 .../rax_x86_tests/simd/avx/vsubps_vsubpd.rs | 0 .../rax_x86_tests/simd/avx/vsubss_vsubsd.rs | 0 .../rax_x86_tests/simd/avx/vtestps_vtestpd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vucomisd.rs | 0 .../x86}/rax_x86_tests/simd/avx/vucomiss.rs | 0 .../simd/avx/vunpckhps_vunpckhpd.rs | 0 .../simd/avx/vunpcklps_vunpcklpd.rs | 0 .../rax_x86_tests/simd/avx/vxorps_vxorpd.rs | 0 .../simd/avx/vzeroupper_vzeroall.rs | 0 .../x86}/rax_x86_tests/simd/avx2/mod.rs | 0 .../rax_x86_tests/simd/avx2/vbroadcasti128.rs | 0 .../rax_x86_tests/simd/avx2/vextracti128.rs | 0 .../simd/avx2/vgatherdps_vgatherdpd.rs | 0 .../simd/avx2/vgatherqps_vgatherqpd.rs | 0 .../rax_x86_tests/simd/avx2/vinserti128.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vmpsadbw.rs | 0 .../simd/avx2/vpabsb_vpabsw_vpabsd.rs | 0 .../simd/avx2/vpacksswb_vpackssdw.rs | 0 .../simd/avx2/vpackuswb_vpackusdw.rs | 0 .../simd/avx2/vpaddb_vpaddw_vpaddd_vpaddq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpaddsb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpaddsw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpaddusb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpaddusw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpalignr.rs | 0 .../simd/avx2/vpand_vpor_vpxor.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpandn.rs | 0 .../rax_x86_tests/simd/avx2/vpavgb_vpavgw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpblendd.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpblendvb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpblendw.rs | 0 .../simd/avx2/vpbroadcastb_vpbroadcastw.rs | 0 .../simd/avx2/vpbroadcastd_vpbroadcastq.rs | 0 .../vpcmpeqb_vpcmpeqw_vpcmpeqd_vpcmpeqq.rs | 0 .../vpcmpgtb_vpcmpgtw_vpcmpgtd_vpcmpgtq.rs | 0 .../rax_x86_tests/simd/avx2/vperm2i128.rs | 0 .../rax_x86_tests/simd/avx2/vpermd_vpermq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpermpd.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpermps.rs | 0 .../simd/avx2/vpgatherdd_vpgatherdq.rs | 0 .../simd/avx2/vpgatherqd_vpgatherqq.rs | 0 .../simd/avx2/vphaddsw_vphsubsw.rs | 0 .../simd/avx2/vphaddw_vphaddd.rs | 0 .../rax_x86_tests/simd/avx2/vphminposuw.rs | 0 .../simd/avx2/vphsubw_vphsubd.rs | 0 .../rax_x86_tests/simd/avx2/vpmaddubsw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpmaddwd.rs | 0 .../simd/avx2/vpmaskmovd_vpmaskmovq.rs | 0 .../simd/avx2/vpmaxsb_vpmaxsw_vpmaxsd.rs | 0 .../simd/avx2/vpmaxub_vpmaxuw_vpmaxud.rs | 0 .../simd/avx2/vpminsb_vpminsw_vpminsd.rs | 0 .../simd/avx2/vpminub_vpminuw_vpminud.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpmovmskb.rs | 0 .../simd/avx2/vpmovsx_variants.rs | 0 .../avx2/vpmovsxbw_vpmovsxbd_vpmovsxbq.rs | 0 .../avx2/vpmovzxbw_vpmovzxbd_vpmovzxbq.rs | 0 .../avx2/vpmovzxwd_vpmovzxwq_vpmovzxdq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpmuldq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpmulhrsw.rs | 0 .../simd/avx2/vpmulhw_vpmulhuw.rs | 0 .../simd/avx2/vpmullw_vpmulld.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpmuludq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsadbw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpshufb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpshufd.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpshufhw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpshuflw.rs | 0 .../simd/avx2/vpsignb_vpsignw_vpsignd.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpslldq.rs | 0 .../simd/avx2/vpsllvd_vpsllvq.rs | 0 .../simd/avx2/vpsllw_vpslld_vpsllq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsravd.rs | 0 .../rax_x86_tests/simd/avx2/vpsraw_vpsrad.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsrldq.rs | 0 .../simd/avx2/vpsrlvd_vpsrlvq.rs | 0 .../simd/avx2/vpsrlw_vpsrld_vpsrlq.rs | 0 .../simd/avx2/vpsubb_vpsubw_vpsubd_vpsubq.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsubsb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsubsw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsubusb.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vpsubusw.rs | 0 .../x86}/rax_x86_tests/simd/avx2/vptest.rs | 0 ...ckhbw_vpunpckhwd_vpunpckhdq_vpunpckhqdq.rs | 0 ...cklbw_vpunpcklwd_vpunpckldq_vpunpcklqdq.rs | 0 .../rax_x86_tests/simd/avx512/kadd_mask.rs | 0 .../simd/avx512/kand_kor_kxor.rs | 0 .../simd/avx512/kandn_knot_mask.rs | 0 .../x86}/rax_x86_tests/simd/avx512/kmov.rs | 0 .../simd/avx512/ktest_kunpck_kshift.rs | 0 .../x86}/rax_x86_tests/simd/avx512/mod.rs | 0 .../avx512/vaddph_vsubph_vmulph_vdivph.rs | 0 .../rax_x86_tests/simd/avx512/vaddps_zmm.rs | 0 .../avx512/valign_vprol_vpror_vpternlog.rs | 0 .../simd/avx512/vcompress_vexpand.rs | 0 .../simd/avx512/vdbpsadbw_vplzcnt_vpshld.rs | 0 .../rax_x86_tests/simd/avx512/vdivps_zmm.rs | 0 .../rax_x86_tests/simd/avx512/vmovaps_zmm.rs | 0 .../rax_x86_tests/simd/avx512/vmovups_zmm.rs | 0 .../rax_x86_tests/simd/avx512/vmulps_zmm.rs | 0 .../rax_x86_tests/simd/avx512/vsubps_zmm.rs | 0 .../rax_x86_tests/simd/avx512_extended.rs | 0 .../rax_x86_tests/simd/avx512_mask_ops.rs | 0 .../x86}/rax_x86_tests/simd/fma/mod.rs | 0 .../vfmadd132pd_vfmadd213pd_vfmadd231pd.rs | 0 .../vfmadd132ps_vfmadd213ps_vfmadd231ps.rs | 0 .../vfmadd132sd_vfmadd213sd_vfmadd231sd.rs | 0 .../vfmadd132ss_vfmadd213ss_vfmadd231ss.rs | 0 .../simd/fma/vfmaddsub_vfmsubadd.rs | 0 .../rax_x86_tests/simd/fma/vfmsub_variants.rs | 0 .../simd/fma/vfnmadd_variants.rs | 0 .../simd/fma/vfnmsub_variants.rs | 0 .../rax_x86_tests/simd/mmx/MMX_TEST_STATUS.md | 0 .../x86}/rax_x86_tests/simd/mmx/emms.rs | 0 .../x86}/rax_x86_tests/simd/mmx/mod.rs | 0 .../x86}/rax_x86_tests/simd/mmx/movq.rs | 0 .../simd/mmx/packsswb_packssdw_mmx.rs | 0 .../rax_x86_tests/simd/mmx/packuswb_mmx.rs | 0 .../simd/mmx/paddb_paddw_paddd.rs | 0 .../simd/mmx/paddsb_paddsw_mmx.rs | 0 .../simd/mmx/paddusb_paddusw_mmx.rs | 0 .../rax_x86_tests/simd/mmx/pand_por_pxor.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pandn_mmx.rs | 0 .../rax_x86_tests/simd/mmx/pavgb_pavgw_mmx.rs | 0 .../simd/mmx/pcmpeqb_pcmpeqw_pcmpeqd.rs | 0 .../simd/mmx/pcmpgtb_pcmpgtw_pcmpgtd_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pextrw_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pinsrw_mmx.rs | 0 .../rax_x86_tests/simd/mmx/pmaddwd_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pmaxsw_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pmaxub_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pminsw_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pminub_mmx.rs | 0 .../rax_x86_tests/simd/mmx/pmulhuw_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pmulhw.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pmullw.rs | 0 .../x86}/rax_x86_tests/simd/mmx/psadbw_mmx.rs | 0 .../x86}/rax_x86_tests/simd/mmx/pshufw.rs | 0 .../simd/mmx/psllw_pslld_psllq_mmx.rs | 0 .../rax_x86_tests/simd/mmx/psraw_psrad_mmx.rs | 0 .../simd/mmx/psrlw_psrld_psrlq_mmx.rs | 0 .../simd/mmx/psubb_psubw_psubd.rs | 0 .../simd/mmx/psubsb_psubsw_mmx.rs | 0 .../simd/mmx/psubusb_psubusw_mmx.rs | 0 .../simd/mmx/punpckhbw_punpckhwd.rs | 0 .../simd/mmx/punpcklbw_punpcklwd.rs | 0 .../{ => isa/x86}/rax_x86_tests/simd/mod.rs | 0 .../x86}/rax_x86_tests/simd/packing_ops.rs | 0 .../rax_x86_tests/simd/sse/addps_addpd.rs | 0 .../rax_x86_tests/simd/sse/addss_addsd.rs | 0 .../simd/sse/addsubps_addsubpd.rs | 0 .../simd/sse/aesdec_aesdeclast.rs | 0 .../simd/sse/aesenc_aesenclast.rs | 0 .../simd/sse/aesimc_aeskeygenassist.rs | 0 .../rax_x86_tests/simd/sse/andnps_andnpd.rs | 0 .../rax_x86_tests/simd/sse/andps_andpd.rs | 0 .../rax_x86_tests/simd/sse/blendps_blendpd.rs | 0 .../simd/sse/blendvps_blendvpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/clflushopt.rs | 0 .../x86}/rax_x86_tests/simd/sse/cmppd.rs | 0 .../x86}/rax_x86_tests/simd/sse/cmpps.rs | 0 .../x86}/rax_x86_tests/simd/sse/cmpsd.rs | 0 .../x86}/rax_x86_tests/simd/sse/cmpss.rs | 0 .../rax_x86_tests/simd/sse/comiss_comisd.rs | 0 .../x86}/rax_x86_tests/simd/sse/crc32.rs | 0 .../simd/sse/cvtdq2pd_cvtpd2dq.rs | 0 .../simd/sse/cvtdq2ps_cvtps2dq.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtpd2ps.rs | 0 .../simd/sse/cvtpi2pd_cvtpd2pi.rs | 0 .../simd/sse/cvtpi2ps_cvtps2pi.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtps2pd.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtsd2si.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtsd2ss.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtsi2sd.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtsi2ss.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtss2sd.rs | 0 .../x86}/rax_x86_tests/simd/sse/cvtss2si.rs | 0 .../simd/sse/cvttps2dq_cvttpd2dq.rs | 0 .../simd/sse/cvttps2pi_cvttpd2pi.rs | 0 .../simd/sse/cvttsd2si_cvttss2si.rs | 0 .../rax_x86_tests/simd/sse/divps_divpd.rs | 0 .../rax_x86_tests/simd/sse/divss_divsd.rs | 0 .../x86}/rax_x86_tests/simd/sse/dppd.rs | 0 .../x86}/rax_x86_tests/simd/sse/dpps.rs | 0 .../x86}/rax_x86_tests/simd/sse/extractps.rs | 0 .../x86}/rax_x86_tests/simd/sse/fisttp_sse.rs | 0 .../rax_x86_tests/simd/sse/haddps_haddpd.rs | 0 .../rax_x86_tests/simd/sse/hsubps_hsubpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/insertps.rs | 0 .../x86}/rax_x86_tests/simd/sse/lddqu.rs | 0 .../rax_x86_tests/simd/sse/ldmxcsr_stmxcsr.rs | 0 .../simd/sse/lfence_mfence_sfence.rs | 0 .../x86}/rax_x86_tests/simd/sse/maskmovdqu.rs | 0 .../rax_x86_tests/simd/sse/maskmovq_emms.rs | 0 .../rax_x86_tests/simd/sse/maxps_maxpd.rs | 0 .../rax_x86_tests/simd/sse/maxss_maxsd.rs | 0 .../rax_x86_tests/simd/sse/minps_minpd.rs | 0 .../rax_x86_tests/simd/sse/minss_minsd.rs | 0 .../x86}/rax_x86_tests/simd/sse/mod.rs | 0 .../simd/sse/monitor_mwait_extended.rs | 0 .../x86}/rax_x86_tests/simd/sse/movapd.rs | 0 .../x86}/rax_x86_tests/simd/sse/movaps.rs | 0 .../x86}/rax_x86_tests/simd/sse/movd_movq.rs | 0 .../x86}/rax_x86_tests/simd/sse/movddup.rs | 0 .../simd/sse/movddup_extended.rs | 0 .../x86}/rax_x86_tests/simd/sse/movdqa.rs | 0 .../x86}/rax_x86_tests/simd/sse/movdqu.rs | 0 .../rax_x86_tests/simd/sse/movhlps_movlhps.rs | 0 .../simd/sse/movhps_movlps_movhpd_movlpd.rs | 0 .../simd/sse/movmskps_movmskpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/movntdq.rs | 0 .../x86}/rax_x86_tests/simd/sse/movntdqa.rs | 0 .../x86}/rax_x86_tests/simd/sse/movnti.rs | 0 .../rax_x86_tests/simd/sse/movntps_movntpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/movntq.rs | 0 .../rax_x86_tests/simd/sse/movntss_movntsd.rs | 0 .../simd/sse/movq_movq2dq_movdq2q.rs | 0 .../simd/sse/movshdup_movsldup.rs | 0 .../simd/sse/movsldup_movshdup_extended.rs | 0 .../simd/sse/movss_movsd_scalar.rs | 0 .../x86}/rax_x86_tests/simd/sse/movupd.rs | 0 .../x86}/rax_x86_tests/simd/sse/movups.rs | 0 .../x86}/rax_x86_tests/simd/sse/mpsadbw.rs | 0 .../simd/sse/mpsadbw_extended.rs | 0 .../rax_x86_tests/simd/sse/mulps_mulpd.rs | 0 .../rax_x86_tests/simd/sse/mulss_mulsd.rs | 0 .../x86}/rax_x86_tests/simd/sse/orps_orpd.rs | 0 .../simd/sse/pabsb_pabsw_pabsd.rs | 0 .../simd/sse/packsswb_packssdw.rs | 0 .../x86}/rax_x86_tests/simd/sse/packusdw.rs | 0 .../simd/sse/packuswb_packusdw.rs | 0 .../simd/sse/paddb_paddw_paddd_paddq.rs | 0 .../rax_x86_tests/simd/sse/paddsb_paddsw.rs | 0 .../rax_x86_tests/simd/sse/paddusb_paddusw.rs | 0 .../x86}/rax_x86_tests/simd/sse/palignr.rs | 0 .../simd/sse/pand_por_pxor_pandn.rs | 0 .../x86}/rax_x86_tests/simd/sse/pause.rs | 0 .../rax_x86_tests/simd/sse/pavgb_pavgw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pblendvb.rs | 0 .../x86}/rax_x86_tests/simd/sse/pblendw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pclmulqdq.rs | 0 .../simd/sse/pclmulqdq_extended.rs | 0 .../simd/sse/pcmpeqb_pcmpeqw_pcmpeqd.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpeqq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpestri.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpestrm.rs | 0 .../simd/sse/pcmpgtb_pcmpgtw_pcmpgtd.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpgtq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpistri.rs | 0 .../x86}/rax_x86_tests/simd/sse/pcmpistrm.rs | 0 .../simd/sse/pextrb_pextrd_pextrq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pextrw.rs | 0 .../rax_x86_tests/simd/sse/phaddsw_phsubsw.rs | 0 .../rax_x86_tests/simd/sse/phaddw_phaddd.rs | 0 .../x86}/rax_x86_tests/simd/sse/phminposuw.rs | 0 .../simd/sse/phminposuw_extended.rs | 0 .../rax_x86_tests/simd/sse/phsubw_phsubd.rs | 0 .../simd/sse/pinsrb_pinsrd_pinsrq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pinsrw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmaddubsw.rs | 0 .../simd/sse/pmaddubsw_extended.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmaddwd.rs | 0 .../rax_x86_tests/simd/sse/pmaxsb_pmaxsd.rs | 0 .../simd/sse/pmaxsb_pmaxsw_pmaxsd.rs | 0 .../simd/sse/pmaxub_pmaxuw_extended.rs | 0 .../simd/sse/pmaxub_pmaxuw_pmaxud.rs | 0 .../rax_x86_tests/simd/sse/pmaxuw_pmaxud.rs | 0 .../rax_x86_tests/simd/sse/pminsb_pminsd.rs | 0 .../simd/sse/pminsb_pminsw_pminsd.rs | 0 .../simd/sse/pminub_pminuw_extended.rs | 0 .../simd/sse/pminub_pminuw_pminud.rs | 0 .../rax_x86_tests/simd/sse/pminuw_pminud.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmovmskb.rs | 0 .../simd/sse/pmovsxbw_pmovsxbd_pmovsxbq.rs | 0 .../simd/sse/pmovsxwd_pmovsxwq_pmovsxdq.rs | 0 .../simd/sse/pmovzxbw_pmovzxbd_pmovzxbq.rs | 0 .../simd/sse/pmovzxwd_pmovzxwq_pmovzxdq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmuldq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmulhrsw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmulhuw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmulhw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmulld.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmullq.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmullw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pmuludq.rs | 0 ...tchnta_prefetcht0_prefetcht1_prefetcht2.rs | 0 .../x86}/rax_x86_tests/simd/sse/psadbw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pshufb.rs | 0 .../x86}/rax_x86_tests/simd/sse/pshufd.rs | 0 .../x86}/rax_x86_tests/simd/sse/pshufhw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pshuflw.rs | 0 .../x86}/rax_x86_tests/simd/sse/pshufw.rs | 0 .../simd/sse/psignb_psignw_psignd.rs | 0 .../rax_x86_tests/simd/sse/pslldq_psrldq.rs | 0 .../simd/sse/psllw_pslld_psllq.rs | 0 .../rax_x86_tests/simd/sse/psraw_psrad.rs | 0 .../simd/sse/psrlw_psrld_psrlq.rs | 0 .../simd/sse/psubb_psubw_psubd_psubq.rs | 0 .../rax_x86_tests/simd/sse/psubsb_psubsw.rs | 0 .../rax_x86_tests/simd/sse/psubusb_psubusw.rs | 0 .../x86}/rax_x86_tests/simd/sse/ptest.rs | 0 ...unpckhbw_punpckhwd_punpckhdq_punpckhqdq.rs | 0 ...unpcklbw_punpcklwd_punpckldq_punpcklqdq.rs | 0 .../x86}/rax_x86_tests/simd/sse/rcpps.rs | 0 .../x86}/rax_x86_tests/simd/sse/rcpss.rs | 0 .../rax_x86_tests/simd/sse/roundps_roundpd.rs | 0 .../rax_x86_tests/simd/sse/roundss_roundsd.rs | 0 .../x86}/rax_x86_tests/simd/sse/rsqrtps.rs | 0 .../x86}/rax_x86_tests/simd/sse/rsqrtss.rs | 0 .../x86}/rax_x86_tests/simd/sse/shufpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/shufps.rs | 0 .../rax_x86_tests/simd/sse/sqrtps_sqrtpd.rs | 0 .../rax_x86_tests/simd/sse/sqrtss_sqrtsd.rs | 0 .../rax_x86_tests/simd/sse/subps_subpd.rs | 0 .../rax_x86_tests/simd/sse/subss_subsd.rs | 0 .../rax_x86_tests/simd/sse/ucomiss_ucomisd.rs | 0 .../x86}/rax_x86_tests/simd/sse/unpckhpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/unpckhps.rs | 0 .../x86}/rax_x86_tests/simd/sse/unpcklpd.rs | 0 .../x86}/rax_x86_tests/simd/sse/unpcklps.rs | 0 .../rax_x86_tests/simd/sse/xorps_xorpd.rs | 0 .../stack_operations/enter_extended.rs | 0 .../stack_operations/leave_extended.rs | 0 .../rax_x86_tests/stack_operations/mod.rs | 0 .../rax_x86_tests/stack_operations/pop/mod.rs | 0 .../rax_x86_tests/stack_operations/pop/pop.rs | 0 .../rax_x86_tests/stack_operations/pop_mem.rs | 0 .../stack_operations/push/mod.rs | 0 .../stack_operations/push/push.rs | 0 .../stack_operations/push_imm.rs | 0 .../stack_operations/push_mem.rs | 0 .../stack_operations/pusha_popa.rs | 0 .../stack_operations/pushf_popf_extended.rs | 0 .../stack_operations/rsp_operations.rs | 0 .../stack_operations/stack_alignment.rs | 0 .../x86}/rax_x86_tests/trash/rotate/mod.rs | 0 .../x86}/rax_x86_tests/trash/rotate/rcl.rs | 0 .../x86}/rax_x86_tests/trash/rotate/rcr.rs | 0 .../x86}/rax_x86_tests/trash/rotate/rol.rs | 0 .../trash/rotate/rol_ror_extended.rs | 0 .../x86}/rax_x86_tests/trash/rotate/ror.rs | 0 .../x86}/rax_x86_tests/trash/rotate/shld.rs | 0 .../trash/rotate/shld_shrd_extended.rs | 0 .../x86}/rax_x86_tests/trash/rotate/shrd.rs | 0 .../tests/{ => isa/x86}/shl2p8_bug_trigger.rs | 0 .../shl2p8_edge_cases_should_not_panic.rs | 0 .../src/tests/{ => isa/x86}/sse_avx_tests.rs | 0 .../src/tests/{ => isa/x86}/stack32_test.rs | 0 .../tests/{ => isa/x86}/stress_sar2p_all.rs | 0 .../tests/{ => isa/x86}/stress_shl1p_all.rs | 0 .../tests/{ => isa/x86}/stress_shl2p_all.rs | 0 .../{ => isa/x86}/stress_shl2p_trigger.rs | 0 .../tests/{ => isa/x86}/stress_shr2p_all.rs | 0 .../tests/{ => isa/x86}/string_ops_tests.rs | 0 .../elf64}/elf64_aarch64_basic.rs | 2 +- .../elf64}/elf64lin_cpu_arithmetics.rs | 0 .../{ => loaders/elf64}/elf64lin_flags.rs | 0 .../tests/{ => loaders/elf64}/elf64lin_fpu.rs | 0 .../elf64}/elf64lin_static_helloworld.rs | 0 .../{ => loaders/elf64}/elf64lin_syscall64.rs | 0 .../libmwemu/src/tests/loaders/elf64/mod.rs | 6 + .../libmwemu/src/tests/loaders/hello_world.rs | 221 ++++++++++++++++++ .../{ => loaders/macho}/macho64_basic.rs | 2 +- .../{ => loaders/macho}/macho64_hello.rs | 4 +- .../libmwemu/src/tests/loaders/macho/mod.rs | 2 + crates/libmwemu/src/tests/loaders/mod.rs | 4 + .../{ => loaders/pe}/exe32win_minecraft.rs | 0 .../tests/{ => loaders/pe}/exe64win_enigma.rs | 0 .../tests/{ => loaders/pe}/exe64win_msgbox.rs | 0 .../src/tests/{ => loaders/pe}/mingw_tests.rs | 0 crates/libmwemu/src/tests/loaders/pe/mod.rs | 7 + .../{ => loaders/pe}/pe64_loader_tests.rs | 0 .../pe}/peb_teb_ldr_structures_test.rs | 0 .../tests/{ => loaders/pe}/tls_fls_tests.rs | 0 crates/libmwemu/src/tests/mod.rs | 84 +------ crates/libmwemu/src/tests/os/mod.rs | 5 + .../src/tests/{ => os}/ssdt_win64_tests.rs | 0 .../tests/{ => os}/syscall64_ssdt_tests.rs | 0 .../{ => os}/threading_operations_tests.rs | 0 .../src/tests/{ => os}/winapi32_tests.rs | 0 .../src/tests/{ => os}/winapi64_tests.rs | 0 crates/libmwemu/src/tests/shellcode/mod.rs | 7 + .../tests/{ => shellcode}/sc32lin_rshell.rs | 0 .../tests/{ => shellcode}/sc32win_donut.rs | 0 .../{ => shellcode}/sc32win_peb_ldr_rot.rs | 0 .../{ => shellcode}/sc32win_veryobfus.rs | 0 .../{ => shellcode}/sc64lin_arith_100iter.rs | 0 .../{ => shellcode}/sc64win_metasploit.rs | 0 .../tests/{ => shellcode}/sc64win_strgen.rs | 0 .../src/tests/{ => unit}/banzai_mode_tests.rs | 0 .../{ => unit}/breakpoint_functionality.rs | 0 .../src/tests/{ => unit}/config_management.rs | 0 .../src/tests/{ => unit}/config_tests.rs | 0 .../tests/{ => unit}/console_control_tests.rs | 0 .../src/tests/{ => unit}/emulation_perf.rs | 0 .../{ => unit}/emulator_initialization.rs | 0 .../src/tests/{ => unit}/error_conditions.rs | 0 .../src/tests/{ => unit}/hooks_system.rs | 0 .../{ => unit}/instruction_pointer_tests.rs | 0 .../{ => unit}/maps_memory_operations.rs | 0 .../tests/{ => unit}/maps_operations_tests.rs | 0 .../tests/{ => unit}/memory_map_operations.rs | 0 crates/libmwemu/src/tests/unit/mod.rs | 20 ++ .../src/tests/{ => unit}/pure_rust_check.rs | 0 .../tests/{ => unit}/register_state_tests.rs | 0 .../src/tests/{ => unit}/regsisters_test.rs | 0 .../tests/{ => unit}/serialization_tests.rs | 0 .../src/tests/{ => unit}/should_serialize.rs | 0 .../test_unified_step_and_run_methods.rs | 0 .../{ => unit}/utility_functions_tests.rs | 0 examples/hello-world/Makefile | 43 +++- flake.nix | 30 +++ 704 files changed, 378 insertions(+), 92 deletions(-) rename examples/hello-world/hello-linux-arm64 => crates/libmwemu/src/tests/fixtures/hello_linux_arm64 (100%) rename examples/hello-world/hello-linux-x64 => crates/libmwemu/src/tests/fixtures/hello_linux_x64 (100%) create mode 100755 crates/libmwemu/src/tests/fixtures/hello_linux_x86 rename examples/hello-world/hello-mac-arm64 => crates/libmwemu/src/tests/fixtures/hello_mac_arm64 (99%) create mode 100755 crates/libmwemu/src/tests/fixtures/hello_mac_x64 rename examples/hello-world/hello-win-arm64.exe => crates/libmwemu/src/tests/fixtures/hello_win_arm64.exe (100%) rename examples/hello-world/hello-win-x64.exe => crates/libmwemu/src/tests/fixtures/hello_win_x64.exe (100%) create mode 100755 crates/libmwemu/src/tests/fixtures/hello_win_x86.exe rename crates/libmwemu/src/tests/{ => isa/aarch64}/aarch64_basic.rs (100%) create mode 100644 crates/libmwemu/src/tests/isa/aarch64/mod.rs create mode 100644 crates/libmwemu/src/tests/isa/mod.rs rename crates/libmwemu/src/tests/{ => isa/x64}/allocator64_test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x64}/call64.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x64}/exception_handler64.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x64}/linux_call64.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x64}/mem64_test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x64}/memmove_test.rs (100%) create mode 100644 crates/libmwemu/src/tests/isa/x64/mod.rs rename crates/libmwemu/src/tests/{ => isa/x64}/stack64_test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/allocator32_test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/basic_test_code_bytes_shld_shrd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/bit_manipulation_tests.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/call32.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/cmpxchg_tests.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/exception_handler32.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/flag_calculations.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/fpu_conversions.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/fpu_f80_emulation.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/fpu_stack_operations.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/logic_test.rs (100%) create mode 100644 crates/libmwemu/src/tests/isa/x86/mod.rs rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/aaa_aas.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/aam_aad.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/adc_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/adcx_adox.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/add_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/aaa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/aad.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/aam.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/aas.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/daa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/das.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/bcd/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/cmp_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/comparison/cmp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/comprehensive_arithmetic.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/daa_das.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/div.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/idiv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/imul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/inc_dec.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_addition_carry/adc.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_addition_carry/add.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_division/div.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_division/idiv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_multiplication/imul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_multiplication/mul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_subtraction/dec.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_subtraction/inc.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_subtraction/neg.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_subtraction/sbb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/integer_subtraction_base/sub.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/mul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/neg.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/sbb_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/arithmetic/sub_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/check.py (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/clean.py (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/clean2.py (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/common/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fixer.py (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/arithmetic_variants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/comparison_control.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/f2xm1.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fabs.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fadd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/faddp_fsubp_fmulp_fdivp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fbld_fbstp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fchs.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fclex_fnclex.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fcmovcc.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fcom.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fcomi_fcomip.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fcompp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fcos.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fdiv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/ffree.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fiadd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/ficom_ficomp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fidiv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fidivr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fild.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fimul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fincstp_fdecstp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/finit_fninit.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fist_fistp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fisttp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fisub.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fisubr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fld_constants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fldcw_fstcw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fldenv_fstenv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fmul.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fninit_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fnop.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fnsave_fnop.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fpatan.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fprem.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fprem1.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fptan.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/frndint.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/frndint_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fsave_frstor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fscale.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fsin_fcos.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fsincos.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fsqrt.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fst_fstp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fstenv_fnstenv.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fstsw_fnstsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fsub.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/ftst.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fucom_fucomp_fucompp.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fucomi_fucomip.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fxam.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fxch.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fxsave64_fxrstor64.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fxsave_fxrstor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fxtract.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fyl2x.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/fyl2xp1.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/fpu/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/lapic_integration.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic/and.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic/not.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic/or.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic/test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic_xor/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/basic_logic_xor/xor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_counting_swap/bswap.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_counting_swap/lzcnt.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_counting_swap/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_counting_swap/tzcnt.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_scanning/bsf.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_scanning/bsr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_scanning/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_testing/bt.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_testing/btc.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_testing/btr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_testing/bts.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bit_testing/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi1/bextr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi1/blsi.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi1/blsmsk.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi1/blsr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi1/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi2/bzhi.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi2/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi2/pdep.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/bmi2/pext.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_advanced/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_advanced/rorx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_basic/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_basic/rcl.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_basic/rcr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_basic/rol.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/rotates_basic/ror.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_arithmetic/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_arithmetic/sar.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_double_precision/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_double_precision/shld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_double_precision/shrd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_logical/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_logical/shl.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_logical/shr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_variable/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_variable/sarx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_variable/shlx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logic_and_bit_manipulation/shifts_variable/shrx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/and.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/not.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/or.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/sar.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/shl_sal.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/shr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/logical/xor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/rcl.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/rcr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/rol.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/rol_ror_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/ror.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/shld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/shld_shrd_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/rotate/shrd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vaddps_vaddpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vaddss_vaddsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vaddsubps_vaddsubpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vandnps_vandnpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vandps_vandpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vblendps_vblendpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vblendvpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vblendvps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vbroadcastss_vbroadcastsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcmpps_vcmppd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcomisd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcomiss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtdq2pd_vcvtpd2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtdq2ps_vcvtps2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtps2pd_vcvtpd2ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtsi2ss_vcvtsi2sd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtss2sd_vcvtsd2ss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvtss2si_vcvtsd2si.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvttps2dq_vcvttpd2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vcvttss2si_vcvttsd2si.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vdivps_vdivpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vdivss_vdivsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vdppd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vdpps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vextractf128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vextractf128_vinsertf128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd132pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd132ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd213pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd213ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd231pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmadd231ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub132pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub132ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub213pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub213ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub231pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfmsub231ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd132pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd132ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd213pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd213ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd231pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmadd231ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub132pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub132ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub213pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub213ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub231pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vfnmsub231ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vhaddps_vhaddpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vhsubps_vhsubpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vinsertf128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vldmxcsr_vstmxcsr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmaskmovps_vmaskmovpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmaxps_vmaxpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vminps_vminpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovaps_vmovapd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovddup.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovdqa_vmovdqu.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovhlps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovhpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovhps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovlhps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovlpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovlps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovmskps_vmovmskpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovntdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovntdqa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovntpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovntps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovshdup.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovsldup.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmovups_vmovupd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmulps_vmulpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vmulss_vmulsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vorps_vorpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vperm2f128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vpermilpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vpermilps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vrcpps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vroundpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vroundps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vroundsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vroundss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vrsqrtps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vshufps_vshufpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vsqrtps_vsqrtpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vsubps_vsubpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vsubss_vsubsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vtestps_vtestpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vucomisd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vucomiss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vunpckhps_vunpckhpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vunpcklps_vunpcklpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vxorps_vxorpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx/vzeroupper_vzeroall.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vbroadcasti128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vextracti128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vgatherdps_vgatherdpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vgatherqps_vgatherqpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vinserti128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vmpsadbw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpabsb_vpabsw_vpabsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpacksswb_vpackssdw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpackuswb_vpackusdw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpaddb_vpaddw_vpaddd_vpaddq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpaddsb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpaddsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpaddusb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpaddusw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpalignr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpand_vpor_vpxor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpandn.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpavgb_vpavgw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpblendd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpblendvb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpblendw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpbroadcastb_vpbroadcastw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpbroadcastd_vpbroadcastq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpcmpeqb_vpcmpeqw_vpcmpeqd_vpcmpeqq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpcmpgtb_vpcmpgtw_vpcmpgtd_vpcmpgtq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vperm2i128.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpermd_vpermq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpermpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpermps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpgatherdd_vpgatherdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpgatherqd_vpgatherqq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vphaddsw_vphsubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vphaddw_vphaddd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vphminposuw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vphsubw_vphsubd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmaddubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmaddwd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmaskmovd_vpmaskmovq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmaxsb_vpmaxsw_vpmaxsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmaxub_vpmaxuw_vpmaxud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpminsb_vpminsw_vpminsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpminub_vpminuw_vpminud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmovmskb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmovsx_variants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmovsxbw_vpmovsxbd_vpmovsxbq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmovzxbw_vpmovzxbd_vpmovzxbq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmovzxwd_vpmovzxwq_vpmovzxdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmuldq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmulhrsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmulhw_vpmulhuw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmullw_vpmulld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpmuludq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsadbw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpshufb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpshufd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpshufhw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpshuflw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsignb_vpsignw_vpsignd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpslldq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsllvd_vpsllvq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsllw_vpslld_vpsllq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsravd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsraw_vpsrad.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsrldq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsrlvd_vpsrlvq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsrlw_vpsrld_vpsrlq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsubb_vpsubw_vpsubd_vpsubq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsubsb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsubusb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpsubusw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vptest.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpunpckhbw_vpunpckhwd_vpunpckhdq_vpunpckhqdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx2/vpunpcklbw_vpunpcklwd_vpunpckldq_vpunpcklqdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/kadd_mask.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/kand_kor_kxor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/kandn_knot_mask.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/kmov.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/ktest_kunpck_kshift.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vaddph_vsubph_vmulph_vdivph.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vaddps_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/valign_vprol_vpror_vpternlog.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vcompress_vexpand.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vdbpsadbw_vplzcnt_vpshld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vdivps_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vmovaps_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vmovups_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vmulps_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512/vsubps_zmm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/avx512_mask_ops.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmadd132pd_vfmadd213pd_vfmadd231pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmadd132ps_vfmadd213ps_vfmadd231ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmadd132sd_vfmadd213sd_vfmadd231sd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmadd132ss_vfmadd213ss_vfmadd231ss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmaddsub_vfmsubadd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfmsub_variants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfnmadd_variants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/fma/vfnmsub_variants.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/MMX_TEST_STATUS.md (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/emms.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/movq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/packsswb_packssdw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/packuswb_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/paddb_paddw_paddd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/paddsb_paddsw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/paddusb_paddusw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pand_por_pxor.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pandn_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pavgb_pavgw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pcmpeqb_pcmpeqw_pcmpeqd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pcmpgtb_pcmpgtw_pcmpgtd_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pextrw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pinsrw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmaddwd_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmaxsw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmaxub_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pminsw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pminub_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmulhuw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmulhw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pmullw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psadbw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/pshufw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psllw_pslld_psllq_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psraw_psrad_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psrlw_psrld_psrlq_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psubb_psubw_psubd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psubsb_psubsw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/psubusb_psubusw_mmx.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/punpckhbw_punpckhwd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mmx/punpcklbw_punpcklwd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/packing_ops.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/addps_addpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/addss_addsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/addsubps_addsubpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/aesdec_aesdeclast.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/aesenc_aesenclast.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/aesimc_aeskeygenassist.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/andnps_andnpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/andps_andpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/blendps_blendpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/blendvps_blendvpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/clflushopt.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cmppd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cmpps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cmpsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cmpss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/comiss_comisd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/crc32.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtdq2pd_cvtpd2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtdq2ps_cvtps2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtpd2ps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtpi2pd_cvtpd2pi.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtpi2ps_cvtps2pi.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtps2pd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtsd2si.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtsd2ss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtsi2sd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtsi2ss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtss2sd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvtss2si.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvttps2dq_cvttpd2dq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvttps2pi_cvttpd2pi.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/cvttsd2si_cvttss2si.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/divps_divpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/divss_divsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/dppd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/dpps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/extractps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/fisttp_sse.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/haddps_haddpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/hsubps_hsubpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/insertps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/lddqu.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/ldmxcsr_stmxcsr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/lfence_mfence_sfence.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/maskmovdqu.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/maskmovq_emms.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/maxps_maxpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/maxss_maxsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/minps_minpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/minss_minsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/monitor_mwait_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movapd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movaps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movd_movq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movddup.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movddup_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movdqa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movdqu.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movhlps_movlhps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movhps_movlps_movhpd_movlpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movmskps_movmskpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movntdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movntdqa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movnti.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movntps_movntpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movntq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movntss_movntsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movq_movq2dq_movdq2q.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movshdup_movsldup.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movsldup_movshdup_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movss_movsd_scalar.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movupd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/movups.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/mpsadbw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/mpsadbw_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/mulps_mulpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/mulss_mulsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/orps_orpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pabsb_pabsw_pabsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/packsswb_packssdw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/packusdw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/packuswb_packusdw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/paddb_paddw_paddd_paddq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/paddsb_paddsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/paddusb_paddusw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/palignr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pand_por_pxor_pandn.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pause.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pavgb_pavgw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pblendvb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pblendw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pclmulqdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pclmulqdq_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpeqb_pcmpeqw_pcmpeqd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpeqq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpestri.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpestrm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpgtb_pcmpgtw_pcmpgtd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpgtq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpistri.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pcmpistrm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pextrb_pextrd_pextrq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pextrw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/phaddsw_phsubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/phaddw_phaddd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/phminposuw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/phminposuw_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/phsubw_phsubd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pinsrb_pinsrd_pinsrq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pinsrw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaddubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaddubsw_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaddwd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaxsb_pmaxsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaxsb_pmaxsw_pmaxsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaxub_pmaxuw_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaxub_pmaxuw_pmaxud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmaxuw_pmaxud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pminsb_pminsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pminsb_pminsw_pminsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pminub_pminuw_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pminub_pminuw_pminud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pminuw_pminud.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmovmskb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmovsxbw_pmovsxbd_pmovsxbq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmovsxwd_pmovsxwq_pmovsxdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmovzxbw_pmovzxbd_pmovzxbq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmovzxwd_pmovzxwq_pmovzxdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmuldq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmulhrsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmulhuw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmulhw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmulld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmullq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmullw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pmuludq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/prefetchnta_prefetcht0_prefetcht1_prefetcht2.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psadbw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pshufb.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pshufd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pshufhw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pshuflw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pshufw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psignb_psignw_psignd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/pslldq_psrldq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psllw_pslld_psllq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psraw_psrad.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psrlw_psrld_psrlq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psubb_psubw_psubd_psubq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psubsb_psubsw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/psubusb_psubusw.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/ptest.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/punpckhbw_punpckhwd_punpckhdq_punpckhqdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/punpcklbw_punpcklwd_punpckldq_punpcklqdq.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/rcpps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/rcpss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/roundps_roundpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/roundss_roundsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/rsqrtps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/rsqrtss.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/shufpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/shufps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/sqrtps_sqrtpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/sqrtss_sqrtsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/subps_subpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/subss_subsd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/ucomiss_ucomisd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/unpckhpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/unpckhps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/unpcklpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/unpcklps.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/simd/sse/xorps_xorpd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/enter_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/leave_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/pop/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/pop/pop.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/pop_mem.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/push/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/push/push.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/push_imm.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/push_mem.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/pusha_popa.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/pushf_popf_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/rsp_operations.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/stack_operations/stack_alignment.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/mod.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/rcl.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/rcr.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/rol.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/rol_ror_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/ror.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/shld.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/shld_shrd_extended.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/rax_x86_tests/trash/rotate/shrd.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/shl2p8_bug_trigger.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/shl2p8_edge_cases_should_not_panic.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/sse_avx_tests.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stack32_test.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stress_sar2p_all.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stress_shl1p_all.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stress_shl2p_all.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stress_shl2p_trigger.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/stress_shr2p_all.rs (100%) rename crates/libmwemu/src/tests/{ => isa/x86}/string_ops_tests.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64_aarch64_basic.rs (91%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64lin_cpu_arithmetics.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64lin_flags.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64lin_fpu.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64lin_static_helloworld.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/elf64}/elf64lin_syscall64.rs (100%) create mode 100644 crates/libmwemu/src/tests/loaders/elf64/mod.rs create mode 100644 crates/libmwemu/src/tests/loaders/hello_world.rs rename crates/libmwemu/src/tests/{ => loaders/macho}/macho64_basic.rs (94%) rename crates/libmwemu/src/tests/{ => loaders/macho}/macho64_hello.rs (93%) create mode 100644 crates/libmwemu/src/tests/loaders/macho/mod.rs create mode 100644 crates/libmwemu/src/tests/loaders/mod.rs rename crates/libmwemu/src/tests/{ => loaders/pe}/exe32win_minecraft.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/pe}/exe64win_enigma.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/pe}/exe64win_msgbox.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/pe}/mingw_tests.rs (100%) create mode 100644 crates/libmwemu/src/tests/loaders/pe/mod.rs rename crates/libmwemu/src/tests/{ => loaders/pe}/pe64_loader_tests.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/pe}/peb_teb_ldr_structures_test.rs (100%) rename crates/libmwemu/src/tests/{ => loaders/pe}/tls_fls_tests.rs (100%) create mode 100644 crates/libmwemu/src/tests/os/mod.rs rename crates/libmwemu/src/tests/{ => os}/ssdt_win64_tests.rs (100%) rename crates/libmwemu/src/tests/{ => os}/syscall64_ssdt_tests.rs (100%) rename crates/libmwemu/src/tests/{ => os}/threading_operations_tests.rs (100%) rename crates/libmwemu/src/tests/{ => os}/winapi32_tests.rs (100%) rename crates/libmwemu/src/tests/{ => os}/winapi64_tests.rs (100%) create mode 100644 crates/libmwemu/src/tests/shellcode/mod.rs rename crates/libmwemu/src/tests/{ => shellcode}/sc32lin_rshell.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc32win_donut.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc32win_peb_ldr_rot.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc32win_veryobfus.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc64lin_arith_100iter.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc64win_metasploit.rs (100%) rename crates/libmwemu/src/tests/{ => shellcode}/sc64win_strgen.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/banzai_mode_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/breakpoint_functionality.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/config_management.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/config_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/console_control_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/emulation_perf.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/emulator_initialization.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/error_conditions.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/hooks_system.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/instruction_pointer_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/maps_memory_operations.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/maps_operations_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/memory_map_operations.rs (100%) create mode 100644 crates/libmwemu/src/tests/unit/mod.rs rename crates/libmwemu/src/tests/{ => unit}/pure_rust_check.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/register_state_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/regsisters_test.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/serialization_tests.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/should_serialize.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/test_unified_step_and_run_methods.rs (100%) rename crates/libmwemu/src/tests/{ => unit}/utility_functions_tests.rs (100%) diff --git a/examples/hello-world/hello-linux-arm64 b/crates/libmwemu/src/tests/fixtures/hello_linux_arm64 similarity index 100% rename from examples/hello-world/hello-linux-arm64 rename to crates/libmwemu/src/tests/fixtures/hello_linux_arm64 diff --git a/examples/hello-world/hello-linux-x64 b/crates/libmwemu/src/tests/fixtures/hello_linux_x64 similarity index 100% rename from examples/hello-world/hello-linux-x64 rename to crates/libmwemu/src/tests/fixtures/hello_linux_x64 diff --git a/crates/libmwemu/src/tests/fixtures/hello_linux_x86 b/crates/libmwemu/src/tests/fixtures/hello_linux_x86 new file mode 100755 index 0000000000000000000000000000000000000000..8dcbeee1b368c0bd34d21e7d931c4229f5549f93 GIT binary patch literal 14928 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 diff --git a/crates/libmwemu/src/tests/fixtures/hello_mac_x64 b/crates/libmwemu/src/tests/fixtures/hello_mac_x64 new file mode 100755 index 0000000000000000000000000000000000000000..5b9303c5a500b2daa00ba0f12892234cba39be83 GIT binary patch literal 8440 zcmeHMO>0v@6uoIutybr7bp!2r_M&XB)_eBrmkxWg{pe z1XtOs8-Ibg65MpB?sX}+aW5{a=ggaDU(&jBCHKP3oij7{%zbAP$h`UR^ZV9bkwj8N zhTv&>O5~AvXo(zw7vRRs=dS1Pva zaw}+7>ML%-Am3}pH|EBPE@0Y^Fj$T_&n1zLE!h)U#GH!`F9M$frZ$J+Jz&=J5%Cn_0r)&TZk$Vx z^T)^8-t>0YoBN9)8HH!tt!B1bDP_wW)iN;c7@T#;*8WWI>E%x^o@b73e)&9g0bL$E zToWv*G26D+_>%(oMZMm$~pXu65F+)o`sE8;MXRvPNJ?# zDa<~JK>n^L!o54~F!fSX1yli5Kow90Q~^~$6;K6Kfq$#O?ZT6@p} zfB$RZ4q64jT5X*5)*8)f`Gh?aWZcs6$p8903*a1N{gpcx5c3Q%ip;dl28fOsI73*Z zAF6;VpbDr0s(>n>3aA3AfGVI0r~;~hD)8Sb;Ni)5_sJ_)-aCeOk7&U74k9vpU+I8t zr*VrLyNtBCd;wt|wu9(OJz-=Y`(((}R*k>zFSi5Vtolo3zbV7DrAl2UlF~iyc%ueW i#uFhqc@J3}zS|(?I}b!Qt#Llx!%g(gb&OpnUe<3*mV{;i literal 0 HcmV?d00001 diff --git a/examples/hello-world/hello-win-arm64.exe b/crates/libmwemu/src/tests/fixtures/hello_win_arm64.exe similarity index 100% rename from examples/hello-world/hello-win-arm64.exe rename to crates/libmwemu/src/tests/fixtures/hello_win_arm64.exe diff --git a/examples/hello-world/hello-win-x64.exe b/crates/libmwemu/src/tests/fixtures/hello_win_x64.exe similarity index 100% rename from examples/hello-world/hello-win-x64.exe rename to crates/libmwemu/src/tests/fixtures/hello_win_x64.exe diff --git a/crates/libmwemu/src/tests/fixtures/hello_win_x86.exe b/crates/libmwemu/src/tests/fixtures/hello_win_x86.exe new file mode 100755 index 0000000000000000000000000000000000000000..ab3bb1fedd3040fd1a25fafefbc4b8dac28e1790 GIT binary patch literal 78336 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�}w#gC#h70Fykarb_VkkSklpPZT?z2K%%9 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 jb%Bq&HV}=CHAt$5?1poVruggLy std::path::PathBuf { + let p = std::env::temp_dir().join(name); + std::fs::write(&p, bytes).unwrap(); + p +} + +/// PARITY GAP: panics in crates/libmwemu/src/maps/mem64.rs:576 with +/// `FAILED to write without permission: addr: 0x0` early in dynamic +/// ELF32 startup. Un-ignore once ELF32 hello-world steps without +/// dereferencing a null pointer. +#[test] +#[ignore = "parity gap: mem64.rs:576 null write on dynamic ELF32 startup"] +fn hello_linux_x86() { + helpers::setup(); + let path = write_tmp("mwemu_hello_linux_x86", HELLO_LINUX_X86); + + let mut emu = emu32(); + emu.load_code(path.to_str().unwrap()); + + assert!( + matches!(emu.cfg.arch, crate::arch::Arch::X86), + "expected ELF32 x86 dispatch, got {:?}", + emu.cfg.arch + ); + let entry = emu.regs().rip; + assert!(entry != 0, "entry point should be set"); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +/// PARITY GAP: panics in +/// crates/libmwemu/src/engine/instructions/call.rs:41 with +/// `attempt to subtract with overflow` while stepping a glibc-dynamic +/// `printf("hello world")`. Also logs `elf64.strtab overlappss` from +/// the loader. Un-ignore once dynamic ELF64 x86_64 startup runs cleanly. +#[test] +#[ignore = "parity gap: call.rs:41 sub overflow on dynamic ELF64 x86_64"] +fn hello_linux_x64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_linux_x64", HELLO_LINUX_X64); + + let mut emu = emu64(); + emu.load_code(path.to_str().unwrap()); + + assert!(emu.cfg.arch.is_x64(), "expected ELF64 x86_64 dispatch"); + let entry = emu.regs().rip; + assert!(entry != 0, "entry point should be set"); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +/// PARITY GAP: panics in crates/libmwemu/src/maps/mem64.rs:357 with +/// `FAILED to read without permission: addr: 0x555555554700` early in +/// dynamic ELF64 aarch64 startup. Loader also logs `elf64.strtab overlappss`. +/// Un-ignore once aarch64 dynamic-linker startup maps the right ranges. +#[test] +#[ignore = "parity gap: mem64.rs:357 perm denied on dynamic ELF64 aarch64"] +fn hello_linux_arm64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_linux_arm64", HELLO_LINUX_ARM64); + + let mut emu = emu_aarch64(); + emu.load_code(path.to_str().unwrap()); + + assert!(emu.cfg.arch.is_aarch64(), "expected ELF64 aarch64 dispatch"); + let pc = emu.regs_aarch64().pc; + assert!(pc != 0, "pc should be set by loader"); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +#[test] +fn hello_mac_arm64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_mac_arm64", HELLO_MAC_ARM64); + + let mut emu = emu_aarch64(); + emu.load_code(path.to_str().unwrap()); + + assert!(emu.cfg.arch.is_aarch64(), "expected Mach-O aarch64 dispatch"); + let pc = emu.regs_aarch64().pc; + assert!(pc >= 0x100000000, "entry 0x{:x} should be in __TEXT", pc); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +/// PARITY GAP: there is no `Macho64::is_macho64_x64` branch in +/// crates/libmwemu/src/emu/loaders.rs — only the aarch64 path exists. A +/// Mach-O x86_64 binary currently falls through to the shellcode default and +/// gets garbage-decoded. Un-ignore once an x86_64 Mach-O loader path lands. +#[test] +#[ignore = "loader gap: no Mach-O x86_64 dispatch in load_code"] +fn hello_mac_x64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_mac_x64", HELLO_MAC_X64); + + let mut emu = emu64(); + emu.load_code(path.to_str().unwrap()); + + assert!( + emu.cfg.arch.is_x64(), + "expected Mach-O x86_64 dispatch, got {:?}", + emu.cfg.arch + ); +} + +/// PARITY GAP: panics in crates/libmwemu/src/maps/mod.rs:327 +/// `incorrect memory map name` while loading a mingw-clang built PE32. +/// Un-ignore once PE32 hello-world loads without tripping the maps name check. +#[test] +#[ignore = "parity gap: maps/mod.rs:327 incorrect memory map name on PE32 mingw"] +fn hello_win_x86() { + helpers::setup(); + let path = write_tmp("mwemu_hello_win_x86.exe", HELLO_WIN_X86); + + let mut emu = emu32(); + emu.load_code(path.to_str().unwrap()); + + assert!( + matches!(emu.cfg.arch, crate::arch::Arch::X86), + "expected PE32 x86 dispatch, got {:?}", + emu.cfg.arch + ); + let entry = emu.regs().rip; + assert!(entry != 0, "entry point should be set"); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +/// PARITY GAP: panics in +/// crates/libmwemu/src/loaders/pe/pe64/parser.rs:127 with +/// `pe64 binary not found`. The PE64 loader re-opens the file by name +/// (`File::open(filename)`) inside `PE64::load`, which fails for the +/// temp-file path used by this test even though the path was just written. +/// Un-ignore once the loader works from already-read bytes or resolves paths +/// robustly. +#[test] +#[ignore = "parity gap: pe64 parser.rs:127 re-opens file by name and fails"] +fn hello_win_x64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_win_x64.exe", HELLO_WIN_X64); + + let mut emu = emu64(); + emu.load_code(path.to_str().unwrap()); + + assert!(emu.cfg.arch.is_x64(), "expected PE64 x86_64 dispatch"); + let entry = emu.regs().rip; + assert!(entry != 0, "entry point should be set"); + + for _ in 0..MAX_STEPS { + if !emu.step() { + break; + } + } +} + +/// PARITY GAP: `PE64::is_pe64` does not differentiate by machine type, so an +/// ARM64 PE is currently mis-routed into the x86_64 PE loader and decoded as +/// x86_64. There is no aarch64 PE dispatch path in load_code. Un-ignore once +/// the loader recognizes IMAGE_FILE_MACHINE_ARM64 and routes to an aarch64 +/// PE loader. +#[test] +#[ignore = "loader gap: no PE aarch64 dispatch in load_code"] +fn hello_win_arm64() { + helpers::setup(); + let path = write_tmp("mwemu_hello_win_arm64.exe", HELLO_WIN_ARM64); + + let mut emu = emu_aarch64(); + emu.load_code(path.to_str().unwrap()); + + assert!( + emu.cfg.arch.is_aarch64(), + "expected PE aarch64 dispatch, got {:?}", + emu.cfg.arch + ); +} diff --git a/crates/libmwemu/src/tests/macho64_basic.rs b/crates/libmwemu/src/tests/loaders/macho/macho64_basic.rs similarity index 94% rename from crates/libmwemu/src/tests/macho64_basic.rs rename to crates/libmwemu/src/tests/loaders/macho/macho64_basic.rs index fce7a4bb..0963a9a9 100644 --- a/crates/libmwemu/src/tests/macho64_basic.rs +++ b/crates/libmwemu/src/tests/loaders/macho/macho64_basic.rs @@ -3,7 +3,7 @@ use crate::*; /// Full Mach-O binary for: int main() { int a=2; int b=2; return a+b; } /// Compiled with: cc -arch arm64 -nostdlib -static -e _main -o test main.c -const MACHO64_ADD: &[u8] = include_bytes!("fixtures/macho64_aarch64_add.bin"); +const MACHO64_ADD: &[u8] = include_bytes!("../../fixtures/macho64_aarch64_add.bin"); #[test] fn macho64_aarch64_load_and_execute() { diff --git a/crates/libmwemu/src/tests/macho64_hello.rs b/crates/libmwemu/src/tests/loaders/macho/macho64_hello.rs similarity index 93% rename from crates/libmwemu/src/tests/macho64_hello.rs rename to crates/libmwemu/src/tests/loaders/macho/macho64_hello.rs index 8fac06d1..d3eb1607 100644 --- a/crates/libmwemu/src/tests/macho64_hello.rs +++ b/crates/libmwemu/src/tests/loaders/macho/macho64_hello.rs @@ -5,12 +5,12 @@ use crate::*; /// mov x0, #1; adrp x1, msg@PAGE; add x1, x1, msg@PAGEOFF; mov x2, #14; /// mov x16, #4; svc #0x80; mov x0, #0; mov x16, #1; svc #0x80 /// Compiled with: cc -arch arm64 -nostdlib -static -e _start -o test hello_raw.s -const HELLO_RAW: &[u8] = include_bytes!("fixtures/macho64_aarch64_hello_raw.bin"); +const HELLO_RAW: &[u8] = include_bytes!("../../fixtures/macho64_aarch64_hello_raw.bin"); /// Standard hello world using printf and libSystem.B.dylib: /// int main() { printf("Hello, World!\n"); return 0; } /// Compiled with: cc -arch arm64 -o test hello.c -const HELLO_LIBC: &[u8] = include_bytes!("fixtures/macho64_aarch64_hello.bin"); +const HELLO_LIBC: &[u8] = include_bytes!("../../fixtures/macho64_aarch64_hello.bin"); #[test] fn macho64_hello_raw_syscall() { diff --git a/crates/libmwemu/src/tests/loaders/macho/mod.rs b/crates/libmwemu/src/tests/loaders/macho/mod.rs new file mode 100644 index 00000000..bfe28bfe --- /dev/null +++ b/crates/libmwemu/src/tests/loaders/macho/mod.rs @@ -0,0 +1,2 @@ +mod macho64_basic; +mod macho64_hello; diff --git a/crates/libmwemu/src/tests/loaders/mod.rs b/crates/libmwemu/src/tests/loaders/mod.rs new file mode 100644 index 00000000..f7e72b21 --- /dev/null +++ b/crates/libmwemu/src/tests/loaders/mod.rs @@ -0,0 +1,4 @@ +mod elf64; +mod hello_world; +mod macho; +mod pe; diff --git a/crates/libmwemu/src/tests/exe32win_minecraft.rs b/crates/libmwemu/src/tests/loaders/pe/exe32win_minecraft.rs similarity index 100% rename from crates/libmwemu/src/tests/exe32win_minecraft.rs rename to crates/libmwemu/src/tests/loaders/pe/exe32win_minecraft.rs diff --git a/crates/libmwemu/src/tests/exe64win_enigma.rs b/crates/libmwemu/src/tests/loaders/pe/exe64win_enigma.rs similarity index 100% rename from crates/libmwemu/src/tests/exe64win_enigma.rs rename to crates/libmwemu/src/tests/loaders/pe/exe64win_enigma.rs diff --git a/crates/libmwemu/src/tests/exe64win_msgbox.rs b/crates/libmwemu/src/tests/loaders/pe/exe64win_msgbox.rs similarity index 100% rename from crates/libmwemu/src/tests/exe64win_msgbox.rs rename to crates/libmwemu/src/tests/loaders/pe/exe64win_msgbox.rs diff --git a/crates/libmwemu/src/tests/mingw_tests.rs b/crates/libmwemu/src/tests/loaders/pe/mingw_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/mingw_tests.rs rename to crates/libmwemu/src/tests/loaders/pe/mingw_tests.rs diff --git a/crates/libmwemu/src/tests/loaders/pe/mod.rs b/crates/libmwemu/src/tests/loaders/pe/mod.rs new file mode 100644 index 00000000..7c87ac48 --- /dev/null +++ b/crates/libmwemu/src/tests/loaders/pe/mod.rs @@ -0,0 +1,7 @@ +mod exe32win_minecraft; +mod exe64win_enigma; +mod exe64win_msgbox; +mod mingw_tests; +mod pe64_loader_tests; +mod peb_teb_ldr_structures_test; +mod tls_fls_tests; diff --git a/crates/libmwemu/src/tests/pe64_loader_tests.rs b/crates/libmwemu/src/tests/loaders/pe/pe64_loader_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/pe64_loader_tests.rs rename to crates/libmwemu/src/tests/loaders/pe/pe64_loader_tests.rs diff --git a/crates/libmwemu/src/tests/peb_teb_ldr_structures_test.rs b/crates/libmwemu/src/tests/loaders/pe/peb_teb_ldr_structures_test.rs similarity index 100% rename from crates/libmwemu/src/tests/peb_teb_ldr_structures_test.rs rename to crates/libmwemu/src/tests/loaders/pe/peb_teb_ldr_structures_test.rs diff --git a/crates/libmwemu/src/tests/tls_fls_tests.rs b/crates/libmwemu/src/tests/loaders/pe/tls_fls_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/tls_fls_tests.rs rename to crates/libmwemu/src/tests/loaders/pe/tls_fls_tests.rs diff --git a/crates/libmwemu/src/tests/mod.rs b/crates/libmwemu/src/tests/mod.rs index c63788f6..6ea0555c 100644 --- a/crates/libmwemu/src/tests/mod.rs +++ b/crates/libmwemu/src/tests/mod.rs @@ -1,79 +1,7 @@ -mod aarch64_basic; -mod allocator32_test; -mod allocator64_test; -mod banzai_mode_tests; -mod basic_test_code_bytes_shld_shrd; -mod bit_manipulation_tests; -mod breakpoint_functionality; -mod call32; -mod call64; -mod cmpxchg_tests; -mod config_management; -mod config_tests; -mod console_control_tests; -mod emulation_perf; -mod elf64lin_cpu_arithmetics; - -mod elf64_aarch64_basic; -mod elf64lin_flags; -mod elf64lin_fpu; -mod elf64lin_static_helloworld; -mod elf64lin_syscall64; -mod emulator_initialization; -mod error_conditions; -mod exception_handler32; -mod exception_handler64; -mod exe32win_minecraft; -mod exe64win_enigma; -mod exe64win_msgbox; -mod flag_calculations; -mod fpu_conversions; -mod fpu_f80_emulation; -mod fpu_stack_operations; mod helpers; -mod hooks_system; -mod instruction_pointer_tests; -mod linux_call64; -mod logic_test; -mod maps_memory_operations; -mod maps_operations_tests; -mod mem64_test; -mod memmove_test; -mod memory_map_operations; -mod pe64_loader_tests; -mod peb_teb_ldr_structures_test; -mod pure_rust_check; -mod register_state_tests; -mod regsisters_test; -mod sc32lin_rshell; -mod sc32win_donut; -mod sc32win_peb_ldr_rot; -mod sc32win_veryobfus; -mod sc64lin_arith_100iter; -mod sc64win_metasploit; -mod sc64win_strgen; -mod serialization_tests; -mod shl2p8_bug_trigger; -mod shl2p8_edge_cases_should_not_panic; -mod should_serialize; -mod ssdt_win64_tests; -mod sse_avx_tests; -mod stack32_test; -mod stack64_test; -mod stress_sar2p_all; -mod stress_shl1p_all; -mod stress_shl2p_all; -mod stress_shl2p_trigger; -mod stress_shr2p_all; -mod string_ops_tests; -mod syscall64_ssdt_tests; -mod test_unified_step_and_run_methods; -mod threading_operations_tests; -mod tls_fls_tests; -mod utility_functions_tests; -mod winapi32_tests; -mod winapi64_tests; -mod rax_x86_tests; -mod macho64_basic; -mod macho64_hello; -mod mingw_tests; \ No newline at end of file + +mod unit; +mod isa; +mod loaders; +mod os; +mod shellcode; diff --git a/crates/libmwemu/src/tests/os/mod.rs b/crates/libmwemu/src/tests/os/mod.rs new file mode 100644 index 00000000..f053438d --- /dev/null +++ b/crates/libmwemu/src/tests/os/mod.rs @@ -0,0 +1,5 @@ +mod ssdt_win64_tests; +mod syscall64_ssdt_tests; +mod threading_operations_tests; +mod winapi32_tests; +mod winapi64_tests; diff --git a/crates/libmwemu/src/tests/ssdt_win64_tests.rs b/crates/libmwemu/src/tests/os/ssdt_win64_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/ssdt_win64_tests.rs rename to crates/libmwemu/src/tests/os/ssdt_win64_tests.rs diff --git a/crates/libmwemu/src/tests/syscall64_ssdt_tests.rs b/crates/libmwemu/src/tests/os/syscall64_ssdt_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/syscall64_ssdt_tests.rs rename to crates/libmwemu/src/tests/os/syscall64_ssdt_tests.rs diff --git a/crates/libmwemu/src/tests/threading_operations_tests.rs b/crates/libmwemu/src/tests/os/threading_operations_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/threading_operations_tests.rs rename to crates/libmwemu/src/tests/os/threading_operations_tests.rs diff --git a/crates/libmwemu/src/tests/winapi32_tests.rs b/crates/libmwemu/src/tests/os/winapi32_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/winapi32_tests.rs rename to crates/libmwemu/src/tests/os/winapi32_tests.rs diff --git a/crates/libmwemu/src/tests/winapi64_tests.rs b/crates/libmwemu/src/tests/os/winapi64_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/winapi64_tests.rs rename to crates/libmwemu/src/tests/os/winapi64_tests.rs diff --git a/crates/libmwemu/src/tests/shellcode/mod.rs b/crates/libmwemu/src/tests/shellcode/mod.rs new file mode 100644 index 00000000..bf9c3b8c --- /dev/null +++ b/crates/libmwemu/src/tests/shellcode/mod.rs @@ -0,0 +1,7 @@ +mod sc32lin_rshell; +mod sc32win_donut; +mod sc32win_peb_ldr_rot; +mod sc32win_veryobfus; +mod sc64lin_arith_100iter; +mod sc64win_metasploit; +mod sc64win_strgen; diff --git a/crates/libmwemu/src/tests/sc32lin_rshell.rs b/crates/libmwemu/src/tests/shellcode/sc32lin_rshell.rs similarity index 100% rename from crates/libmwemu/src/tests/sc32lin_rshell.rs rename to crates/libmwemu/src/tests/shellcode/sc32lin_rshell.rs diff --git a/crates/libmwemu/src/tests/sc32win_donut.rs b/crates/libmwemu/src/tests/shellcode/sc32win_donut.rs similarity index 100% rename from crates/libmwemu/src/tests/sc32win_donut.rs rename to crates/libmwemu/src/tests/shellcode/sc32win_donut.rs diff --git a/crates/libmwemu/src/tests/sc32win_peb_ldr_rot.rs b/crates/libmwemu/src/tests/shellcode/sc32win_peb_ldr_rot.rs similarity index 100% rename from crates/libmwemu/src/tests/sc32win_peb_ldr_rot.rs rename to crates/libmwemu/src/tests/shellcode/sc32win_peb_ldr_rot.rs diff --git a/crates/libmwemu/src/tests/sc32win_veryobfus.rs b/crates/libmwemu/src/tests/shellcode/sc32win_veryobfus.rs similarity index 100% rename from crates/libmwemu/src/tests/sc32win_veryobfus.rs rename to crates/libmwemu/src/tests/shellcode/sc32win_veryobfus.rs diff --git a/crates/libmwemu/src/tests/sc64lin_arith_100iter.rs b/crates/libmwemu/src/tests/shellcode/sc64lin_arith_100iter.rs similarity index 100% rename from crates/libmwemu/src/tests/sc64lin_arith_100iter.rs rename to crates/libmwemu/src/tests/shellcode/sc64lin_arith_100iter.rs diff --git a/crates/libmwemu/src/tests/sc64win_metasploit.rs b/crates/libmwemu/src/tests/shellcode/sc64win_metasploit.rs similarity index 100% rename from crates/libmwemu/src/tests/sc64win_metasploit.rs rename to crates/libmwemu/src/tests/shellcode/sc64win_metasploit.rs diff --git a/crates/libmwemu/src/tests/sc64win_strgen.rs b/crates/libmwemu/src/tests/shellcode/sc64win_strgen.rs similarity index 100% rename from crates/libmwemu/src/tests/sc64win_strgen.rs rename to crates/libmwemu/src/tests/shellcode/sc64win_strgen.rs diff --git a/crates/libmwemu/src/tests/banzai_mode_tests.rs b/crates/libmwemu/src/tests/unit/banzai_mode_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/banzai_mode_tests.rs rename to crates/libmwemu/src/tests/unit/banzai_mode_tests.rs diff --git a/crates/libmwemu/src/tests/breakpoint_functionality.rs b/crates/libmwemu/src/tests/unit/breakpoint_functionality.rs similarity index 100% rename from crates/libmwemu/src/tests/breakpoint_functionality.rs rename to crates/libmwemu/src/tests/unit/breakpoint_functionality.rs diff --git a/crates/libmwemu/src/tests/config_management.rs b/crates/libmwemu/src/tests/unit/config_management.rs similarity index 100% rename from crates/libmwemu/src/tests/config_management.rs rename to crates/libmwemu/src/tests/unit/config_management.rs diff --git a/crates/libmwemu/src/tests/config_tests.rs b/crates/libmwemu/src/tests/unit/config_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/config_tests.rs rename to crates/libmwemu/src/tests/unit/config_tests.rs diff --git a/crates/libmwemu/src/tests/console_control_tests.rs b/crates/libmwemu/src/tests/unit/console_control_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/console_control_tests.rs rename to crates/libmwemu/src/tests/unit/console_control_tests.rs diff --git a/crates/libmwemu/src/tests/emulation_perf.rs b/crates/libmwemu/src/tests/unit/emulation_perf.rs similarity index 100% rename from crates/libmwemu/src/tests/emulation_perf.rs rename to crates/libmwemu/src/tests/unit/emulation_perf.rs diff --git a/crates/libmwemu/src/tests/emulator_initialization.rs b/crates/libmwemu/src/tests/unit/emulator_initialization.rs similarity index 100% rename from crates/libmwemu/src/tests/emulator_initialization.rs rename to crates/libmwemu/src/tests/unit/emulator_initialization.rs diff --git a/crates/libmwemu/src/tests/error_conditions.rs b/crates/libmwemu/src/tests/unit/error_conditions.rs similarity index 100% rename from crates/libmwemu/src/tests/error_conditions.rs rename to crates/libmwemu/src/tests/unit/error_conditions.rs diff --git a/crates/libmwemu/src/tests/hooks_system.rs b/crates/libmwemu/src/tests/unit/hooks_system.rs similarity index 100% rename from crates/libmwemu/src/tests/hooks_system.rs rename to crates/libmwemu/src/tests/unit/hooks_system.rs diff --git a/crates/libmwemu/src/tests/instruction_pointer_tests.rs b/crates/libmwemu/src/tests/unit/instruction_pointer_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/instruction_pointer_tests.rs rename to crates/libmwemu/src/tests/unit/instruction_pointer_tests.rs diff --git a/crates/libmwemu/src/tests/maps_memory_operations.rs b/crates/libmwemu/src/tests/unit/maps_memory_operations.rs similarity index 100% rename from crates/libmwemu/src/tests/maps_memory_operations.rs rename to crates/libmwemu/src/tests/unit/maps_memory_operations.rs diff --git a/crates/libmwemu/src/tests/maps_operations_tests.rs b/crates/libmwemu/src/tests/unit/maps_operations_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/maps_operations_tests.rs rename to crates/libmwemu/src/tests/unit/maps_operations_tests.rs diff --git a/crates/libmwemu/src/tests/memory_map_operations.rs b/crates/libmwemu/src/tests/unit/memory_map_operations.rs similarity index 100% rename from crates/libmwemu/src/tests/memory_map_operations.rs rename to crates/libmwemu/src/tests/unit/memory_map_operations.rs diff --git a/crates/libmwemu/src/tests/unit/mod.rs b/crates/libmwemu/src/tests/unit/mod.rs new file mode 100644 index 00000000..9c5ad9cb --- /dev/null +++ b/crates/libmwemu/src/tests/unit/mod.rs @@ -0,0 +1,20 @@ +mod banzai_mode_tests; +mod breakpoint_functionality; +mod config_management; +mod config_tests; +mod console_control_tests; +mod emulation_perf; +mod emulator_initialization; +mod error_conditions; +mod hooks_system; +mod instruction_pointer_tests; +mod maps_memory_operations; +mod maps_operations_tests; +mod memory_map_operations; +mod pure_rust_check; +mod register_state_tests; +mod regsisters_test; +mod serialization_tests; +mod should_serialize; +mod test_unified_step_and_run_methods; +mod utility_functions_tests; diff --git a/crates/libmwemu/src/tests/pure_rust_check.rs b/crates/libmwemu/src/tests/unit/pure_rust_check.rs similarity index 100% rename from crates/libmwemu/src/tests/pure_rust_check.rs rename to crates/libmwemu/src/tests/unit/pure_rust_check.rs diff --git a/crates/libmwemu/src/tests/register_state_tests.rs b/crates/libmwemu/src/tests/unit/register_state_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/register_state_tests.rs rename to crates/libmwemu/src/tests/unit/register_state_tests.rs diff --git a/crates/libmwemu/src/tests/regsisters_test.rs b/crates/libmwemu/src/tests/unit/regsisters_test.rs similarity index 100% rename from crates/libmwemu/src/tests/regsisters_test.rs rename to crates/libmwemu/src/tests/unit/regsisters_test.rs diff --git a/crates/libmwemu/src/tests/serialization_tests.rs b/crates/libmwemu/src/tests/unit/serialization_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/serialization_tests.rs rename to crates/libmwemu/src/tests/unit/serialization_tests.rs diff --git a/crates/libmwemu/src/tests/should_serialize.rs b/crates/libmwemu/src/tests/unit/should_serialize.rs similarity index 100% rename from crates/libmwemu/src/tests/should_serialize.rs rename to crates/libmwemu/src/tests/unit/should_serialize.rs diff --git a/crates/libmwemu/src/tests/test_unified_step_and_run_methods.rs b/crates/libmwemu/src/tests/unit/test_unified_step_and_run_methods.rs similarity index 100% rename from crates/libmwemu/src/tests/test_unified_step_and_run_methods.rs rename to crates/libmwemu/src/tests/unit/test_unified_step_and_run_methods.rs diff --git a/crates/libmwemu/src/tests/utility_functions_tests.rs b/crates/libmwemu/src/tests/unit/utility_functions_tests.rs similarity index 100% rename from crates/libmwemu/src/tests/utility_functions_tests.rs rename to crates/libmwemu/src/tests/unit/utility_functions_tests.rs diff --git a/examples/hello-world/Makefile b/examples/hello-world/Makefile index d2d02281..56c32762 100644 --- a/examples/hello-world/Makefile +++ b/examples/hello-world/Makefile @@ -1,29 +1,52 @@ -CC_NATIVE = cc +CC_MACARM64 = clang -target arm64-apple-darwin +CC_MACX64 = clang -target x86_64-apple-darwin +CC_LINUX86 = i686-unknown-linux-gnu-gcc CC_LINUX64 = x86_64-unknown-linux-gnu-gcc CC_LINARM64 = aarch64-unknown-linux-gnu-gcc +CC_WINX86 = i686-w64-mingw32-clang CC_WINX64 = x86_64-w64-mingw32-clang CC_WINARM64 = aarch64-w64-mingw32-clang SRC = main.c +OUT = ../../crates/libmwemu/src/tests/fixtures -all: hello-mac-arm64 hello-linux-x64 hello-linux-arm64 hello-win-x64.exe hello-win-arm64.exe +TARGETS = \ + $(OUT)/hello_mac_arm64 \ + $(OUT)/hello_mac_x64 \ + $(OUT)/hello_linux_x86 \ + $(OUT)/hello_linux_x64 \ + $(OUT)/hello_linux_arm64 \ + $(OUT)/hello_win_x86.exe \ + $(OUT)/hello_win_x64.exe \ + $(OUT)/hello_win_arm64.exe -hello-mac-arm64: $(SRC) - $(CC_NATIVE) $(SRC) -o $@ +all: $(TARGETS) -hello-linux-x64: $(SRC) +$(OUT)/hello_mac_arm64: $(SRC) + $(CC_MACARM64) $(SRC) -o $@ + +$(OUT)/hello_mac_x64: $(SRC) + $(CC_MACX64) $(SRC) -o $@ + +$(OUT)/hello_linux_x86: $(SRC) + $(CC_LINUX86) $(SRC) -o $@ + +$(OUT)/hello_linux_x64: $(SRC) $(CC_LINUX64) $(SRC) -o $@ -hello-linux-arm64: $(SRC) +$(OUT)/hello_linux_arm64: $(SRC) $(CC_LINARM64) $(SRC) -o $@ -hello-win-x64.exe: $(SRC) +$(OUT)/hello_win_x86.exe: $(SRC) + $(CC_WINX86) $(SRC) -o $@ + +$(OUT)/hello_win_x64.exe: $(SRC) $(CC_WINX64) $(SRC) -o $@ -hello-win-arm64.exe: $(SRC) +$(OUT)/hello_win_arm64.exe: $(SRC) $(CC_WINARM64) $(SRC) -o $@ clean: - rm -f hello-mac-arm64 hello-linux-x64 hello-linux-arm64 hello-win-x64.exe hello-win-arm64.exe + rm -f $(TARGETS) -.PHONY: all clean \ No newline at end of file +.PHONY: all clean diff --git a/flake.nix b/flake.nix index 901f51ef..ffba8882 100644 --- a/flake.nix +++ b/flake.nix @@ -17,10 +17,14 @@ toolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "rust-analyzer" "clippy" ]; targets = [ + # mac "aarch64-apple-darwin" + # linux "x86_64-unknown-linux-gnu" "aarch64-unknown-linux-gnu" + # windows "aarch64-pc-windows-gnullvm" + "x86_64-pc-windows-gnullvm" ]; }; @@ -50,6 +54,7 @@ pkgs.pkg-config llvm-mingw # GCC cross-compilers for Linux targets + pkgs.pkgsCross.gnu32.stdenv.cc pkgs.pkgsCross.gnu64.stdenv.cc pkgs.pkgsCross.aarch64-multiplatform.stdenv.cc ]; @@ -58,8 +63,33 @@ # Cargo linkers for cross targets CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_LINKER = "aarch64-w64-mingw32-clang"; + CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = "x86_64-w64-mingw32-clang"; + CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER = "i686-unknown-linux-gnu-gcc"; CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER = "x86_64-unknown-linux-gnu-gcc"; CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = "aarch64-unknown-linux-gnu-gcc"; + + # cc-rs per-target compilers. Build scripts (zstd-sys, bzip2-sys, ...) + # use cc-rs which respects CC_. Set these explicitly because + # the shellHook below clears the global CC the cross stdenvs would + # otherwise leak. + CC_i686_unknown_linux_gnu = "i686-unknown-linux-gnu-gcc"; + CXX_i686_unknown_linux_gnu = "i686-unknown-linux-gnu-g++"; + CC_x86_64_unknown_linux_gnu = "x86_64-unknown-linux-gnu-gcc"; + CXX_x86_64_unknown_linux_gnu = "x86_64-unknown-linux-gnu-g++"; + CC_aarch64_unknown_linux_gnu = "aarch64-unknown-linux-gnu-gcc"; + CXX_aarch64_unknown_linux_gnu = "aarch64-unknown-linux-gnu-g++"; + CC_x86_64_pc_windows_gnullvm = "x86_64-w64-mingw32-clang"; + CXX_x86_64_pc_windows_gnullvm = "x86_64-w64-mingw32-clang++"; + CC_aarch64_pc_windows_gnullvm = "aarch64-w64-mingw32-clang"; + CXX_aarch64_pc_windows_gnullvm = "aarch64-w64-mingw32-clang++"; + + # Both pkgsCross.*.stdenv.cc derivations export CC/CXX via their nix + # setup hooks; whichever runs last wins, leaking a cross gcc into host + # builds (cc-rs respects CC unconditionally). Clear them so host + # builds fall back to clang and per-target builds use CC_. + shellHook = '' + unset CC CXX + ''; }; }; } \ No newline at end of file